红(ji)外(huo)解(zhang)码(hao)
第一次按键可正常解码
之后按键在解码程序的for语句内按键码是正常的,出了for语句就变成第一次的按键码
/* 红外解码程序 */
/* cpu 89c52 */
/* 晶振 11.0592MHz */
/* vs1838b 信号脚接P3^2 */
/* 串口波特率 9600 */
/* */
/* 程序流程: */
/* 初始化 */
/* 外部中断子程序(时钟开、外部中断关、记录时间、时钟关)*/
/* 解码 */
/* 发送数据 */
/* 外部中断开 */
#include <reg52.h>
sbit IR=P3^2; //vs1838b 信号脚接3.2口
unsigned char GCode,Time,*IRF; //引导码时间变量、计时变量、数据时间指针
void delay(unsigned char a)
{
char b;
for(;a>0;a--)
for(b=110;b>0;b--);
}
unsigned char decode() //解码函数
{
unsigned char bity[4],place,n;
for(n=0;n<32;IRF++,n++)
{
switch(*IRF) //解码
{
case 4:
case 5:bity[place]=bity[place]*2;break;
case 8:
case 9:bity[place]=bity[place]*2+1;break;
}
if(n%8==7) //达到一字节
{
if(place==1&&(bity[0]||~bity[1])) //用户码、用户反码(用户码0x00)
return 0;
SBUF=bity[place]; //发送每字节数据
while(!TI);
TI=0;
place++; //字节加1
}
}
SBUF=bity[2]; //调试用,发送用户码
while(!TI);
TI=0;
if(bity[2]==~bity[3]) //校验数据码
{
return bity[2]; //返回数据码
}
else
return 0; //数据出错
}
void main()
{
unsigned char ir_frame[4][8],ajcode; //数据时间变量、按键码
IRF=ir_frame[0]; //数据时间指针初始化
PT0=1;
PX0=0; //外部中断时要用到定时器0中断
TMOD=0x22; //定时器为方式2
TH0=0x06; //250us
TL0=0x06;
TR0=0;
TH1=0xfd; //9600bps
TL1=0xfd;
TR1=1;
IT0=0; //跳变沿触发
SM0=0;
SM1=1; //串口方式1
EA=1; //中断开
ET0=1;
EX0=1;
while(1)
{
if(GCode)
{
GCode=0;
for(IRF=ir_frame[0];IRF<ir_frame[0]+32;IRF++)
{
SBUF=*IRF; //发送{每位数据的时间}
while(!TI);
TI=0;
if((IRF-ir_frame[0])%8==7)
{
SBUF=0; //接受窗口对齐格式用的
while(!TI);
TI=0;
SBUF=0;
while(!TI);
TI=0;
SBUF=0;
while(!TI);
TI=0;
SBUF=0;
while(!TI);
TI=0;
}
}
IRF=ir_frame[0];
ajcode=decode(); //解码
IRF=ir_frame[0];
SBUF=0; //接受窗口对齐格式用的
while(!TI);
TI=0;
SBUF=0;
while(!TI);
TI=0;
SBUF=0;
while(!TI);
TI=0;
SBUF=0;
while(!TI);
TI=0;
SBUF=0;
while(!TI);
TI=0;
SBUF=0;
while(!TI);
TI=0;
SBUF=ajcode; //发送解码结果
while(!TI);
TI=0;
delay(10); //模拟程序运行
EX0=1; //开中断
}
}
}
void time250us() interrupt 1 //250us时钟计时
{
Time++;
}
void IRzd() interrupt 0
{
unsigned char i;
EX0=0;
TR0=1;
while(!IR);
while(IR);
GCode=Time; //引导码时间
TL0=0x06;
Time=0;
if(GCode>0x27) //判断引导码
for(i=0;i<32;i++) //记录数据时间
{
while(!IR);
while(IR);
if(Time>10) //认定为连续按键
{
break;
}
*IRF=Time;
Time=0;
IRF++;
}
else
{
GCode=0;
EX0=1;
}
TR0=0;
TL0=0x06;
Time=0;
}