找回密码
 立即注册

QQ登录

只需一步,快速开始

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

大神们帮我看看为啥用红外控制小车不动呗

[复制链接]
跳转到指定楼层
楼主
ID:237053 发表于 2017-10-21 18:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define const_interrupt_time 792
#define uchar unsigned char
#define uint unsigned int
void initial_myself();   
void initial_peripheral();
void delay_short(uint uiDelayShort);
void delay_long(uint uiDelaylong);
void Int0();   
void detectorIR();
void run();      
sbit IR_sr=P3^2;  
sbit P1_0=P1^0;   
sbit P1_1=P1^1;   
sbit P1_2=P1^2;        
sbit P1_3=P1^3;   
uchar ucMotorStep=0;   
uchar ucdata;
void delay(uchar x);  
void delay1(int ms);
void beep();
unsigned char pwm_val_left  =0;
unsigned char push_val_left =0;
unsigned char pwm_val_right =0;
unsigned char push_val_right=0;
bit Right_moto_stop=1;
bit Left_moto_stop =1;
unsigned  int  time=0;
sbit Left_moto_pwm=P1^6;     
sbit Right_moto_pwm=P1^7;
        
void main()
  {
    initial_myself();         
    delay_long(100);   
    initial_peripheral();
    while(1)   
    {         
           detectorIR();
           run();
    }

}
void detector_IR()
{
        if(ucdata==0x73) ucMotorStep=1;
        else if(ucdata==0x56) ucMotorStep=2;
        else if(ucdata==0x7b) ucMotorStep=3;
        else if(ucdata==0x52) ucMotorStep=4;
        else if(ucdata==0x71) ucMotorStep=5;
        else ucMotorStep=5;
}
void run()
{
        switch(ucMotorStep)
        {
                case 1:
        push_val_left  =3;
        push_val_right =3;
                                P1_0=1;
                                P1_1=0;
                                P1_2=1;
                                P1_3=0;
                                break;
                case 2:
                                push_val_left  =3;
        push_val_right =3;
        P1_0=0;
                                P1_1=1;
                                P1_2=0;
                                P1_3=1;
                                break;
                case 3:
                                push_val_left  =2;
        push_val_right =2;
        P1_0=0;
                                P1_1=1;
                                P1_2=1;
                                P1_3=0;
                                break;
                case 4:
                                push_val_left  =2;
        push_val_right =2;
        P1_0=1;
                                P1_1=0;
                                P1_2=0;
                                P1_3=1;
                                break;
                case 5:
                                P1_0=0;
                                P1_1=0;
                                P1_2=0;
                                P1_3=0;
                                break;
        }
}

void Int0() interrupt 0
{
         uchar i,j;
        EX0=0;            
        i=10;
        while(i--)
        {
                TH0=(65535-const_interrupt_time)/256;   
            TL0=(65535-const_interrupt_time)%256;
                TR0=1;
                while(!TF0);
                TF0=0;
                TR0=0;
                while(IR_sr)
                {
                        EX0=1;
                        return;
                }
        }         
        while(!IR_sr);
        j=5;
        while(j--)
        {
                TH0=(65535-const_interrupt_time)/256;   
            TL0=(65535-const_interrupt_time)%256;
                TR0=1;
                while(!TF0);
                TF0=0;
                TR0=0;
                while(!IR_sr)
                {
                        EX0=1;
                        return;
                }
        }        
        while(IR_sr);
        for(i=0;i<4;i++)
        {
                for(j=0;j<8;j++)
                {
                        
                        while(!IR_sr);
                        TH0=(65535-const_interrupt_time)/256;   
                    TL0=(65535-const_interrupt_time)%256;
                        TR0=1;
                        while(!TF0);
                        TF0=0;
                        TR0=0;         
                        if(IR_sr)      
                        {
                                ucdata|=0x80;                                    
        while(IR_sr);              
                        }
                        ucdata>>=1;               
                }
        }        
        EX0=1;               
    return;
}



void delay_long(unsigned int uiDelayLong)
{
    unsigned int i;
    unsigned int j;
    for(i=0;i<uiDelayLong;i++)
    {
       for(j=0;j<500;j++)
           {
              ;
           }
    }
}

void initial_myself()  
{   

  TMOD=0x01;  
}

void initial_peripheral()
{
   
   ET0=1;            
   IT0=1;   
   EX0=1;   
   EA=1;   
}
void pwm_out_left_moto(void)
{  
   if(Left_moto_stop)
   {
    if(pwm_val_left<=push_val_left)
        Left_moto_pwm=1;
else
        Left_moto_pwm=0;
if(pwm_val_left>=10)
pwm_val_left=0;
   }
   else  Left_moto_pwm=0;
}
  
void pwm_out_right_moto(void)
{
  if(Right_moto_stop)
   {
    if(pwm_val_right<=push_val_right)
        Right_moto_pwm=1;                                                                           
else
        Right_moto_pwm=0;
if(pwm_val_right>=10)
pwm_val_right=0;
   }
   else    Right_moto_pwm=0;
}
void timer0()interrupt 1   using 2
{
     TH0=0XF8;  
  TL0=0X30;
  time++;
  pwm_val_left++;
  pwm_val_right++;
  pwm_out_left_moto();
  pwm_out_right_moto();
}

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

使用道具 举报

沙发
ID:237053 发表于 2017-10-21 23:20 | 只看该作者
别沉了呀
回复

使用道具 举报

板凳
ID:239611 发表于 2017-10-22 10:41 | 只看该作者
我感觉你的红外解码程序有问题,不知道你用的什么遥控编码方式,给你一个通用遥控的解码例程参考一下:
  1. /************************************************************
  2. 函数功能:对4个字节的用户码和键数据码进行解码
  3. 说明:解码正确,返回1,否则返回0
  4. 出口参数:dat
  5. *************************************************************/
  6. bit DeCode(void)        
  7. {
  8.    
  9.    unsigned char  i,j;
  10.         unsigned char temp;    //储存解码出的数据
  11.         for(i=0;i<4;i++)      //连续读取4个用户码和键数据码
  12.           {
  13.                  for(j=0;j<8;j++)  //每个码有8位数字
  14.                          {
  15.                  temp=temp>>1;  //temp中的各数据位右移一位,因为先读出的是高位数据                                                                       
  16.                            TH0=0;         //定时器清0
  17.                            TL0=0;         //定时器清0
  18.                            TR0=1;         //开启定时器T0
  19.                       while(IR==0)   //如果是低电平就等待
  20.                        ;              //低电平计时
  21.                              TR0=0;         //关闭定时器T0
  22.                            LowTime=TH0*256+TL0;    //保存低电平宽度
  23.                            TH0=0;         //定时器清0
  24.                            TL0=0;         //定时器清0
  25.                            TR0=1;         //开启定时器T0
  26.                            while(IR==1)   //如果是高电平就等待
  27.                                ;                          
  28.                            TR0=0;        //关闭定时器T0
  29.                            HighTime=TH0*256+TL0;   //保存高电平宽度
  30.                            if((LowTime<370)||(LowTime>640))
  31.                                               return 0;        //如果低电平长度不在合理范围,则认为出错,停止解码                       
  32.                            if((HighTime>420)&&(HighTime<620))   //如果高电平时间在560微秒左右,即计数560/1.085=516次
  33.                                    temp=temp&0x7f;       //(520-100=420, 520+100=620),则该位是0
  34.                            if((HighTime>1300)&&(HighTime<1800)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次
  35.                                    temp=temp|0x80;       //(1550-250=1300,1550+250=1800),则该位是1
  36.                      }                                     
  37.            a[i]=temp;        //将解码出的字节值储存在a[i]                                                                                                                                                                         
  38.     }                                                    
  39.   if(a[2]=~a[3])  //验证键数据码和其反码是否相等,一般情况下不必验证用户码
  40.          return 1;     //解码正确,返回1
  41. }
复制代码

回复

使用道具 举报

地板
ID:237053 发表于 2017-10-22 22:19 | 只看该作者
botgs 发表于 2017-10-22 10:41
我感觉你的红外解码程序有问题,不知道你用的什么遥控编码方式,给你一个通用遥控的解码例程参考一下:

那这个怎么用呢
回复

使用道具 举报

5#
ID:239611 发表于 2017-10-23 14:09 | 只看该作者
z50555 发表于 2017-10-22 22:19
那这个怎么用呢

首先还是先了解一下红外遥控的编码和解码的知识,然后查一下你的遥控器的编码方式,把这个程序改一下做个接收测试。
接收测试就做个简单的小程序,记下你的发射信息,把接收的结果和原值比较一下,对了就亮个灯就行了,这样可以确认接收是否正确。
回复

使用道具 举报

6#
ID:242112 发表于 2017-10-23 15:09 | 只看该作者
用的是ST芯片吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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