新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51學習之定時器中斷

        51學習之定時器中斷

        作者: 時間:2016-11-23 來源:網絡 收藏
        定時器中斷可用兩種方式處理:查詢和進入中斷處理。
        1.查詢
        void Init_T0 (void) 定時器初始化
        {
        TMOD = 0x01;
        TH0 = (65536-65000) /256;
        TL0 = (65536-65000) %6;
        EA = 1;
        ET0 = 1;
        TR0 = 1;
        }
        void Main() 主函數
        { Init_T0 ();
        Speak1 =1;
        if(TF0==1) 查詢中斷標志
        {
        Speak1=~Speak1;
        //TH0 = (65536-65000) /256;
        //TL0 = (65536-65000) %6;
        TF0=0;
        }
        }
        2.進入中斷處理
        void Init_T0 (void) 定時器初始化
        {
        TMOD = 0x01;
        TH0 = (65536-65000) /256;
        TL0 = (65536-65000) %6;
        EA = 1;
        ET0 = 1;
        TR0 = 1;
        }
        void Time0_Int() interrupt 1 中斷處理函數
        {
        Speak1=~Speak1;
        //TH0 = (65536-65000) /256;
        //TL0 = (65536-65000) %6;
        }
        void Main() 主函數
        {
        Init_T0 ();
        Speak1 =1;
        while(1); 等待中斷
        }
        對于查詢方式,一定要手動清楚中斷標志。
        上面2段程序,我屏蔽了,中斷時重新裝計數初值的語句,程序都可正常運行,所以我認為無論對于那種處理方式,重裝初值都不必要。
        初始化時,可定義輸出口的初始狀態。而在處理中斷時,一定要用取反語句。手動置0或1,程序不能正常運行。
        對于方式2,開始main中沒寫最后的while(1),程序不正常運行。
        上述定時最大為65535,約65ms.如果計時大于此,可在中斷中處理。
        程序如下:
        int a;
        void Time0_Int() interrupt 1
        {
        if(a++==20)
        { a=0;
        Speak1=~Speak1;
        }
        }
        呵呵,在寫上面這一小段時,開始沒寫a=0,燈一直亮,后來參考下,發現不清0.a一直變大,程序只能執行一次。



        關鍵詞: 51學習定時器中

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 云霄县| 海淀区| 佛冈县| 龙门县| 顺义区| 铜梁县| 和龙市| 泉州市| 廊坊市| 安达市| 宁陵县| 临桂县| 三原县| 鸡泽县| 泰州市| 福泉市| 麟游县| 临桂县| 吴川市| 永丰县| 新余市| 河曲县| 博客| 阿拉尔市| 泾川县| 婺源县| 嵊州市| 洛阳市| 定兴县| 许昌县| 旅游| 社旗县| 绿春县| 张家港市| 达州市| 新巴尔虎右旗| 西青区| 临朐县| 乐山市| 庆阳市| 三都|