找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2162|回复: 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;
  • }
回复

使用道具 举报

ID:470332 发表于 2019-11-30 00:18 | 显示全部楼层

value = value | 0x80这句话的意思是将value的最高位置1
回复

使用道具 举报

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:643576 发表于 2019-11-30 19:28 | 显示全部楼层
怎么用红外来控制单片机音乐的播放,求解
回复

使用道具 举报

ID:514901 发表于 2019-12-1 16:47 | 显示全部楼层
value = value | 0x80是与value = value >> 1配合使用的,高位置1后左移1位,左移7次再加上第八次就构成一个char型数据
回复

使用道具 举报

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

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

回复

使用道具 举报

ID:514901 发表于 2019-12-2 13:17 | 显示全部楼层
yuanni5544 发表于 2019-12-2 09:18
照你甘说,每次高位置1,右移一位。不就变成全部都是1

笨啊你,没看到上面有个if吗,达到条件才置一
回复

使用道具 举报

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

怎么用红外控制播放音乐啊,大兄弟,
回复

使用道具 举报

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

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

使用道具 举报

ID:514901 发表于 2019-12-3 11:46 | 显示全部楼层
单片机老司机 发表于 2019-12-2 20:20
怎么用红外控制播放音乐啊,大兄弟,

你是新手的话,先不要想怎么用红外控制音乐播放,而是先解决怎么控制红外,再解决音乐播放。这两个对新手来说都是有一定难度的,所以不要想着一步到位。
回复

使用道具 举报

ID:514901 发表于 2019-12-3 11:55 | 显示全部楼层
yuanni5544 发表于 2019-12-3 10:06
有个问题我想问下,我用小车的传感器检测启动,用usb连接正常可以运行,但是按下电源开关,传感器检测到 ...

典型的电源功率不够,建议电源改为12V,买个L298N作为驱动,然后pwm降压来驱动电机
回复

使用道具 举报

ID:643576 发表于 2019-12-3 14:36 来自手机 | 显示全部楼层
郑汉松 发表于 2019-12-3 11:46
你是新手的话,先不要想怎么用红外控制音乐播放,而是先解决怎么控制红外,再解决音乐播放。这两个对新手 ...

红外也不会,先请教大佬
回复

使用道具 举报

ID:514901 发表于 2019-12-3 16:05 | 显示全部楼层
单片机老司机 发表于 2019-12-3 14:36
红外也不会,先请教大佬

这你去看视频学习呗,网上资源大把,源码也很多
回复

使用道具 举报

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

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

使用道具 举报

ID:514901 发表于 2019-12-5 19:40 | 显示全部楼层
yuanni5544 发表于 2019-12-5 16:54
这两天学用pwm,解决了问题,然后我想问一下定时器0和1中断,可以同时用吗

当然可以。不过我觉得你这个红外遥控车,要解码又要PWM控制,定时器应该不够用吧?可以用89c52的芯片有3个定时器,如果还不够用可以考虑stc15的芯片有更多的定时器,这些芯片都是8051内核的,兼容89c51的程序
回复

使用道具 举报

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 单片机教程网

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