HC-SRO4测距模块的程序设计

来源:互联网 发布:java如何防止xss攻击 编辑:程序博客网 时间:2024/05/12 07:58

      主要技术参数:
        1:使用电压:DC5V                   2:静态电流:小于2mA
        3:电平输出:高5V                   4:电平输出:底0V
        5:感应角度:不大于15             6:探测距离:2cm-450cm 

        7:高精度:可达0.3cm

        板上接线方式,VCC、trig(控制端)、  echo(接收端), GND

   工作原理:

(1)采用IO触发测距,给至少10us的高电平信号;

(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;

(3)有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;   

 一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,就可以达到你移动测量的值了~~

当时卖家声称该模块探测距离2-450cm,但是我在实验的时候发现探测距离最大为110cm,也有网友出现了和我类似的情况,个人感觉很可能是模块的问题,同时该模块的测距误差挺大的(声称精度高达0.3cm,实际精度远远低于0.3cm,3块钱能买到多好的东西呢?)


代码如下(该代码试验过,没有问题,大家可以根据自己的管脚设置,稍作修改即可):

#include<reg52.h>#define speed 340                  //预定义声速(m/s)char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};sbit INPUT=P3^2;                 //回声接收端口sbit OUTPUT=P3^1;                //超声触发端口sbit wx=P2^6;                    //数码管锁存器(74hc573)段选,sbit dx=P2^7;                    //数码管锁存器(74hc573)位选long int distance;               //定义距离unsigned int temp;void delay()                      //延时10us{    unsigned char a,b;    for(b=1;b>0;b--)        for(a=2;a>0;a--);}void delayms(unsigned int i)        //延时(ms){ unsigned int j,k; for(j=0;j<i;j++)  for(k=0;k<110;k++);  }void Init()    //定时器初始化{  TMOD=0x01;                    //选择定时器2,设置为16位自动重装模式 TL0=0x18; TH0=0xfc;                    //1ms ET0=1;                             //开定时器2 EA=1;                    //总中断使能}void Init_IO()     // I/O初始化函数{  OUTPUT =1;  INPUT = 1;  temp = 0;  distance = 0;}void ClrData()            //清理数码管 {  P0 = 0xff;             //发送要显示的段码  dx = 1;  dx = 0;  P0 = 0xff;             //发送要显示的位码,只显示一位数字  wx = 1;  wx = 0;  }void Display(unsigned char adress,unsigned char number) //显示函数,adress显示的是地址,number是要显示的数字(共阴极数码管)   { unsigned char i; i=~(0x01<<adress); P0=i; wx=1; wx=0; P0=number; dx=1; dx=0; delayms(1); } void Trig_emit()                                     //出发声波{OUTPUT = 1;delay();                                     //延时10usOUTPUT = 0;}void Measure_Distance()                              //测距函数{unsigned char l;unsigned int h,y;TR0 = 1;while(INPUT)    {        ;    } TR0 = 0;                                             //当input低电平时,说明一次接受完毕,开始计算距离。l = TL0;h = TH0;y = (h << 8) + l;y = y - 0xfc18;                                      distance = y + 1000 * temp;                          //计算总时间(us)TL0 = 0x18; //重新为定时器赋值,为下次接收做准备TH0 = 0xfc;delayms(3);distance = speed * distance / 20000;              //单位cm}void main(){    unsigned int b,c,d,e;  while(1){Trig_emit();                //触发超声波发射while(INPUT == 0)           //等待回声         {             ;         }Measure_Distance();         //计算脉宽并转换为距离    b=(distance/1000);    c=(distance/100)%10;    d=(distance/10)%10;             e=distance%10;ClrData();                  //清理数码管Display(1,table[b]);delayms(1);Display(2,table[c]);delayms(1);Display(3,table[d]-0x80);    //减去0x80,显示小数点delayms(1);Display(4,table[e]);delayms(1);    Init_IO();                  // 参数重新初始化delayms(10);                //延时,两次发射之间要至少有10ms间隔} }void timer0 (void) interrupt 1   //定时器中断函数{TF0 = 0;TL0 = 0x18;TH0 = 0xfc;temp++;if(temp==18)                      //超声波回声脉宽最多18ms{TR0 =0;TL0 = 0x18;TH0 = 0xfc;temp = 0;} }


0 0
原创粉丝点击