基于AVR單片機的控制系統(tǒng)設計
對于用戶按鍵操作切換不同的菜單時,我們只需修改一個指向?qū)藛喂?jié)點的全局菜單節(jié)點指針即可。當用戶按下“ESC”鍵時,菜單指針指向當前節(jié)點的父節(jié)點,按下“Enter”鍵時,則指針指向?qū)?jié)點的子節(jié)點。
本文引用地址:http://cafeforensic.com/article/267092.htm用于AVR單片機的RAM空間較小,只有4KB,我們需設計一種合理而簡潔的數(shù)據(jù)結(jié)構,我們將菜單的數(shù)據(jù)結(jié)構定義為(C語言實現(xiàn))。
圖3 menuselect函數(shù)的流程圖
將菜單分為顯示型菜單和功能性菜單,顯示型菜單項用于切換各級菜單,功能型菜單則執(zhí)行最底層菜單所對應的操作,total變量為0則表示為功能型菜單,大于0則表示選擇型菜單。通過菜單的ID,即可以知道當前菜單的顯示位置和內(nèi)容,將此信息放在對應的displaymenu函數(shù)中可以節(jié)省數(shù)據(jù)空間,不用對于功能型菜單建立額外的ID與處理函數(shù)間的對應關系表,從而實現(xiàn)功能型菜單和顯示型菜單的一致性操作。一個供參考的執(zhí)行函數(shù)可以寫作:
if(g_pmenu->total>0)
{ g_pmenu=menuselect(g_pmenu,Key);} else {(g_pmenu->displaymenu)(g_pmenu->ID,g_pmenu->cur);}
其中menuselect函數(shù)用于切換對應的菜單子項,按鍵為“UP”鍵和“DOWN”鍵時,只需修改g_pmune->cur即可;按下“ENTER”鍵時,則g_pmenu=g_pmenu->down,再根據(jù)cur值,g_pmenu=g_pmenu->right;按下“ESC”鍵,則g_pmenu=g_pmenu->up.
這種設計使得代碼數(shù)據(jù)量變得較小,同時增強了程序的擴展性,需要增加或修改菜單項時,不論是功能型菜單還是執(zhí)行性菜單,只需要修改對應的菜單結(jié)構的數(shù)組即可,而不必修改對應的執(zhí)行代碼。經(jīng)過這樣的簡化后,發(fā)現(xiàn)對于菜單數(shù)較多的多通道輸入/輸出系統(tǒng),系統(tǒng)RAM區(qū)還是不夠用。對于一個8輸入通道的系統(tǒng),每個通道的參數(shù)設置項可能多達40項,總菜單節(jié)點大于300個,每個節(jié)點占用14B,則整個菜單節(jié)點所占的RAM已超過4K,所以這種方式還是需要進一步改進。
注意到多通道的參數(shù)設置項完全相同,ID為111,112,。,118的菜單分支完全一樣,ID為121和122的菜單分支也完全相同。可以定義一種Sibling菜單,從而刪去ID為112~118以及ID為122的菜單節(jié)點和子節(jié)點(虛線框所示),其上級菜單(ID為11和ID為12)的項目中的total值均變?yōu)?.為了區(qū)別不同的通道分支,有兩種實現(xiàn)辦法:
一種處理方法采用全局變量
增加一個g_CODER_Channel_Number的全局變量,用于保存當前的通道號。在menuselect函數(shù)中,增加一個針對本系統(tǒng)設計的一個判斷,當ID為11時,則不修改對應的g_pmenu->cur,而是直接修改變量g_CODER_Channel_Number,進入對應的顯示函數(shù)后,直接根據(jù)g_CODER_Channel_Number判斷通道號,從而輸出對應的值。這種方法不需要改變系統(tǒng)設計的結(jié)構,但需要針對不同的系統(tǒng)修改主處理函數(shù)menuselect.
另一種處理方法在菜單結(jié)構中增加一個MenuSibling結(jié)構,定義為
typedef struct _menuSibling{
signedcharcur;signedchartotal;}SIBLING;同時對應的菜單結(jié)構修改為typedefstructmenu{……
SIBLINGSibling;}MENU;
這樣,ID為11的結(jié)構項的Sibling.total為8,Sibling.cur為當前的子菜單項。判斷到total>0且Sibling.total>0時,可知其下一級菜單為SIB2LING菜單,此時以前需修改cur想的操作則修改Sibling.cur即可。這種設計下,每個節(jié)點增加了2B的空間,但是保證的程序的一致性,對于不同的系統(tǒng)其設計基本一致。
以上菜單項的設計用于系統(tǒng)設置部分,當退出系統(tǒng)設置時,即進入系統(tǒng)循環(huán)檢測部分。單片機通過RS-485接口檢測各個通道是否正常,當正常時則顯示為綠燈,出現(xiàn)異常則顯示為紅燈,黃燈為中間狀態(tài)。指示燈的流程參見圖4.
圖4循環(huán)檢測的指示燈流程
結(jié)束語
按照本文提供的方法優(yōu)化后的設計,可以滿足大多數(shù)的多通道輸入/輸出系統(tǒng)的控制系統(tǒng)的需要,整個系統(tǒng)的設計主要在于建立一個菜單樹,將對應的節(jié)點編號,再編寫對應的節(jié)點處理函數(shù)即可。這種設計使得程序的開發(fā)、維護都很容易,具有較強的可擴展性和可移植性。
c語言相關文章:c語言教程
單片機相關文章:單片機教程
單片機相關文章:單片機視頻教程
單片機相關文章:單片機工作原理
蜂鳴器相關文章:蜂鳴器原理
評論