搜索
bottom↓
回复: 6

通过红外遥控器来控制。。舵机!!!

[复制链接]

出0入0汤圆

发表于 2010-10-22 19:08:24 | 显示全部楼层 |阅读模式
最近正在做一个机器人,但是我在用红外控制舵机的时候。比如一个按键控制舵机正转一个按键控制电机反转,只有刚通电时通过按遥控板正转键电机正转,之后按反转就不能了。。。如果要反转又只能断电后按才能转动。。。我用的是stc51单片机,用了两个中断。一个检测按键,一个控制pwm波。想了一天了就只是觉得可能是中断的时候可能有问题,但是有查不出原因。。还望各位大虾帮忙看一下啊,小弟不胜感激!!!!
红外键盘程序:
#include<reg52.h>
#include<string.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
extern unsigned char ir_code[4]; /*遥控接收数据*/
unsigned char ir_liangfa=0;      /*连_发码位*/
sbit          ir_port=P1^1;      /*遥控输入脚*/
uint tt,flag,flag1;
extern unsigned char ir_bit;            /*遥控接收成功*/
/*void Delay_M(unsigned int a)                 //主函数延时函数 1MS/次
{       
        uchar i;
        while(--a!=0)
        {               
           for(i=0;i<125;i++);
        }                                     
}*/
void open_yaokong(void) /*开启遥控接收*/
{
        uchar i,j;
        TMOD=0x01;
        TH1=0xff;
        TL1=0xa3;
        EA=1;
        ET1=1;//打开定时器0中断
        TR1=0;//启动定时器0
        //EX0=1;
        //ir_port=1;
//        while(ir_port);               
        while(!ir_port)
        {
                tt=0;        //TMOD=0x01;
                TH1=0xff;
                TL1=0xa3;
                TR1=1;
                 while(!ir_port);
                if(tt>75)
                {
                        tt=0;
                        TR1=0;
                        flag=1;
                 }  
         }
        if(flag==1)
            {
                flag=0;
                while(ir_port==0); /*等待高电平避开9毫秒低电平引导脉冲*/
                TH1=0xff;
                TL1=0xa3;
                TR1=1;
                tt=0;
                  while(ir_port);        //>4.5ms
                if(tt>35)
                        {
                                tt=0;
                                TR1=0;
                            flag1=1;
                        }
                }               
       
        if(flag1==1)
        {
                flag1=0;
                while(ir_port==1);         //等高电平4.5ms
                /*以下32数据码的读取,0和1的识别*/
                for(i=4;i>0;i--)
               {
                        for(j=0;j<8;j++)
                    {
                                        //Nop();
                                         while(ir_port==0); /*等待地址码第一位的高电平信号*/
                                         TH1=0xff;
                                         TL1=0xa3;
                                         tt=0;
                                         TR1=1;
                                       
                                        ir_code[i-1]=(ir_code[i-1]<<1);
                                           while(ir_port==1);//等待高电平       
                                        if(tt>11)
                                        {
                                         ir_code[i-1]=(ir_code[i-1]|0x01);
                                         //while(ir_port==1);
                                        }       
                                }
                        tt=0;TR1=0;
                        }
                if(ir_code[1]==(~ir_code[0]))
                {
                         ir_liangfa=0; /*连_发码位置0*/
                         ir_bit=1;     /*遥控接收正确,置位1*/
                        }
        //return;
                //while(ir_port);
  }
}
void interru() interrupt 3   //延时0.1ms
{
        TH1=0xff;
        TL1=0xa3;
        tt++;
}
控制电机程序:
#include<reg52.h>
#include<intrins.h>
#include<red.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char ir_code[4]; /*遥控接收数据*/
sbit ir_port =  P1^1;      /*遥控输入脚*/
sbit led  =  P1^2;              /*LED*/
sbit DJZ  =  P1^3;           //      ;中间伺服马达引脚定义
unsigned char ir_bit,t;            /*遥控接收成功*/
unsigned char TEMP_FOR=0;
void delay_1000(void)     //1000us         伺服马达反转
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=142;b>0;b--)
            for(a=2;a>0;a--);
}
void delay_1500(void)  //1500us          伺服马达回到中点
{
    unsigned char a,b;
    for(b=3;b>0;b--)
        for(a=248;a>0;a--);

}
void delay_2000(void)   //2000us   伺服马达正转        45°
{
    unsigned char a,b;
    for(b=4;b>0;b--)
        for(a=248;a>0;a--);
}
void delay(uint z)         //Z ms
{
        uint t,y;
        for(t=z;t>0;t--)
                for(y=110;y>0;y--);
}
void LED()                   //发光二极管闪烁子程序
{
        WLED=0;
        delay(1000);
        WLED=1;
}
void SPEAK()          //压电喇叭发出嘀的一声
{
        SPK=0;
        delay(400);
        SPK=1;
}

void go_home()                  //机器人中各伺服电机回中点控制子程序
{                                           // ****注意延时
    TEMP_FOR=7;
}
void DJZ_FOR()                 //中间电机正转子程序
{
        TEMP_FOR=1;
        ET0 = 1;
}
void DJZ_BACK()                 //中间电机反转子程序
{
        TEMP_FOR=2;
ET0 = 1;
}
void main(void)            //主函数
{
          TMOD = 0x01;
    TH0 = 0x0B1;
    TL0 = 0x0E0;
    EA = 1;
    //ET0 = 1;
    TR0 = 1;
        DJZ = 0;
        DJL = 0;
        DJR = 0;
   ir_code[1]=0xFF;        //用户数据码初始化
   //Delay_M(2000);        //延时2秒
   //Beep_set();             //进入系统确定音
   DB2=1;
   //led=1;
          LED1=0;
   
   while(1)
      {        
           dula = 0; //关数码管
           wela = 0;
           while(ir_port);
           open_yaokong();
          if(ir_bit==1)
          {ir_bit=0;
          if(ir_code[1]==0xe1)
                      {  
                  
                   DJZ_FOR();
                   DB2=1;          
                   //GO_L();
               //led=0;
                   LED1=1;
                   delay(500);
                   LED1=0;
                  ir_code[1]=0;
                  //EA=1;
                   }
          if(ir_code[1]==0xa1)
                      {
                          DJZ_BACK();
                   //DJZ_BACK();
                   //GO_R();
               //led=0;
                   LED1=1;
                   delay(500);
                   LED1=0;
                   ir_code[1]=0;
                   }
                }
}
void Timer0Interrupt(void) interrupt 1
{
    //20ms中断
    TH0 = 0x0B1;
    TL0 = 0x0E0;
        if(TEMP_FOR==1&t<4)         ////中间电机正转子程序
        {         t++;
                //TEMP_FOR=0;
            DJZ=1;
            delay_2000();
            DJZ=0;
        if (t==3)  ET0 = 0;       
        }
        t=0;
        if(TEMP_FOR==2&t<4)         ////中间电机反转子程序
        {
                //TEMP_FOR=0;
            DJZ=1;
            delay_1000();
            DJZ=0;
        if (t==3)  ET0 = 0;
        }
        t=0;
}
谢谢啦。。。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2010-10-24 20:07:27 | 显示全部楼层
哎呀。。。没人来救我了啊

出0入0汤圆

 楼主| 发表于 2010-10-25 15:58:34 | 显示全部楼层
问题自己已解决了哈、、、、、、、、

出0入0汤圆

发表于 2011-1-14 01:17:07 | 显示全部楼层
你能把正确的,给我发一下么?我正需要这一程序····谢谢啦

出0入0汤圆

发表于 2011-4-23 01:47:19 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-25 15:56:58 | 显示全部楼层
我也要

出0入0汤圆

发表于 2013-5-6 14:37:32 | 显示全部楼层
什么原因哈?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 12:51

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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