新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機萬能紅外遙控解碼程序

        51單片機萬能紅外遙控解碼程序

        作者: 時間:2016-12-01 來源:網絡 收藏

        void Delay1(uint ms)//延時子程序
        {
        uint x,y;
        for(x=ms;x>0;x--)
        for(y=0;y<2400;y++);
        }

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

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


        /*********************************************************************************************
        函數名:定時/計數器初始化函數
        調 用:T_C_init();
        參 數:無
        返回值:無
        結 果:設置SFR中T/C1和(或)T/C0相關參數
        備 注:本函數控制T/C1和T/C0,不需要使用的部分可用//屏蔽
        /**********************************************************************************************/
        void T_C_init (void){
        TMOD = 0x01; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
        TH0 = 0xfe; //16位計數寄存器T0高8位
        TL0 = 0x0c; //16位計數寄存器T0低8位(100uS延時)
        TR0 = 1; //T/C0啟動開關
        ET0 = 1; //T/C0中斷開關
        EA = 1; //中斷總開關
        }
        /**********************************************************************************************/
        /*********************************************************************************************
        函數名:定時/計數器0中斷處理函數
        調 用:[T/C0溢出后中斷處理]
        參 數:無
        返回值:無
        結 果:重新寫入16位計數寄存器初始值,處理用戶程序
        備 注:必須允許中斷并啟動T/C本函數方可有效,重新寫入初值需和T_C_init函數一致
        /**********************************************************************************************/
        void T_C0 (void) interrupt 1 using 1{ //切換寄存器組到1
        TH0 = 0xfe; //16位計數寄存器T0高8位(重新寫入初值)
        TL0 = 0x0c; //16位計數寄存器T0低8位(100uS延時)
        //函數內容
        TCC++;
        }
        /**********************************************************************************************/

        /*********************************************************************************************
        函數名:UART串口初始化函數
        調 用:UART_init();
        參 數:無
        返回值:無
        結 果:啟動UART串口接收中斷,允許串口接收,啟動T/C1產生波特率(占用)
        備 注:振蕩晶體為12MHz,PC串口端設置 [ 4800,8,無,1,無 ]
        /**********************************************************************************************/
        void UART_init (void){
        //EA = 1; //允許總中斷(如不使用中斷,可用//屏蔽)
        //ES = 1; //允許UART串口的中斷

        TMOD = 0x20; //定時器T/C1工作方式2
        SCON = 0x50; //串口工作方式1,允許串口接收(SCON = 0x40 時禁止串口接收)
        TH1 = 0xF3; //定時器初值高8位設置
        TL1 = 0xF3; //定時器初值低8位設置
        PCON = 0x80; //波特率倍頻(屏蔽本句波特率為2400)
        TR1 = 1; //定時器啟動
        }


        /**********************************************************************************************/
        /*********************************************************************************************
        函數名:外部中斷INT初始化函數
        調 用:INT_init();
        參 數:無
        返回值:無
        結 果:啟動外部中斷INT1、INT0中斷,設置中斷方式
        備 注:
        /**********************************************************************************************/
        void INT_init (void){
        EA = 1; //中斷總開關
        //EX0 = 1; //允許外部中斷0中斷
        IT0 = 1; //1:下沿觸發 0:低電平觸發
        }

        void INT_0 (void) interrupt 0 using 2{ //切換寄存器組到2
        EX0 = 0; //允許外部中斷0中斷
        //用戶函數內容
        for(i=0;i<46;i++)
        {
        //獲取低電平寬度
        TH0 = 0xfe; //16位計數寄存器T0高8位
        TL0 = 0x0c; //16位計數寄存器T0低8位(100uS延時)
        TCC=0;
        TR0 = 1; //T/C0啟動開關
        while(Rc==0);
        TR0=0;
        Ldate[i]=TCC;

        //獲取高電平寬度
        TH0 = 0xfe; //16位計數寄存器T0高8位
        TL0 = 0x0c; //16位計數寄存器T0低8位(100uS延時)
        TCC=0;
        TR0 = 1; //T/C0啟動開關
        while(Rc==1);
        TR0=0;
        Hdate[i]=TCC;
        }

        LED_zs=0;
        Delay1(100);
        LED_zs=1;
        Delay1(100);
        LED_zs=1;
        Delay1(300);
        LED_zs1=0;

        }

        void fs(void)
        {
        int fs;
        for(fs=0;fs<46;fs++)
        {
        TH0 = 0xfe; //16位計數寄存器T0高8位
        TL0 = 0x0c; //16位計數寄存器T0低8位(100uS延時)
        TCC=0;
        TR0 = 1; //T/C0啟動開關
        while(TCCTR0=0;
        TH0 = 0xfe; //16位計數寄存器T0高8位
        TL0 = 0x0c; //16位計數寄存器T0低8位(100uS延時)
        TCC=0;
        TR0 = 1; //T/C0啟動開關
        while(TCCTR0=0;
        }

        }

        void main (void)
        {
        int n;
        IP=0x02;
        T_C_init();
        INT_init();
        UART_init();
        LED_zs=1;
        LED_zs1=0;
        red=0;
        while(1)
        {
        Key_f=1;
        if( Key_f!=1)
        {
        Delay1(2);
        Key_f=1;
        if(Key_f!=1)
        {
        for(n=0;n<46;n++)
        {
        SBUF = Ldate[n]; //將接收的數據發送回去
        while(TI == 0); //檢查發送中斷標志位
        TI = 0;
        }
        for(n=0;n<46;n++)
        {
        SBUF = Hdate[n]; //將接收的數據發送回去
        while(TI == 0); //檢查發送中斷標志位
        TI = 0;
        }
        while(!Key_f){fs();Delay1(100);}
        }
        }
        Key_s=1;
        if(Key_s!=1)
        {
        Delay1(2);
        if(Key_s!=1)
        {
        EX0=1;
        LED_zs1=1;
        while(!Key_s);
        }
        }

        }}


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 黄浦区| 阳曲县| 施甸县| 西乌珠穆沁旗| 台州市| 阜平县| 林周县| 河津市| 西充县| 五指山市| 同江市| 齐河县| 新营市| 武川县| 拜泉县| 烟台市| 辉县市| 深圳市| 德庆县| 招远市| 綦江县| 宜城市| 海丰县| 霍邱县| 根河市| 眉山市| 原阳县| 察哈| 福鼎市| 吴堡县| 甘谷县| 泌阳县| 周口市| 唐山市| 同心县| 晋中市| 兴国县| 弥勒县| 黄大仙区| 林甸县| 启东市|