资源描述:
《HC-SR04超声波测距模块及程序(坤).pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、超声波模块HC-SR04简介以及编程说明:我编写了一个超声波测距模块(HC-SR04)的程序,主要把测距的程序写成函数形式,函数的返回值为所测的距离(为十进制数),单位为毫米(mm)。便于大家嵌入自己开发的主程序中,方便随时调用。函数中调用了单片机的定时器,所以单片机的一个定时器资源已经被占用,但是没有使用外部中断,而是软件查询引脚电平的方式判断回波信号,目的是方便于再接入几个超声波模块,因为单片机的外部中断资源有限。效果:可在3CM-90CM范围内测量,但是远距离误差较大(1cm-2cm),但近距离误差较小。可以根据不同的模块作简单的修正
2、。注:单片机所用的晶振频率为12MHz超声波模块的工作方式:1.给超声波模块接入电源和地。2.给脉冲触发引脚(trig)输入一个长为20us的高电平方波3.输入方波后,模块会自动发射8个40KHz的声波,与此同时回波引脚(echo)端的电平会由0变为1;(此时应该启动定时器计时)4.当超声波返回被模块接收到时,回波引脚端的电平会由1变为0;(此时应该停止定时器计数),定时器记下的这个时间即为超声波由发射到返回的总时长。5.根据声音在空气中的速度为344米/秒,即可计算出所测的距离。注:不同的模块,引脚的标识可能会不一样。2主要技术参数:1:
3、使用电压:DC---5V2:静态电流:小于2mA3:电平输出:高5V,低0V4:感应角度:不大于15度5:探测距离:2CM-450CM6:高精度:可达0.2CM接线方式:VCC、trig(控制端)、echo(接收端)、GND程序:#include#defineuintunsignedint#defineucharunsignedcharsbitTx=P3^2;//产生脉冲引脚,延时20ussbitRx=P3^3;//回波引脚,进入外部中断1。这些引脚可随意改变。bitTimeUp=0;//定时器溢出标志位longTh0,T
4、l0;unsignedlongtime0=0;uintMeasureresult=0;//*****************************************//**********共阴数码管的显示***************unsignedintcodeNumber[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//P0端unsignedintcodePosition[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//P
5、2端uintMeasure(void){charDel20us=0;//延时变量,在超声波脉冲引脚中产生20us的方波charRxBack=1;//超声波返回标志位TMOD=0x01;//定时器工作方式1:16位,初值不能重装Tx=0;//将超声波脉冲引脚电位拉低Th0=0;//初始化变量值Tl0=0;//初始化变量值TimeUp=0;//初始化EA=1;//开总中断ET0=1;//开定时器0中断TR0=0;//关定时器0TH0=0;//赋定时器初始值高8位为0TL0=0;//赋定时器初始值低8位为0Tx=1;//拉高超声波脉冲引脚电位fo
6、r(Del20us=20;Del20us>0;Del20us--);//延时20usTx=0;//拉低超声波脉冲引脚电位,使之产生20us的方波信号,使超声波模块开始工作。while(Rx==0);//等待回波引脚变1;TH0=0;TL0=0;TR0=1;//开定时器0//使用软件查询的方式,检测超声波回波引脚,判断是否有声波返回,避免使用外部中断的形式,便于扩展多个超声波模块。while(RxBack){if(Rx==0
7、
8、TimeUp==1){TR0=0;Th0=TH0;Tl0=TL0;TR0=1;RxBack=0;}}while(!T
9、imeUp);//等待定时器溢出time0=(Th0*256+Tl0);//取出定时器的值Measureresult=((unsignedlong)(344)*time0)/2000;//测量的结果单位为mmif(Measureresult<30
10、
11、Measureresult>900){Measureresult=0;}//过滤掉一些异常的数据,当测量出的距离不在30-900mm时返回值为0returnMeasureresult;}voidT0_time()interrupt1{TimeUp=1;}//以下是一个主函数,用于实时显示所测出的
12、距离。voidmain(){ucharflag=0;uintj=0;uintge,shi,bai;while(1){ge=Measure()%100%10;shi=Measure