新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 1T-12T單片機中斷方式格力空調(diào)遙控器(YB0F2)解碼

        1T-12T單片機中斷方式格力空調(diào)遙控器(YB0F2)解碼

        作者: 時間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
        格力空調(diào)遙控器(YB0F2)解碼

        CUP:STC89C52RC晶振:11.0569MHz
        直接如串口輸出 波特率:57600
        ************************************ 說 明 **********************************************
        解碼方式:
        以一個9ms的低電平和4.5ms的高電平為引導(dǎo)碼,后跟35位二進制代碼接著0.565ms低電平和20MS高電平跟32位二進制代碼
        前4個字節(jié)每個字節(jié)為8位,中間1個字節(jié)只有3位,接著為20MS高電平,跟后4個字節(jié)每個字節(jié)為8位
        以低電平為0.565ms、高電平為0.56ms、 周期為1.125ms的組合表示"0";
        以低電平為0.565ms、高電平為1.685ms、周期為2.25ms的組合表示"1"。
        注意:經(jīng)過紅外接收頭解調(diào)后單片機接收到的高低電平是和遙控器發(fā)射時是相反的一個過程
        *兼容1T-12T單片機中斷方式紅外接收數(shù)據(jù),并通過串口發(fā)送
        程序編輯: lbq69147794022/07/2011

        本文引用地址:http://www.104case.com/article/201611/321340.htm

        #include
        typedef unsigned char uint8;
        sbit Ir_Pin = P3^2;
        uint8 Ir_Buf[9]; //用于保存解碼結(jié)果

        void int1_init(void)
        {
        IT0 = 1; //下降沿有效
        EX0 = 1;
        EA = 1;
        }

        void uart_init(void)
        {
        TMOD = 0x21;

        SCON = 0x50;
        PCON |= 0x80;
        TH1 = 0xff; //57600bps @ 11.0592MHz
        TL1 = 0xff;
        TR1 = 1;
        }


        void UART_Send_Byte(uint8 dat)
        {
        SBUF = dat;
        while (TI == 0);
        TI = 0;
        }

        unsigned int Ir_Get_Low()
        {
        TL0 = 0;
        TH0 = 0;
        TR0 = 1;
        while (!Ir_Pin && (TH0 & 0x80)==0);//一直計到Ir_Pin不等0與計到大于1.085*32768=35553.28us
        TR0 = 0;
        return (TH0 * 256 + TL0);//返回T1 高八位和低八位計數(shù)值
        }

        unsigned int Ir_Get_High()
        {
        TL0 = 0;
        TH0 = 0;
        TR0 = 1;
        while (Ir_Pin && (TH0 & 0x80)==0);//一直計到Ir_Pin不等1與計到大于1.085*32768=35553.28us
        TR0 = 0;
        return (TH0 * 256 + TL0);//返回T1 高八位和低八位計數(shù)值
        }

        main()
        {
        uart_init();
        int1_init();
        while (1);
        }

        void int1_isr() interrupt 0
        {
        unsigned int temp;
        char i,j;
        temp = Ir_Get_Low();
        if ((temp < 7833) || (temp > 8755)) //引導(dǎo)脈沖低電平8500~9500us
        return;//不在這范圍則說明出錯//1.085*7833=8498us ~ 1.085*8755=9499us
        temp = Ir_Get_High();
        if ((temp < 3686) || (temp > 4608)) //引導(dǎo)脈沖高電平4000~5000us
        return; //不在這范圍則說明出錯//1.085*3686=3999us ~ 1.085*4608=4999us

        for (i = 0; i < 4; i++) //4個字節(jié)
        {
        for (j = 0; j < 8; j++) //每個字節(jié)8位
        {
        temp = Ir_Get_Low();
        if ((temp < 184) || (temp > 737)) //200~800us
        return;//不在這范圍則說明出錯//1.085*200=217us ~ 1.085*800=868us
        temp = Ir_Get_High();
        if ((temp < 184) || (temp > 1843)) //200~2000us
        return;//不在這范圍則說明出錯//1.085*200=217us ~ 1.085*2000=2170us
        Ir_Buf[i] >>= 1;//先將它自動補0
        if (temp > 1032) //1120us//1.085*1032=1119us
        Ir_Buf[i] |= 0x80;//如果大于1119us才將它設(shè)為1
        }
        }

        for (i = 4; i <= 4; i++) //1個字節(jié)
        {Ir_Buf[i] = 0;
        for (j = 0; j < 3; j++) //每個字節(jié)8位
        {
        temp = Ir_Get_Low();
        if ((temp < 184) || (temp > 737)) //200~800us
        return;//不在這范圍則說明出錯//1.085*200 = 217us ~ 1.085*800 = 868us
        temp = Ir_Get_High();
        if ((temp < 184) || (temp > 1843)) //200~2000us
        return;//不在這范圍則說明出錯//1.085*200 = 217us ~ 1.085*2000 = 2170us
        Ir_Buf[i] <<= 1;//先將它自動補0
        if (temp > 1032) //1120us//1.085*1032 = 1119us
        Ir_Buf[i] |= 0x01;//如果大于1119us才將它設(shè)為1
        }
        }

        //delay21ms();//實測波形只20ms但如果只延時20ms讀出會出錯故延時21ms
        temp = Ir_Get_Low();
        if ((temp < 184) || (temp > 737)) //200~800us
        return;//不在這范圍則說明出錯//1.085*200 = 217us ~ 1.085*800 = 868us
        temp = Ir_Get_High();
        if ((temp < 17498) || (temp > 19354)) //19~21ms
        return;//不在這范圍則說明出錯//1.085*17498 = 18985us ~ 1.085*19354 = 20999us

        for (i = 5; i < 9; i++) //4個字節(jié)
        {
        for (j = 0; j < 8; j++) //每個字節(jié)8位
        {
        temp = Ir_Get_Low();
        if ((temp < 184) || (temp > 737)) //200~800us
        return;//不在這范圍則說明出錯//1.085*200 = 217us ~ 1.085*800 = 868us
        temp = Ir_Get_High();
        if ((temp < 184) || (temp > 1843)) //200~2000us
        return;//不在這范圍則說明出錯//1.085*200 = 217us ~ 1.085*2000 = 2170us
        Ir_Buf[i] >>= 1;//先將它自動補0
        if (temp > 1032) //1120us//1.085*1032 = 1119us
        Ir_Buf[i] |= 0x80;//如果大于1119us才將它設(shè)為1
        }
        }

        for(i = 0;i < 9;i++) //通過串口將代碼發(fā)出
        {
        UART_Send_Byte(Ir_Buf[i]);//將9個字節(jié)的遙控鍵值通過串口輸出
        }
        }



        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 铅山县| 武汉市| 广德县| 本溪市| 睢宁县| 河北省| 秦皇岛市| 株洲市| 阿合奇县| 缙云县| 阿拉善右旗| 忻州市| 古蔺县| 繁峙县| 滨州市| 雷波县| 祁东县| 怀宁县| 武隆县| 上高县| 崇义县| 西峡县| 武乡县| 呼和浩特市| 桦川县| 宿州市| 固原市| 四川省| 呼伦贝尔市| 佳木斯市| 湟源县| 达州市| 柘荣县| 乌海市| 伽师县| 特克斯县| 南漳县| 冀州市| 合江县| 青田县| 卢氏县|