基于A(yíng)VR單片機的控制系統設計
系統軟件結構
系統軟件體系分為幾個(gè)部分:
(1)系統的循環(huán)檢測部分,用于檢測各通道的系統設備工作是否正常,出現異常時(shí)則通過(guò)三色指示燈報警(綠色代表正常,紅色代表異常,黃色為中間狀態(tài))。
(2)系統的設置部分,接受用戶(hù)按鍵,用戶(hù)可以在GUI上設置希望設置的參數。
(3)網(wǎng)絡(luò )接口部分,此時(shí)單片機系統不參與設置,主要功能將網(wǎng)絡(luò )部分獲得的數據導至各通道。軟件系統的核心部分在于菜單結構的設計。
本系統采用一種基于節點(diǎn)編號的三叉樹(shù)狀菜單的設計。將整個(gè)菜單看作一個(gè)菜單樹(shù),每個(gè)界面對應于樹(shù)中的一個(gè)節點(diǎn),父節點(diǎn)為當前菜單的上一級菜單;右節點(diǎn)為當前菜單的“兄弟”菜單,亦即上級菜單的其余子菜單。
我們采用對節點(diǎn)編號的方式將整個(gè)菜單樹(shù)串起來(lái),通過(guò)識別節點(diǎn)編號(ID)就能知道該節點(diǎn)處于哪一級菜單,同時(shí)也便于我們將菜單數初始化。編號方式:每級子菜單的編號為上級父菜單ID乘以10再加上該級子菜單在上級菜單中對應的子項號(1,2,3.),我們將根節點(diǎn)ID編號為1,則根節點(diǎn)菜單的子菜單對應的ID分別為11,12,13。ID為11的節點(diǎn)的下級菜單ID為:111,112,113。一個(gè)樹(shù)型結構菜單的結構和ID編號的實(shí)例如圖2所示。
Typedef structmenu{
long ID; / /當前菜單ID
void ( * disp laymenu) ( long i, unsigned char j) ; / /當前菜單對應處理函數
char cur; / /當前菜單子項
char total; / /子菜單總數
structmenu * up, * down, * right; / /毗鄰子菜單
}MENU;
圖2 一個(gè)菜單樹(shù)的實(shí)例
對于用戶(hù)按鍵操作切換不同的菜單時(shí),我們只需修改一個(gè)指向對應菜單節點(diǎn)的全局菜單節點(diǎn)指針即可。當用戶(hù)按下“ESC”鍵時(shí),菜單指針指向當前節點(diǎn)的父節點(diǎn),按下“Enter”鍵時(shí),則指針指向對應節點(diǎn)的子節點(diǎn)。
用于AVR單片機的RAM空間較小,只有4KB,我們需設計一種合理而簡(jiǎn)潔的數據結構,我們將菜單的數據結構定義為(C語(yǔ)言實(shí)現)。
圖3 menuselect函數的流程圖
將菜單分為顯示型菜單和功能性菜單,顯示型菜單項用于切換各級菜單,功能型菜單則執行最底層菜單所對應的操作,total變量為0則表示為功能型菜單,大于0則表示選擇型菜單。通過(guò)菜單的ID,即可以知道當前菜單的顯示位置和內容,將此信息放在對應的displaymenu函數中可以節省數據空間,不用對于功能型菜單建立額外的ID與處理函數間的對應關(guān)系表,從而實(shí)現功能型菜單和顯示型菜單的一致性操作。一個(gè)供參考的執行函數可以寫(xiě)作:
if(g_pmenu->total>0)
{
g_pmenu=menuselect(g_pmenu,Key);
}
else
{
(g_pmenu->displaymenu)(g_pmenu->ID,g_pmenu->cur);
}
其中menuselect函數用于切換對應的菜單子項,按鍵為“UP”鍵和“DOWN”鍵時(shí),只需修改g_pmune->cur即可;按下“ENTER”鍵時(shí),則g_pmenu=g_pmenu->down,再根據cur值,g_pmenu=g_pmenu->right;按下“ESC”鍵,則g_pmenu=g_pmenu->up。
這種設計使得代碼數據量變得較小,同時(shí)增強了程序的擴展性,需要增加或修改菜單項時(shí),不論是功能型菜單還是執行性菜單,只需要修改對應的菜單結構的數組即可,而不必修改對應的執行代碼。經(jīng)過(guò)這樣的簡(jiǎn)化后,發(fā)現對于菜單數較多的多通道輸入/輸出系統,系統RAM區還是不夠用。對于一個(gè)8輸入通道的系統,每個(gè)通道的參數設置項可能多達40項,總菜單節點(diǎn)大于300個(gè),每個(gè)節點(diǎn)占用14B,則整個(gè)菜單節點(diǎn)所占的RAM已超過(guò)4K,所以這種方式還是需要進(jìn)一步改進(jìn)。
陀螺儀相關(guān)文章:陀螺儀原理
評論