STC89C52实现红外遥控(C语言)
STC89C52RC实现红外遥控(C语言)7.29
#include<reg52.h>
#define DataPort P0
sbit we=P2^7;
sbit du=P2^6;
unsigned char code digit[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char irtime;
bit irpro_ok,ir_ok;
unsigned char IRcode[4],IRdata[33];
void TIME0init(void)
{
TMOD=0x02;
TH0=0x00;
TL0=0x00;
ET0=1;
TR0=1;
}
void EX0init()
{
IT0=1;
EX0=1;
EA=1;
}
void TIME0_interrupt(void) interrupt 1 using 1
{
irtime++;
}
void EX0_interrupt(void) interrupt 0
{
static unsigned char i; //接收第几次红外信号处理
static bit startflag; //是否开始处理
if(startflag)
{
if(irtime>40&&irtime<60)
i=0;
IRdata[i]=irtime;
irtime=0;
i++;
if(i==33)
{
ir_ok=1;
startflag=0;
}
}
else
{
irtime=0;
startflag=1;
}
}
void Ir_work(void)
{
if (IRcode[0]==0x00&&IRcode[1]==0xFF)
{
switch(IRcode[2])//客户码:00FF
{
case 0x45:break;
case 0x46:break;
case 0x47:break;
case 0x44:break;
case 0x40:break;
case 0x43:break;
case 0x07:break;
case 0x15:break;
case 0xD9:break;
case 0x16:DataPort=digit[0];break;
case 0x19:break;
case 0x0D:break;
case 0x0C:DataPort=digit[1];break;
case 0x18:DataPort=digit[2];break;
case 0x5E:DataPort=digit[3];break;
case 0x08:DataPort=digit[4];break;
case 0x1C:DataPort=digit[5];break;
case 0x5A:DataPort=digit[6];break;
case 0x42:DataPort=digit[7];break;
case 0x52:DataPort=digit[8];break;
case 0x4A:DataPort=digit[9];break;
default:break;
}
}
}
void Ircodepro(void)
{
unsigned char i, j, k;
unsigned char cord,value;
k=1;
for(i=0;i<4;i++) //处理4个字节
{
for(j=1;j<=8;j++) //处理1个字节8位
{
cord=IRdata[k];
if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
value|=0x80;
if(j<8)
{
value>>=1;
}
k++;
}
IRcode[i]=value;
value=0;
}
irpro_ok=1;//处理完毕标志位置1
}
void main(void)
{
EX0init();
TIME0init();
we=1;
DataPort=0xFE;
we=0;
du=1;
while(1)
{
if(ir_ok)
{
Ircodepro();
ir_ok=0;
}
if(irpro_ok)
{
Ir_work();
irpro_ok=0;
}
}
}