蓝桥省赛后继续水——超声波驱动程序

超声波测距的电路图电路图:部分A——跳帽接线部分因为跳帽的P10和P11要分别用跳帽接到N_A1,N_B1;

sbit TX = P1^0;
sbit RX = P1^1;

P10为发送端,P11为接收端。

部分B——超声波发送接收电路

 把发送与接收部分的程序分开写(也是参考了网上的其他人): 发送占空比为50%的方波信号。

发送超声波:

void send_wave(void)        //发送部分是——循环8次,13us的高低电平转换。
{
u8 i;
for(i=0;i<8;i++)
{
TX=1;
Delay12us();_nop_();
TX=0;
Delay12us();_nop_();
}
}

接收并换算测距:(启用定时器1)

u16 Measure(void)
{
u16 time=0,Current_Distance=0;

TMOD=0x01;
TL1=0x00;
TH1=0x00;
EA=0;                        //初始化定时器0,总中断不开启
send_wave();    //P10发送超声波
TR1=1;                       //启动定时器1
while((RX==1)&&(TF1==0));          //等待反射回来的信号被接收

//原因:当CX20106接收到超声波发送的信号会产生一个下降沿信号,若RX==1,表示没有接收完毕,

同时TF1的中断请求标志位==0,即表示没有定时器溢出的中断请求,测量是在容许范围内,测量的值是有效的,这两个条件同时 存在表明没有接收到信号。


TR1=0;          //当程序运行到这里表示接收到信号了。
if(!TF1)          //TF0=0,我们开始换算测量的距离
{
time=TH1;             //计时的值装入变量,time是16位变量,能装下13位定时器的值。
time=(time<<8)|TL1;
Current_Distance=time*0.018;    //换算成距离。
}
else           //否则超出范围,清空溢出的标志,表示测量到了很远的距离大约是999cm(比较随意的一个值)。
{
TF1=0;
Current_Distance=999;
}
EA=1;                                   //开启中断
return Current_Distance;      //返回测量的距离
}

 
原文地址:https://www.cnblogs.com/page71/p/13905731.html