新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 狀態(tài)機思路在單片機中的程序?qū)崿F(xiàn)

        狀態(tài)機思路在單片機中的程序?qū)崿F(xiàn)

        作者: 時間:2012-07-10 來源:網(wǎng)絡(luò) 收藏
        實現(xiàn)一個時鐘程序

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

        狀態(tài)機思路在單片機中的程序?qū)崿F(xiàn)

        圖2 時鐘程序狀態(tài)遷移圖

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

        表2 時鐘程序狀態(tài)遷移表

        狀態(tài)機思路在單片機中的程序?qū)崿F(xiàn)

        狀態(tài)機應(yīng)用的注意事項

        基于狀態(tài)機的程序調(diào)度機制,其應(yīng)用的難點并不在于對狀態(tài)機概念的理解,而在于對系統(tǒng)工作狀態(tài)的合理劃分。

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

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

        “偽態(tài)”和“漏態(tài)”這兩種錯誤的存在,將會導致程序結(jié)構(gòu)的渙散。因此要特別小心避免。

        更復雜的狀態(tài)機

        前面介紹的是一種簡單的狀態(tài)結(jié)構(gòu)。它只有一級,并且只有一維,如圖3所示。

        狀態(tài)機思路在單片機中的程序?qū)崿F(xiàn)

        圖3 線性狀態(tài)機結(jié)構(gòu)

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

        1 多級狀態(tài)結(jié)構(gòu)

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

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

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

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

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

        狀態(tài)機思路在單片機中的程序?qū)崿F(xiàn)

        圖4 樹狀多級狀態(tài)結(jié)構(gòu)



        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 阳春市| 海原县| 台北市| 和静县| 孙吴县| 调兵山市| 晋江市| 湖南省| 上栗县| 绥化市| 岚皋县| 五华县| 鹰潭市| 潼关县| 鲁山县| 芒康县| 五原县| 湘阴县| 西乡县| 黎城县| 平潭县| 曲水县| 西藏| 克东县| 睢宁县| 鹿邑县| 钦州市| 黄大仙区| 军事| 印江| 巴林右旗| 崇文区| 左云县| 东乌| 江孜县| 武穴市| 顺平县| 罗平县| 合肥市| 河曲县| 饶平县|