|
发表于 2010-8-5 17:07:53
|
显示全部楼层
给你一个。。。。/。。。,
//************函数申明*********************
void delay882us(void); //精确延时882us 7.3728m
void delay1000us(void); //精确延时1000us
void delay520us(void); //精确延时500us
void delay16(unsigned int i)
{
while(--i);
}
//******************************************
void delay882us(void)
{
delay16(458);
}
//******************************************
void delay1000us(void)
{
delay16(518);
}
//******************************************
void delay520us(void)
{
delay16(269);
}
//*************用到的I/O口定义**************
sbit P32=P3^2; //INT0,红外信号输入
//*******************外部中断0 红外解码程序****************************************
decode(void) interrupt 0
{
unsigned char count0,count1,count2;
EX0 = 0; //外部中断0关闭
for(count0=0;count0<10;count0++) //起始码前9ms的低电平
{
delay882us();
if(P32) goto exit; //9ms没完就出来高电平则为干扰信号,跳出中断(退出解码)
}
if(!P32) //低电平没完
{
for(count0=0;count0<5;count0++) // 连续5次 520US必须是1
{
delay520us();
if(!P32) goto exit; // 2.5MS 内必须是1 否则就是连码 退出解码
}
delay520us();delay520us();delay520us();delay520us(); //9ms没结束再延时4740us,加上前面的8820us,已跳过起始码的13.5ms
for(count1=0;count1<4;count1++) //开始读数据,4个字节,32位
{
for(count2=0;count2<8;count2++) //每个字节8位
{
while(!P32); //等待高电平到来
delay882us();
if(P32) //延时882us后,若P32还是高电平,则为 位1
{
IRCode[count1]=IRCode[count1]>>1;
IRCode[count1]=IRCode[count1]|0x80;
delay1000us(); //延时1000us,结束高电平
}
else //延时882us后,若P32为低电平,则为 位0
{
IRCode[count1]=IRCode[count1]>>1;
IRCode[count1]=IRCode[count1]|0x00;
}
}
} //到这里已读完所有32位数据
if(IRCode[2]=~IRCode[3]) //效验 数据和数据 反码
{
RFDATA=IRCode[2];
}
}
exit:
EX0 = 1;
} |
|