********Lodestar Stuodio***************
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit IR=P3^2;
uchar HW_dat[4];
uint L_time,H_time;
sbit dis_IO=P3^0;
sbit dis_clk=P3^1;
uchar dis_tab[]={0x11,0xD7,0x32,0x92,0xD4, // ;01234
0x98,0x18,0xD3,0x10,0x90, // ;56789
0x50,0x1C,0x39,0x16,0x38,0x78, //;ABCDEF
0x54,0xFF}; //;H,,灭
bit dec_code();
void HW_fun();
void display(uchar dis_dat);
void main()
{
EA=1;
TMOD=0x01; //T0工作方式1
IT0=1; //外部中断为下降沿触发方式
ET0=1;
EX0=1;
while(1) ;
}
/*****红外触发中断服务子函数*******/
void INT_0(void) interrupt 0
{
EX0=0;
TH0=TL0=0;
TR0=1;
while(!IR) ;
TR0=0;
L_time=TH0*256+TL0; //计算引导码低电平时间
TH0=TL0=0;
TR0=1;
while(IR) ;
TR0=0;
H_time=TH0*256+TL0; //计算引导码高电平时间
if((L_time>8500)&&(L_time<9500)&&(H_time>4000)&&(H_time<5000)) //判断引导码是否正确
{
if(dec_code()) //判断解码是否成功
HW_fun(); //执行红外遥控相应命令函数
}
EX0=1;
}
/*****32bit用户码、数据码及其反码接受判断函数*******/
bit dec_code()
{
uchar i,j;
uchar HW_temp;
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
HW_temp>>=1;
TH0=TL0=0;
TR0=1;
while(!IR) ;
TR0=0;
L_time=TH0*256+TL0;
TH0=TL0=0;
TR0=1;
while(IR) ;
TR0=0;
H_time=TH0*256+TL0;
if((L_time<450)||(L_time>650))
return 0;
if((H_time>450)&&(H_time<650))
HW_temp&=0x7f;
if((H_time>1200)&&(H_time<2000))
HW_temp|=0x80;
}