新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機紅外遙控電風扇程序

        51單片機紅外遙控電風扇程序

        作者: 時間:2016-11-30 來源:網絡 收藏

        /*------------------------------------------------
        外部中斷0初始化
        ------------------------------------------------*/
        void EX0init(void)
        {
        IT0 = 1; //指定外部中斷0下降沿觸發,INT0 (P3.2)
        EX0 = 1; //使能外部中斷
        EA = 1; //開總中斷
        }

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

        /*------------------------------------------------
        定時器0中斷處理
        ------------------------------------------------*/

        void tim0_isr (void) interrupt 1 using 1
        {
        irtime++; //用于計數2個下降沿之間的時間
        }

        /*------------------------------------------------
        外部中斷0中斷處理
        ------------------------------------------------*/
        void EX0_ISR (void) interrupt 0 //外部中斷0服務函數
        {
        static unsigned char i; //接收紅外信號處理
        static bit startflag; //是否開始處理標志位

        if(startflag)
        {
        if(irtime<63&&irtime>=33)//引導碼 TC9012的頭碼,9ms+4.5ms
        i=0;
        irdata[i]=irtime;//存儲每個電平的持續時間,用于以后判斷是0還是1
        irtime=0;
        i++;
        if(i==33)
        {
        irok=1;
        i=0;
        }
        }
        else
        {
        irtime=0;
        startflag=1;
        }

        }

        /*------------------------------------------------
        鍵值處理
        ------------------------------------------------*/

        void Ir_work(void)//紅外鍵值散轉程序
        {
        switch(IRcord[2])//判斷第三個數碼值
        {
        case 0x0c:P1=0xff;P2=0x28;D1=0; break;//1 顯示相應的按鍵值
        case 0x18:P1=0xff;P2=0xcd;D2=0;break;//2
        case 0x5e:P1=0xff;P2=0x6d;D3=0;break;//3
        case 0x16:P1=0xff;P2=0xfe;break;//0
        case 0x07:LD=0;break;
        case 0x15:LD=1;break;
        //case 0x07:P1=0xff;D7=0;break;//7
        //case 0x15:P1=0xff;D8=0;break;//8
        //case 0xd9:DataPort=dofly_DuanMa[9];break;//9
        //case 0x16:DataPort=dofly_DuanMa[1];break;//1 顯示相應的按鍵值
        //case 0x19:DataPort=dofly_DuanMa[2];break;//2
        //case 0x0d:DataPort=dofly_DuanMa[3];break;//3
        //case 0x0c:DataPort=dofly_DuanMa[1];break;//1 顯示相應的按鍵值
        //case 0x18:DataPort=dofly_DuanMa[2];break;//2
        //case 0x5e:DataPort=dofly_DuanMa[3];break;//3
        // case 0x08:DataPort=dofly_DuanMa[4];break;//4
        //case 0x1c:DataPort=dofly_DuanMa[5];break;//5
        //case 0x5a:DataPort=dofly_DuanMa[6];break;//6
        //case 0x42:DataPort=dofly_DuanMa[7];break;//7
        // case 0x52:DataPort=dofly_DuanMa[8];break;//8
        //case 0x4a:DataPort=dofly_DuanMa[9];break;//9
        default:break;
        }

        irpro_ok=0;//處理完成標志

        }
        /*------------------------------------------------
        紅外碼值處理
        ------------------------------------------------*/
        void Ircordpro(void)//紅外碼值處理函數
        {
        unsigned char i, j, k;
        unsigned char cord,value;

        k=1;
        for(i=0;i<4;i++) //處理4個字節
        {
        for(j=1;j<=8;j++) //處理1個字節8位
        {
        cord=irdata[k];
        if(cord>7)//大于某值為1,這個和晶振有絕對關系,這里使用12M計算,此值可以有一定誤差
        value|=0x80;
        if(j<8)
        {
        value>>=1;
        }
        k++;
        }
        IRcord[i]=value;
        value=0;
        }
        irpro_ok=1;//處理完畢標志位置1
        }

        /*------------------------------------------------
        主函數
        ------------------------------------------------*/
        void main(void)
        {
        EX0init(); //初始化外部中斷
        TIM0init();//初始化定時器
        LCD1602=0;
        cs88=0;
        // DataPort=0xfe; //取位碼 第一位數碼管選通,即二進制1111 1110
        LATCH2=1; //位鎖存
        LATCH2=0;
        P2=0x00;
        while(1)//主循環
        {
        if(irok) //如果接收好了進行紅外處理
        {
        Ircordpro();
        irok=0;
        }

        if(irpro_ok) //如果處理好后進行工作處理,如按對應的按鍵后顯示對應的數字等
        {
        Ir_work();
        }
        }
        }


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 来凤县| 灵台县| 八宿县| 青海省| 黔西| 和龙市| 呼伦贝尔市| 怀安县| 讷河市| 林西县| 峡江县| 沈阳市| 辽宁省| 牡丹江市| 枞阳县| 蚌埠市| 鹿泉市| 祁连县| 聂荣县| 芦溪县| 台湾省| 海丰县| 平山县| 阳江市| 石嘴山市| 无棣县| 灵武市| 临海市| 北海市| 仁布县| 固阳县| 昌邑市| 安阳市| 梓潼县| 黄大仙区| 沙雅县| 岐山县| 资阳市| 什邡市| 濮阳县| 合川市|