找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求解一个单片机红外程序

[复制链接]
跳转到指定楼层
楼主
ID:652430 发表于 2019-11-29 15:38 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
value = value | 0x80;这段程序不要没有影响吧,能用一个实例说明下value的值怎么来


  • void IRcordpro()                                    //提取它的33次脉宽进行数据解码
  • {
  •         uchar i, j, k, cord, value;
  •         k = 1;                                                 //从第一位脉宽开始取,丢弃引导码脉宽
  •         for(i = 0; i < 4; i++)
  •         {
  •                 for(j = 0; j < 8; j++)
  •                 {
  •                         cord = IRdata[k];            //把脉宽存入cord
  •                         if(cord > 5)                         //如果脉宽大于我11.0592的t0溢出率为约278us*5=1390那么判断为1
  •                         value = value | 0x80;
  •                         if(j < 7)
  •                         {
  •                                 value = value >> 1;        //value位左移依次接收8位数据。
  •                         }
  •                         k++;                                //每执行一次脉宽位加1
  •                 }
  •                 IRcord[ i] = value;
  •                 value = 0;
  •         }
  •         IRpro_ok = 1;
  • }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:652430 发表于 2019-11-30 09:51 来自手机 | 显示全部楼层
moluxiyan 发表于 2019-11-30 00:18
value = value | 0x80这句话的意思是将value的最高位置1

我知道。我意思是为什么要置1,例如11000011,先送低位1过去,value的值是1000 0000吗,然后或0x80,有什么用处
回复

使用道具 举报

板凳
ID:652430 发表于 2019-11-30 09:53 来自手机 | 显示全部楼层
moluxiyan 发表于 2019-11-30 00:18
value = value | 0x80这句话的意思是将value的最高位置1

我知道。我意思是为什么要置1,例如11000011,先送低位1过去,value的值是1000 0000吗,然后或0x80,有什么用处
回复

使用道具 举报

地板
ID:652430 发表于 2019-12-2 09:18 来自手机 | 显示全部楼层
郑汉松 发表于 2019-12-1 16:47
value = value | 0x80是与value = value >> 1配合使用的,高位置1后左移1位,左移7次再加上第八次就构成一 ...

照你甘说,每次高位置1,右移一位。不就变成全部都是1

回复

使用道具 举报

5#
ID:652430 发表于 2019-12-3 10:06 来自手机 | 显示全部楼层
郑汉松 发表于 2019-12-2 13:17
笨啊你,没看到上面有个if吗,达到条件才置一

有个问题我想问下,我用小车的传感器检测启动,用usb连接正常可以运行,但是按下电源开关,传感器检测到后不能运行,发出滴滴的声音,用手拨动一下车轮就转动,然后可以正常运行,不知道是什么原因,红外遥控小车启动也是一样,用电源控制没反应的
回复

使用道具 举报

6#
ID:652430 发表于 2019-12-5 16:54 来自手机 | 显示全部楼层
郑汉松 发表于 2019-12-3 11:55
典型的电源功率不够,建议电源改为12V,买个L298N作为驱动,然后pwm降压来驱动电机

这两天学用pwm,解决了问题,然后我想问一下定时器0和1中断,可以同时用吗
回复

使用道具 举报

7#
ID:652430 发表于 2019-12-10 23:45 来自手机 | 显示全部楼层
郑汉松 发表于 2019-12-5 19:40
当然可以。不过我觉得你这个红外遥控车,要解码又要PWM控制,定时器应该不够用吧?可以用89c52的芯片有3 ...

我用电脑连接调试就可以,用独立电源调试就接收不了红外信号,程序我用一个定时器把PWM和红外接收写一起,分开两个定时器写的话,只能一次接收一个按键信号,要重启才可以接收另一个,有什么办法解决。程序如下:
#include<reg52.h>
            sbit P36=P3^6 ;
         sbit P37=P3^7 ;
         sbit P24=P2^4;
         sbit ENA=P1^0;
         sbit P11=P1^1;
         sbit P12=P1^2;
          sbit ENB=P1^3         ;
          sbit P14=P1^4;
          sbit P15=P1^5;
           sbit IR=P3^2;
         
         void fonrt();
         void zuozuan();
            void tingzhi();

   unsigned char irtime;
   bit irpro_ok,irok;
   unsigned char IRcord[4];
   unsigned char irdata[33];
   void Ir_work (void);
   void Ircordpro(void);
        
         unsigned char pwm_val_left =0;
   unsigned char push_val_left =0;
   unsigned char pwm_val_right =0;
unsigned char push_val_right=0;  
   unsigned int time;
                 void         pwm_out_left_moto() ;
                 void pwm_out_right_moto() ;
                 bit Left_moto_stop =1; //右电机停转
                 bit Right_moto_stop=1;
        
                 
#define Left_moto_Stop    {P1^1=0,P1^2=0;}  
#define Right_moto_Stop   {P1^4=0,P1^5=0;}
sbit Left_moto_pwm= P1^0;        
sbit Right_moto_pwm         = P1^3        ;

/******************************************************************
**                       左电机调速
******************************************************************/
void pwm_out_left_moto()
{  
        

            if(pwm_val_left<=push_val_left)
                        {
                        ENA=0;
        
                        }
                else
                    {
                              ENA=1;
                                                                 
                        }
                if(pwm_val_left>=20)
                           ENA=1;
        }



/******************************************************************
**                       右电机调速
******************************************************************/
void pwm_out_right_moto(void)
{

            if(pwm_val_right<=push_val_right)
            {
                    Right_moto_pwm=1;
                }
        else
            {
                        Right_moto_pwm=0;
                }
        if(pwm_val_right>=20)
               pwm_val_right=0;
   }


        void tim0_isr(void)interrupt 1 using 1
        {
        irtime++;
         pwm_val_left++;
         pwm_val_right++;
         pwm_out_left_moto();
         pwm_out_right_moto();                  
        }

        void EX0_ISR(void)interrupt 0
        {
        static unsigned char i;
        static bit startflag;
        if (startflag)
        {if(irtime<63&&irtime>=33)
        i=0;
        irdata=irtime;
        irtime=0;
        i++;
        if (i==33)
        {irok=1;
        i=0;
        }
        }
        else
        {irtime=0;
        startflag=1;}
        }

        void TIM0init(void)
        {TMOD=0x02;
                 TH0= 0x00;                  //1ms定时
        TL0= 0x00;
        ET0=1;
        TR0=1;
        TR1=0;}

        void EX0init(void)
        {IT0=1;
        EX0=1;
        EA=1;}

void Ircordpro (void)
{unsigned char i,j,k;
unsigned char cord,value;
k=1;
for (i=0;i<4;i++)
{for(j=1;j<=8;j++)
{cord=irdata[k];
if(cord>7)
value |=0x80;
if(j<8)
{value>>=1;
}
k++;
}IRcord=value;
value=0;}
irpro_ok=1;
}
  
           void Ir_work(void)
        {switch(IRcord[2])
        {case 0x18:fonrt();break;
         case 0x52:tingzhi( );break;
         case 0x08:zuozuan();break;
         default:break;}
         irpro_ok=0        ;
         }

   void delay (int xms)
   {unsigned int i,j;
   for (i=xms;i>0;i--)
   for (j=112;j>0;j--);}

void  fonrt ()
{ push_val_right=16;  
push_val_left =16;
  P11=1;
P12=0;
P14=1;
P15=0;
delay(200);
  }

   void zuozuan()
   {   
           delay(500);
   push_val_left=8;
         push_val_right=12;
P11=0;
P12=1;
        P14=1;
P15=0;            
}

void tingzhi()
   {P1=0x00;
   }
   
   void main()
   {  IP=0X02;
            EX0init();
   TIM0init();
             while(1)
  {
   if(irok)
   {Ircordpro();
   irok=0;}

  if(irpro_ok)         
   {   
        Ir_work();  
   }
   }
   }
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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