数码管超声波模块测试

/************************************************************************************************************/
//程序名:       RCW-00XX系列 超声波测距模块数码管显示 DEMO 程序
//晶振:         11.0592MHz
//MCU:           5V:STC11F04E   3.3V:STC11L04E
//接线:         模块TRIG接 P3.5  ECH0 接P3.7
//数码管:       共阳数码管P1接数据口,P3.2 P3.3 P3.4接选通数码管
/***********************************************************************************************************/
//定义头文件及接口
/***********************************************************************************************************/	    
		     #include <AT89x51.H>		
			 #include <intrins.h>
			 #define  RX    P3_7            //接模块 Echo
			 #define  TX    P3_5            //接模块 TRIG
			 #define  LED1  P3_2            //定义数码管1选通IO口
			 #define  LED2  P3_3            //定义数码管2选通IO口
			 #define  LED3  P3_4            //定义数码管3选通IO口
			 unsigned int   time=0;         //探测回响时间
			 unsigned int   timer=0;        //数码管刷新次数
			 unsigned char  posit=0;     
			 unsigned long  S=0;            //距离数据
			 bit      flag  =0;             //超时指示
			 unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
                                            //  0    1    2    3    4    5    6    7    8    9    -    不显示    
			 unsigned char disbuff[4]	   ={ 0,0,0,0,};
/********************************************************/ 
//延时程序
/********************************************************/
    void delayms(unsigned int ms)
    {
	unsigned char i=100,j;
	for(;ms;ms--)
	 {
		while(--i)
		{
			j=10;
			while(--j);
		}
	 }
    }
/********************************************************/
//数码管显示0-9  检测数码管
/********************************************************/
    void Display1_9(void)				 
	{
	  unsigned int x;
	  for(posit=0;posit<=11;posit++)
	   {
	    P1=discode[posit];
        for(x=0;x<=100;x++)
	     {
         LED1=0;
         LED2=1;
	     LED3=1;
         delayms(1);
         LED1=1;
         LED2=1;
	     LED3=0;
         delayms(1);
         LED1=1;
         LED2=0;
	     LED3=1;
         delayms(1); 
		}
       }
	}
/********************************************************/
//数码管扫描显示(单次)
/********************************************************/
    void Display(void)				    
	{

	 if(posit==0)
	  {
	   P1=(discode[disbuff[posit]])&0x7f;
	  }
	 else
	  {
	   P1=discode[disbuff[posit]];
	  }

	 if(posit==0)
	  {
      LED1=0;
      LED2=1;
	  LED3=1;
	  }
	 else if(posit==1)
	  {
      LED1=1;
      LED2=1;
	  LED3=0;
	  }
	 else
	  {
      LED1=1;
      LED2=0;
	  LED3=1;
	  }

	 if(++posit>=3)
	  {
	  posit=0;
	  }
	}
/********************************************************/
    void Conut(void)
	{
	 time=TH0*256+TL0;
	 TH0=0;
	 TL0=0;	
	 S=(time*1.863)/100;            //算出来是M 如果用的晶振不是11.0592MHz 需要修改该参数  12MHz为 S=(time*1.7)/100; 
	                                //每次计数时间T=1/MCU计数器计数CLOCK  STC11F/L04计数器计数CLOCK:晶振频率/12  不同MCU不一样,注意需要修改
	 								//例:MCU STC11F04E  11.0592MHz  计数CLOCK=1/(11.0592MHz/12)=1/(0.9216*1000000)=1.09577uS 
	 								//   实际距离为声波路程的1/2,  s=1/2vt=1/2*340*(TH0+TL0)*1.09577=186.3*(TH0+TL0)
	 if((S>=700)||flag==1)          //超出测量范围显示“-” 
	  {	 
	   flag=0;
	   disbuff[0]=10;	            //“-”
	   disbuff[1]=10;	            //“-”
	   disbuff[2]=10;	            //“-”
	  }
	  else
	  {
	   disbuff[0]=S%1000/100;       //距离M位
	   disbuff[1]=S%1000%100/10;    //距离10CM位
	   disbuff[2]=S%1000%10 %10;    //距离CM位
	  }
	 }
/********************************************************/
  void zd0() interrupt 1 		    //T0中断用来计数器溢出,超过测距范围
  {
	ET0=0;                          //不允许T0中断
    flag=1;							//中断溢出标志
	TH0=0;
	TL0=0;  
	ET0=1;                          //允许T0中断
  }
/********************************************************/
  void  zd3()  interrupt 3 		    //T1中断用来扫描数码管和计800MS启动模块
  {
     ET1=0;                         //不允许T1中断
     TR1=0;			                //关闭定时器
	 TH1=0xf8;
	 TL1=0x30;
	 Display();
	 timer++;                       //计LED显示次数,2mS一次
	 if(timer>=300)                 //600MS  启动一次模块
	 {
	  timer=0;
	  TX=1;			                 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  TX=0;
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	 } 
      TR1=1;			               //开启定时器
	  ET1=1;                           //允许T0中断
  }
/*********************************************************/
//主程序
/*********************************************************/
	void  main(void)
  {   
    P1=0Xff;            //IO口初始化
    P3=0Xff;            //IO口初始化
	Display1_9();       //检测数码管
    TMOD=0x11;		    //设T0为方式1,GATE=1;
	TH0=0;
	TL0=0;          
	TH1=0xf8;		    //2MS定时 刷新显示
	TL1=0x30;
	ET0=1;              //允许T0中断
	ET1=1;			    //允许T1中断
	TR1=1;			    //开启定时器
	EA=1;			    //开启总中断
	while(1)
	{
	 while(!RX);		//当RX为零时等待
	 TR0=1;			    //开启计数
	 while(RX);			//当RX为1计数并等待
	 TR0=0;				//关闭计数
     Conut();			//计算
	}
  }
                														 


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值