蓝桥杯单片机之超声波

首先看原理图


这里的超声波模块主要是介绍的是蓝桥杯板子上的超声波模块,超声波的原理其实很简单的,就是由于单片机一个引脚连接到发射模块,就可以利用这个引脚来发出一定频率的信号,而在,而在发射模块发射出的超声波被接受回来之后,就会在接收端连接的一极产生下降沿,我们利用一个定时器来计数,记录下来回的时间,然后根据声音传播速度来算出距离,这里超声波的速度和我们声音速度差不多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;
}


猜你喜欢

转载自blog.csdn.net/private_void_main/article/details/79513145