微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 超声波测距离,这个程序那里错了,数码管数字乱变化的

超声波测距离,这个程序那里错了,数码管数字乱变化的

时间:10-02 整理:3721RD 点击:
求各位路过的大神,解救一下!
#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 int k;
        unsigned long S=0;
        bit      flag =0;
unsigned char const discode[] ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xF7,0xff};                           
                         unsigned char const positon[4]={ 0x04,0x10,0x40,0x80};
                         unsigned char disbuff[4]           ={ 0,0,0,0,};
    void Display(void)                                 //扫描数码管
        {
         if(posit==0)
         {P2=(discode[disbuff[posit]])&0xfb;}
         else
         {P2=discode[disbuff[posit]];}
          P1=~positon[posit];
          if(++posit>=4)
          posit=0;
        }
    void Conut(void)
        {
         time=TH0*256+TL0;
         TH0=0;
         TL0=0;
         //time=23529;
         S=(time*0.17);     //算出来是CM
         if((S>=7000)||flag==1) //超出测量范围显示"-"
         {         
          flag=0;
          disbuff[0]=10;           //"-"
          disbuff[1]=10;           //"-"
          disbuff[2]=10;           //"-"
                disbuff[3]=10;           //"-"
         }
         else
         {
                disbuff[0]=S/1000;
          disbuff[1]=S/100%10;
          disbuff[2]=S/10%10;
          disbuff[3]=S%10;
         }
        }
     void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  {
    flag=1;                                                         //中断溢出标志
  }
   void  zd3()  interrupt 3                  //T1中断用来扫描数码管和计800 ms启动模块
  {
         TH1=0xf8;
         TL1=0x30;
         Display();
         timer++;
         if(timer>=400)
         {
          timer=0;
          TX=1;                                        //800 ms  启动一次模块
          _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;                   //2 MS定时
        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