找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2277|回复: 0
打印 上一主题 下一主题
收起左侧

基于STC59C52的红外遥控解码程序

[复制链接]
跳转到指定楼层
楼主
ID:323225 发表于 2018-5-6 08:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式



/****************************************************************

程序名称:  将遥控接收头接收到的按键编码通过定时器0中断方式,
       数码管显示出来              
说明:能解码的遥控编码必须是NEC 的6221/6121/6222编码方式
      同时 SE10必须要闭合,即使用12M晶体

*****************************************************************/


/*头文件*/
#include <reg52.h>      
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define _Nop() _nop_()



/*端口定义*/

#define sled_dm_port  P0      /*定义LED显示的段码数据脚*/
#define sled_wm_port  P2      /*定义LED显示的位码数据脚*/

sbit dac_latch_port = P3^7;  /*定义DAC通道的锁存器的LE脚*/
sbit led_latch_port = P2^5;  /*LED锁存器的LE脚*/

/*定义数码管显示字符跟数字的对应数组关系*/
uchar code mun_to_char[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
/*                         0    1    2    3    4    5    6    7    8    9    a    b    c    d    e    f */

/*定义需要点亮的数码管*/
uchar code sled_bit_table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

uchar data sled_data[8]={0xff,0xc0,0xc0,0xff,0xff,0xc0,0xc0,0xff}; /*0-7号SLED缓冲值*/
uchar data led_lighten_bit=0 ;  /*LED灯点亮标志位0-7*/


sbit ir_port=P3^2;  /*遥控输入脚*/
uchar ir_code[4];   /*遥控接收数据*/
uchar ir_bit=0;     /*遥控接收成功*/
uchar ir_liangfa=0; /*连发码位*/



/*-----------------------------------------------
显示部分程序,采用定时器0产生中断,1MS更新一次
------------------------------------------------*/
void SLED_Disp() interrupt 1 using 3
{
    TH0  = (65536-1000)/256;
    TL0  = (65536-1000)/256;
        sled_wm_port = 0xff; /*关闭显示*/
        sled_dm_port = sled_data[led_lighten_bit]; /*输出段码数据到数码管*/
        sled_wm_port = sled_bit_table[led_lighten_bit]; /*输出位码数据到数码管*/
        led_lighten_bit++;
        if(led_lighten_bit>=8) led_lighten_bit=0; /*8位数码管全动态输出*/
}



void T0_valueSet() /*定义中断方式,中断时间*/
{
    TMOD = 0x01;  /*定时0,工作在方式1*/
    TH0  = (65536-1000)/256;
    TL0  = (65536-1000)/256;
    TR0  = 1;     /*启动计数*/
    EA   = 1;     /*开总中断*/
    ET0  = 1;     /*开定时器0中断*/
        return;
}



//--------------------------------------
void delay_882us() /* 延时882us */
{
        uint i;
        i=110;
        while(--i);
}

void delay_1000us() /* 延时1000us */
{
        uint i;
        i=125;
        while(--i);
}

void delay_2400us() /* 延时2400us */
{
        uint i;
        i=300;
        while(--i);
}

void yaokong_jieshou()
{
        uchar i,j;
        EA = 0;
        for(i=0;i<10;i++){
                delay_882us(); /*调用882微秒延时子程序*/
                if(ir_port==1){
                        ir_bit=0;
                        EA=1;
                        return; /*检测在8820微秒内如果出现高电平就退出解码程序*/
                        }
                }
        /*以下识别连发码,和跳过4.5ma的高电平*/
        while(ir_port==0); /*等待高电平避开9毫秒低电平引导脉冲*/
        delay_2400us();
        if(ir_port==0){
                ir_bit=1;
                ir_liangfa=1; /*连发码位置0*/
                EA=1;
                return; /*连发码退出*/
                }
        delay_2400us();
        /*以下32数据码的读取,0和1的识别*/
        for(i=4;i>0;i--){
                for(j=0;j<8;j++){
                        while(ir_port==0); /*等待地址码第一位的高电平信号*/
                        delay_882us();
                        ir_code[i-1]=(ir_code[i-1]>>1);
                        if(ir_port==1){
                                ir_code[i-1]=(ir_code[i-1]|0x80);
                                delay_1000us();
                                }
                        }
                }
        if(ir_code[1]==(~ir_code[0])){
                ir_liangfa=0; /*连发码位置0*/
                ir_bit=1; /*遥控接收正确,置位1*/
                }
        EA = 1;
        return;
}

//------------------------------------------------------------



/*主程序*/
void main()
{
        T0_valueSet(); /*定义中断方式,中断时间*/
        led_latch_port = 0;
        dac_latch_port = 0;       
        while(1){
                if(ir_port==0){
                        yaokong_jieshou();
                        if(ir_bit==1){ /*接收成功刷新显示*/
                                /*转换数据为显示字符*/
                                sled_data[1] = mun_to_char[ir_code[0]/0x10];
                                sled_data[2] = mun_to_char[ir_code[0]%0x10];
                                sled_data[5] = mun_to_char[ir_code[2]/0x10];
                                sled_data[6] = mun_to_char[ir_code[2]%0x10];
                                }
                        }
                }
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表