蓝桥省赛后继续水——超声波驱动程序
超声波测距的电路图电路图:部分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; //返回测量的距离
}