微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机发超声波

51单片机发超声波

时间:10-02 整理:3721RD 点击:
51单片机发超声波,使用串口助手接收返回信息。却显示不是要打印的信息,而是一堆问号。希望大神帮忙找出错误,十二道金牌加急啊!
以下是代码:
//晶振:11。0592
//接线:模块TRIG接 P1.2  ECH0 接P1.1
//串口波特率9600          
        #include   <AT89X51.H>
        #include   <intrins.h>
    #include   <STDIO.H>
    #define uchar unsigned  char
    #define uint  unsigned   int  
        #define  RX  P1_1
    #define  TX  P1_2

        unsigned int  time=0,timeH,timeL;
        unsigned int  timer=0;
        uint succeed_flag;
        float         S=0;
    bit           flag =0;
       
/********************************************************/
    void Conut(void)
        {
         time=TH0*256+TL0;
         TH0=0;
         TL0=0;
         S=(time*1.87)/100;     //算出来是CM
         if(flag==1)                    //超出测量
         {
          flag=0;
          printf("-----\n");
         }
          printf("S=%f\n",S);
        }
/********************************************************/
void delay(uint z)
{
uint x,y;
  for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void delayms(unsigned int ms)
{
        unsigned char i=100,j;
        for(;ms;ms--)
        {
                while(--i)
                {
                        j=10;
                        while(--j);
                }
        }
}
/********************************************************/
     void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  {
    flag=1;                                                         //中断溢出标志
  }
/********************************************************/
   void  StartModule()                          //T1中断用来扫描数码管和计800MS启动模块
  {
          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=0x13;                 
        SCON=0x02;
        TH1=0xFD;
        TL1=0xFD;
        TH0=0;
        TL0=0;
        TR0=1;  
        ET0=1;             //允许T0中断
       
        TR1=1;                           //开启定时器
        EA=1;                           //开启总中断
   while(1)        
    {
        EA=0;           //关总中断
        StartModule();
        while(RX==1);
       succeed_flag=0; //清测量成功标志
        EA=1;
        IT0=1;
        EX0=1;          //打开外部中断0
        TH1=0;          //定时器1清零
        TL1=0;          //定时器1清零
        TF1=0;          //计数溢出标志
        TR1=1;          //启动定时器1
        TR1=0;          //关闭定时器1
        EX0=0;          //关闭外部中断0
                if(succeed_flag==1)
                {
                  
                     Conut();                        //计算
                        
                }
                         if(succeed_flag==0)
                        {
                            TR0=1;                            //开启计数
                        }      
        }
        }
       
void exter()  interrupt 0
{   
         TR0=0;                                //关闭计数  
     succeed_flag=1;//至成功测量的标志
    EX0=0;         //关闭外部中断
}
//****************************************************************
            

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

网站地图

Top