单片机红外遥控解码程序设计

版权声明:本文为博主原创文章。 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--);
}






猜你喜欢

转载自blog.csdn.net/u012763833/article/details/52640089