新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機C51編程幾個有用的模塊

        單片機C51編程幾個有用的模塊

        作者: 時間:2012-07-04 來源:網絡 收藏

        KeilC51常用功能模塊使用說明

        說明
        本文檔包括系統中常用到的時鐘中斷、通訊及鍵盤掃描等模塊(見所附源程序)的說明。這些模塊使用前后臺系統模型。為達到最大的靈活性,需要在用戶工程中定義config.h文件,在其中定義各模塊可選參數的設置,而不是直接更改源代碼。
        這些可選內容大部分為宏定義,如果不定義宏相應的功能在編譯時被屏蔽,不會增加代碼長度。具體可選內容見各模塊中的說明。
        在Config.h文件中還要包含一個硬件的資源頭文件。
        各模塊使用了定義在Common.h中的一些數據類型。如:BIT(bit)BYTE(unsignedchar)等,具體請參見源程序。

        時鐘模塊
        軟件設計中,時鐘是重要資源,為了充分利用時鐘資源,故設計本時鐘模塊。本模塊使用定時器0,在完成用戶指定功能的同時,還能夠自動處理一些其它模塊中與時鐘相關的信息。
        時鐘模塊由聲明文件Timer.h以及實現文件Timer.c組成。
        用戶應該在Config.h中定義宏TIMER_RELOAD來設定定時器0的重裝載初值。推薦的定時器0的中斷時間大于1毫秒。

        在程序的初始化階段調用時鐘模塊的初始化函數InitTimerModule()之后,就可以使用時鐘模塊所以支持的各種功能。具體描述如下:
        延時:當用戶需要進行一定時間的延時時,可以通過調用Delay()來進行,參數為時鐘中斷的次數。如時鐘中斷周期為1ms,想進行100ms的延時,則可以調用Delay(100)。
        注意:
        如果延時的絕對時間小于時鐘中斷的周期,則不能夠用本方法做到延時。

        定時:當程序中需要使用定時功能時,如等待某外部事件,如果在一定時間內發生則繼續執行,如果在這段時間內發生,則認為出現錯誤,轉向錯誤處理機制。
        在此推薦一種編程模式,但用戶可以用自己認為更合理的方式處理此類問題。
        這里簡單說明一下關于阻塞式函數及非阻塞式函數。簡單說,阻塞式函數就是當檢測完成條件,如果不能夠完成則等待,如:
        voidCheckSomething()
        {
        //gbitSuccessFlagisaglobalvariable
        while(gbitSuccessFlag==FALSE)
        {
        //donothingbutwaiting
        }
        }
        可以看到,當bitSuccessFlag沒有被設置為TRUE時,函數保持等待狀態不返回,這樣就是阻塞式的函數。
        另外一種情況:
        BITCheckSomething()
        {
        if(gbitSuccessFlag==TRUE)
        {
        //…
        returnTRUE;
        }
        returnFALSE;
        }
        在這里,如果所檢測的事件有沒有完成,函數進行檢測之后,立刻返回,通過返回值報告完成情況,如果沒有完成,則等待調用者分配再次執行的機會。這樣的函數就是非阻塞函數。
        在應用定時功能時,首先要將檢測函數定義成非阻塞函數。如上面的第二個版本的CheckSomething。
        然后下面模式:
        BITbitDone=FALSE;
        ResetClock();//cleartimerinterrupttimescounter
        while(GetClock()MAX_WAITINGTIME)
        {
        if(CheckSomething()==TRUE)
        {
        bitDone=TRUE;
        break;
        }
        }
        if(bitDone==FALSE)
        {
        //processtimeout
        }

        或者簡單寫成:
        BITbitDone=FALSE;
        ResetClock();
        while(GetClock()MAX_WAITINGTIME(bitDone=CheckSomething));
        if(bitDone==FLASE)
        {
        //…
        }

        軟件看門狗:實現具有局限性的看門狗功能。在程序中合適的地方加入對軟件看門狗的復位函數ResetWatchDog(),在Config.h中加入宏TIMER_WATCHDOGTIMEOUT。當程序運行時,如果在發生TIMER_WATCHDOGTIMEOUT次時鐘中斷之內沒有復位軟件看門狗,則系統復位。
        注意:
        如果沒有加入TIMER_WATCHDOGTIMEOUT宏,程序中的ResetWatchDog沒有任何用處,不用刪除。
        如果系統不能實現時鐘中斷,則軟件看門狗也同時失去功能。
        目前版本的的時鐘模塊的復位功能并不是完全復位,主要表現在當復位之后,系統將不再響應任何中斷。所以軟件看門狗只是一個程序的調試功能,不應該將它用于正式工作的程序,此時應該使用硬件看門狗。

        用戶自定義任務:如果想在時鐘中斷內執行一些耗時較短的任務,可以定義回調函數OnTimerInterrupt。函數原形為:voidOnTimerInterrupt();
        如果想在發生時鐘中斷時執行一些功能,而這些功能又耗時相對較長,不合適放在中斷響應函數內部,則可以在程序中的主循環中的任意地方添加:ImpTimerService(),同時提供原形為voidOnTimerEvent()的回調函數。具體的程序如下所示:
        voidmain()
        {
        Initialize();
        while(TRUE)
        {
        //…working
        ImpTimerService();
        //…working
        }
        }

        voidOnTimerEvent()
        {
        //dosometask
        }

        對通訊模塊提供支持:如通訊中的各種超時等,見通訊模塊中的詳細說明。
        對鍵盤掃描模塊提供支持:可以自動調用鍵盤掃描模塊,見鍵盤掃描模塊中的詳細說明。
        對程序調試提供支持:在程序開發過程中,有時為了判斷程序是不是在工作,常用利用單片機系統的某一空閑引腳通過一個限流電阻接一個發光二極管,在程序中間隔固定時間交替控制發光管的明暗。實現這個功能只要在Config.h文件中定義TIMER_FLASHLED宏,如:
        #defineTIMER_FLASHLEDP1_0
        則當時鐘中斷發生256次之后,改變發光管的狀態。


        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 昭平县| 新巴尔虎右旗| 金湖县| 神池县| 沿河| 英德市| 苍南县| 色达县| 太仆寺旗| 铁岭县| 平舆县| 台江县| 六盘水市| 淳安县| 临安市| 绥芬河市| 淄博市| 蓝山县| 绥宁县| 孟州市| 来凤县| 西华县| 铁力市| 西乌珠穆沁旗| 松江区| 崇义县| 宽甸| 仁寿县| 淮安市| 保定市| 泸水县| 潍坊市| 长顺县| 嘉善县| 湖南省| 日土县| 宜兰市| 林西县| 广昌县| 扶绥县| 澎湖县|