网上有很多关于uPD6121G红外遥控解码程序,这些都写的很长,看起来发晕下载下来也多数不能用以下程序是通过检验的程序,只要编译后就可以正
网上有许多关于uPD6121G红外遥控解码程序,这些都写的很长,看起来发晕.下载下来也大都不能用.以下程序是经过查验的程序,只需编译后就可以正常运用.留意这儿仅仅个解码程序!假如你想增加其它功用请自己增加.此程序没有解码UPD6121的重复码.
以下程序运用:12MHZ晶振,AT89C52
设计者:李国强
晶振: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() interrupt 0
{
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;
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/258917.html