#include //头文件包含单片机寄存器
sbit IR=P3^2; //将IR位定义为P3.2引脚
unsigned char a[4]; //存储用户代码、用户反码和键数据代码
unsigned int LowTime,HighTime; ///储存高低电平的宽度
sbit Relay=P1^3; //将Relay位定义为P1.3引脚
/************************************************************
函数功能:解码4个字节的用户码和键数据码
说明:解码正确,返回1,否则返回0
出口参数:dat
*************************************************************/
bit DeCode(void)
{
unsigned chari,j;
unsigned char temp; ///存储解码的数据
for(i=0;i<4;i ) ///连续读取4个用户码和键数据码
{
for(j=0;j<8;j )///每个代码有8位数字
{
temp=temp>>1;//temp每个数据都向右移动,因为高位数据首先被读取
TH0=0; ///定时器清0
TL0=0; ///定时器清0
TR0=1; ///打开定时器T0
while(IR==0) //如果是低电平,等待
; ///低电平计时
TR0=0; ///关闭定时器T0
LowTime=TH0*256 TL0; //保持低电平宽度
TH0=0; ///定时器清0
TL0=0; ///定时器清0
TR0=1; ///打开定时器T0
while(IR==1) //如果是高电平,等待
;
TR0=0; //关闭定时器T0
HighTime=TH0*256 TL0; //保持高电平宽度
if((LowTime<370)||(LowTime>640))
return 0; //如果低电平长度不在合理范围内,则认为错误,停止解码
if((HighTime>420)&&(HighTime<620)) //如果高电平时间约为560微秒,则计数为560/1.085=516次
temp=temp&0x7f; //(520-100=420, 520 100=620)
if((HighTime>1300)&&(HighTime<1800)) //如果高电平时间约为1680微秒,则计数为1680/1.085=1548次
temp=temp|0x80; //(1550-250=1300,1550 250=1800),则该位是1
}
a[i]=temp; ///存储解码字节值a[i]
}
if(a[2]=~a[3])///验证键数据码是否等于其反码,一般不需要验证用户码
return 1; ///解码正确,返回1
}
/************************************************************
函数功能:执行遥控功能
*************************************************************/
void Function(void)
{
Relay=!Relay; //对P1.3引脚取反,控制继电器的吸合、释放
}
/************************************************************
函数功能:主函数
*************************************************************/
void main()
{
EA=1; //打开总中断
EX0=1; ///开外中断0
ET0=1; //定时器T0中断允许
IT0=1; ///外中断沿触发下降
TMOD=0x01; //使用定时器T0的模式1
TR0=0; //定时器T0关闭
while(1) ///等待红外信号中断
;
}
/************************************************************
函数功能:红外触发的外部中断处理函数
*************************************************************/
void Int0(void) interrupt 0 using 0
{
EX0=0; ///关闭外中断0,不再接收二次红外信号中断,只解码当前红外信号
TH0=0; //定时器T0的高8位清0
TL0=0; //定时器T0的低8位清0
TR0=1; ///打开定时器T0
while(IR==0) //如果是低电平,等待并计时低电平引导码
;
TR0=0; ///关闭定时器T0
LowTime=TH0*256 TL0;//保存低电平时间
TH0=0; //定时器T0的高8位清0
TL0=0; //定时器T0的低8位清0
TR0=1; ///打开定时器T0
while(IR==1)///如果是高电平,等待并计时引导码高电平
;
TR0=0; ///关闭定时器T0
HighTime=TH0*256 TL0; ////保存导码的高电平长度
……………………
…………本文篇幅有限 请从51黑下载剩余代码…………