标题: 求大神指导 为什么我的超声波老是不工作(超声波加舵机) [打印本页]

作者: 白依依    时间: 2019-3-1 12:45
标题: 求大神指导 为什么我的超声波老是不工作(超声波加舵机)

#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

sbit Trig = P2^2;
sbit Echo = P0^7;
sbit pwm = P2^3;
sbit led = P2^4;
sbit led1 = P2^5;
sbit led2 = P1^5;
sbit led3 = P1^6;

int jd;
int count;
unsigned int  time=0;
unsigned long S=0;
unsigned int  timer=0;           //时间标志位  
void  StartModule();

void Time0_Init()          //定时器初始化
{

TH1  = 0xfe;
TL1  = 0x33;     //11.0592MZ晶振,0.5ms
    TR1=1;                 //定时器开始
        ET1=1;
}
void delayms(unsigned int ms);

void Time0_Int() interrupt 3 //中断程序
{

   uint a;
   led1 = ~led1;
   TH1  = 0xfe;             //重新赋值
   TL1  = 0x33;
   a++;
//   timer++;
//   if(a==40)
//   {
//           pwm=1;
//           a=0;
//   }
//   if(a=jd)
//   {
//             pwm=0;
//   }
//   if(timer>=500)
//   {                                         //每ms启动一次模块
     StartModule();
//         timer=0;
//   }
    if(count< jd)              //判断0.5ms次数是否小于角度标识
      pwm=1;                  //确实小于,PWM输出高电平
    else
      pwm=0;                  //大于则输出低电平
    count=(count+1);          //0.5ms次数加1
    count=count%40;     //次数始终保持为40 即保持周期为20ms
}



void Conut(void)
        {
         time=TH0*256+TL0;
         TH0=0;
         TL0=0;

         S=(time*1.7)/100;     //算出来是CM


                //如果距离小于等于20cm 则  舵机转至180度

                if(S<=20){
                                          jd=5;
                                                 delayms(80);
                                                 led = 0;
                }else{

                        jd=2;     //默认舵机转角为90度
                                                 led = 1;
                }
                }

void delayms(unsigned int ms)
{
        unsigned char i=100,j;
        for(;ms;ms--)
        {
                while(--i)
                {
                        j=10;
                        while(--j);
                }
        }
}

void  StartModule()                          //启动模块
  {
          Trig=1;                                         //启动一次模块
          _nop_();
          _nop_();              //表示空循环一个机器指令的时间,12M中表示1us;  21次 大约20us  用于硬件初始化
          _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=0x11;                   //设T0为方式1,GATE=1;
         TH0=0;
         TL0=0;  
         Time0_Init();
                 

         ET0=1;             //允许T0中断
         EA=1;                           //开启总中断        

        jd=2;
             Trig=0;
                Echo=0;
        while(1)
        {
//                     StartModule() ;
             while(!Echo);             //当RX为零时等待
             TR0=1;                            //开启计数
             while(Echo);                       //当RX为1计数并等待
             TR0=0;                                //关闭计数
             Conut();                        //计算
             delayms(80);
        }

}               


作者: 白依依    时间: 2019-3-1 12:49
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

sbit Trig = P2^2;
sbit Echo = P0^7;
sbit pwm = P2^3;
sbit led = P2^4;
sbit led1 = P2^5;
sbit led2 = P1^5;
sbit led3 = P1^6;

int jd;
int count;
unsigned int  time=0;
unsigned long S=0;
unsigned int  timer=0;           //时间标志位  
void  StartModule();

void Time0_Init()          //定时器初始化
{
   
TH1  = 0xfe;
TL1  = 0x33;     //11.0592MZ晶振,0.5ms
    TR1=1;                 //定时器开始
        ET1=1;
}
void delayms(unsigned int ms);

void Time0_Int() interrupt 3 //中断程序
{

   uint a;
   led1 = ~led1;
   TH1  = 0xfe;             //重新赋值
   TL1  = 0x33;
   a++;
   timer++;

   if(timer>=500)
   {                                         //每250ms启动一次模块
     StartModule();
         timer=0;
   }
    if(count< jd)              //判断0.5ms次数是否小于角度标识
      pwm=1;                  //确实小于,PWM输出高电平
    else
      pwm=0;                  //大于则输出低电平
    count=(count+1);          //0.5ms次数加1
    count=count%40;     //次数始终保持为40 即保持周期为20ms
}
                 
                 
                 
void Conut(void)
        {
         time=TH0*256+TL0;
         TH0=0;
         TL0=0;
        
         S=(time*1.7)/100;     //算出来是CM
               
               
                //如果距离小于等于20cm 则  舵机转至180度
               
                if(S<=20){
                                          jd=5;
                                                 delayms(80);
                                                 led = 0;
                }else{

                        jd=2;     //默认舵机转角为90度
                                                 led = 1;
                }
                }

void delayms(unsigned int ms)
{
        unsigned char i=100,j;
        for(;ms;ms--)
        {
                while(--i)
                {
                        j=10;
                        while(--j);
                }
        }
}

void  StartModule()                          //启动模块
  {
          Trig=1;                                         //启动一次模块
          _nop_();
          _nop_();              //表示空循环一个机器指令的时间,12M中表示1us;  21次 大约20us  用于硬件初始化
          _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=0x11;                   //设T0为方式1,GATE=1;
         TH0=0;
         TL0=0;  
         Time0_Init();
                 
        
         ET0=1;             //允许T0中断
         EA=1;                           //开启总中断        
        
        jd=2;
             Trig=0;
                Echo=0;
        while(1)
        {
             while(!Echo);             //当RX为零时等待
             TR0=1;                            //开启计数
             while(Echo);                       //当RX为1计数并等待
             TR0=0;                                //关闭计数
             Conut();                        //计算
             delayms(80);
        }
                        
}               



作者: admin    时间: 2019-3-1 15:52
您这个问题给的信息不全,估计是没人能回答得了的,先转移到冷门区了,自行点击编辑按钮补充一下吧,审核员会帮你重新转到热门问答区的




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1