这个程序是我从网上找来的,原作者是刘玉宏
不过我没看出来他用的什么片子,我用AT89S51没法编译
现在已经改过来了,嘿嘿,希望能对大家学RC-5协议有些帮助
include<reg52.h>
// 波特率发生器的初值(115200波特率)XTAL 11.0592M
//#define BRGR1_DATA 00
//#define BRGR0_DATA 0x50
sbit WAY_0 = P2^0;
//sbit LED_RECIEVE= P0^6;
unsigned char bdata buffer;//发往串口的缓冲器
sbit way0=buffer^0;
unsigned char irtype; //RC5一帧的各段的标志
unsigned char count,buf_s[3]; //红外接收位寄存器
unsigned char end; //红外一帧接收结束标志
void t0_service(void) interrupt 1 using 1
{
//第一次进入中断,为定时1/4位的时间445us
//以后则定时一位时间1.778ms进入中断
way0=~WAY_0; //一体化解码后,有载频的部分变为低电平
TH0=(0xffff-1522)/256;
TL0=(0xffff-1522)%256;
count++;
if((irtype==0)&&(count==3)) //起始码部分2个1和翻转位
{
buf_s[0]=buffer;
count=0;
irtype=1;
buffer=0;
}
else if((irtype==1)&&(count==5)) //5位地址
{
// TI=0;
buf_s[1]=buffer;
count=0;
irtype=2;
buffer=0;
}
else if((irtype==2)&&(count==6)) //6位命令
{
// TI=0;
buf_s[2]=buffer;
P0 = ~buffer;
count=0;
irtype=3;
buffer=0;
}
else if(irtype==3) //等最后半位结束,实际延时1位时间
{
TI=0;
count=0;
irtype=0;
buffer=0;
end=1;
TR0=0; //解码结束,定时器停止
return;
}
buffer=buffer<<1;
// if(way0 == 1) buffer++;
}
void powerup( void )
{
TMOD = 0X21; //定时器1为方式2
TL1 = 0xfd; //置初值,波特率为9600
TH1 = 0xfd;
PCON = 0x00; //SMOD = 0
// TR0=1;
TR1 = 1; //启动定时器1
IE=0x82;
SCON = 0x50;
}
void main(void)
{
unsigned char i;
WAY_0=1; //输入首先写1
powerup();
while(1)
{
buffer=0;
irtype=0;
count=0;
end=0;
TH0=(0xffff-381)/256;
TL0=(0xffff-381)%256;
while (WAY_0);//等待低电平,一帧的开始
TR0=1; //开始定时,红外接收
while(!end); //等一帧解码结束
for(i = 0;i<3;i++)
{
TI=0;
SBUF = buf_s[i]+0x30;
while(!TI);
}
}
}