<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于AVR單片機(jī)的控制系統(tǒng)設(shè)計(jì)

          基于AVR單片機(jī)的控制系統(tǒng)設(shè)計(jì)

          作者: 時(shí)間:2013-12-12 來(lái)源:網(wǎng)絡(luò) 收藏

          系統(tǒng)軟件結(jié)構(gòu)

          系統(tǒng)軟件體系分為幾個(gè)部分:

          (1)系統(tǒng)的循環(huán)檢測(cè)部分,用于檢測(cè)各通道的系統(tǒng)設(shè)備工作是否正常,出現(xiàn)異常時(shí)則通過三色指示燈報(bào)警(綠色代表正常,紅色代表異常,黃色為中間狀態(tài))。
          (2)系統(tǒng)的設(shè)置部分,接受用戶按鍵,用戶可以在GUI上設(shè)置希望設(shè)置的參數(shù)。
          (3)網(wǎng)絡(luò)接口部分,此時(shí)單片機(jī)系統(tǒng)不參與設(shè)置,主要功能將網(wǎng)絡(luò)部分獲得的數(shù)據(jù)導(dǎo)至各通道。軟件系統(tǒng)的核心部分在于菜單結(jié)構(gòu)的設(shè)計(jì)。

          本系統(tǒng)采用一種基于節(jié)點(diǎn)編號(hào)的三叉樹狀菜單的設(shè)計(jì)。將整個(gè)菜單看作一個(gè)菜單樹,每個(gè)界面對(duì)應(yīng)于樹中的一個(gè)節(jié)點(diǎn),父節(jié)點(diǎn)為當(dāng)前菜單的上一級(jí)菜單;右節(jié)點(diǎn)為當(dāng)前菜單的“兄弟”菜單,亦即上級(jí)菜單的其余子菜單。

          我們采用對(duì)節(jié)點(diǎn)編號(hào)的方式將整個(gè)菜單樹串起來(lái),通過識(shí)別節(jié)點(diǎn)編號(hào)(ID)就能知道該節(jié)點(diǎn)處于哪一級(jí)菜單,同時(shí)也便于我們將菜單數(shù)初始化。編號(hào)方式:每級(jí)子菜單的編號(hào)為上級(jí)父菜單ID乘以10再加上該級(jí)子菜單在上級(jí)菜單中對(duì)應(yīng)的子項(xiàng)號(hào)(1,2,3.),我們將根節(jié)點(diǎn)ID編號(hào)為1,則根節(jié)點(diǎn)菜單的子菜單對(duì)應(yīng)的ID分別為11,12,13。ID為11的節(jié)點(diǎn)的下級(jí)菜單ID為:111,112,113。一個(gè)樹型結(jié)構(gòu)菜單的結(jié)構(gòu)和ID編號(hào)的實(shí)例如圖2所示。

          Typedef structmenu{
          long ID; / /當(dāng)前菜單ID
          void ( * disp laymenu) ( long i, unsigned char j) ; / /當(dāng)前菜單對(duì)應(yīng)處理函數(shù)
          char cur; / /當(dāng)前菜單子項(xiàng)
          char total; / /子菜單總數(shù)
          structmenu * up, * down, * right; / /毗鄰子菜單
          }MENU;

          基于AVR單片機(jī)的控制系統(tǒng)設(shè)計(jì)

          圖2 一個(gè)菜單樹的實(shí)例

          對(duì)于用戶按鍵操作切換不同的菜單時(shí),我們只需修改一個(gè)指向?qū)?yīng)菜單節(jié)點(diǎn)的全局菜單節(jié)點(diǎn)指針即可。當(dāng)用戶按下“ESC”鍵時(shí),菜單指針指向當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn),按下“Enter”鍵時(shí),則指針指向?qū)?yīng)節(jié)點(diǎn)的子節(jié)點(diǎn)。

          用于的RAM空間較小,只有4KB,我們需設(shè)計(jì)一種合理而簡(jiǎn)潔的數(shù)據(jù)結(jié)構(gòu),我們將菜單的數(shù)據(jù)結(jié)構(gòu)定義為(C語(yǔ)言實(shí)現(xiàn))。

          基于AVR單片機(jī)的控制系統(tǒng)設(shè)計(jì)

          圖3 menuselect函數(shù)的流程圖

          將菜單分為顯示型菜單和功能性菜單,顯示型菜單項(xiàng)用于切換各級(jí)菜單,功能型菜單則執(zhí)行最底層菜單所對(duì)應(yīng)的操作,total變量為0則表示為功能型菜單,大于0則表示選擇型菜單。通過菜單的ID,即可以知道當(dāng)前菜單的顯示位置和內(nèi)容,將此信息放在對(duì)應(yīng)的displaymenu函數(shù)中可以節(jié)省數(shù)據(jù)空間,不用對(duì)于功能型菜單建立額外的ID與處理函數(shù)間的對(duì)應(yīng)關(guān)系表,從而實(shí)現(xiàn)功能型菜單和顯示型菜單的一致性操作。一個(gè)供參考的執(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ù)用于切換對(duì)應(yīng)的菜單子項(xiàng),按鍵為“UP”鍵和“DOWN”鍵時(shí),只需修改g_pmune->cur即可;按下“ENTER”鍵時(shí),則g_pmenu=g_pmenu->down,再根據(jù)cur值,g_pmenu=g_pmenu->right;按下“ESC”鍵,則g_pmenu=g_pmenu->up。

          這種設(shè)計(jì)使得代碼數(shù)據(jù)量變得較小,同時(shí)增強(qiáng)了程序的擴(kuò)展性,需要增加或修改菜單項(xiàng)時(shí),不論是功能型菜單還是執(zhí)行性菜單,只需要修改對(duì)應(yīng)的菜單結(jié)構(gòu)的數(shù)組即可,而不必修改對(duì)應(yīng)的執(zhí)行代碼。經(jīng)過這樣的簡(jiǎn)化后,發(fā)現(xiàn)對(duì)于菜單數(shù)較多的多通道輸入/輸出系統(tǒng),系統(tǒng)RAM區(qū)還是不夠用。對(duì)于一個(gè)8輸入通道的系統(tǒng),每個(gè)通道的參數(shù)設(shè)置項(xiàng)可能多達(dá)40項(xiàng),總菜單節(jié)點(diǎn)大于300個(gè),每個(gè)節(jié)點(diǎn)占用14B,則整個(gè)菜單節(jié)點(diǎn)所占的RAM已超過4K,所以這種方式還是需要進(jìn)一步改進(jìn)。

          陀螺儀相關(guān)文章:陀螺儀原理




          評(píng)論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();