📄 infrared_receive.c
字号:
/*******************************INFRARED DRIVER********************************/
/* */
/* SYSTEM CLOCK 11.0592M */
/* */
/******************************************************************************/
#define INFRARED_EXTERN
#include<c8051f020.h>
#include"infrared_receive.h"
sbit P37=P3^7;
unsigned char val[8]=0;
bit Head_ok=0,Got=0; //Head_ok: 头帧正确,有新的按键 Got:接收完毕
void Timer3_Init()
{
TMR3CN &=0xfb; //关定时器3
TMR3RL = T_3MS; //延时3ms
TMR3 = T_3MS;
}
void Infrared_Init()
{
IE=0x80; //开总中断
EIE2|=0x21;//开中断7和定时器3中断
Timer3_Init();
}
unsigned char Wait_Infrared()
{
unsigned char keyvalue;
while(!Got); //等待接收完毕
if(val[2]+val[3]==0xff) //较验,最后两个字节相互为反码
keyvalue=val[2]; //第三个字节为有效信息
Got=0;
return(keyvalue);
}
void ex_interrupt() interrupt 19 //下降沿中断,收到低电平开始
{
if(!Head_ok) //头帧是否检测完毕
{
EIE2&=0xdf;//关中断7
P3IF&=0x7f;//清中断7的中断标志
Timer3_Init();//定时器3初始化
TMR3CN|=0x04; //开定时器3
}
else
{
while(P37==0)
{if(TMR3CN>0x80) return;} //等待变高 定时器3溢出则跳出 多级中断的实现
P3IF&=0x7f;//清中断7的中断标志
TMR3 = T_0_8MS;//延时0.8ms
TMR3CN|=0x04; //开定时器3
}
}
void T3_inter() interrupt 14
{
static unsigned char i=0,n=0;
static bit h=0;
unsigned int v;
TMR3CN&=0x7f; //清中断标志
if(Head_ok==0&&h==0&&P37==0) h=1; //开始后第一个3ms处应为低
else if(Head_ok==0&&h==1&&P37==1) // 开始后第二个3ms处应为高
{
EIE2|=0x20; //开中断7
TMR3CN&=0xfb; //关定时器3
h=0;Head_ok=1;return;
}
else if(Head_ok)
{
TMR3CN&=0xfb; //关定时器3
n=i++/8;
if(P37) //每0.8ms读一次数据
{
val[n]=val[n]>>1;
val[n]|=0x80;
}
else
val[n]=val[n]>>1;
// n=++i/8;
if(i==32)
{
i=0;n=0;Head_ok=0;
EIE2&=0xdf;//关中断7
for(v=0;v<60000;v++); //避开重复码
EIE2|=0x20; //开中断7
Got=1;
}
}
else //还原为最原始状态
{
EIE2|=0x20;//开中断7
Timer3_Init();
h=0;Got=0;Head_ok=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -