找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1861|回复: 2
打印 上一主题 下一主题
收起左侧

求大神指导 为什么我的超声波老是不工作(超声波加舵机)

[复制链接]
跳转到指定楼层
楼主
ID:436152 发表于 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);
        }

}               

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:436152 发表于 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);
        }
                        
}               


回复

使用道具 举报

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表