单片机基础模块学习——超声波传感器

一、超声波原理

左边发射超声波信号,右边接收超声波信号

左边的芯片用来处理超声波发射信号,中间的芯片用来处理接收的超声波信号

二、超声波原理图

  • T——transmit 发送
  • R——Recieve 接收
  • U18芯片对输入的N_A1信号进行放大,然后输入给超声波传感器,作用是增强带负载能力 。传递给JS2一个高频的方波信号

    U11芯片如果JS1接收到超声波信号,N_B1输出低电平;如果没有接收到超声波信号,N_B1输出高电平。主要功能是对超声波信号进行处理,以高低电平进行输出。


    使用超声波功能的话,用短接帽将1,3短接,2,4短接

    使用红外功能,将35短接,46短接

    相当于红外和超声波共用P10和P11,使用哪个功能,就将哪个短接


     使用的是40Khz的频率,一个周期有高低电平变换,所以就是80Khz的频率,换算之后就是12.5us


    距离测量原理

     三、模块代码

    #include "ultrasonic.h"
    
    unsigned char Wave_Recv(void)
    {
    	unsigned char ucNum=10;
    	
    	Tx=0;
    	TL0=0xF4;
    	TH0=0xFF;
    	TR0=1;//开始计时
    	/**************************发射部分***************************/
    	while(ucNum--)//每12us,高低电平进行切换,就可以产生40kHZ的方波信号
    	{
    		while(!TF0);//当计时器没到时,等待;当计时器到了,TF0为1时,取反为0,退出循环
    		Tx^=1;//取反
    		TF0=0;//清零
    	}
    	
    	TR0=0;
    	TL0=0;
    	TH0=0;//正计时
    	TR0=1;
    	while(Rx && !TF0);//没接到信号Rx为1,TF0没溢出为1 就会一直循环;接收到信号会退出,溢出会退出循环
    	TR0=0;
    	
    	if(TF0)//说明溢出了也没有接收到信号,可能是距离过远
    		return 255;
    	else
    		return ((TH0<<8)|TL0)*0.017;//单位是cm
    		
    }

    四、主函数代码

    #include "seg.h"
    #include "tim.h"
    #include "led.h"
    #include "init.h"
    #include "ultrasonic.h"
    
    //Seg
    unsigned char pucSeg_Buf[12],pucSeg_Code[9],pucSeg_Pos=0;//字符数组以/0结尾,所以要有9位
    //Ultrasonic
    unsigned char ucDist =0;
    
    
    //Timer
    unsigned long ulms =0;
    unsigned int uiSeg_Dly=0;
    unsigned int uiUltrasonic_Dly=0;
    void Seg_Proc(void);
    void Ultrasonic_Proc(void);
    
    void main(void)
    {
    	Cls_Peripheral();
    	Timer0Init();
    	Timer1Init();
    	EA=1;
    	
    	while(1)
    	{
    		Seg_Proc();
    		Ultrasonic_Proc();
    	}
    
    }
    
    void Seg_Proc(void)
    {
    	if(uiSeg_Dly<200)
    		return;
    	
    	uiSeg_Dly =0;
    	
    	sprintf(pucSeg_Buf,"%-3u     ",(unsigned int)ucDist);//将指定的内容打印到字符数组里
    	Seg_Tran(pucSeg_Buf,pucSeg_Code);
    }
    void Ultrasonic_Proc(void)
    {
    	if(uiUltrasonic_Dly<500)
    		return;
    	
    	uiUltrasonic_Dly =0;
    	ucDist=Wave_Recv();
    }
    void Time_1(void) interrupt 3
    {
    	ulms++;
    	uiSeg_Dly++;
    	uiUltrasonic_Dly++;
    	if(ulms % 2==0)
    	{
    	pucSeg_Pos=(pucSeg_Pos+1)%8;//实现pucSeg_Pos从0-7循环的操作
    	Seg_Disp(pucSeg_Code,pucSeg_Pos);
    	}
    }

    作者:promising-w

    物联沃分享整理
    物联沃-IOTWORD物联网 » 单片机基础模块学习——超声波传感器

    发表回复