1.编程思想:
(1)打开定时器开始定时
(2)发射超声波40KHz(每个电平维持100个NOP,一共8周期脉冲)
(3)检测是否有RX的情况,若RX == 0则接收到了反馈的波
(4)停止定时器,读时间
(5)计算距离
2.代码:
#include "ultrasonic.h"
sbit TX = P1 ^ 0; // 发射引脚
sbit RX = P1 ^ 1; // 接收引脚
void Timer0Init(void) // 定时长度12us @12.000MHz
{
AUXR &= 0x7F;
TMOD &= 0xF0;
TL0 = 0xF4;
TH0 = 0xFF;
TF0 = 0;
TR0 = 0;//定时器0停止计时
}
unsigned char Wave_Recv(void)
{
unsigned char ucDist, ucNum = 10;
TX = 0;
TL0 = 0xF4;//设置定时初始值
TH0 = 0xFF;//设置定时初始值
TR0 = 1;//定时器0开始计时
while(ucNum--)
{
while(!TF0);清除TF0标志,TF0=0
TX ^= 1;
TF0 = 0;//清除TF0标志
}
TR0 = 0;//停止定时器
TL0 = 0;//设置定时初始值
TH0 = 0;//设置定时初始值
TR0 = 1;//定时器0开始计时
while(RX && !TF0);//等待收到脉冲
TR0 = 0;//停止定时器
if(TF0)//发生溢出
{
TF0 = 0;//清除TF0标志
ucDist = 255;
}
else
ucDist = ((TH0 << 8) + TL0) * 0.017;//计算距离单位为cm,时间单位为us
return ucDist;
}