void send_wave() { c_send = 1; //10us的高电平触发 delay(); c_send = 0; TH0 = 0; //给定时器0清零 TL0 = 0; TR0 = 0; //关定时器0定时 while(!c_recive); //当c_recive为零时等待 TR0=1; while(c_recive) //当c_recive为1计数并等待 { flag_time0 = TH0 * 256 + TL0; if((flag_time0 > 40000)) //当超声波超过测量范围时,显示3个888 { TR0 = 0; flag_csb_juli = 2; distance = 888; break ; } else { flag_csb_juli = 1; } } if(flag_csb_juli == 1) { TR0=0; //关定时器0定时 distance =flag_time0; //读出定时器0的时间 distance *= 0.017; // 0.017 = 340M / 2 = 170M = 0.017M 算出来是米 if((distance > 500)) //距离 = 速度 * 时间 { distance = 888; //如果大于3.8m就超出超声波的量程 } } }请详细解释以上程序
时间: 2024-04-09 12:32:35 浏览: 225
以上程序是一个发送超声波信号并接收回波的函数。函数的作用是测量超声波的传输时间,并计算出距离。
函数的具体步骤如下:
1. 将发送引脚c_send置高电平,触发超声波的发送。发送持续10微秒。
2. 将发送引脚c_send置低电平。
3. 清零定时器0的计数值,准备开始计时。
4. 关闭定时器0。
5. 当接收引脚c_recive为0时,等待。
6. 打开定时器0,开始计时。
7. 当接收引脚c_recive为1时,进行计数并等待。
8. 读取定时器0的计数值,保存在变量flag_time0中。该值表示超声波传输的时间。
9. 如果flag_time0大于40000(超过测量范围),则表示超声波信号超出了测量范围,将距离distance设为888,并跳出循环。
10. 如果flag_time0在测量范围内,则将flag_csb_juli设为1。
11. 如果flag_csb_juli为1,则关闭定时器0。
12. 将distance赋值为flag_time0乘以0.017,得到距离的单位是米。这里的0.017是通过声速340米/秒除以2得到的。
13. 如果距离大于500米,则将distance设为888,表示超出了超声波的量程。
以上就是该函数的具体实现。它通过测量超声波传输时间来计算距离,并考虑了超声波的测量范围和量程。
阅读全文