版权声明:本文为博主原创文章。 https://blog.csdn.net/u012763833/article/details/52640089
硬件平台:STC12C5A60S2最小系统
红外接收头:VS1838B(规格书)
拓展阅读
sbit IRIN = P3^2; //红外接收端输入
void delay100us(void);
void delay10us(void);
/**
* 红外输入引脚设置外部中断0下降沿触发
*/
void infraredDecodeInit(void)
{
IT0 = 1;
EX0 = 1;
EA = 1;
IRIN = 1;
}
/**
* 根据协议进行解码
*/
uchar time, decodeValue[4]; // 存储解码值
bit OPERATE_FLAG = 0;
void infraredDecode()
{
uchar i, j;
uint errTime;
delay10us();
/* 确认接收到正确信号 */
if (IRIN == 0) {
/* 等待起始码过去(9ms低电平),等待超时则退出 */
errTime = 1000;
while ((IRIN == 0) && (errTime > 0)) {
delay10us();
errTime--;
}
/* 如果正确等到高电平 */
if (IRIN == 1) {
/* 等待结果码过去(4.5ms高电平),等待超时则退出 */
errTime = 500;
while ((IRIN == 1) && (errTime > 0)) {
delay10us();
errTime--;
}
/* 开始接收位编码信息,共四组,每组8位 */
for (i=0; i<4 ;i++) {
/* 接收一组数据 */
for (j=0; j<8; j++) {
/* 等待0.56ms低电平过去 */
errTime = 60;
while ((IRIN == 0) && (errTime > 0)) {
delay10us();
errTime--;
}
/* 根据高电平持续时间判断码值 */
errTime = 22;
while ((IRIN == 1) && (errTime > 0)) {
delay100us();
time++;
errTime--;
}
decodeValue[i] >>= 1; // 先发送低位
if (time >= 8) {
decodeValue[i] |= 0x80;
}
time=0;
}
}
if(decodeValue[2] != ~decodeValue[3]) return; // 数据校验
}
}
lcd1602WriteCmd(0xCC);
lcd1602WriteDat(0x30 + keyValueTransfer(decodeValue[2])/10);
lcd1602WriteDat(0x30 + keyValueTransfer(decodeValue[2])%10);
delay_ms(500);
}
void EXIT0_Handler() interrupt 0
{
infraredDecode();
}
/* 11.0592MHz 1T */
void delay100us(void)
{
unsigned char a,b;
for(b=61;b>0;b--)
for(a=3;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
void delay10us(void)
{
unsigned char a;
for(a=26;a>0;a--);
}