文号
t57183
阅读
6055
回复
1
收藏
1
红外解码程序出了点问题
2013/05/29
IP:福建
红(ji)外(huo)解(zhang)码(hao)
第一次按键可正常解码
之后按键在解码程序的for语句内按键码是正常的,出了for语句就变成第一次的按键码
psb.jpg


/* 红外解码程序 */
/* 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;
}
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的