📄 红外接受.c
字号:
#include <myincludes.h>
#define dp GD02
//得PIND2的值 (INT0)
char k,buf[4];
void delay_0_5ms(void)
{
unsigned int i;
for(i=1;i<(unsigned int)(4*147-2);i++) //稍比发送的长一点
;
}
/********************************************************************
* 函数说明:1 MS延时程序 *
********************************************************************/
void delay_1ms(void)
{
unsigned int i;
for(i=1;i<(unsigned int)(8*143-2);i++)
;
}
void Delay_Ms(uint num)
{
uint i;
for(i=0;i<num;i++) delay_1ms();
}
/*每次发送的32二进制码可分成两部分,其中前16位是遥控器辨识码,
主要用于区别不同遥控器,后16位是 操作码。这两个部分的后8位都是前8位的反码,
用作数据校验。*/
/*数据头的时间:Th=9+4.5=13.5ms
数据"0"的时间:T0=0.565+0.56=1.125ms
数据"1"的时间:T1=1.685+0.56=2.245ms*/
/********************************************************************
* 函数说明:外中断0初始化程序 *
*********************************************************************/
void int0_init(void)
{
MCUCR=0x02;//开中断0、下降沿触发脉冲
GIFR=0Xff;
}
#pragma interrupt_handler ext_int0:2 //M16参考外中断向量
/********************************************************************
* 函数说明:外中断0中断处理程序 *
*********************************************************************/
void ext_int0(void)
{ unsigned char i,j;
CLI(); //暂时屏蔽外部中断
for (i=0;i<8;i++) //延时8毫秒
{
delay_1ms(); //调用1ms延迟程序。
if(dp==1) //判断INT0端口的状态。操作的是PD2,PD2为高吗?变回高就退出
{
SEI(); //开中断
return; //如果为高,说明是干扰或出错,跳出这个循环。
}
}
while(dp==0); //等待9ms的低电平结束,
Delay_Ms(4); //避过4.5ms的结果码
delay_0_5ms();
for (j=0;j<4;j++)
{
k=0;
for (i=0;i<8;i++)
{
while(dp==0); //等待每一个数据位的0.565ms低电平后的高电平
if (dp)
{
delay_1ms(); //为高电平,再延迟1ms,
k |= BIT(i); //第i位读取1
}
else
{
k &= ~BIT(i); //第i位读取0
}
}
buf[j] = k ; //保存读到的数据 buf[2]就是所真正要接收的数据
}
if ((buf[2]+buf[3]) != 0xff) //判断数据的第三字节和第四字节的取反后相等吗?
{
SEI(); //开中断
return; //如果不相等说明是干扰或出错,跳出整个循环。
}
//////////////////////////////////////////////加要加的函数
SEI(); //开中断
}
void main()
{
SEI();
int0_init();
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -