OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13258|回复: 5

红外遥控长按与短按

[复制链接]

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-1-29
在线时间
0 小时
发表于 2013-2-16 14:21:58 | 显示全部楼层 |阅读模式
这两天一直在尝试怎么让红外遥控器根据按键时间更好的操作
打个比方说按下遥控器按键时蜂鸣器一直响
松开按键时蜂鸣器停止响
一开始个人的想法是因为按键按下后一直发连发码,所以在外部中断发连发码的语句里加了响蜂鸣器
 else if(res>=85&&res<200)
   {
     RedRdy=1;
     RedRec++;
    bell=0;//打开蜂鸣器
    }
但是却不知道再松开按键后该如何退出中断,本身在中断函数里就设置死循环来扫描高电平脉宽,原先设置是在一扫描到连发码就跳出死循环结束外部中断
肯定有网友们做过类似这样功能的程序,能粘贴出来让小弟看看吗~~
跪谢~~~
当我的世界不一样,那就让我不一样
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-2-19 12:33:19 | 显示全部楼层
在主程序做,不要放到解码中断里面处理,主程序里面检查按键,结合延时处理一下,就能达到你要的效果了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-1-29
在线时间
0 小时
 楼主| 发表于 2013-2-22 13:58:37 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
问题是怎么让程序知道它什么时候松开按键呀?这是我的红外解码程序~~求原子兄指导

sbit 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++;

   
}
        }    
    } 
}
当我的世界不一样,那就让我不一样
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-2-22 14:17:12 | 显示全部楼层
无非就是判断啊...
连续和不连续,你大脑是如何判断的?
然后根据你的思路,写代码即可.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1863
金钱
1863
注册时间
2011-3-29
在线时间
139 小时
发表于 2013-2-23 03:22:57 | 显示全部楼层
连发码的间隔大概一百多ms吧。每接收完一个红外码就设置一个标记。另外设置一个200ms以上的定时器,或是周期为200ms以上的循环,查询红外接收情况,并清除标记。
业余程序玩家。
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2012-3-16
在线时间
0 小时
发表于 2013-3-17 10:28:21 | 显示全部楼层
你这种红外遥控,按键按下的第一次是波形是:9ms低电平,4.5ms高电平,然后是发32位数据(16位前导位,8位数据原码,8位数据反码)。这时如果你的按键还是不放的话,红外的波形就是:9ms低电平,2.5ms高电平,如何循环。所以单单靠遥控器的硬件实现不了像微动按键的长按和短按的。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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