用51单片机设计超声波测距系统的设计原理和电路(附源程序)

合集下载

基于51单片机的超声波测距仪设计

基于51单片机的超声波测距仪设计

自动化技术综合实训报告实训题目:院专班姓学指导教师:实训地点:开课时间:序号 评价内容 分数 序号 评价内容分数1 出勤(10 分)3 实训任务完成情况(50 分) 2 课题难度分值(10 分)4实训总结报告(30 分)实训总成绩: 94 分学生姓名:魏*星实训评分指导教师评语:指导教师(签名):年月目录第 1章绪论1.1实训的目和要求1.2实训课题设计功能描述………………………………………………………1.3应解决的问题………………………………………………………………第 2章整体设计方案2.1设计原理2.2整体系统设计………………………………………………………………第 3章硬件电路设计3.1电路原理图3.2元件清单……………………………………………………………………3.3重要电路介绍3.3.1复位与晶振电路……………………………………………………3.3.2超声波发射电路……………………………………………………3.3.3超声波接收检测电路………………………………………………3.3.4显示电路第 4章软件设计4.1系统软件设计4.2程序流程图4.3程序设计与调试第 5章制板焊接调试5.1仿真结果与 PCB图5.2焊制电路板、实物运行调试5.3误差分析与校正讨论总结与体会谢词参考文献附录第1章绪论1.1实训的目的和要求生产实训是自动化专业本科生在校期间必须进行的主要实践环节之一,是培养学生工程实践能力、提高学生工程素质的一个重要组成部分。

作为一名工科学生,将来从事自动化及相关工作,为了让我们能尽早的认识社会实践,了解工业生产,提高自己的动手意识,强化个人素质,增强理论联系实际的观念,学校给我们安排了为期两周的专业实训,让我们学到的理论知识和实践联系到一起,为我们以后的走向社会打下一个坚实的基础。

这次实训的主要目的是让大家进一步了解 AT89 系列单片机的引脚、功能,晶振电路、显示电路和信号输入输出电路的设计,熟悉使用 keil 软件和用汇编语言编程完成各种处理和控制,同时学习使用软件对电路进行设计,对项目进行仿真、调试,以及 PCB 板的制作等,最主要的是了解一个小型项目的研发过程,从项目的提出到项目实现需要怎样一步步来完成,项目完成事应该大概掌握以上要求。

51单片机超声波测距离(带温度补偿)

51单片机超声波测距离(带温度补偿)

超声波模块原理图:发射接收原理图PCB:51单片机原理图:软件部分C语言程序:/*=========================================================== =========调试要求:1.MCU:A T89S52芯片或AT89C522.晶振:12MHz调试注意:本程序带温度补偿,采用DS18B20测量温度1.LCD1602液晶屏有显示后,才接入超声波模块。

2.注意超声波模块电源的极性。

不清楚请参好淘宝的电路图3.没有选用频率为12MHz晶振,用了别的频率晶振,单片机定时器的测量值与发出的40KHz频率脉冲不对。

4.使用者经常误发出20KHZ脉冲当40KHZ脉冲。

(40KHz频率脉冲,周期25us,占空比为50% = 12.5us)5.如果是用开发板调超声波模块,请检查开发板上的电路是否与超声波模块的控制脚复用了, 若复用了,请通过跳线分开发板上的电路。

6如果使用的是万用板,请确定单片机的复位电路和晶振电路是否正常,同时单片机的31脚(EA)记得接高电平。

============================================================= =======*/#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//===============================LCD1602接口定义=====================/*-----------------------------------------------------|DB0-----P2.0 | DB4-----P2.4 | RW-------P0.1 ||DB1-----P2.1 | DB5-----P2.5 | RS-------P0.2 ||DB2-----P2.2 | DB6-----P2.6 | E--------P0.0 ||DB3-----P2.3 | DB7-----P2.7 | 注意,P0.0到P0.2需要接上拉电阻---------------------------------------------------============================================================= */#define LCM_Data P2 //数据接口#define Busy 0x80 //用于检测LCM状态字中的Busy标识sbit LCM_RW = P0^1; //读写控制输入端,LCD1602的第五脚sbit LCM_RS = P0^2; //寄存器选择输入端,LCD1602的第四脚sbit LCM_E = P0^0; //使能信号输入端,LCD1602的第6脚//===============================超声波模块定义========================sbit RemPin =P3^2;// 接收端(这个不能修改,因为是外部中断(INT0)的引脚) sbit TxPin =P3^1;// 发射端//******************************************************************** ***//ds18b20数字温度传感器控制引脚定义sbit dq_ds18b20=P3^3;//定义控制DS18B20//******************************************************************** ***//LCD显示模块的函数声明void WriteDataLCM (uchar WDLCM);//LCD模块写数据void WriteCommandLCM (uchar WCLCM,BuysC); //LCD模块写指令uchar ReadDataLCM (void);//LCD模块读数据uchar ReadStatusLCM (void);//读LCD模块的忙标void DisplayOneChar (uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置显示一个字符void DisplayListChar (uchar X,uchar Y,uchar delayms,uchar code *DData); void DisplayCursorPos (uchar X, uchar Y);void LCMInit (void);void DisplayIntData (uchar X, uchar Y,int ZhengShu,uchar Digit,uchar XiaoShu);void DisplayCharData (uchar X, uchar Y,uchar ZiFu);//******************************************************************** **//延时函数声明void delay25us_40KHz(unsigned char us);void DelayUs(uint us);void DelayMs(uint Ms);void delay_3us();//3US的延时程序void delay_8us(unsigned int t);//8US延时基准程序void delay_50us(unsigned int t);//延时50*T微妙函数的声明//******************************************************************** ***//DS18B20测温函数定义void w_1byte_ds18b20(uchar value);//向DS18B20写一个字节uchar r_1byte_ds18b20(void);//从DS18B20读取一个字节的数据void rest_ds18b20(void);//DS18B20复位程序void readtemp_ds18b20(void);//读取温度void display_temp(void);//温度显示程序//******************************************************************** ***//参数定义uint length = 0; // 测距的长度0.00Muchar flag = 0; // 测距的标志有信号接收=1uchar templ,temph;uint speed;//根据温度计算出来的声音速度uchar t_b,t_s,t_g,t_x;//从左到右分别存储温度百位,十位,个位,小数位uchar flag1;//温度正负性暂存,1为正数,0为负数const unsigned char tabl3[]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x0 8,0x09,0x09};/*=========================================================== ================主程序============================================================= ================*/void main(void){uchar i;LCMInit(); //1602初始化EX0 = 1; //允许总中断中断,使能INT0 外部中断ET0 = 1;TMOD=0x11; //设定T0为16位时器,设定T1为16位时器DisplayOneChar( 0,14,'m');DisplayListChar(0,0,0, "Distanc: "); //显示字符串while(1){readtemp_ds18b20();display_temp();//显示温度for(i=0;i<20;i++){DisplayIntData(0, 13,length,5,3);//显示测量距离TH0=0x00;TL0=0x00;TR0=1; //启动定时器0EA = 1; //允许所有中断delay25us_40KHz(15); //发出脉冲信号DelayMs(200);}}}//******************************************************************** ***********//温度显示函数void display_temp(){if(flag1==1)//温度为正数时的显示程序{DisplayOneChar( 1,2,'+');}else{DisplayOneChar( 1,2,'-');}//显示温度信息DisplayOneChar( 1,0,'T');DisplayOneChar( 1,1,':');DisplayOneChar( 1,3,t_s+0x30);DisplayOneChar( 1,4,t_g+0x30);DisplayOneChar( 1,5,'.');DisplayOneChar( 1,6,t_x+0x30);//显示速度信息DisplayOneChar( 1,8,'S');DisplayOneChar( 1,9,':');DisplayOneChar( 1,10,speed/100%10+0x30);DisplayOneChar( 1,11,speed/10%10+0x30);DisplayOneChar( 1,12,speed%10+0x30);DisplayOneChar( 1,13,'M');DisplayOneChar( 1,14,'/');DisplayOneChar( 1,15,'S');}//****************************************************//读取温度void readtemp_ds18b20(void){uchar temp32;rest_ds18b20();w_1byte_ds18b20(0xcc); //跳过读序列号的操作w_1byte_ds18b20(0x44); //启动温度转换delay_8us(2);rest_ds18b20();w_1byte_ds18b20(0xcc); //跳过读序列号的操作w_1byte_ds18b20(0xbe); //读取温度寄存器等(共可读9个寄存器)前两个就是温度templ=r_1byte_ds18b20();temph=r_1byte_ds18b20();if((temph&0xf0))//判断温度的正负性{flag1=0;temph=-temph;templ=-templ;t_x=tabl3[templ & 0x0f];//计算温度的小数temp32=temph & 0x0f;temp32<<=4;templ>>=4;temp32=temp32 | templ;t_b=temp32/100%10;//计算温度的百位数据t_s=temp32/10%10;//计算温度的十位数据t_g=temp32%10;//计算温度的个位数据speed=331.4-0.607*(temp32 | templ);}else//为正数{t_x=tabl3[templ & 0x0f];//计算温度的小数temp32=temph & 0x0f;temp32<<=4;templ>>=4;temp32=temp32 | templ;t_b=temp32/100%10;//计算温度的百位数据t_s=temp32/10%10;//计算温度的十位数据t_g=temp32%10;//计算温度的个位数据flag1=1;speed=311.4+0.607*(temp32 | templ);}}/*=========================================================== =========功能:在1602显示一个整数数据说明:显示一个整数数据-9999->32625. 从右至左显示数据5位:============================================================= =========*/void DisplayIntData(uchar X, uchar Y,int ZhengShu,uchar Digit,uchar XiaoShu) {uchar i=0,k=0, BCD[5]={0};if(Digit>5) Digit=5;if(ZhengShu<0){k=1;//负数示志位ZhengShu=-ZhengShu;}BCD[4] =ZhengShu / 10000; //求出万位数据ZhengShu = ZhengShu % 10000;BCD[3] =ZhengShu / 1000; //求出千位数据ZhengShu = ZhengShu % 1000;BCD[2] =ZhengShu / 100; //求出百位数据ZhengShu = ZhengShu % 100;BCD[1] =ZhengShu / 10; //求出十位数据BCD[0] =ZhengShu % 10; //求出个位数据for(i=0;i<Digit;i++)//输出显示的数值{if((i==XiaoShu)&&(0!=XiaoShu)){DisplayOneChar(X,Y-i,'.');//输出小数点Y= Y-1;}DisplayOneChar(X,Y-i,BCD[i]+0x30); //显示一个字符}if(k==1)DisplayOneChar(X,Y-1,'-');//输出负符}//****************************************************************//读一个字节uchar r_1byte_ds18b20(void){uchar i=0;uchar value= 0;for (i=0;i<8;i++){value>>=1;dq_ds18b20=0;// DQ_L;delay_3us();dq_ds18b20=1; //DQ_H;delay_8us(2);if(dq_ds18b20==1) value|=0x80;delay_8us(6); //延时40us}dq_ds18b20=1;return value;}//******************************************************************** ***********//子程序功能:向DS18B20写一字节的数据void w_1byte_ds18b20(uchar value){uchar i=0;for(i=0;i<8;i++){dq_ds18b20=1;delay_3us();dq_ds18b20=0;delay_8us(2);if (value& 0x01) dq_ds18b20=1; //DQ = 1delay_50us(1); //延时50us 以上delay_8us(2);value>>=1;}dq_ds18b20=1; //DQ = 1}//;**************************************************//ds18b20复位子程序void rest_ds18b20(void){rest:delay_3us(); //稍做延时delay_3us();dq_ds18b20=1;delay_3us();dq_ds18b20=0;// DQ_L;delay_50us(11);//480us<T<960usdq_ds18b20=1;//拉高总线delay_8us(5);if(dq_ds18b20==1){return;}delay_50us(2); //延时90usif(dq_ds18b20==1){return;}else{goto rest;}}//==============================超声波模块测试子程序================================================/*=========================================================== =========注意:是用12MHz晶振设定延时时间:x*25us 与产生40KHZ的脉冲============================================================= =======*/void delay25us_40KHz(unsigned char us){while(us--){TxPin = 0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();TxPin = 1;_nop_();_nop_();_nop_();_nop_();}TxPin = 1;}/*=========================================================== ==================中断程序的入口(注意:接收与发射的电平是相反的)============================================================= ==================*/void init0int() interrupt 0{uint timer_us = 0;TR0=0; //关闭定时器0timer_us =TH0*256+TL0;if(timer_us>190)timer_us=timer_us-180; //修正测距的距离if(timer_us<=735){timer_us=timer_us-96;//二次修正}if(timer_us>5059){timer_us+=29;}if(timer_us>5470){timer_us+=29;}if(timer_us>6410){timer_us+=29;}if(timer_us>7410){timer_us+=29;}if(timer_us>8410){timer_us+=29;}if(timer_us>9410){timer_us+=29;}if(timer_us>10410){timer_us+=29;}length = ((unsigned long)(speed)*timer_us)/2000;//计算长度,是扩大100倍flag = 0;EA = 0; //禁止所有中断}/*=========================================================== =========功能:在1602显示一个字符数据说明:显示一个字符数据0~256. 从左至右显示数据3位============================================================= =========*/void DisplayCharData(uchar X, uchar Y,uchar ZiFu){uchar i=0;uchar V alueBCD[3];V alueBCD[0] = ZiFu / 100; //求出百位数据ZiFu = ZiFu % 100;V alueBCD[1] = ZiFu / 10; //求出十位数据V alueBCD[2] = ZiFu % 10; //求出个位数据for(i=0;i<3;i++)//输出显示的数值{DisplayOneChar(X,Y+i,V alueBCD[i]+0x30); //显示一个字符}}/*=========================================================== ================超出测量时间============================================================= ================*/void timer0int (void) interrupt 1{TR0=0; //关闭定时器0length = 0; //超出测量时间显示示0flag = 1; //EA = 0; //禁止所有中断}/*=========================================================== ===========LCM初始化============================================================= =========*/void LCMInit(void){LCM_Data = 0;WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号DelayMs(5);WriteCommandLCM(0x38,0);DelayMs(5);WriteCommandLCM(0x38,0);DelayMs(5);WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x08,1); //关闭显示WriteCommandLCM(0x01,1); //显示清屏WriteCommandLCM(0x06,1); // 显示光标移动设置WriteCommandLCM(0x0C,1); // 显示开及光标设置DelayMs(100);}/*=========================================================== =========显示光标的位置============================================================= =======*/void DisplayCursorPos( unsigned char X, unsigned char Y){X &= 0x1;Y &= 0xF; //限制Y不能大于15,X不能大于1if (X) Y |= 0x40; //当要显示第二行时地址码+0x40;Y |= 0x80; // 算出指令码WriteCommandLCM(Y, 1); //这里不检测忙信号,发送地址码}/*=========================================================== =========按指定位置显示一串字符:第X 行,第y列注意:字符串不能长于16个字符============================================================= =========*/void DisplayListChar(uchar X,uchar Y,uchar delayms, uchar code *DData){unsigned char ListLength;ListLength = 0;X &= 0x1;Y &= 0xF; //限制X不能大于15,Y不能大于1while (DData[ListLength]!='\0') //若到达字串尾则退出{if (Y <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;Y++;DelayMs(delayms);//延时显示字符串}elsebreak;//跳出循环体}}/*=========================================================== =========设定延时时间:x*1us============================================================= =======*/void DelayUs(uint us){while(us--);}/*=========================================================== =========设定延时时间:x*1ms============================================================= =======*/void DelayMs(uint Ms){uint i,TempCyc;for(i=0;i<Ms;i++){TempCyc = 250;while(TempCyc--);}}//==============================LCD1602显示子程序================================================/*=========================================================== ==========写数据函数: E =高脉冲RS=1 RW=0============================================================= =========*/void WriteDataLCM(unsigned char WDLCM){ReadStatusLCM(); //检测忙LCM_Data = WDLCM;LCM_RS = 1;LCM_RW = 0;LCM_E = 0; //若晶振速度太高可以在这后加小的延时LCM_E = 0; //延时LCM_E = 1;}/*=========================================================== =========写指令函数: E=高脉冲RS=0 RW=0============================================================= =========*/void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCM(); //根据需要检测忙LCM_Data = WCLCM;LCM_RS = 0;LCM_RW = 0;LCM_E = 0;LCM_E = 0;LCM_E = 1;}/*=========================================================== =========//读数据============================================================= =========*/unsigned char ReadDataLCM(void){LCM_RS = 1;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;return(LCM_Data);}/*=========================================================== =========正常读写操作之前必须检测LCD控制器状态:E=1 RS=0 RW=1;DB7: 0 LCD控制器空闲,1 LCD控制器忙。

(完整版)基于51单片机的超声波测距系统设计

(完整版)基于51单片机的超声波测距系统设计

完满 WORD 格式整理1设计任务本文采纳超声波传感器 ,IAP15 单片机以及 LCD显示模块设计了一种超声波测距显示器,能够实现丈量物体到仪器距离以及显示等功能。

是一种构造简单、性能稳固、使用方便、价钱便宜的超声波距离丈量器,拥有必定的适用价值。

2设计思路超声波测距超声波超声波是指频次在 20kHz 以上的声波,它属于机械波的范围。

最近几年来,跟着电子丈量技术的发展,运用超声波作出精准丈量已成可能。

跟着经济发展,电子丈量技术应用愈来愈宽泛,而超声波丈量精准高,成本低,性能稳固则备受喜爱。

超声波也按照一般机械波在弹性介质中的流传规律,如在介质的分界面处发生反射和折射现象,在进入介质后被介质汲取而发生衰减等。

正是因为拥有这些性质,使得超声波能够用于距离的丈量中。

跟着科技水平的不停提升,超声波测距技术被宽泛应用于人们平时工作和生活之中。

一般的超声波测距仪可用于固定物位或液位的丈量,合用于建筑物内部、液位高度的丈量等。

超声在空气中测距在特别环境下有较宽泛的应用。

利用超声波检测常常比较快速、方便、计算简单、易于实现及时控制,并且在丈量精度方面能达到工业适用的指标要求,所以为了使挪动机器人能够自动闪避阻碍物行走,就一定装备测距系统,以使其及时获得距阻碍物的地点信息(距离和方向)。

所以超声波测距在挪动机器人的研究上获得了宽泛的应用。

同时因为超声波测距系统拥有以上的这些长处,所以在汽车倒车雷达的研制方面也获得了宽泛的应用。

超声波测距原理最常用的超声测距的方法是回声探测法,超声波发射器向某一方向发射超声波,在发射时辰的同时计数器开始计时,超声波在空气中流传,途中遇到阻碍物面阻拦就立刻反射回来,超声波接收器收到反射回的超声波就立刻停止计时。

超声波在空气中的流传速度为340m/s,依据计时器记录的时间 t ,就能够计算出发射点距阻碍物面的距离s,即:s=340t/2 。

因为超声波也是一种声波,其声速 V 与温度有关。

课程设计实验报告-超声波测距仪的设计

课程设计实验报告-超声波测距仪的设计

超声波测距仪的设计一、设计目的本设计利用超声波传输中距离与时间的关系,采用STC51单片机进行控制和数据处理,设计出能够精确测量两点间距离的超声波测距仪。

同时了解单片机各脚的功能,工作方式,计数/定时,I/O口的相关原理,并稳固学习单片机的相关内容知识。

二、设计要求1.设计一个超声波测距仪,能够用四段数码管准确显示所测距离2.精度小于1CM,测量距离大于200CM三、设计器材元器件数量STC51单片机 1个超声波测距模块URF-04 1个电阻〔1K 200 4.7K〕 3 个晶振〔12MHz〕 1 个共阳极四位数码管 1 个极性电容〔33pF〕 2 个非极性电容〔22uF〕 1 个四、超声波测距系统原理331.45米/秒,由单片机负责计时,单片机使用12.0M晶振,所以此系统的测量精度理论上可以到达毫米级。

超声波测距的算法设计: 超声波在空气中传播速度为每秒钟340米〔15℃时〕。

X2是声波返回的时刻,X1是声波发声的时刻,X2-X1得出的是一个时间差的绝对值,假定X2-X1=0.03S,那么有340m×0.03S=10.2m。

由于在这10.2m 的时间里,超声波发出到遇到返射物返回的距离如下:图1 测距原理超声波测距器的系统框图如下列图所示:图2 系统框图五、设计方案及分析〔包含设计电路图〕4.1硬件电路设计4.1.1 单片机最小系统控制模块设计与比拟方案二:采用STC51单片机控制。

STC51单片机是一种低功耗、高性能CMOS8位微控制器,具有 8KB的系统可编程Flash 存储器。

AT89S52具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路,能够满足题目设计的所有要求,而且我们对STC51单片机也比拟熟悉,因此我们选择方案二。

最小系统电路图如图3所示图3 单片机最小系统显示模块设计采用四位共阳极数码管显示,连接电路简单,显示电路连接图如图4所示图4 数码管显示电路超声波测距模块a.本系统采用超声波模块URF04进行测距,该模块使用直流5V供电,理想条件下测距可达500cm,广泛应用于超声波测距领域,模块性能稳定,测度距离精确,盲区〔2cm〕超近。

用51单片机设计超声波测距系统的设计原理和电路(附源程序)

用51单片机设计超声波测距系统的设计原理和电路(附源程序)

---------------------------------------------------------------最新资料推荐------------------------------------------------------用51单片机设计超声波测距系统的设计原理和电路(附源程序)基于51单片机的超声波测距仪说明书引言超声波测距仪,可使用于汽车倒车、建筑施工工地以及一些工业现场的位置监控,也可用于如液位、井深、管道长度的测量等场合。

利用超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量。

利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制。

一、性能要求该超声波测距仪,要求测量范围在0.08-3.00m,测量精度1cm,测量时和被测物体无直接接触,能够清晰稳定地显示测量结果。

二、工作原理及方案论证超声波传感器及其测距原理超声波是指频率高于20KHz 的机械波。

用超声波传感器产生超声波和接收超声波,习惯上称为超声波换能器或超声波探头。

超声波传感器有发送器和接收器.超声波传感器是利用压电效应的原理将电能和超声波相互转化,即在发射超声波的时候,将电能转换,发射超声波;而在收到回波的时候,则将超声振动转换成电信号。

超声波测距的原理一般采用渡越时间法 TOF(timeofflight)。

1/ 14首先测出超声波从发射到遇到障碍物返回所经历的时间,再乘以超声波的速度就得到二倍的声源和障碍物之间的距离。

根据要求并综合各方面因素,采用 AT89C52单片机作为主控制---------------------------------------------------------------最新资料推荐------------------------------------------------------ 器,用动态扫描法实现 LED 数字显示,超声波驱动信号用单片机的定时器完成,超声波测距仪的系统框图如下图所示:图1 超声波测距仪系统设计框图三、系统硬件部分硬件部分主要由单片机系统及显示电路、超声波发射电路和超声波检测接收电路三部分组成。

基于51单片机超声波测距.

基于51单片机超声波测距.

一设计要求(1)设计一个以单片机为核心的超声波测距仪,可以应用于汽车倒车、工业现场的位置监控;(2)测量范围在0.50~4.00m,测量精度1cm;(3)测量时与被测物无直接接触,能够清晰稳定地显示测量结果。

二超声波测距系统电路总体设计方案本系统硬件部分由AT89S52控制器、超声波发射电路及接收电路、温度测量电路、声音报警电路和LCD显示电路组成。

汽车行进时LCD显示环境温度,当倒车时,发射和接收电路工作,经过AT89S52数据处理将距离也显示到LCD 上,如果距离小于设定值时,报警电路会鸣叫,提醒司机注意车距。

超声波测距器的系统框图如下图所示:图5 系统设计总框图由单片机AT89S52编程产生10us以上的高电平,由指定引脚输出,就可以在指定接收口等待高电平输出。

一旦有高电平输出,即在模块中经过放大电路,驱动超声波发射探头发射超声波。

发射出去的超声波经障碍物反射回来后,由超声波接收头接收到信号,通过接收电路的处理,指定接收口即变为低电平,读取单片机中定时器的值。

单片机利用声波的传播速度和发射脉冲到接收反射脉冲的时间间隔计算出障碍物的距离,并由单片机控制显示出来。

由时序图可以看出,超声波测距模块的发射端在T0时刻发射方波,同时启动定时器开始计时,当收到回波后,产生一负跳变到单片机中断口,单片机响应中断程序,定时器停止计数。

计算时间差,即可得到超声波在媒介中传播的时间t,由此便可计算出距离。

图6 时序图三超声波发射和接收电路的设计分立元件构成的发射和接收电路容易受到外界的干扰,体积和功耗也比较大。

而集成电路构成的发射和接收电路具有调试简单,可靠性好,抗干扰能力强,体积小,功耗低的优点,所以优先采用集成电路来设计收发电路。

3.1 超声波发射电路超声波发射电路包括超声波产生电路和超声波发射控制电路两部分,可采用软件发生法和硬件方法产生超声波。

在超声波的发射电路的设计中,我们采用电路结构简单的集成电路构成发射电路:图7 由反相器构成的超声波发射电路图7是由反相器74HC04构成的发射电路,用反相器74HC04构成的电路简单,调试容易,易通过软件控制。

51单片机超声波测距C程序

51单片机超声波测距C程序

51单片机超声波测距C程序(2018-01-26 14:09:10>超声波检测原理超声波测距的程序流程图程序如下://超声波模块程序〃超声波模块程序//Trig = P2A0//Echo = P3A2#in elude <reg52.h>#defi ne uchar un sig ned char#defi ne uint un sig ned int//void delay( uint z>{uint x,y 。

for(x=z 。

x>0。

x-->for(y=110 。

y>0。

y-->。

//void delay_20us(>{uchar a 。

for(a=0。

a<100。

a++>。

}//*********************************************************** ****// 显示数据转换程序void display(uint temp>{uchar ge,shi,bai 。

bai=temp/100 。

shi=(temp%100>/10 。

ge=temp%10。

wela=1 。

P0=0xf7。

wela=0 。

dula=1 。

P0=table[bai] 。

delay(1> 。

dula=1 。

P0=0x00 。

// 关位码dula=0 。

wela=1 。

P0=0xef 。

wela=0 。

dula=1 。

P0=table[shi] 。

dula=0 。

delay(1> 。

dula=1 。

P0=0x00。

// 关位码dula=0 。

dula=1 。

P0=table[ge] 。

dula=0 。

wela=1 。

P0=0xdf 。

wela=0。

dula=1 。

P0=0x00。

// 关位码dula=0 。

}//***************************************************************void main(>{uint distance 。

基于51单片机的超声波测距仪设计

基于51单片机的超声波测距仪设计

基于51单片机的超声波测距仪设计摘要:本方案以stc89c52为核心,通过编程(C语言)来实现该单片机对外围电路的适时控制,并提供给外围电路各种所需的信号和接收超声波反射回来的微小信号,包括频率振荡信号,时钟信号,数据处理信号和显示信号等等。

其核心功能是对距离的检测并实时的进行距离的显示,在检测距离方面通过发射端与接收端的时间差来计算,理论上所测距离与其时间差成线性关系,所以可以通过线性回归统计方法求出实际距离与所求距离的关系。

该电路简化了一些外围电路,任能做到较为精确的测量工作,由于是采用程控操作,所以其移植性和可扩展性还是较好。

在设计时分,分模块进行设计来实现各部分功能,简化了在设计过程中的调试难度。

关键词:超声波测距、单片机控制、液晶显示、距离报警、线性回归Abstract:This program stc89c52 programming (C language) to achieve the timely control of the single-chip peripheral circuits, and made available to the peripheral circuits of the desired signal and receiving the ultrasonic reflected the small signal, including frequency oscillation signal, the clock signal, data signal processing and display signals, and so on. The its core function is to to the detection of pairs the distance and real-time of the carried out the distance the display of goes as follows. In the to calculate the, in the the detection distance aspects of through the launch of the-side with the the time of the the receiving end is poor, in theory, the measured distance with its time difference into a linear the relationship between,, so can through the the linear regression statistical methods calculate the actual distance of the seek distance relationship. The circuit simplifies the peripheral circuit, any more accurate measurements can be done, because it is programmed operation, its portability and scalability better. Hours of the design, the sub-module design to achieve the function of each, and simplifies the debugging difficulty in the design process.1Keywords:Ultrasonic Ranging, MCU control, LCD, alarm of distance ,linear regression目录1前言 (4)1.1 课题的研究背景和意义 (4)1.2 课题的国内外研究现状 (4)2 总体方案设计 (5)2.1超声波测距的原理 (5)2.2超声波传感器的工作原理及结构图 (5)3单元模块设计 (6)3.1各单元模块功能介绍及电路设计 (6)3.2 AT89S52型单片机介绍 (7)3.3各单元模块的联接 (9)4 软件设计 (16)4.1软件设计分析 (16)4.2软件设计思路 (16)4.2.1主程序 (16)4.2.2 超声波测距子程序 (17)4.2.3 超声波延时子程序 (18)5系统调试 (19)5.1硬件调试 (19)5.2硬软件联调 (20)5.3测试结果分析 (21)5.3.1测试波形 (21)5.3.2测试中仪器仪表 (22)5.3.3 数据分析 (22)5.4超声波测距误差分析 (23)5.4.1温度误差 (23)5.4.2串扰问题 (23)6 结论 (24)6.1总结与体会 (24)6.2 对设计的进一步完善提出意见或建议 (24)附录一、相关设计程序 (27)附录二、设计图和PCB (36)附录三、实物图 (37)231前言1.1 课题的研究背景和意义超声波是指频率高于20KHz的声波,属于机械波的范畴,遵循一般机械波在弹性介质中的传播规律,如在介质的分界面处发生反射和折射现象,在进入介质后被介质吸收而发生衰减等,正是因为有这些性质,使得超声波可以用于距离的测量,随着经济的发展,科技水平的不断提高,电子测量技术应用越来越广泛,超声波测量精度高,成本低,性能稳定则备受青睐,超声波测距技术被广泛的应用于人们生活和工作中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于51单片机的超声波测距仪说明书
引言
超声波测距仪,可使用于汽车倒车、建筑施工工地以及一些工业现场的位置监控,也可用于如液位、井深、管道长度的测量等场合。

利用超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量。

利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制。

一、性能要求
该超声波测距仪,要求测量范围在0.08-3.00m,测量精度1cm,测量时和被测物体无直接接触,能够清晰稳定地显示测量结果。

二、工作原理及方案论证
超声波传感器及其测距原理
超声波是指频率高于20KHz的机械波。

用超声波传感器产生超声波和接收超声波,习惯上称为超声波换能器或超声波探头。

超声波传感器有发送器和接收器.超声波传感器是利用压电效应的原理将电能和超声波相互转化,即在发射超声波的时候,将电能转换,发射超声波;而在收到回波的时候,则将超声振动转换成电信号。

超声波测距的原理一般采用渡越时间法TOF(timeofflight)。

首先测出超声波从发射到遇到障碍物返回所经历的时间,再乘以超声波的速度就得到二倍的声源和障碍物之间的距离。

根据要求并综合各方面因素,采用AT89C52单片机作为主控制
器,用动态扫描法实现LED数字显示,超声波驱动信号用单片机的定时器完成,超声波测距仪的系统框图如下图所示:
图1 超声波测距仪系统设计框图
三、系统硬件部分
硬件部分主要由单片机系统及显示电路、超声波发射电路和超声波检测接收电路三部分组成。

1.单片机系统及显示电路
单片机采用AT89C52来实现对CX20106A红外接收芯片和TCT40-10系列超声波转换模块的控制。

单片机通过P1.1引脚发射脉冲控制超声波的发送,然后单片机不停的检测外中断0口INT0引脚,当INT0引脚的电平由高电平变为低电平时就认为超声波已经返回。

计数器所计的数据就是超声波所经历的时间,通过换算就可以得到传感器和障碍物之间的距离。

显示电路采用简单实用的4位共阳LED数码管,段码用74LS244驱动,位码用PNP三极管驱动。

单片机系统及显示电路如下图所示:
X T A L 2
18X T A L 119A L E 30E A
31P S E N 29R S T
9P 0.0/A D 039P 0.1/A D 138P 0.2/A D 237P 0.3/A D 336P 0.4/A D 435P 0.5/A D 534P 0.6/A D 633P 0.7/A D 732P 1.0/T 21P 1.1/T 2E X 2P 1.23P 1.34P 1.45P 1.56P 1.67P 1.7
8P 3.0/R X D 10P 3.1/T X D 11P 3.2/I N T 012P 3.3/I N T 113P 3.4/T 014P 3.7/R D
17
P 3.6/W R 16P 3.5/T 115P 2.7/A 15
28
P 2.0/A 821P 2.1/A 922P 2.2/A 1023P 2.3/A 1124P 2.4/A 1225P 2.5/A 1326P 2.6/A 1427U 1
A T 89C 52
Q 1
9012
Q 3
9012
Q 4
9012
Q 2
9012
1A 021A 141A 261A 382A 0112A 1132A 2152A 3171O E 12O E
191Y 0181Y 1161Y 2141Y 3122Y 092Y 172Y 252Y 33
U 2
74L S 244
R
510
510
R 1
4.7K
R 2
4.7K
R 3
4.7K
R 4
4.7K
V c c C 13.3u
X T 112M
S 1
C 3
20p
R 8
10K
C 2
20p
G N D
图2 单片机系统及显示电路
2.超声波发射电路
利用555时基电路振荡产生40kHz的超声波信号,使之和换能器的40kHz固有频率一致。

12V电源保证555时基具有足够驱动能力。

P1.1为超声波发射控制信号,由单片机控制。

发射电路如图3所示:
图3 超声波发射电路原理图
3.超声波检测接收电路
超声波接收电路采用集成电路CX20106A,这是一款红外线检波接收的专用芯片,常用于电视机红外遥控接收器。

考虑到红外遥控常用的载波频率38KHz和测距超声波频率40KHz较为接近,可以利用它作为超声波检测电路。

实验证明其具有很高的灵敏度和较强的抗干扰能力。

适当改变C4的大小,可改变接受电路的灵敏度和抗干扰能力。

接收电路如图4所示:
图4 超声波接收电路图
四.系统软件部分
超声波测距程序设计软件部分主要由主程序,超声波发射子程序,超声波接受中断程序及显示子程序组成。

下面对超声波测距仪的算法,主程序,超声波发射子程序和超声波接受中断程序逐一介绍。

1.超声波测距仪的算法设计
下图示意了超声波测距的原理,即超声波发生器T在某一时刻发出的一个超声波信号,当超声波遇到被测物体后反射回来,就被超声波接收器R所接受。

这样只要计算出发生信号到接受返回信号所用的时间,就可算出超声波发生器和反射物体的距离。

距离计算公式:d=s/2=(c*t)/2
*d为被测物和测距器的距离,s为声波的来回路程,c为声速,t为
声波来回所用的时间
2.主程序
主程序框图如右图所示:
主程序首先对系统环境初始化,设置定时
器T0工作模式为16位的定时计数器模式,
置位总中断允许位EA并给显示端口P0和
P2清0。

然后调用超声波发生子程序送出
一个超声波脉冲,为避免超声波从发射器
直接传送到接收器引起的直接波触发,需
延迟0.1ms(这也就是测距器会有一个最
小可测距离的原因)后,才打开外中断0接
收返回的超声波信号。

由于采用12MHz的
晶振,机器周期为1us,当主程序检测到接收成功的标志位后,将计数器T0中的数(即超声波来回所用的时间)按下式计算即可测得被测物体和测距仪之间的距离,设计时取20℃时的声速为344m/s则有:d=(C*T0)/2=172T0/10000cm(其中T0为计数器T0的计数值)测出距离后结果将以十进制BCD码方式LED,然后再发超声波脉冲重复测量过程。

3.超声波发生子程序和超声波接收中断程序
超声波发生子程序的作用是通过P1.1端口发送超声波发射控制脉冲信号,同时把计数器T0打开进行计时。

超声波测距器主程序利用外中断0检测返回超声波信号,一旦接收到返回超声波信号(INT0引脚出现低电平),立即进入中断程序。

进入该中断后就立即关闭计时器T0停止计时,并将测距成功标志字赋值1。

如果当计时器溢出时还未检测到超声波返回信号,则定时器T0溢出中断将外中断0关闭,并将测距成功标志字赋值2以表示此次测距不成功。

五.软硬件调试及性能
超声波发射和接收采用Φ15的超声波换能器TCT40-10F1(T发射)和TCT40-10S1(R接收),中心频率为40kHz,保持两换能器中心轴线平行并相距4~8cm。

主要性能指标:测距仪能测的范围为0.08~3.00m,测距仪精度1cm。

程序清单
以下是用汇编语言编写的超声波测距控制源程序:
采用MH晶振
显示缓冲单元在40H~43H,使用内存、、用于计算距离用于标志
脉冲输出端口
中断入口程序
主程序
为显示数据存放单元(
为最高位)

位自动重装模式,为位定
时器
初值
初值
;超声波脉冲个数控制(为赋值的一半)
开启测距定时器
收到反射信号时标志位为
;计算距离子程序
;重新开启测距定时器
;测量间隔控制(约

中断程序
中断,中断一次
启动计时器,用以计算超声波来回时间
开启发超声波用定时器
中断,发超声波用
;超声波发送完毕,关
;开启接收回波中断
外中断,收到回波时进入
;关计数器
;将计数值移入处理单元
;接收成功标志
延时程序
显示程序
为最高位,为最低位,先扫描高位

;共阳数码管不亮,—
距离计算程序计算值×m近似
最高位为,不点亮
;此高位为,先看最高位是否为不亮
;最高位不亮,次高位也不亮
次高位为,先看次高位是否为不亮
;次高位不亮,次高位也不亮
两字节无符号数乘法程序
四字节两字节无符号数除法程序
附程序。

相关文档
最新文档