新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 利用單片機定時中斷實現軟定時器

        利用單片機定時中斷實現軟定時器

        作者: 時間:2016-11-24 來源:網絡 收藏
        以下是代碼實現已經測試并用到項目上課放心使用
        Author : 吾本杞人
        #include "reg52.h"
        #include "Intrins.h"
        #include "TypeDef.h"
        #include "CPUPin_Def.h"
        #include "VarDef.h"
        #define TIME_BASE_2MS 2
        #define TIME_BASE_500MS 250
        #define TIME_BASE_10MS 5
        #define F_OSC 110592 //定義這個是默認按照11.0592MHZ的晶振算的TH0 TL0的值 方式1 16位定時器
        //注意這種寫法只能晶振翻倍的時候改這個宏才有用,
        //因為51單片機硬件不支持浮點運算 12/11.0592 = 1 向下取整了 跟11.0592的晶振值是一樣的
        // 如果支持浮點運算會有芯片內部專門的的硬件浮點運算指令 這種寫法也不行 必須強轉類型
        //如 ( double)12/(double)11.0592 要把類型強轉成浮點數才行。
        //目前有 硬件支持浮點 有軟件浮點 就是說軟件也可以實現浮點數運算。比如編譯器看到特殊的代碼會把轉到
        //一個特殊的函數去處理。 51 STM32 單片機目前好像都不支持硬件浮點數
        void Timer0() interrupt 1 using 1
        {
        //采用靜態變量這里只會執行一次,不管多少次中斷因為是靜態變量
        //但不能寫成
        //如果實際換成了是12MHZ晶振 就改成 F_OSC / 120000 因為TH0 TL0 是按照11.0592算的值
        static uchar TimeBase2ms = TIME_BASE_2MS * (F_OSC / 110592);
        //如果11.0592的晶振 就1 如果是12.00MHZ 那這個值算出來說就是1.085xxxx 晶振跑的快了這個值要大點
        //就是直接改F_OSC 這個宏就行了。不用改其他的
        static uchar idata TimeBase500ms = TIME_BASE_500MS * (F_OSC / 110592);
        static uchar TimeBase10ms = TIME_BASE_10MS *(F_OSC / 110592);
        static unsigned char CountSignalDelay = 0;
        //以上只會執行一次 static 定義聲明初始化
        uchar i;
        TH0=0xfc ; // 總定時1000微秒, 進入中斷需要12個周期, 所以實際定時1000 - 12 * 12 / F
        TL0=0x72 ;
        //這里 用工具算出來應該是FC 66 FC72-FC66 = 12
        //讓裝載的數字少用12個周期 進入中斷因為進入中斷需要12周期加上去正好1ms
        _push_( SCONF ) ;
        if( --TimeBase2ms == 0 ){
        TimeBase2ms = TIME_BASE_2MS * (F_OSC / 110592);
        //0--3 是2毫秒為時基的定時器
        for( i = 0; i < 4; i++ )
        {
        if( TimerNo[ i ] != 0 ){
        if( --( TimerNo[ i ] ) == 0 ){//時間到
        fTimer |= 0x01 << i; //置為時間到
        }
        }
        }
        if( --TimeBase10ms == 0 )
        {
        TimeBase10ms = TIME_BASE_10MS * ( F_OSC / 110592 );
        ScanCopierSignal() ;//10毫秒掉一次函數
        }
        if( --TimeBase500ms == 0 )
        {
        TimeBase500ms = TIME_BASE_500MS * ( F_OSC / 110592 );
        //處理以500ms為時基的定時器
        for( i = 4; i < 8; i++ )
        {
        if( TimerNo[ i ] != 0 ){
        if( -- ( TimerNo[ i ] ) == 0 ) {
        fTimer |= 0x01 << i;
        }
        }
        _pop_(SCONF);
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 沾化县| 天峻县| 庆城县| 平凉市| 福泉市| 公主岭市| 高平市| 社旗县| 瓮安县| 台东市| 平顺县| 巴塘县| 鄯善县| 融水| 潼关县| 阿克苏市| 高阳县| 江孜县| 湘潭县| 郓城县| 无为县| 通辽市| 乌鲁木齐市| 阿勒泰市| 赣州市| 昭苏县| 巫溪县| 伊金霍洛旗| 正定县| 方城县| 堆龙德庆县| 米易县| 玛沁县| 金溪县| 会泽县| 留坝县| 商南县| 高雄县| 正蓝旗| 建德市| 海宁市|