红外线键盘键值的程序,高手帮忙
最近再编写一个红外线键盘键值的程序。红外线接收口的数据线接单片机的外部中断0口。红外线键盘发送数据,通过串口发送到上位机显示。我的问题是,我按了一次按键后,上位机能正常显示我所按得键值。但第二次按就没有反应了,第二次程序也没有进入外部中断程序里了。我检查了好久,都不知道哪里出错了···大侠们,帮帮我看看吧。
#include<reg52.h>
sbit red=P3^2;
//sbit led=P1^0;
//sbit led1=P1^1;
bit b_red_start;
bit ok,b_into;
unsigned int time;
unsigned char n;
unsigned char red_temp[33]; //第0个数是存储引导码的时间,后32个存储各个位的用户码和数据码的时间
unsigned char red_data[4];
void deal_red_data();
void init_into() //初始化
{
TMOD=0x21;
SCON=0x40;
TH1=0xFD;
TL1=0xFD;
TH0=0xfe; //定时0.5ms
TL0=0x33;
IT0=1;
ES=1;
EX0=1;
ET0=1;
EA=1;
TR0=1;
TR1=1;
}
void main()
{
time=0;
n=0;
init_into();
while(1)
{
if(ok)
{
deal_red_data();
ok=0;
}
}
}
void ix0() interrupt 0 using 2 //红外线的接收头数据线连接到单片机的外部中断0口
{
if(b_red_start) //测量用户码和数据码
{
red_temp[n]=time ;
time=0;
n++;
if(n==33)
{
ok=1;
n=0;
b_red_start=0;
b_into=1;
}
}
else if(time>=20&&time<33)//引导码
{
n=0;
b_red_start=1;
red_temp[n]=time ;
time=0;
n++;
}
else if(b_red_start==0)
{
time=0;
}
// led=~led;
}
void deal_red_data() //32位减至处理,前16位是用户码,后16位是数据码和数据码反码
{
int i, j,k;
unsigned char temp;
temp=0;
k=1;
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
temp>>=1;
if(red_temp[k]>3)
temp|=0x80;
else temp=temp;
k++;
}
red_data[i]=temp;
temp=0;
}
for(i=0;i<4;i++) //通过串口发送检测到的键值到上位机观察
{
SBUF=red_data[i];
while(!TI) ;
TI=0;
}
}
void timer0() interrupt 1 using 1
{
TH0=0xfe; //定时0.5ms
TL0=0x33;
time++;
}