新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于8952單片機的紅外解碼(TC9012F編碼)

        基于8952單片機的紅外解碼(TC9012F編碼)

        作者: 時間:2016-11-28 來源:網絡 收藏
        紅外操作免去了和機器接觸。第一是方便,第二也很自然的可以將用戶與管理著分離(使用功能在遙控上,調試功能在機器上)。所以免不了在自己的電子鐘設計中加入了紅外。加的多,學得也多嘛。

        雖然重點在后面,但是先上個程序

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

        參考總結后,第一次參考歸納出源程序如下:

        #include
        #include
        #include
        ////////////////////////////////////////////////

        sbit ir=P3^2;//紅外接口標志

        ////////////////////////////////////////////

        unsigned char irtime;//電平寬度(以定時器來記錄)
        bit irpro_ok,irok;
        unsigned char ircord[4];
        unsigned char irdata[33];

        //////////////////////////////////////////////

        void ir_work(void);
        void ircordpro(void);

        //////////////////////////////////////////////////////////////////

        void tim0_isr (void) interrupt 1 using 1//定時器0中斷服務函數
        {
        irtime++;
        }

        ///////////////////////////////////////////////////////////////////////
        void ex0_isr (void) interrupt 0 using 0//外部中斷0服務函數
        {
        unsigned char i;
        bit startflag;

        if(startflag)
        {
        TR0=0;
        if(irtime<38&&irtime>=34)//引導碼判斷(9MS)
        i=0;
        TR0=1;
        //確認為引導碼,初始為新的32位編碼開始
        irdata[i]=irtime;//i=0是引導碼,后面是其余碼。每次記錄的是每次高低電平一起的脈沖寬度。
        //收到到一個碼算一次中斷,中斷結束前清零寬度計時
        irtime=0;
        i++;
        if(i==33)
        {
        irok=1;
        i=0;
        }
        }
        //第一次進入中斷開啟startflag,用于第二次進入中斷計時比對
        else
        {irtime=0;startflag=1;}

        }

        ////////////////////////////////////////////////////////////////////
        void TIM0init(void)//定時器0初始化
        {

        TMOD=0x02;//定時器0工作方式2,TH0是重裝值,TL0是初值
        TH0=0;//reload value
        TL0=0;//initial value
        ET0=1;//開中斷
        TR0=1;
        }
        ///////////////////////////////////////////////////////////////////
        void EX0init(void)
        {
        IT0 = 1;
        EX0 = 1;
        EA = 1;
        }
        void ir_work(void)//紅外鍵值散轉程序
        {

        switch(ircord[2])//判斷第三個數碼值(數據碼,后面是反碼,前面是引導碼和地址碼)
        {
        case 0:P1=0x00;break;//1 LED顯示相應的按鍵值
        case 1:P1=0xfe;break;//2
        case 2:P1=0xfd;break;//3
        }


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 宜川县| 兴城市| 上蔡县| 文水县| 叶城县| 新建县| 五峰| 监利县| 望谟县| 沙雅县| 无极县| 依安县| 辽源市| 玉环县| 太谷县| 承德市| 施秉县| 泸西县| 汝南县| 平潭县| 满洲里市| 大庆市| 祁连县| 建水县| 普陀区| 华阴市| 郎溪县| 淳化县| 龙南县| 康定县| 绍兴县| 揭西县| 翼城县| 沂水县| 天全县| 河间市| 崇礼县| 江山市| 乌拉特前旗| 隆德县| 平乡县|