欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 基于STC59C52的紅外遙控解碼程序 [打印本頁]

作者: tyx2018    時間: 2018-5-6 08:49
標題: 基于STC59C52的紅外遙控解碼程序



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

程序名稱:  將遙控接收頭接收到的按鍵編碼通過定時器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];
                                }
                        }
                }
}






歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1