完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这两天一直在尝试怎么让红外遥控器根据按键时间更好的操作
打个比方说按下遥控器按键时蜂鸣器一直响 松开按键时蜂鸣器停止响 一开始个人的想法是因为按键按下后一直发连发码,所以在外部中断发连发码的语句里加了响蜂鸣器 else if(res>=85&&res<200) { RedRdy=1; RedRec++; bell=0;//打开蜂鸣器 } 但是却不知道再松开按键后该如何退出中断,本身在中断函数里就设置死循环来扫描高电平脉宽,原先设置是在一扫描到连发码就跳出死循环结束外部中断 肯定有网友们做过类似这样功能的程序,能粘贴出来让小弟看看吗~~ 跪谢~~~ |
|
相关推荐
5个回答
|
|
在主程序做,不要放到解码中断里面处理,主程序里面检查按键,结合延时处理一下,就能达到你要的效果了。
|
|
|
|
问题是怎么让程序知道它什么时候松开按键呀?这是我的红外解码程序~~求原子兄指导
***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++; } } } } |
|
|
|
|
|
|
|
连发码的间隔大概一百多ms吧。每接收完一个红外码就设置一个标记。另外设置一个200ms以上的定时器,或是周期为200ms以上的循环,查询红外接收情况,并清除标记。
|
|
|
|
你这种红外遥控,按键按下的第一次是波形是:9ms低电平,4.5ms高电平,然后是发32位数据(16位前导位,8位数据原码,8位数据反码)。这时如果你的按键还是不放的话,红外的波形就是:9ms低电平,2.5ms高电平,如何循环。所以单单靠遥控器的硬件实现不了像微动按键的长按和短按的。
|
|
|
|
只有小组成员才能发言,加入小组>>
3320 浏览 9 评论
2998 浏览 16 评论
3496 浏览 1 评论
9066 浏览 16 评论
4089 浏览 18 评论
1187浏览 3评论
612浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
602浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2339浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1899浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 16:45 , Processed in 2.075054 second(s), Total 88, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号