基于51单片机的蓝牙舵机控制超声波模块测距开发(二)

                                                    超声波模块篇

引语:本篇将介绍如何使用超声波模块。
最终目的:将51开发板与超声波模块相连,超声波模块的echo引脚将电信号返回给单片机,通过程序判断距离,然后将距离显示在数码管上。
实现效果需要达到的目标:
1.了解SR-04超声波模块的工作原理,并会编写相应程序。

2.将距离显示到数码管上。

材料:51单片机开发板,SR-04超声波模块,杜邦线若干。

51单片机开发板 

我使用的是宋雪松的51开发板,如图。

基于51单片机的蓝牙舵机控制超声波模块测距开发(二)_第1张图片

他的数码管工作原理,我这里就不做过多解释了。

SR-04超声波模块 

基于51单片机的蓝牙舵机控制超声波模块测距开发(二)_第2张图片

接线方式:vcc接5v

                trig接P2^0口

                echo接P2^1口

                GND接单片机上的GND

如图是SR-04超声波模块

#include"reg51.h"
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

sbit RX=P2^1;
sbit TX=P2^0;
unsigned int  time=0;
unsigned int  timer=0;
unsigned char posit=0;
unsigned char i=0; 
unsigned long S=0;
bit      flag =0;
//--定义使用的IO--//



//--定义全局变量--//
unsigned char code DIG_CODE[17]={
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsigned char disbuff[4]	   ={ 0,0,0,0,};
void delay20us(void)   //?? -0.46875us
{
    unsigned char a,b; 
    for(b=3;b>0;b--)
        for(a=1;a>0;a--);
}

/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能		   : 使用数码管显示
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

/********************************************************/
    void Conut(void)
	{
	 time=TH0*256+TL0;
	 TH0=0;
	 TL0=0;
	
	 S= (long)(time*0.17);     //算出来是CM
	 if((S>=4000)||flag==1) //超出测量范围显示“ERR0”
	 {	 
	  flag=0;
	  disbuff[0]=0x7b;	   //“-”
	  disbuff[1]=0x72;	   //“-”
	  disbuff[2]=0x72;	   //“-”
	  disbuff[3]=0x3f;	   //“-”
	 }
	 else
	 {
	  disbuff[3]=DIG_CODE[S%10000/1000];
	  disbuff[2]=DIG_CODE[S%1000/100];
	  disbuff[1]=DIG_CODE[S%100/10];
	  disbuff[0]=DIG_CODE[S%10/1];//个位
	 }
	}
/********************************************************/
     void zd0() interrupt 1 		 //T0中断用来计数器溢出,超过测距范围
  {
    flag=1;							 //中断溢出标志
  }
/********************************************************/
   void  zd3()  interrupt 3 		 //T1中断用来扫描数码管和计800MS启动模块
  {	
	static unsigned char i=0;
	 TH1=0xf8;
	 TL1=0xCD;
	  P0 = 0xFF;   //显示消隐
    switch (i)
    {
        case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=disbuff[0]; break;
        case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=disbuff[1]; break;
        case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=disbuff[2]; break;
        case 3: ADDR2=0; ADDR1=1; ADDR0=1; i=0; P0=disbuff[3]; break;
       /* case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=disbuff[4]; break;
        case 5: ADDR2=1; ADDR1=0; ADDR0=1; i=0; P0=disbuff[5]; break;*/
        default: break;
    }
	 timer++;
	 if(timer>=100)
	 {
	  timer=0;
	  TX=1;			                //800MS  启动一次模块
		delay20us();
	  TX=0;
	 } 
  }
/*********************************************************/

	void  main(void)

  { 
	ENLED=0;
	ADDR3=1;
  TMOD=0x11;		   //设T0为方式1,GATE=1;
	TH0=0;
	TL0=0;          
	TH1=0xf8;		   //2MS定时
	TL1=0xCD;
	ET0=1;             //允许T0中断
	ET1=1;			   //允许T1中断
	TR1=1;			   //开启定时器
	EA=1;			   //开启总中断

	while(1)
	{
	 while(!RX);		//当RX为零时等待
	 TR0=1;			    //开启计数
	 while(RX);			//当RX为1计数并等待
	 TR0=0;				//关闭计数
     Conut();			//计算
	}

  }





你可能感兴趣的:(SR-04,51单片机)