红外解码程序出了点问题
insect502013/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;
}
来自:电子信息 / 电子技术
1
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}