📄 redrec.c
字号:
/*--------------------------------------------
开始 0:发送开始的9ms开始高电平
开始 1:发送9ms高电平后再接受5ms低电平
开始 2:发送完开始信号后就是数据了8位
如果是0则高低电平比为1:3,反之则为1:1
0=1ms高电平3ms低电平
1=1ms高电平1ms低电平
由于发送的时候硬件把电平反相了,所以解码的时候
也要反相处理
----------------------------------------------*/
#define RE_DATA ID3
#define RE_DDR RD3
#define RE_PIN OD3
unsigned char REKEY = 0;//红外接收的数据
void int_interr1(void)
{
RE_DDR = 0;
MCUCR |= 0x04;
MCUCSR|= 0x00;
GICR |= 0x80;
}
/***********************************************
函数名:delay_ms
子函数:无
输 入:n
输 出:无
功 能:延迟n*0.5MS子程序
------------------------------------------------
************************************************/
void REdelay_ms(unsigned int n)
{
unsigned int i=852;
for(;n>0;n--)
{
while(i--);
i=852;
}
}
/***********************************************
函数名:CheckRE
子函数:无
输 入:无
输 出:无
功 能:红外解码
------------------------------------------------
************************************************/
unsigned char CheckRE(void)
{
unsigned char i,Recived_Data = 0;
unsigned int j=0;
REdelay_ms(3); //延迟1.5ms
if(RE_DATA==1)return(16); //没有出现足够的9ms低电平出错
REdelay_ms(14); //延迟7 ms,再加上前面的1.5ms达到延迟8.5ms
if(RE_DATA==1)return(17); //高电平没达到9ms的低电平时间,出错
while(!RE_DATA) //等待出现5ms高电平的开始信号,即等待RE_DATA=1
{j++;if(j>50000)return(17);}
j = 0;
REdelay_ms(3); //延迟1.5ms
if(RE_DATA==0)return(18); //没到5 ms就出现高低电平,出错返回
REdelay_ms(6); //延迟3 ms,加上前面的1.5ms达到延迟4.5ms
if(RE_DATA==0)return(19); //高电平没达到5ms出错
while(RE_DATA) //等待出现低电平
{j++;if(j>50000)return(19);}
j = 0;
for(i=0;i<8;i++)
{
while(!RE_DATA) //等待出现高电平
{j++;if(j>50000)return(19);}
j = 0;
REdelay_ms(3); //延迟1.5ms
if(RE_DATA==0) //如果该位是1则为1ms低电平1ms高电平
{
Recived_Data|=(1<<i);
}
else //如果该位是0则为1ms低电平3ms高电平
{
while(RE_DATA)//等待出现低电平即等待数据0发送完毕
{j++;if(j>5000)return(19);}
j=0;
}
}
while(!RE_DATA){j++;if(j>5000)return(19);}
return Recived_Data;
}
//外中断1服务程序
//#pragma interrupt_handler int1_isr:3
//void int1_isr(void)
SIGNAL(SIG_INTERRUPT1)
{
unsigned char key;
GICR&=~(1<<INT1);
key=CheckRE();
if(key<16)
{
REKEY=key;
OSTaskResume(2);//唤醒红外处理任务
}
GICR |= 0x80;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -