新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 狀態機思路在單片機中的程序實現

        狀態機思路在單片機中的程序實現

        作者: 時間:2012-07-10 來源:網絡 收藏
        實現一個時鐘程序

        接下來,我將就狀態機的應用,結合流程圖、狀態遷移圖和狀態遷移,舉一個實際例子。下面這張圖是一個時鐘程序的狀態遷移圖,如圖2所示。

        狀態機思路在單片機中的程序實現

        圖2 時鐘程序狀態遷移圖

        把這張圖稍做歸納,就可以得到它的另一種表現形式——狀態遷移表,如表2所示。

        表2 時鐘程序狀態遷移表

        狀態機思路在單片機中的程序實現

        狀態機應用的注意事項

        基于狀態機的程序調度機制,其應用的難點并不在于對狀態機概念的理解,而在于對系統工作狀態的合理劃分。

        初學者往往會把某個“程序動作”當作是一種“狀態”來處理。我稱之為“偽態”。那么如何區分“動作”和“狀態”。本匠人的心得是看二者的本質:“動作”是不穩定的,即使沒有條件的觸發,“動作”一旦執行完畢就結束了;而“狀態”是相對穩定的,如果沒有外部條件的觸發,一個狀態會一直持續下去。

        初學者的另一種比較致命的錯誤,就是在狀態劃分時漏掉一些狀態。我稱之為“漏態”。

        “偽態”和“漏態”這兩種錯誤的存在,將會導致程序結構的渙散。因此要特別小心避免。

        更復雜的狀態機

        前面介紹的是一種簡單的狀態結構。它只有一級,并且只有一維,如圖3所示。

        狀態機思路在單片機中的程序實現

        圖3 線性狀態機結構

        如果有必要,我們可以建立更復雜的狀態機模型。

        1 多級狀態結構

        狀態機可以是多級的。在分層的多級狀態機系統里面,一個“父狀態”下可以劃分多個“子狀態”,這些子狀態共同擁有上級父狀態的某些共性,同時又各自擁有自己的一些個性。

        在某些狀態下,還可以進一步劃分子狀態。比如,我們可以把前面的時鐘例子修改如下:
        把所有和時鐘功能有關的狀態,合并成1個一級狀態。在這個狀態下,又可以劃分出3個二級子狀態,分別為顯示時間、設置小時、設置分鐘;

        同樣,我們也可以把所有和鬧鐘功能有關的狀態,合并成1個一級狀態。在這個狀態下,再劃分出4個二級子狀態,分別為顯示鬧鐘、設置“時”、設置“分”、設置鳴叫時間。

        我們需要用另一個狀態變量(寄存器)來表示這些子狀態。

        子狀態下面當然還可以有更低一級的孫狀態(子子孫孫無窮盡也),從而將整個狀態體系變成了樹狀多級狀態結構,如圖4所示。

        狀態機思路在單片機中的程序實現

        圖4 樹狀多級狀態結構



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 巩留县| 阳曲县| 丰城市| 陆河县| 当雄县| 西畴县| 长岭县| 白水县| 英山县| 安达市| 民乐县| 西盟| 介休市| 西林县| 甘谷县| 南开区| 邻水| 桓仁| 伽师县| 昂仁县| 灵寿县| 朔州市| 张北县| 辉南县| 昔阳县| 秀山| 开江县| 寿光市| 桐城市| 射洪县| 宜阳县| 伊宁县| 莱州市| 洛扎县| 大连市| 蓬溪县| 丰台区| 渑池县| 榆中县| 贵德县| 乌拉特前旗|