只用一个for循环就能解码出红外遥控全码 历史上最简单的NEC红外遥控解码程序 被俺编出来啦 哇哈哈!
时间:10-02
整理:3721RD
点击:
/***无敌呆呆猫---2015/6/25晚16:00编写完成#51单片机NEC格式红外遥控码解码程序#
留此纪念### ***/
#include<reg51.h>
#define wei P0
#define duan P1
sbit ird=P3^2;
unsigned int timelong; //timelong T/C定时器计数值
unsigned char quke,a,b,yonghuma_l,yonghuma_h,anjianma_z,anjianma_f; //quke=躯壳 用户码低8位 高8位 按键码正8位 反8位
unsigned char code zifuku[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, //3641BG:4位共阳极数码管字符表
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
void delay (unsigned int a){ //用于保持数码管显示稳定
unsigned int i;
while(--a !=0){
for(i=0;i<600;i++);}
}
void main(){
EA=1;
EX0=1;
IT0=1;
TR0=0;
TMOD=1;
TH0=0;
TL0=0;
while(1){
while((timelong<13000)^(timelong>14000)); //NEC引导码检测 引导码错误时 会一直处于检测状态 不向下走
while(!ird); //等待中断
while(ird); //等待中断
while(!ird); //防止第二个中断到来时 b的值误抢在中断前代入for循环
for(a=32;a>0;a--){ //这个for循环高端大气上档次 一气呵成取出4个字节解码值 是这个程序的精髓
switch(a){
case 24:yonghuma_l=quke; //整个程序真正用于解码的就其实是这个短短的for循环
break;
case 16:yonghuma_h=quke;
break;
case 8:anjianma_z=quke;
break;
case 0:anjianma_f=quke;
break;
}
while(b);
quke=quke>>1;
if((timelong>2000)&&(timelong<2500)){
quke=quke|0x80;
}
if((timelong<875)&&(timelong>1375)){
quke=quke|0x00;
}
b=1;
}
EX0=0;
delay(80);
EX0=1;
while((timelong<13300)^(timelong>13700)){ //如果没有正确的新引导码出现 将一直显示解码值 不被没有引导码的红外输入干扰 新的按键被按下还能回到程序的开头重新解码
wei=0x80; //没找到正确的连续码资料 解码结尾还不够完善 待研究
duan=zifuku[yonghuma_l/16]; //3641BG:4位共阳极数码管
delay(1); //4个8位解码值的段和位如果也建数组用for循环
duan=0xff; //多级嵌套的话 这个程序本身就够精简了
wei=0x40; //好像也省不了什么事......
duan=zifuku[yonghuma_l%16];
delay(1);
duan=0xff;
wei=0x20;
duan=zifuku[yonghuma_h/16];
delay(1);
duan=0xff;
wei=0x10;
duan=zifuku[yonghuma_h%16];
delay(1);
duan=0xff;
wei=0x8;
duan=zifuku[anjianma_z/16];
delay(1);
duan=0xff;
wei=0x4;
duan=zifuku[anjianma_z%16];
delay(1);
duan=0xff;
wei=0x2;
duan=zifuku[anjianma_f/16];
delay(1);
duan=0xff;
wei=0x1;
duan=zifuku[anjianma_f%16];
delay(1);
duan=0xff;
}
}
}
void zdext ()interrupt 0{
TR0=0;
timelong=TH0*256+TL0;
TH0=0;
TL0=0;
TR0=1;
b=0; //b值用于 for循环与中断的有序同步 一中断一for循环
}
/***如果感兴趣的想试一试这个解码程序的发烧友 移植的时候后面的
动态数码管显示得自己修改一下哦 我的板子被我改过了 不一样
照搬的话可能显示不了哦 ***/
留此纪念### ***/
#include<reg51.h>
#define wei P0
#define duan P1
sbit ird=P3^2;
unsigned int timelong; //timelong T/C定时器计数值
unsigned char quke,a,b,yonghuma_l,yonghuma_h,anjianma_z,anjianma_f; //quke=躯壳 用户码低8位 高8位 按键码正8位 反8位
unsigned char code zifuku[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, //3641BG:4位共阳极数码管字符表
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
void delay (unsigned int a){ //用于保持数码管显示稳定
unsigned int i;
while(--a !=0){
for(i=0;i<600;i++);}
}
void main(){
EA=1;
EX0=1;
IT0=1;
TR0=0;
TMOD=1;
TH0=0;
TL0=0;
while(1){
while((timelong<13000)^(timelong>14000)); //NEC引导码检测 引导码错误时 会一直处于检测状态 不向下走
while(!ird); //等待中断
while(ird); //等待中断
while(!ird); //防止第二个中断到来时 b的值误抢在中断前代入for循环
for(a=32;a>0;a--){ //这个for循环高端大气上档次 一气呵成取出4个字节解码值 是这个程序的精髓
switch(a){
case 24:yonghuma_l=quke; //整个程序真正用于解码的就其实是这个短短的for循环
break;
case 16:yonghuma_h=quke;
break;
case 8:anjianma_z=quke;
break;
case 0:anjianma_f=quke;
break;
}
while(b);
quke=quke>>1;
if((timelong>2000)&&(timelong<2500)){
quke=quke|0x80;
}
if((timelong<875)&&(timelong>1375)){
quke=quke|0x00;
}
b=1;
}
EX0=0;
delay(80);
EX0=1;
while((timelong<13300)^(timelong>13700)){ //如果没有正确的新引导码出现 将一直显示解码值 不被没有引导码的红外输入干扰 新的按键被按下还能回到程序的开头重新解码
wei=0x80; //没找到正确的连续码资料 解码结尾还不够完善 待研究
duan=zifuku[yonghuma_l/16]; //3641BG:4位共阳极数码管
delay(1); //4个8位解码值的段和位如果也建数组用for循环
duan=0xff; //多级嵌套的话 这个程序本身就够精简了
wei=0x40; //好像也省不了什么事......
duan=zifuku[yonghuma_l%16];
delay(1);
duan=0xff;
wei=0x20;
duan=zifuku[yonghuma_h/16];
delay(1);
duan=0xff;
wei=0x10;
duan=zifuku[yonghuma_h%16];
delay(1);
duan=0xff;
wei=0x8;
duan=zifuku[anjianma_z/16];
delay(1);
duan=0xff;
wei=0x4;
duan=zifuku[anjianma_z%16];
delay(1);
duan=0xff;
wei=0x2;
duan=zifuku[anjianma_f/16];
delay(1);
duan=0xff;
wei=0x1;
duan=zifuku[anjianma_f%16];
delay(1);
duan=0xff;
}
}
}
void zdext ()interrupt 0{
TR0=0;
timelong=TH0*256+TL0;
TH0=0;
TL0=0;
TR0=1;
b=0; //b值用于 for循环与中断的有序同步 一中断一for循环
}
/***如果感兴趣的想试一试这个解码程序的发烧友 移植的时候后面的
动态数码管显示得自己修改一下哦 我的板子被我改过了 不一样
照搬的话可能显示不了哦 ***/
这个程序可以以解码,但是实用性很差,程序里用的while()语句太多了,很容易很程序死在某个地方,比如做个遥控器控制几个灯什么的,实现起来都有困难因为你的程序时间全花在等待上面,没有时间做其他事情。
额。我也不想啊 但我就会c语言的这5大循环语句 搞几晚上 做出来能解码 我还是有点小小的激动的
慢慢来,至少时序是看懂了。
谢谢分享谢谢分享
听了你的建议我又改进了下 做了个没有while 不浪费时间 能控制东西的解码 你给看看有啥毛病么
http://bbs.elecfans.com/jishu_490951_1_1.html
优化代码,学习无止境啊
小编,quke 是怎么获得值得?
他们说我这个while太多 你还是看看我改进过的另一个吧 解码都在中断里面完成 http://bbs.elecfans.com/jishu_490951_1_1.html
学习了,谢谢啊!
可以放一个break
