9347|11

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

如何编写红外遥控解码程序,我想判断按键持续按下的消息(可加分) [复制链接]

单片机C语言
12M晶振
AT89S52
中断模式
检测某键持续按下

最新回复

根据以上定义。设标志code_status为过程标志, 0。判断头码 符合8--10ms转1  否则初始化后回0 1。判断头码的标准键码的4.5ms(yes转2)和重复码的2.25ms(yes 转4)都不符合转0 2。判断用户码 8位检测完后转3 3。判断数据码(并与用户码进行数据完整性判断)8位检测完后转0 4。判断重复码的间隔0.56ms(yes转0 no转1) 转0的都要初始化数据为0.  详情 回复 发表于 2009-11-25 09:01
点赞 关注

回复
举报

62

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我用AVR做过,用的是计时器捕捉中断。
51系列的思路应该和AVR的差不多,红外遥控按键按下108ms后,会发射连发码,程序里根据这个判断即可。
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
需要知道你的发码芯片是什么,不同的发码芯片的重复码是不一样的,有点 是一个固定的重复码(NEC)有点是键码以一定的间隔发送!
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 
如果发射采用PT2262/2272这样的遥控专用芯片,先看发射采用的芯片型号,然后查看手册知道芯片用的是什么格式(NEC/TOSHIBA/...),再根据格式就知道判断按键长按的方法,不同格式处理键长按下方法不一样。

如果发射是你自己定义的,那更好处理,自己定一个协议约定发射和接收如何判断0/1,比如定义成两个脉冲之间间隔为300毫秒为0,间隔为800毫秒为1,超过2000毫秒为溢出,不想自己做解码放大整形电路可以直接用一体化的接收头,这些接收头大都是38k的载波,接收头输出已经去掉载波
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

5
 
我的芯片是固定的重复码(NEC)
我现在是不会写解码程序,一点也不会,没学过,不过大学学过一学期C语言还记得一点点,网上买来实验板想自己玩玩,下载了几个改了改,可是没法改成收取重复码(检测一直按下的)的代码,还请继续帮忙
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 

  1. unsigned int Ir_Get_Low(void)
  2. {
  3. TL0=0;
  4. TH0=0;
  5. TR0=1;
  6. while(!Ir_Pin && (TH0&0x80)==0);
  7.                
  8. TR0=0;      
  9. return TH0*256+TL0;
  10. }

  11. unsigned int Ir_Get_High(void)
  12. {
  13. TL0=0;
  14. TH0=0;
  15. TR0=1;
  16. while(Ir_Pin && (TH0&0x80)==0);
  17. TR0=0;
  18. return TH0*256+TL0;
  19. }

  20. void IR_Process(void)
  21. {
  22. unsigned int temp;
  23. char i,j;
  24. do{
  25.         init();
  26.    restart:
  27.    while(Ir_Pin);
  28.    temp=Ir_Get_Low();
  29.    if(tempc(9500)) continue;//引导脉冲低电平9000
  30.    temp=Ir_Get_High();
  31.    if(tempc(5000)) continue;//引导脉冲高电平4500
  32.    for(i=0;i<4;i++) //4个字节
  33.    {
  34.         for(j=0;j<8;j++) //每个字节8位
  35.         {
  36.         temp=Ir_Get_Low();
  37.         if(tempc(800)) goto restart;
  38.         temp=Ir_Get_High();
  39.         if(tempc(2000)) goto restart;
  40.         Ir_Buf[i]>>=1;
  41.         if(temp>c(1120)) Ir_Buf[i]|=0x80;
  42.         }
复制代码

以上是一段比较好的代码,能解码,只是不能判断一直按下,我知道108ms的重复码,可是不会写,不知道思路,上面的我也看不太懂,并不知道到底怎么检测的,需要大家给源码,一起帮解决啊,网上C语言的这段代码是空白,只有汇编的
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

7
 
不会判断啊,请明示大侠
引用 1 楼 soyokaze 的回复:
我用AVR做过,用的是计时器捕捉中断。
51系列的思路应该和AVR的差不多,红外遥控按键按下108ms后,会发射连发码,程序里根据这个判断即可。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

8
 
利用标志,自己设一个判断解码位置的标志!解完头码后,判断是4.5ms的电平还是2.25ms的电平,就可以判断重复码了;
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

9
 

  1. unsigned int Ir_Get_Low(void)
  2. {
  3. TL0=0;
  4. TH0=0;
  5. TR0=1;
  6. while(!Ir_Pin && (TH0&0x80)==0);
  7.                
  8. TR0=0;      
  9. return TH0*256+TL0;
  10. }

  11. unsigned int Ir_Get_High(void)
  12. {
  13. TL0=0;
  14. TH0=0;
  15. TR0=1;
  16. while(Ir_Pin && (TH0&0x80)==0);
  17. TR0=0;
  18. return TH0*256+TL0;
  19. }

  20. void IR_Process(void)
  21. {
  22. unsigned int temp;
  23. char i,j;
  24. do{
  25.         init();
  26.    restart:
  27.    while(Ir_Pin);
  28.    temp=Ir_Get_Low();
  29.    if(tempc(9500)) continue;//引导脉冲低电平9000
  30.    temp=Ir_Get_High();
  31. [color=#FF0000]   if(temp
  32.    if(tempc(5000)) continue;//引导脉冲高电平4500

  33.    for(i=0;i<4;i++) //4个字节
  34.    {
  35.         for(j=0;j<8;j++) //每个字节8位
  36.         {
  37.         temp=Ir_Get_Low();
  38.         if(tempc(800)) goto restart;
  39.         temp=Ir_Get_High();
  40.         if(tempc(2000)) goto restart;
  41.         Ir_Buf[i]>>=1;
  42.         if(temp>c(1120)) Ir_Buf[i]|=0x80;
  43.         }
  44.    }        
复制代码

上面修改了一下,大侠给看看对吗?能不能实现
引用 7 楼 galle 的回复:
利用标志,自己设一个判断解码位置的标志!解完头码后,判断是4.5ms的电平还是2.25ms的电平,就可以判断重复码了;
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

10
 
mark~~~~
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

11
 
我的是定义一个280uS的中断,在中断中计数(记录与上一次管脚电平相同的数值,如果本次电平与上一次不同就重新计数,持续某一电平计数超过200就认为是没有红外了,初始化各个自定义标志),为了减少误动作,在判断头码的时候使用范围定义9ms的用 28---369 36=10ms/0.28ms  28=8ms/0.28ms )4.5ms的用12--20(20=5.5ms/0.28ms 12=3.5ms/0.28ms)以此类推!
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

12
 
根据以上定义。设标志code_status为过程标志,
0。判断头码 符合8--10ms转1  否则初始化后回0
1。判断头码的标准键码的4.5ms(yes转2)和重复码的2.25ms(yes 转4)都不符合转0
2。判断用户码 8位检测完后转3
3。判断数据码(并与用户码进行数据完整性判断)8位检测完后转0
4。判断重复码的间隔0.56ms(yes转0 no转1)

转0的都要初始化数据为0.
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表