单片机学习小组
直播中

连涣艺

7年用户 183经验值
私信 关注

怎么让红外遥控器根据按键时间更好的操作

这两天一直在尝试怎么让红外遥控器根据按键时间更好的操作
打个比方说按下遥控器按键时蜂鸣器一直响
松开按键时蜂鸣器停止响
一开始个人的想法是因为按键按下后一直发连发码,所以在外部中断发连发码的语句里加了响蜂鸣器
else if(res>=85&&res<200)
   {
     RedRdy=1;
     RedRec++;
    bell=0;//打开蜂鸣器
    }
但是却不知道再松开按键后该如何退出中断,本身在中断函数里就设置死循环来扫描高电平脉宽,原先设置是在一扫描到连发码就跳出死循环结束外部中断
肯定有网友们做过类似这样功能的程序,能粘贴出来让小弟看看吗~~
跪谢~~~

回帖(5)

张斌

2019-1-22 14:40:38
在主程序做,不要放到解码中断里面处理,主程序里面检查按键,结合延时处理一下,就能达到你要的效果了。
举报

盛越熊

2019-1-22 14:51:20
问题是怎么让程序知道它什么时候松开按键呀?这是我的红外解码程序~~求原子兄指导
***it RDATA=P3^3;  //红外接口 与外部中断一相连
unsigned char RedKey=255;  //红外摇控的键值,无键按下时为255
int RedRec;
int RedRdy;
//红外初始化
void Red_Init(void)
{
RDATA=1;//P3^3输出高电平
EX1=1;//开启红外中断 3^3
EA=1;  //开总中断
IT1=1;//外部中断下降沿触发
}
//检测高电平脉冲宽度,逻辑0 560微秒 逻辑1 1680微秒
//高电平最长脉冲不超过5毫秒
//返回值:T  脉宽为T*20微秒
unsigned char Get_PulseWidth(void)
{
    unsigned char t=0,a=0;
    while(RDATA)//高电平到来,检测其脉宽
    {
        t++;
for(a=0;a<68;a++);// 延时20微秒
        if(t==250)return t; //超时溢出
    }
    return t;
}
   
/*-------------------------协议--------------------------
开始拉低9ms,接着是一个4.5ms的高脉冲,通知器件开始传送数据了
接着是16位前导脉冲,用于识别该型号的摇控。
然后是发送8位数据的原码,接着又发送8位数据的反码.
最后是一个长脉冲,和开始位一样,拉低9ms和一个4.5ms脉冲表示结束。
每个按键不同这处只在于那8位数据的原码和反码,因些只须要识别
8位原码就可以识别按键了
---------------------------------------------------------*/
/****** 外部中断1服务程序,按键处理 ******/
void EXTI1_ISR() interrupt 2

unsigned char res=0,aa=0;  //aa用于取位         
    char OK=0; //收到前导位的标志
    char RODATA=0;
char Fin=0;
    while(1)
    {   
if(RDATA)//有高脉冲出现
        {
            res=Get_PulseWidth();//获得此次高脉冲宽度   
            if(res==250)
break;
//非有用信号
            if(res>=200&&res<250)OK=1; //获得前导位(4.5ms) 介于4毫秒与5毫秒之间
            else if(res>=50&&res<85)  //如果是宽脉冲,则RODATA=1
            {
                aa++;
                RODATA=1;//1.5ms            
            }
            else if(res>=10&&res<50)  //如果是窄脉冲,则RODATA=0      
            {
                aa++;
                RODATA=0;//500us              
            }
            //舍去16位前导脉冲,从第17位开始接着的8位是数据的正码,再后8位是反码
            //获取正码
            if(OK&&(aa>=17)&&(aa<25))
            {
                RedKey<<=1;
                RedKey+=RODATA;
RedRec=0;
            } 
            else if(res>=85&&res<200)

RedRdy=1;
 RedRec++;
   
}
        }    
    } 
}
举报

杨嘉怡

2019-1-22 15:09:24
无非就是判断啊...
连续和不连续,你大脑是如何判断的?
然后根据你的思路,写代码即可.
举报

李英健

2019-1-22 15:26:20
连发码的间隔大概一百多ms吧。每接收完一个红外码就设置一个标记。另外设置一个200ms以上的定时器,或是周期为200ms以上的循环,查询红外接收情况,并清除标记。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分