距离蓝桥杯单片机省赛还有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/12CL = 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测量一次。
提示:以上为个人观点,仅供参考,如有说错的地方,请校正指出,共同交流进步。