超声波接收器:当接收到一段40KHz的频率时,会在第7角(N_B1)产生一个低电平下降脉冲。
N_A1==P10 N_B1==P11
步骤:(根据超声波只能接收40KHz的脉冲频率下手)
- 利用定时器由超声波发送引脚发出一段40KHz左右的频率脉冲
- 重新给定时器赋初值,超声波接收器等待接收由超声波发送引脚发出的40KHz的频率脉冲,并会在第7角(N_B1)产生一个低电平下降脉冲。
//定时器初始化(12us计时)
//函数参数:定时器1初始化
//入口参数:无
//返回值:无
//函数功能:设置系统频率为 12.000MHz,设置定时时长为 12us, \
定时器模式为 16 位自动重载(模式0),定时器时钟分频为 12T( FOSC/12)\
用于超声波发送器发出特定的40KHz的脉冲频率。
void Timer0_Init(void) //12微秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式,单片机系统时钟为12MHz
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xF4; //设置定时初始值
TH0 = 0xFF; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 0; //定时器0开始计时
}
//超声波模块测距
#include <STC15F2K60S2.H>
sbit TX = P1^0; //发送引脚
sbit RX = P1^1; //接收引脚
unsigned char Read_ultrasonic(void)
{
unsigned char ucDist,Num = 10;
TX = 0;
TL0 = 0xF4; //设置定时初始值
TH0 = 0xFF; //设置定时初始值,产生12us计数
TR0 = 1; //定时器1开始计时
while(Num--)//发送一段40KHz左右的脉冲信号
{
while(!TF0);//溢出标志位
TX ^= 1;//电平反转
TF0 = 0;//清除定时器0标志位
}
TR0 = 0; //暂停定时器0
TL0 = 0; //重新设置定时初始值
TH0 = 0; //重新设置定时初始值
TR0 = 1; //开启定时器0
while(RX && !TF0);//等待超声波接收器接收到一个40KHz的脉冲信号,或者是定时器0溢出
TR0 = 0; //立刻暂停定时器0定时计数
if(TF0) //判断是否是定时器0溢出导致的退出等待
{
TF0 = 0; //清除定时器0标志位
ucDist = 255;//返回一个最大无效值
}
else //如果超声波接收器接收到了一个40KHz的脉冲信号,则计算距离
ucDist = ((TH0<<8)|TL0)*0.017;//0.017是由"t(us)*0.000001将时间us转换成s,在*340得到距离单位是m
//,在乘以100将单位m转换成cm,最后/2"得到单程距离;
return ucDist;
}
如
有不妥之处,还请指出,如有补充,洗耳恭听。此笔记仅供参考,如若对你有所帮助,点个赞加个关注呗谢谢,最后祝愿你旗开得胜,金榜题名。