本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
/*使用89C52单片机,8MHz晶振,定时器1和外部中断0来处理UPD6121G的红外解码程序*/
//红外单发能控制,能在数码管上显示用户码和控制码,但怎么也调试不出重复码(重复码不在数码管上显示)。
//是判断重复码的方式不对?还是处理重复码的方式不对?还是根本就没有判断出重复码。本人是新手,跪求高手分析。万分感谢!
void timer1init() //定时器1,工作方式2 初始化函数,晶振为8MHz
{
TMOD=0x20;
TH1=0x55; // 装初值 自动重装到TL1 55
TL1=0x00;
EA=1;
ET1=1;
TR1=1;
}
void int0init() //外部中断0初始化
{
IT0=1;
EX0=1;
EA=1;
}
void timer1() interrupt 3 //定时器1中断函数
{
irtime++;
}
void int0 () interrupt 0
{
if(startflag)
{
if(repeat) //判断并进入长按键重复码
{
if(irtime>30&&irtime<250)
{
irtime=0 ;
}
if(irtime>250&&irtime<400)
{
irtime=0;
repeatnum++;
}
if(irtime>400) //一段时间没发码退出循环
repeat=0;
}
if(irtime>40) //检测引导码
{
bitnum=0;
}
irdata[bitnum]=irtime; //将引导码装入数组的第一位
irtime=0;
bitnum++;
if(bitnum==33)
{
// bitnum=0;
i rreceok=1;
}
if(bitnum==34)
{
bitnum=0;
// irreceok=1;
repeat=1;
repeatnum=0;
}
}
else
{
startflag=1;
}
}
void irpros()
{
uchar k,i,j;
uchar value;
k=1;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
value=value>>1; // 右移7次
if(irdata[k]>5) // 判断8次
{
value=value|0x80 ;
}
k++;
}
ircode[j]=value;
}
irprosok=1;
}
void remotework()
{
if(irreceok)
{
irpros();
irreceok=0;
}
if(irprosok)
{
irprosok=0;
if(ircode[0]==ircode[1]&&ircode[2]==~ircode[3]) //校验接收是否有误
{
if(ircode[0]==客户码)
{
switch(ircode[2])
{
case 0x9b: 自定义程序; break;
case 0xa0:
{ 自定义程序;
while(repeat) //长按键重复码处理
{
if(repeatnum==2)
{
repeatnum=0 ;
自定义程序;
}
}
break;
}
}
}
}
}
} |
|