#include <STC15F2K60S2.H>
#include "intrins.h"
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
void CSB(void)
{
unsigned int S = 0;
if(flag_T0 >6) //2ms
{
flag_T0 =0;
TX = 1;somenop;TX = 0;somenop;TX = 1;somenop;TX = 0;somenop; TX = 1;somenop;TX = 0;somenop; TX = 1;somenop;TX = 0;somenop;
TR1 = 1;
while((RX==1)&&(TF1==0));
TR1 = 0;
if(TF1){S=999;TF1=0;}
else
{
S = (TH1<<8)|TL1;
S = (unsigned int)(S*0.017);
S = S/12;
}
TH1= 0;
TL1= 0;
}
displaysmg6(S%1000/100);
displaysmg7(S%100/10);
displaysmg8(S%10);
}
本次程序使用的单片机是基于蓝桥杯的stc15f260s2,超声波模块跟单片机型号无关,其工作原理相同,这里我使用定时器定时读取,定时器1作为计数
①超声波模块发送引脚发送一个10us以上的高电平,而后在拉低(这里可以多发几次,时间也可以稍微长些)
②打开定时器1开始计数
③判断echo引脚是否接收到信号,(收到信号echo引脚会被拉低)或者定时器计数是否溢出
④假设超声波echo引脚接受到信号,则关闭定时器计数,
⑤TH1和TL1都是8位重装载寄存器,将其放到一个16位的变量中进行计算
⑥S=((340*10)✘(t/10的六次方))/2=0.017*t
(哈哈哈哈当时写的太快,代码中的时间直接用s存储了,现在是手机编辑 懒得回去改了)