新闻中心

EEPW首页>嵌入式系统>设计应用> 小巧的uPD6121G红外遥控解码程序

小巧的uPD6121G红外遥控解码程序

作者: 时间:2016-11-25 来源:网络 收藏
网上有很多关于uPD6121G红外遥控解码程序,这些都写的很长,看起来发晕.下载下来也多数不能用.以下程序是通过检验的程序,只要编译后就可以正常使用.注意这里只是个解码程序!如果你想增加其它功能请自己添加.此程序没有解码UPD6121的重复码.

以下程序使用:12MHZ晶振,AT89C52

本文引用地址://m.amcfsurvey.com/article/201611/321161.htm

设计者:李国强
晶振:12MHzAT89S51
11年2月13号--2月24号编好

#include
#define uchar unsigned char
#define uint unsigned int
sbit in=P3^2;//红外信号输入
sbit d0=P1^0;//测试用
sbit d1=P1^1;//测试用
uchar sj[4];//放置解码数据
uint jce;//计时
bit biaoz;

void main(void)
{uchar iii=0;
IT0=1;//负跳变触发
EX0=1;//开外部中断0
EA=1;//开总中断
biaoz=0;
//EX0=0;
//while(i<1250)++i;//调试用
while(1)
{
while(biaoz)
{iii=sj[2];
//iii++;
P1=iii;
IE0=0;
EX0=1;
biaoz=0;
}

}

}


void zd()interrupt0
{
uint su=0;
uchar i=0,ii=0;
EX0=0;
while(!in)if(++su>850) break;//计算9ms红外信号,进行干扰排除

while(in)if(++su>2000) break;//计算4.5ms+9ms时间

if((su>1120)&&(su<1130))//如没错误进入信号收入
{

while(i<4)
{
while(ii<8)
{su=0;//归0后计时
while(!in) if(++su>55) break;//(0.612ms)计算0和1的开始时间
while(in) if(++su>160) break;//(1.767ms)计算时长为判断0和1作准备
if(su<120)sj[i]>>=1;//su小于120判断为0
if(su>155){sj[i]>>=1;sj[i]+=0x80;}//su大于155判断为1
ii++;

while(in)if(++su>250) break;//(2.757ms)判断为1后如没有变低电平在此等待,防死循环
if(su==250)ii=8;//防止死循环和错误数据

}
ii=0;//为下次循环作好准备
i++;
if(su==250)i=8;//防止死循环和错误数据
}
//P1=sj[2];//显示解码数据sj[2]//如果P1口有发光管就能看到解码后的数据

}
if(i==4)biaoz=1;
else
{IE0=0;
}EX0=1;
}



评论


技术专区

关闭