超声波测距
超声波模块如上图所示,有4个引脚,VCC, GND, Trig, Echo。
时序如下:当Trig给一个10us的脉冲,超声波信号开始发出,同时,Echo变为高电平,当Echo回到低电平时,测距完成,所以只需要在Echo高电平时开启定时器,在Echo回低电平的时候测时间,然后通过时间测距。
代码如下:
#include <REGX52.H>
#include <INTRINS.H>sbit Trig = P2^0;
sbit Echo = P2^1;void Delay10us() //@12.000MHz
{unsigned char i;_nop_();i = 2;while (--i);
}void Timer0_Init(void)
{TMOD &= 0xF0; //设置定时器模式TMOD |= 0x01; //设置定时器模式TL0 = 0; //设置定时初始值TH0 = 0; //设置定时初始值TF0 = 0; //清除TF0标志TR0 = 0; //定时器0开始计时
}void Timer_state(unsigned char flag)
{TR0 = flag;
}void Timer_counter(unsigned int value)
{TL0 = value%256;TH0 = value/256;
}unsigned int get_Time()
{unsigned int Time;Time = (TH0<<8) | TL0;return Time;
}unsigned int get_distance()
{unsigned int time,distance;Trig = 1;Delay10us();Trig = 0;while(Echo == 0);Timer_counter(0);Timer_state(1);while(Echo == 1);time = get_Time();Timer_counter(0);Timer_state(0);distance = (int)time * 0.017;return distance;
}