微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求助,STC单片机超声波串口调试问题

求助,STC单片机超声波串口调试问题

时间:10-02 整理:3721RD 点击:
单片机型号IAP15W413AS,使用网上通用的超声波串口测距的代码,串口助手没有返回数据。求大神帮忙解决。以下是我自己改的代码,还有希望能讲解下推挽输出的设置,特别是P2.0口。
                                         /***********************************************************************************************************/
//HC-SR04 超声波测距模块 DEMO 程序
//晶振:11。0592
//接线:模块TRIG接 P2.1  ECH0 接P2.0
//串口波特率9600
/***********************************************************************************************************/          
        #include   <stc15fxxxx.H>
        #include   <intrins.h>
        #include  <stdio.h>
//        #include<reg52.h>
    #define uchar unsigned  char
    #define uint  unsigned   int  
        #define  TRIG  P21
    #define  ECHO  P20

        unsigned int  time=0;
        unsigned int  timer=0;
        float         S=0;
    bit           flag =0;
        void delayms(unsigned int ms);
        void led_init()
{
        P1M1 &= ~(1 << 6);        //P1.6设置为推挽输出
        P1M0 |=  (1 << 6);
}
void led_on()
{
        P16 = 1;
}
void led_off()
{
        P16 = 0;
}

#if(0)
        void   TRIG_init()
        {
                P2M1 &= ~(1 << 0);        //P2.1设置为推挽输出
                P2M0 |=  (1 << 1);
        }
        void   ECHO_init()
        {
                P2M1 &= ~(1 << 1);        //P2.0设置为推挽输出
                P2M0 |=  (1 >> 0);
        }
#endif
/********************************************************/
    void Conut(void)
        {
         time=TH0*256+TL0;
         TH0=0;
         TL0=0;
         S=(time*1.87)/100;     //算出来是CM
         if(flag==1)                    //超出测量
         {
          flag=0;
          printf("-----\n");
         }
                led_on();
                delayms(10000);         
          printf("S=%f\n",S);
        }
/********************************************************/
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启动模块
  {
          TRIG=1;                                         //800MS  启动一次模块
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          TRIG=0;
  }
/********************************************************/
void main(void)
{  
    TMOD|=0x21;                   //设T0为方式1,GATE=1;
        SCON=0x50;
        TH1=0xFD;
        TL1=0xFD;
        TH0=0;
        TL0=0;
        TR0=1;  
        ET0=1;             //允许T0中断
        TR1=1;                           //开启定时器
        TI=1;
        EA=1;                           //开启总中断
        led_init();
        led_off();
        TRIG_init();
        ECHO_init();

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

void   TRIG_init()应该设置为输入吧!

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

网站地图

Top