关键词不能为空

当前您在: 主页 > 英语 >

基于51单片机的HC_SR04超声波测距系统制作

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-09 07:59
tags:

-

2021年2月9日发(作者:toxicity)


Word


格式



基于< /p>


51


单片机带温度补偿的


HC- SR04


超声波测距系统




利用从网上购买的


HC- SR04


超声波模块制作了一个测距装置,


HC-SR04


自身不带温度补偿功能,所以


加上一个使用


DS18B20


做的温度测量模块。整个系统包括:


51


单片机最小系统,超声波测距模块、温度测


量模块、液晶显示模块。使 用了如下主要元器件:



元件



STC90C516RC


HC-SR04


DS18B20


lcd1602




系统电路图







51


单片机



超声波测距模块



温度测量模块



液晶显示模块



说明



数量



1


1


1


1




























完美整理



Word


格式




51


单片机最小系统



单片机型号:


STC90C516


,晶振:

< p>
12Mhz


。自己动手焊接的最小系统板。




LCD1602A


液晶显示模块:




















完美整理



Word


格式



HC-SR04


超声波测距模块



HC-SR04


超声波测距模块可提供


2cm



400cm


的非接触式距离感 测功能,测距精度可达


3mm


;模块自


身包括超声波发射器、接收器与控制电路。




实物正反两面图



HC- SR04


电气参数:





HC- SR04


工作原理及说明:



1





Trig


触发控制信号


IO


端口至少


10us


的高电平信号;


2




模块自动发送


8



40khz


的方波,并自动检测是否有信号返回;



3




有信号 返回时,


Echo


回响信号输出端口输出一个高电平,高电平持 续的时间就是超声波从发射到


返回的时间;



4




两次测 距时间间隔最少在


60ms


以上,以防止发射信号对回响信号的 影响;




超声波时序图




















完美整理



Word


格式



单片机控制


HC- SR04


超声波测距说明:




原理图中,单片机的


P1.7


口接

< p>
HC-SR04



Trig


端口,


P1.6


口接


HC-SR04



Echo


端口,超声波在传


播时碰到障碍物即返回,


HC-SR04


模块收 到回波信号后


Echo


口输出一个高电平,

单片机检测到高电平后即


启动计数器开始计数,直到单片机检测到

< br>Echo


口变成低电平后结束计数,计数器的计数值乘以单片机计


数周期就是超声波从发射到接收的往返时间,即距离


S=v*t/2

< p>




由于在室温下,声 速受温度的影响,其变化关系为:


V=334.1+T*0.61(T

< br>为当前温度


)


,利用


DS18B 20


温度传感器可以得到环境温度,补偿温度对声速的影响。当温度高于


26


度或低于


14


度时,上述 公式不能


完全满足对测量的修正了,所以高于


26


度时取


26


度,低于


14< /p>


度时取


14


度。




距离计算公式为:


S=(334.1 +T*0.61)*N*T


0


/2



T


:当前环境温度值




N


:计数值




T


0


:单片 机计数周期


=


晶振频率


/12(


微秒


)




HC-SR04


测量存在不稳定性,


所 在对同一距离进行多次测量,并对测量结果排序,去除最大和最小值,


将余下的求平均值 。




程序流程图:



















完美整理



Word


格式




程序代码:



/*


*


程序:基于


HC- SR04


的超声波测距系统



*


单片机型号:


STC90C516 12MHz


*


说明:按下


K1

< br>键后,指示灯点亮,开始连续进行


7


次超声波测距,每次 测距间隔


80ms




*


完成后对


7


次结果排序并将最大的


2


个数值和最小的


2


个数值去除,对剩余的



* 3


个数值取平均值。


完成后指示灯灭,


输出结果到


LCD1602

< br>上。


测量超出范围则发出报警声。



*


使用两个


IO


端口控制


HC- SR04


触发信号输入和回响信号输出,



*


以及一个


T0


定时器用于时间计数。



* < /p>


使用


DS18B20


测量环境温度,声速 公式:


V=334.1m/s+Temperature*0.61



*


单片机晶振 为


12Mhz(11.953M)


,计数时为

< br>T=1us


*


计算公式:


S=(334.1m/s+Temperature*0.61)*N*T/2



N


为计数值


=TH0*256+T L0


*/



/*


包含头文件


*/


#include


#include


















完美整理



Word


格式




#define Delay4us(){_nop_();_nop_();_nop_();_nop_();}


/*


宏定义


*/


#define uchar


unsigned char




//


无符 号


8




#define uint


unsigned int



//


无符号


16




#define ulong


unsigned long


//

无符号


32





/*


全局变量定义


*/


sbit K1=P1^0;



< /p>


//


按下


K1


后 ,开始测距



sbit LEDRed=P1^1;


//


测距指示灯,亮表示正在测距,灭表示测距完成


sbit BEEP=P1^5;


//


报警测量超出范围




sbit Trig=P1^7;


//HC-SR04


触发信号输入



sbit Echo=P1^6;


//HC- SR04


回响信号输出




float xdata DistanceValue=0.0;


//


测量的距离值



float xdata SPEEDSOUND;




//


声速



float xdata XTALTIME;





//


单片机计数周期



uchar xdata stringBuf[6];




//


数值转字符串缓冲





//LCD1602


提示信息



uchar code Prompts[][16]=


{



{


//


测量 距离




{


/ /


超出测量范围



< br>{


//


测距最大值


400cm



{


//


测距 最小值


2cm



{



//


清屏




{


//


按键开始测量

< br>


};


uchar xdata DistanceText[]=


测量结果字符串



uchar xdata TemperatureText[]=


测量温度值




/*


外部函数声明


*/


extern void LCD_Initialize();


extern void LCD_Display_String(uchar *, uchar);


extern void ReadTemperatureFromDS18B20();


extern int xdata CurTempInteger;




//


毫秒延时函数



void DelayMS(uint ms);


//20


微秒延时函数



void Delay20us();


//HCSR04


初始化



void HCSR04_Initialize();


















完美整理



Word


格式



//


测量距离



float MeasuringDistance();


//


测距的数值排序求平均



float DistanceStatistics();


//


输出距离值到


LCD1602


上< /p>



void DisplayDistanceValue(float dat);


//


将无符号的整数转成字符串,返回字符串长度,不包括


'0'

< p>
结束符



uchar UnsigedIntToString(uint value);


//


蜂鸣器



void Beep(uchar time);


//


显示温度值



void DisplayTemperatureValue();







//


测量距离



float MeasuringDistance()


{



//


最大定时时间约


65ms



TH0=0;



TL0=0;





//


生成


2 0us


的脉冲宽度的触发信号




Trig=1;






Delay20us();



Trig=0;




//


等待回响信号变高电平




while(!Echo);




TR0=1;



//


启动定时器


0




//


等待回响信号变低电平




while(Echo);





TR0=0;



//


关闭定时器


0




//


返回距离值


(mm)



return (SPEEDSOUND*XTALTIME *((float)TH0*256+(float)TL0))/2000;


}



//HCSR04


初始化



void HCSR04_Initialize()


{



//


计算单片机计数周期



晶振


=11.953M


单位


us



XTALTIME=12/11.953;


















完美整理



Word


格式




//


温度


2 5


度时声速的值




SPEEDSOUND=334.1+25*0.61;







Trig=0;



Echo=0;



TMOD=0x01;


}



//


输出距离值到

< br>LCD1602




void DisplayDistanceValue(float dat)


{



uchar i=0,j=0,len;



uint value;



value=(uint)dat;



//


范围检查大于


4000mm


和小 于


20mm


都为超出测量范围




if(value>4000)



{




LCD_Display_String(Prompts[1],0x00);




LCD_Display_String(Prompts[2],0x40);




Beep(2);




}



else if(value<20)



{




LCD_Display_String(Prompts[1],0x00);




LCD_Display_String(Prompts[3],0x40);




Beep(2);



}



else



{




//


将数值转换成字符串





len=UnsigedIntToString(value);




//


保留


1


位小数





while(stringBuf[i]!='0')




{





if(len-j==1)





{






DistanceText[6+j]='.';






j++;





}else





{






DistanceText[6+j]=stringBuf[i];






i++;






j++;





}




}




DistanceText[6+j]='c';




j++;


















完美整理



Word


格式





DistanceText[6+j]='m';




i=7+j;




//


剩余位置补空格





while(i<16)




{





DistanceText[i]=' ';





i++;





}




//LCD_Display_String(Prompts[0],0x00);




LCD_Display_String(DistanceText,0x40);



}


}



//


显示温度值



void DisplayTemperatureValue()


{



TemperatureTex t[13]=CurTempInteger/10+'0';


TemperatureText[14]=CurTempInteger%10+'0';



TemperatureText[15]='C';



LCD_Display_String(Temperat ureText,0x00);



}



//


将无符号的整数转成字符串,返 回字符串长度



uchar UnsigedIntToString(uint value)


{



uchar i=0,t,length;



//


从个位开始转换




do



{




stringBuf[i]='0'+value%10;




value=value/10;




i++;



}while(value!=0);



length=i;



//


将字符串颠倒顺序




for(i=0;i<(length/2);i++)



{




t=stringBuf[i];




stringBuf[i]=stringBuf[length-i-1];




stringBuf[length-i-1]=t;




}



stringBuf[length]='0';



return length;


}



//


蜂鸣器



















完美整理



-


-


-


-


-


-


-


-



本文更新与2021-02-09 07:59,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/619898.html

基于51单片机的HC_SR04超声波测距系统制作的相关文章