打印
[PIC®/AVR®/dsPIC®产品]

红外遥控长按键的问题

[复制链接]
599|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dengdc|  楼主 | 2022-11-25 21:14 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
用的是ATMEGA8a,单次按键没有问题,但自己搞了几天处理连发码都没搞出来,诚信请教如何判断是连发码?

uchar IR_buf[4]={0x00,0x00,0x00,0x00};  //IR_buf[0]、IR_buf[1]为用户码低位、用户码高位接收缓冲区
                                                              // IR_buf[2]、IR_buf[3]为键数据码和键数据码反码接收缓冲区
/********us延时程序,延时时间0.14ms(140us*)*******/
void Delayus(uint x)
{
         char i, j;
        for(i=0;i<x;i++)      {for(j=0;j<210;j++);}</x;i++)
}
interrupt [EXT_INT0] void ext_int0_isr(void)
{
   uchar i,j,sum=0;
   GICR |=(0<<int0);   Delayus(20);                                //延时20*0.14MS  ,2.8MS</int0);
   for(i = 0;i < 14;i++)
      {
         Delayus(1);
         if(IRIN)                            //9MS内有高电平,则判断为干扰,退出处理程序
         {
           GICR |=(1<<int0);                  return;                                    //返回</int0);
         }
      }
   while(!(IRIN));                          //等待9ms低电平过去
   for(i=0;i<4;i++)
    {
      for(j=0;j<8;j++)
      {
         while(IRIN);                         //等待4.5ms高电平过去
         while(!(IRIN));                 //等待变高电平
         while(IRIN)                          //计算高电平时间
          {
             Delayus(1);                        //延时0.14ms
             sum++;                                    //对0.14ms延时时间进行计数
             if(sum >= 30)              //高电平时间过长,则退出处理程序
             {
               GICR |=(1<<int0);               return;</int0);
             }
          }
       IR_buf = IR_buf >> 1;      //接受一位数据
       if(sum >= 6)
          {IR_buf = IR_buf | 0x80;}   //若计数值大于6(高电平时间大于0.56),则为数据1
       sum = 0;                  //若计数小于6,数据最高位补"0",说明收到的是"0",同时计时清零
     }
   }
  if(IR_buf[2]!=~IR_buf[3])                //将键数据反码取反后与键数据码码比较,若不等,表示接收数据错误,放弃
    { GICR |=(1<<int0);   ="" return;}
  HW_Status=1;
}
void RR()    //遥控器键控
{
        if(HW_Status==1)
     {   static uchar m;
                 if((IR_buf[2]==0xfb)||(IR_buf[2]==e))              //音量加
                        {
                                if( VOLUME_1<98)
                                        {++ VOLUME_1;}
                                else if( VOLUME_1>=98)
                                        { VOLUME_1=98;}
                        }
                if((IR_buf[2]==0xfa)||(IR_buf[2]==b))        //音量减
                        {
                                if( VOLUME_1>0)
                                        {-- VOLUME_1;}
                        }
void RR()    //遥控器键控处理
{
        if(HW_Status==1)
     {   static uchar m;
                 if((IR_buf[2]==0xfb)||(IR_buf[2]==e))              //音量加
                        {
                                if( VOLUME_1<98)
                                        {++ VOLUME_1;}
                                else if( VOLUME_1>=98)
                                        { VOLUME_1=98;}
                        }
                if((IR_buf[2]==0xfa)||(IR_buf[2]==b))                                        //音量减
                        {
                                if( VOLUME_1>0)
                                        {-- VOLUME_1;}
                        }
}

使用特权

评论回复
沙发
lcczg| | 2022-11-28 17:21 | 只看该作者
要解码?用定时器的捕获功能。

使用特权

评论回复
板凳
pzsh| | 2022-11-28 17:21 | 只看该作者
两个 void RR() ?

使用特权

评论回复
地板
10299823| | 2022-12-1 17:03 | 只看该作者
网上有红外遥控器的学习和回放教程。

使用特权

评论回复
5
chuxh| | 2022-12-1 19:27 | 只看该作者
连发得看遥控器,有的遥控器单按也是连发

使用特权

评论回复
6
pengf| | 2022-12-1 19:29 | 只看该作者
有的遥控器单次按键也会连续发送相同的内容,如我正在测试的某万能电视遥控器,按一次键就会连续发送5组相同的键值,两组之间相隔约24ms:

使用特权

评论回复
7
pengf| | 2022-12-1 19:32 | 只看该作者

使用特权

评论回复
8
pengf| | 2022-12-1 19:34 | 只看该作者
    连发可以通过标志来判断,每接收完一次数据对这个标志加一,数据处理完之后这个标志归零,这样就可以知道连发的次数了。

使用特权

评论回复
9
zwll| | 2022-12-1 19:36 | 只看该作者
我是遥控接收与接收后的处理分开进行的,接收函数放在中断里,接收到的数据放在全局变量中,然后在主循环里对接收到的数据进行处理。

使用特权

评论回复
10
dengdc|  楼主 | 2022-12-1 19:39 | 只看该作者

嗯,我再好好缕一缕吧,有了好消息及时通知大家

使用特权

评论回复
11
updownq| | 2022-12-1 20:25 | 只看该作者
看看红外的通信协议,有很多的 。

使用特权

评论回复
12
benjaminka| | 2022-12-2 19:58 | 只看该作者
这个是判断信号长度的。              

使用特权

评论回复
13
sdlls| | 2022-12-2 20:40 | 只看该作者
这个通过定时器实现信号长度的捕获的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

892

主题

13885

帖子

7

粉丝