微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求助51单片机控制两个超声波测距模块程序

求助51单片机控制两个超声波测距模块程序

时间:10-02 整理:3721RD 点击:
不怎么懂单片机编程,买的超声波测距模块,下面是带数码管显示的程序    哪位大神帮忙改一下,改成可控制两个超声波模块(轮流接收),显示在八位数码管上:
/***********************************************************************************************************/
//hc-sr04 超声波测距模块 DEMO 程序
//晶振:11。0592
//接线:模块TRIG接 P0.1  ECH0 接P0.0
//数码管:共阳数码管P1接数据口,P2.7 P2.6 P2.5 P2.4接选通数码管
/***********************************************************************************************************/     
       #include <AT89x51.H>  //器件配置文件
    #include <intrins.h>
    #define  RX  P0_0
    #define  TX  P0_1
    unsigned int  time=0;
    unsigned int  timer=0;
    unsigned char posit=0;
    unsigned long S=0;
    bit      flag =0;
    unsigned char const discode[] ={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00/*-*/};
    unsigned char const positon[4]={ 0x7f,0xbf,0xdf,0xef};
    unsigned char disbuff[4]    ={ 0,0,0,0,};
/********************************************************/
    void Display(void)     //扫描数码管
{
  if(posit==0)
  {P1=(discode[disbuff[posit]])&0x7f;}
  else
  {P1=discode[disbuff[posit]];}
   P2=positon[posit];
   if(++posit>=4)
   posit=0;
}
/********************************************************/
/********************************************************/
    void Conut(void)
{
  time=TH0*256+TL0;
  TH0=0;
  TL0=0;

  S=(time*1.7)/10;     //算出来是MM
   
  if((S>=7000)||flag==1) //超出测量范围显示“-”
  {  
   flag=0;
   disbuff[0]=10;    //“-”
   disbuff[1]=10;    //“-”
   disbuff[2]=10;    //“-”
      disbuff[3]=10;    //“-”
  }
  else
  {
   disbuff[0]=S%10000/1000;
   disbuff[1]=S%10000%1000/100;
   disbuff[2]=S%10000%1000%100/10;
      disbuff[3]=S%10000%1000%100%10;
  }

}
/********************************************************/
     void zd0() interrupt 1    //T0中断用来计数器溢出,超过测距范围
  {
    flag=1;           //中断溢出标志
  }
/********************************************************/
   void  zd3()  interrupt 3    //T1中断用来扫描数码管和计800MS启动模块
  {
  TH1=0xf8;
  TL1=0x30;
  Display();
  timer++;
  if(timer>=400)
  {
   timer=0;
   TX=1;                   //800MS  启动一次模块
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   TX=0;
  }
  }
/*********************************************************/
void  main(  void  )
  {  
   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();   //计算
}
  }
               

谢谢小编了多多关照

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top