这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 51单片机红外解码程序

共29条 1/3 1 2 3 跳转至

51单片机红外解码程序

专家
2013-05-06 08:08:54     打赏

51单片机红外解码程序,解释的很详细,很适合初学者,这两天刚好用到,特来分享。

——回复可见内容——

 




关键词: 红外     解码    

助工
2013-05-06 08:16:40     打赏
2楼

刚好现在在学习,太给力了


专家
2013-05-06 08:42:34     打赏
3楼
#include 
#include 

// 函数原型
void SystemInit(void);
void Delay_840us(void);
void Delay_2400us(void);
void LedDisp();
unsigned char GetCode(void);//获得码
void  delay(unsigned char loop);

// 位变量
sbit IRIN = P3^2;	
sbit BEEP = P1^6;
sbit swch = P1^7;

// 变量
unsigned char KeyValue;     //机器码
unsigned char MaValue;      //键值码;
unsigned char disbuf[4];    //数码管显示缓冲
unsigned char scan[4]={0x04,0x08,0x10,0x20}; //p2位选择
unsigned char code table[16] = //共陰碼
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71};

/**
 * 延时
 */
void delay(unsigned char loop) 
{  
    unsigned char i;          
    for(i=0;i>8);  
    TR1=1; 
    while(!TF1); 
    TF1=0; 
    TR1=0;
}

/**
 * 延时9ms 
 */
void Delay_9000us(void)
{
    TL1 = 153.6;
    TH1 = 223.6;
    TR1 = 1;
    while(!TF1);
    TF1 = 0;
    TR1 = 0;
}

/**
 * 延时4.5ms 
 */
void Delay_4500us(void)
{
    TH1 = 239.8;
    TL1 = 204.8;
    TR1 = 1;
    while(!TF1);
    TF1 = 0;
    TR1 = 0;
}

/**
 * 系统初始化 
 */
void SystemInit(void)
{
    IRIN = 1;
    IT0 = 1;         //INT0负跳变触发
    TMOD = 0x10;     //定时器1工作在方式1
    EA = 1;
    EX0 = 1;
}

/**
 * 读码 
 */
unsigned char GetCode()
{ 
    unsigned char n;

    static temp = 0; 

    for( n = 0; n < 8; n++ ) 
    {
        while(!IRIN);  // 等待高电平,开始解码

        Delay_840us(); // 延时0.84ms

        if(IRIN) // 若仍然为高电平,则为1,否则为0
        {
           temp = (0x80|(temp>>1));  // 1  
           while(IRIN); //等待跳变成低电平
        }
        else { 
            temp=(0x00|(temp>>1));  // 0
        }
    } 

    return temp;
}

/**
 * 数码管显示
 */
void LedDisp()
{ 
    unsigned char i;
    for(i=0;i<4;i++)
    {   
        P0=table[disbuf[i]];
        P2 = scan[i];
        delay(50);
        P0=0x00;
    }
}

void main(void)
{ 
    SystemInit();

    while(1) 
    {  
        //以下是查表显示
        disbuf[0]=(((KeyValue&0xf0)>>4)&0x0f);
        disbuf[1]=KeyValue&0x0f;
        disbuf[2]=(((MaValue&0xf0)>>4)&0x0f);
        disbuf[3]=MaValue&0x0f;  
        LedDisp();
    }
}


void interr_ir(void) interrupt 0
{ 
    /**
     * 用户码和机器码 
     */
    unsigned char addrl,addrh,num1,num2; 

    EA = 0;  //先关闭外部中断0

    Delay_9000us(); // 检测9ms开始码

    if (IRIN) {     // 检测是否为干扰信号
        EA = 1;     // 重新开启外部中断0
        return ;    // 退出解码
    }
		   
    while(!IRIN);   // 等待跳为高电平

    Delay_4500us(); // 检测4.5ms结果码

    if (IRIN) {     // 检测是否为干扰信号
        EA = 1;     // 重新开启外部中断0
        return ;    // 退出解码
    }

    // 读码
    addrl=GetCode(); // 用户编码高位
    addrh=GetCode(); // 用户编码低位
    num1=GetCode();  // 机器码
    num2=GetCode();  // 机器码反码

    //校验是否为错码
    if(num1!=~num2)
    { 
        KeyValue=14; 
        EA=1; 
        return;
    }

    KeyValue=num2;
    MaValue=addrh;  

    EA=1;
}

专家
2013-05-06 08:43:12     打赏
4楼
这是程序,你可以看下

专家
2013-05-06 10:34:23     打赏
5楼
顶一个!

助工
2013-05-06 14:06:31     打赏
6楼

谢啦


菜鸟
2013-05-07 21:29:18     打赏
7楼
楼主好人! 

高工
2013-05-09 16:46:49     打赏
8楼
kanyxia

高工
2013-05-09 21:02:49     打赏
9楼
扫两眼

助工
2013-05-10 10:45:43     打赏
10楼

这很适合我呢~


共29条 1/3 1 2 3 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]