蓝桥杯单片机之超声波

2019-04-15 18:34发布

首先看原理图
这里的超声波模块主要是介绍的是蓝桥杯板子上的超声波模块,超声波的原理其实很简单的,就是由于单片机一个引脚连接到发射模块,就可以利用这个引脚来发出一定频率的信号,而在,而在发射模块发射出的超声波被接受回来之后,就会在接收端连接的一极产生下降沿,我们利用一个定时器来计数,记录下来回的时间,然后根据声音传播速度来算出距离,这里超声波的速度和我们声音速度差不多340m/s在使用超声波之前,我们必须将蓝桥杯板子上的J213,24用跳线帽连接好,默认的情况下这几个引脚是连接好的,这样我们就可以用P10来进行发射超声波,然后就是P11这个引脚上面判断是不是有低电平就可以,同时发射电路发射完之后就可以检测引脚的电平变化,也就是这个时候开启定时器计数器,检测到下降沿或者定时器溢出之后就开始下一次的发射,下面是用代码来进行实现.
/***** 先定义一些引脚,然后宏定义一些数据以供我们后面使用 ***/ //位定义 sbit launch = P1^0; //发送超声波 sbit Receive = P1^1; //接受超声波 #define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();} //我们利用定时器1就要设置一下为16位定时器模式 void T1_Init(void){ TMOD = (TMOD&0x0F)|0x10; TH1 = 0; TL1 = 0; } //发射超声波的函数 void sonic_send(void){ unsigned char i = 8,j = 12; while(i--){ launch = 1; while(j--)somenop; j=11; launch = 0; while(j--)somenop; _nop_();_nop_();_nop_();_nop_(); } } //接收超声波并且计算的函数 unsigned int cal_distant(void){ unsigned int distant ; //发送超声波 sonic_send();         //开启定时器 TR1 = 1;         //等待定时器溢出或者铺捉到下降沿 while((Receive==1)&&(TF1==0));         //关闭定时器 TR1 = 0;         //判断是不是定时器溢出,如果是,则我们直接返回9999表示没有检测到 if(TF1==1){         TF1=0;         distant = 9999;         }         //否则根据计数器的时间来计算出距离 else {                 //获取到计数器的值 distant = TH1; distant = (distant<<8)|(TL1);                 //将计数的值重新清零 TH1 = 0; TL1 = 0; //这个是计算出的单位是cm         /*         公式推导:         默认12分频情况下,定时器加1的时间是1us = 1 * 10^(-6)         声音传播速度一个是340m/s,即3.4*10^4 cm/s,注意单程就要除以2         距离 = 定时器的值 * 3.4*10^4 * 10^(-6) /2      = 定时器的值 * 0.017         */ distant = distant*0.017; } return distant; }