该设计控制器使用的是单片机STC89C52, STC89C52单片机在工控、测量、仪器仪表中应用还是比较广泛的。显示模块是用LCD1602实现距离显示。蜂鸣器用来实现当测量距离超过设定的上限时的报警功能。附件中包含源程序,原理图,PCB,元件清单和一份资料。大家尽管下载学习,包你学会。
实物测试图如下,,最远测试距离为5m。程序流程图如下
本次设计的超声波测距采用的是超声波模块HC-SR04,HC-SR04超声波模块性能稳定,测度距离精确,模块高精度,盲区小。 产品应用领域: 常用于机器人避障、物体测距、液位检测、公共安防、停车场检测等场所。
该设计控制器使用的是单片机STC89C52, STC89C52单片机在工控、测量、仪器仪表中应用还是比较广泛的。显示模块是用LCD1602实现距离显示。蜂鸣器用来实现当测量距离超过设定的上限时的报警功能。
测试分为三部分,第一部分为测试距离小于50cm;第二部分为测试距离小于200cm,大于50cm;第三部分为测试距离大于200cm。
测试距离小于50cm如图5-1所示;
测试距离小于200cm,大于50cm如图5-2所示;
测试距离大于200cm如图5-2所示;
图5-1测试距离小于50cm
图5-2测试距离小于200cm,大于50cm
图5-3测试距离大于200cm
5.2数据分析
通过多次测量,得到最终的距离测试范围0~500cm,但测量出来的距离与实际距离有±1-2cm的误差。经过查资料了解,是因为超声波在空气中的传播速度与温度有关,如果温度变化不大,则可认为声速是基本不变的;但实际中温度总会变化,所以测出的距离与实际会有误差。如果要解决温度对超声波速度的影响,可采用温度补偿。
部分单片机代码如下:
- #include <reg52.h>
- #include<intrins.h>
- #include"lcd.h"
- sbit Trig = P2^3;
- sbit Echo = P2^4;
- sbit beep=P1^4;
- unsigned char PuZh[]=" 3172052052208 ";
- unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
- static unsigned char DisNum = 0; //显示用指针
- unsigned int time=0;
- unsigned long S=0;
- bit flag =0;
- unsigned char disbuff[4] ={ 0,0,0,0,};
- void Conut(void)
- {
- time=TH0*256+TL0;
- TH0=0;
- TL0=0;
- S=(time*1.7)/100; //算出来是CM
- if((S>=500)||flag==1) //超出测量范围显示“-”
- {
- flag=0;
- DisplayOneChar(0, 1, ASCII[11]);
- DisplayOneChar(1, 1, ASCII[10]); //显示点
- DisplayOneChar(2, 1, ASCII[11]);
- DisplayOneChar(3, 1, ASCII[11]);
- DisplayOneChar(4, 1, ASCII[12]); //显示M
- }
- else
- {
- disbuff[0]=S%1000/100;
- disbuff[1]=S%1000%100/10;
- disbuff[2]=S%1000%10 %10;
- DisplayOneChar(0, 1, ASCII[disbuff[0]]);
- DisplayOneChar(1, 1, ASCII[10]); //显示点
- DisplayOneChar(2, 1, ASCII[disbuff[1]]);
- DisplayOneChar(3, 1, ASCII[disbuff[2]]);
- DisplayOneChar(4, 1, ASCII[12]); //显示M
- }
- }
- void zd0() interrupt 1 //T0中断用来计数器溢出,超出测距范围
- {
- flag=1; //中断溢出标志
- }
- void StartModule() //启动模块
- {
- Trig=1; //启动一次模块
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- Trig=0;
- }
- void delayms(unsigned int ms)
- {
- uint i,j;
- for(i=ms;i>0;i--);
- for(j=114;j>0;j--);
- }
- void delay10us(void)
- {
- unsigned char a,b;
- for(b=1;b>0;b--)
- for(a=2;a>0;a--);
- }
- void main(void)
- {
- TMOD=0x01; //设T0为方式1,GATE=1;
- TH0=0;
- TL0=0;
- ET0=1; //允许TO中断
- EA=1; //开启总中断
- LcdInit();
- LcdShowStr(0,0,PuZh);
- while(1)
- {
- StartModule();
- while(!Echo); //当RX为零时等待
- TR0=1; //开启计数
- while(Echo); //当RX为1计数并等待
- TR0=0; //关闭计算
- Conut(); //计算
- delayms(80);
- beep=~beep;
- if(S>=200)
- {
- beep=0;
- delay10us();
- }
- else
- {
- if((S<200)&&(S>50))
- {
- beep=1;
- delayms(8000);
- beep=0;
- delayms(2000);
- }
- else
- {
- if((S>=0)&&(S<=50))
- {
- beep=1;
- delayms(1000000);
- beep=0;
- delayms(500000);
- }
- }
- }
- }
- }
复制代码
全部资料51hei下载地址:
超声波测距.zip
(2.07 MB, 下载次数: 62)
|