距离蓝桥杯单片机省赛还有7天
本次介绍的模块是超声波模块,将使用定时器1和PCA进行距离的测量。如果对PCA还未了解的,可以打开官方给的芯片数据手册,自行查看。
一、超声波测量原理
二、产生8个40KHz的超声波
void Init_wave()
{
unsigned char i;
for(i = 0;i < 8;i++)
{
TX = 1;
Delay12us();//延时函数STC里面生成
TX = 0;
Delay12us();
}
}
三 、发送超声波并检测返回的超声波,并且测量距离
/*利用定时器1进行距离测量*/
unsigned int read_Sonic()
{
unsigned int timer;
TMOD &= 0x0f;
TMOD |= 0x10;//定时器1的16位模式
TH1 = TL1 = 0;
ET1 = 0;//关闭中断
TR1 = 0;//停止计时
Init_wave();//发送超声波
TR1 = 1;//发送完毕开始计时
while((RX == 1) && (TF1 == 0));//进行等待,接收到返回的超声波或计数器溢出,退出等待
TR1 = 0;
if(TF1 == 0)//已接收到声波
{
timer = (TH1 << 8) | TL1;
return (timer*0.0172);//返回测量的距离
}
else//计数器已经溢出
{
TF1 = 0;
return 0;
}
}
/*利用PCA进行超声波测量*/
unsigned int read_Distance()
{
unsigned int timer;
CMOD = 0x00;//传统的12T模式,即SYSclk/12
CL = CH = 0;
CCON = 0x00;//清除溢出标志位和停止计时
Init_wave();
CR = 1;//开始计时
while((RX == 1) && (CF == 0));
CR = 0;
if(CF == 0)
{
timer = (CH << 8) | CL;
return (timer*0.0172);
}
else
{
CF = 0;
return 0;
}
// CF//溢出标志位
// CR//启动计数
}
四、注意事项
为了防止测量次数太频繁,导致上一次测量的数据未处理完毕,又进行一次新的测量,打断了上一次的数据,从而导致测量不稳定。所以因将测量函数放中断里面,隔一段时间测量一次,个人建议是200ms测量一次。
提示:以上为个人观点,仅供参考,如有说错的地方,请校正指出,共同交流进步。