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

li_cf 2009-11-22 03:34:51
单片机C语言
12M晶振
AT89S52
中断模式
检测某键持续按下
...全文
1328 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
galle 2009-11-25
  • 打赏
  • 举报
回复
根据以上定义。设标志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.
galle 2009-11-25
  • 打赏
  • 举报
回复
我的是定义一个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)以此类推!
radar_2008 2009-11-24
  • 打赏
  • 举报
回复
mark~~~~
泊客天涯 2009-11-24
  • 打赏
  • 举报
回复

unsigned int Ir_Get_Low(void)
{
TL0=0;
TH0=0;
TR0=1;
while(!Ir_Pin && (TH0&0x80)==0);

TR0=0;
return TH0*256+TL0;
}

unsigned int Ir_Get_High(void)
{
TL0=0;
TH0=0;
TR0=1;
while(Ir_Pin && (TH0&0x80)==0);
TR0=0;
return TH0*256+TL0;
}

void IR_Process(void)
{
unsigned int temp;
char i,j;
do{
init();
restart:
while(Ir_Pin);
temp=Ir_Get_Low();
if(temp<c(8500) || temp>c(9500)) continue;//引导脉冲低电平9000
temp=Ir_Get_High();
if(temp<c(3000) ) Goto ReCode; //加这样一个判断,如果是小于3ms的就执行重复码代码ReCode 可以吗? 不知道我的表达式对不对?
if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲高电平4500

for(i=0;i<4;i++) //4个字节
{
for(j=0;j<8;j++) //每个字节8位
{
temp=Ir_Get_Low();
if(temp<c(200) || temp>c(800)) goto restart;
temp=Ir_Get_High();
if(temp<c(200) || temp>c(2000)) goto restart;
Ir_Buf[i]>>=1;
if(temp>c(1120)) Ir_Buf[i]|=0x80;
}
}

上面修改了一下,大侠给看看对吗?能不能实现
[Quote=引用 7 楼 galle 的回复:]
利用标志,自己设一个判断解码位置的标志!解完头码后,判断是4.5ms的电平还是2.25ms的电平,就可以判断重复码了;
[/Quote]
sj_dai 2009-11-23
  • 打赏
  • 举报
回复
如果发射采用PT2262/2272这样的遥控专用芯片,先看发射采用的芯片型号,然后查看手册知道芯片用的是什么格式(NEC/TOSHIBA/...),再根据格式就知道判断按键长按的方法,不同格式处理键长按下方法不一样。

如果发射是你自己定义的,那更好处理,自己定一个协议约定发射和接收如何判断0/1,比如定义成两个脉冲之间间隔为300毫秒为0,间隔为800毫秒为1,超过2000毫秒为溢出,不想自己做解码放大整形电路可以直接用一体化的接收头,这些接收头大都是38k的载波,接收头输出已经去掉载波
galle 2009-11-23
  • 打赏
  • 举报
回复
需要知道你的发码芯片是什么,不同的发码芯片的重复码是不一样的,有点 是一个固定的重复码(NEC)有点是键码以一定的间隔发送!
galle 2009-11-23
  • 打赏
  • 举报
回复
利用标志,自己设一个判断解码位置的标志!解完头码后,判断是4.5ms的电平还是2.25ms的电平,就可以判断重复码了;
li_cf 2009-11-23
  • 打赏
  • 举报
回复
不会判断啊,请明示大侠
[Quote=引用 1 楼 soyokaze 的回复:]
我用AVR做过,用的是计时器捕捉中断。
51系列的思路应该和AVR的差不多,红外遥控按键按下108ms后,会发射连发码,程序里根据这个判断即可。
[/Quote]
li_cf 2009-11-23
  • 打赏
  • 举报
回复

unsigned int Ir_Get_Low(void)
{
TL0=0;
TH0=0;
TR0=1;
while(!Ir_Pin && (TH0&0x80)==0);

TR0=0;
return TH0*256+TL0;
}

unsigned int Ir_Get_High(void)
{
TL0=0;
TH0=0;
TR0=1;
while(Ir_Pin && (TH0&0x80)==0);
TR0=0;
return TH0*256+TL0;
}

void IR_Process(void)
{
unsigned int temp;
char i,j;
do{
init();
restart:
while(Ir_Pin);
temp=Ir_Get_Low();
if(temp<c(8500) || temp>c(9500)) continue;//引导脉冲低电平9000
temp=Ir_Get_High();
if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲高电平4500
for(i=0;i<4;i++) //4个字节
{
for(j=0;j<8;j++) //每个字节8位
{
temp=Ir_Get_Low();
if(temp<c(200) || temp>c(800)) goto restart;
temp=Ir_Get_High();
if(temp<c(200) || temp>c(2000)) goto restart;
Ir_Buf[i]>>=1;
if(temp>c(1120)) Ir_Buf[i]|=0x80;
}

以上是一段比较好的代码,能解码,只是不能判断一直按下,我知道108ms的重复码,可是不会写,不知道思路,上面的我也看不太懂,并不知道到底怎么检测的,需要大家给源码,一起帮解决啊,网上C语言的这段代码是空白,只有汇编的
li_cf 2009-11-23
  • 打赏
  • 举报
回复
我的芯片是固定的重复码(NEC)
我现在是不会写解码程序,一点也不会,没学过,不过大学学过一学期C语言还记得一点点,网上买来实验板想自己玩玩,下载了几个改了改,可是没法改成收取重复码(检测一直按下的)的代码,还请继续帮忙
Soyokaze 2009-11-22
  • 打赏
  • 举报
回复
我用AVR做过,用的是计时器捕捉中断。
51系列的思路应该和AVR的差不多,红外遥控按键按下108ms后,会发射连发码,程序里根据这个判断即可。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧