终于成功了,初学单片机,注释可能不是正确,请大家不要见笑,下面是我和代码
/****************************************************************
功能: 红外线遥控接收
时锺: 11.0592mhz
作者: 邓福强
tel: 0769-21353277
qq: 369127282(隐身)
e-mail:wiseton@21cn.com
/***************************************************************/
#include <reg52.h>
#define uchar unsigned char //定义方便使用
#define uint unsigned int
uchar key_value;
sbit ir_pin = p3^3; //由于我的mcu p3^2烧了,只能用暂时代用p3^3
void int_t0_1120us() //定时延时函数 延时1.12ms
{ //初始化t0定时1120us;
tf0=0;
tmod|=0x01; //设t0工作在16位定时模式
th0=(65536-1022)/256;
tl0=(65536-1022)%256;
tr0=1; //t0开始运行
}
void int_t0_2400us() //定时延时函数 延时2.4ms
{ //初始化t0定时2400us;
tf0=0;
tmod|=0x01; //设t0工作在16位定时模式
th0=(65536-2200)/256;
tl0=(65536-2200)%256;
tr0=1; //t0开始运行
}
void int_t0_850us() //定时延时函数 延时0.85ms
{ //初始化t0定时850us;
tf0=0;
tmod|=0x01; //设t0工作在16位定时模式
th0=(65536-775)/256;
tl0=(65536-775)%256;
tr0=1; //t0开始运行
}
ir() //译码函数 此函数不能有while(ir_pin==1)的表达式,如有此表达式会偶然进入死循环,但可以用while(ir_pin==0)
{
uchar data tempcode[4],i,j; //遥控码临时存放区
while(ir_pin==0); //等待4.5ms高电平出现(重码为2.25ms)
int_t0_2400us(); //延时2.4ms,理论要检测2.53125ms的电平
while(tf0!=1);
if(ir_pin==1) //延时2.4ms后判断是高电平是为新码,低电平为重码
int_t0_2400us(); //如是代电平则跳过4.5ms的引导码,理论要跳到4.78125ms
while(tf0!=1);
for(i=0;i<4;i++) //接收4字节
{ //接收8位
for(j=8;j!=0;j--)
{
while(ir_pin==0); //等待0.56高平出现
int_t0_850us(); //延时850us,检测延时0.85后的电平,高是1,低是0
while(tf0!=1);
tempcode>>=1; //从低位开始接收,左移一位准备接收
if(ir_pin==1) //延时850us后,判断此时ir_pin的电平
{
tempcode|=0x80; //1处理,0不用处理,0只是移位就ok
int_t0_1120us(); //延时1120us,跳出1高电平
while(tf0!=1); //跳到1高平后(2.25-0.5625=1.69ms)的低电平,理论要跳到(2.25-0.5625+0.5625/2=1.96875ms)
//此处不能用while(ir_pin==1);如用while(ir_pin==0);在接收最后一位是1会有时会进入死循环?
}
} //end j //下1字节
}//end i
if(tempcode[2]==~tempcode[3]) //比较是遥控码否正确,如要比较用户码用:if((tempcode[0]==~tempcode[1])&&(tempcode[2]==~tempcode[3]))
key_value=tempcode[2]; //如正确返回遥控码
else return; //错误则返回
}
int_2()interrupt 2 using 3 //中断函数
{
uchar i;
for(i=10;i!=0;i--) //确认是遥控不是干扰,重复检测10次 0.85*10=8.5ms
{
if(ir_pin==0) //是否有低电平?
{
int_t0_850us(); //延时850us
while(tf0!=1);
}
else
return; //如9ms有高电平就退出,认定是干扰
}
ea=0; //关中断,在接收过程中有中断将接收失败
ir(); //调用译码函数
p0=key_value;
ea=1; //开中断
}
void main() //主函数
{
ex1=1; //开外部1中断
ea =1; //开总中断
while(1);
}