下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、是單片機高手還是菜鳥?看看你的程序框架就知道了從高校參與設計大賽到現在,在學習的道路上也有幾年的試探了,把自己的一些心得體味共享給大家。初學單片機時,往往都會糾結于其各個模塊功能的應用,如串口(232,485)對各種功能ic的控制,電機控制,中斷應用,定時器應用,人機界面應用,can等. 這是一個學習過程中必須的階段,是基本功。很慶幸,在參與電子設計大賽賽前培訓時,周圍的控制都訓練的很扎實。經過這個階段后,后來接觸不同的mcu就會發(fā)覺,都大同小異,各有各的優(yōu)勢而已,學任何一種新的mcu都很簡單入手包括一些復雜的處理器。而且對mcu的編程控制會提升一個高度概況就是對各種外圍舉行控制(假如是對復雜
2、算法的運算就會用了),而外圍與mcu的通信方式普通也就幾種時序:iic,spi,intel8080,m6800。這樣看來mcu周圍的編程就是一個很容易的東西了。然而這只是開發(fā)中的一點皮毛而已,在接觸過多種mcu,接觸過復雜設計要求,跑過操作系統(tǒng)等等后,我們在回到單片機的裸機開發(fā)時,就不知不覺的就會考慮到囫圇程序設計的架構問題;一個好的程序架構,是一個有閱歷的工程師和一個初學者的分水嶺。以下是我對單片機程序框架以及開發(fā)中一些常用部分的熟悉總結:任何對時光要求苛刻的需求都是我們的敵人,在須要的時候我們惟獨增強硬件成原來毀滅它;比如你要8個數碼管來顯示,我們在沒有相關的硬件支持的時候必需用mcu以動
3、態(tài)掃描的方式來使其工作良好;而動態(tài)掃描將或多或少的阻擋了mcu處理其他的事情。在mcu負擔很重的場合,我會挑選選用一個類似max8279外圍ic來解決這個困擾;然而慶幸的是,有著許多不是對時光要求苛刻的事情:例如鍵盤的掃描,人們敲擊鍵盤的速率是有限的,我們無需實時掃描著鍵盤,甚至可以每隔幾十ms才去掃描一下;然而這個幾十ms的間隔,我們的mcu還可以完成許多的事情;單片機雖然是裸機奔走,但是往往現實的需要打算了我們必需跑出操作系統(tǒng)的姿勢多任務程序;比如一個常用的狀況有4個任務:1 鍵盤掃描;2 led數碼管顯示;3 串口數據需要接受和處理;4 串口需要發(fā)送數據;如何來構架這個單片機的程序將是我
4、們的重點;讀書時代的我會把鍵盤掃描用查詢的方式放在主循環(huán)中,而串口接收數據用中斷,在中斷服務函數中組成相應的幀格式后置位相應的標記位,在主函數的循環(huán)中舉行數據的處理,串口發(fā)送數據以及l(fā)ed的顯示也放在主循環(huán)中;這樣囫圇程序就以標記變量的通信方式,互相協作的在主循環(huán)和后臺中斷中執(zhí)行;然而必需指出其不妥之處:每個任務的時光片可能過長,這將導致程序的實時性能差。假如以這樣的方式在多加幾個任務,使得一個循環(huán)的時光過長,可能鍵盤掃描將很不敏捷。所以若要建立一個良好的通用編程模型,我們必需想方法,消去每個任務中費時光的部分以及把每個任務再次分解;下面來細談每個任務的詳細措施:1 鍵盤掃描鍵盤掃描是單片機的
5、常用函數,以下指出常用的鍵盤掃描程序中,嚴峻妨礙系統(tǒng)實時性能的地方;盡人皆知,一個鍵按下之后的波形是這樣的(假定低有效):在有鍵按下后,數據線上的信號浮現一段時光的顫動,然后為低,然后當按鍵釋放時,信號顫動一段時光后變高。固然,在數據線為低或者為高的過程中,都有可能浮現一些很窄的干擾信號。unsigned char kbscan(void)unsigned char sccode,recode;p2=0xf8;if (p2&0xf8)!=0xf8)delay(100); /延時20ms去抖-這里太費時了,很糟糕if(p2&0xf8)!=0xf8)sccode=0xfe;while(sccode
6、&0x08)!=0)p2=sccode;if (p2&0xf8)!=0xf8)break;sccode=(sccode 10)break;即在一定得時光內,假如鍵盤向來按下,將作為有效鍵處理。這樣雖然不導致囫圇系統(tǒng)其它任務不能運行,但也很大程度上,減弱了系統(tǒng)的實時性能,由于他用了延時函數;我們用兩種有效的辦法來解決此問題:1 在按鍵功能比較容易的狀況下,我們仍然用上面的kbscan()函數舉行掃描,只是把其中去抖用的軟件延時去了,把去抖以及推斷按鍵的釋放用一個函數來處理,它不用軟件延時,而是用定時器的計時(用普通的計時也行)來完成;代碼如下void clearkeyflag(void)keyd
7、ebounceflg = 0;keyreleaseflg = 0;void scankey(void)+keydebouncecnt;/去抖計時(這個計時也可以放在后臺定時器計時函數中處理)keycode = kbscan();if (keycode != key_none)if (keydebounceflg)/進入去抖狀態(tài)的標記位if (keydebouncecnt debounce_time)/大于了去抖規(guī)定的時光if (keycode = keyoldcode)/按鍵依舊存在,則返回鍵值keydebounceflg = 0;keyreleaseflg = 1;/釋放標記return;
8、/here exit with keycodeclearkeyflag(); /keycode != keyoldcode,只是顫動而已elseif (keyreleaseflg = 0)keyoldcode = keycode;keydebounceflg = 1;keydebouncecnt = 0;elseif (keycode != keyoldcode)clearkeyflag();elseclearkeyflag();/沒有按鍵則清零標記keycode = key_none;在按鍵狀況較復雜的狀況,如有長按鍵,組合鍵,連鍵等一些復雜功能的按鍵時候,我們跟傾向于用狀態(tài)機來實現鍵盤的掃
9、描;/avr 單片機 中4*3掃描狀態(tài)機實現char read_keyboard_fun2()static char key_state = 0, key_value, key_line,key_time;char key_return = no_key,i;switch (key_state)case 0: /最初的狀態(tài),舉行3*4的鍵盤掃描key_line = 0b00001000;for (i=1; i=100)/假如長時光沒有釋放key_time=0;key_state=3;/進入連鍵狀態(tài)key_return= (key_line | key_value);break;case 3:/
10、對于連鍵,每隔50ms就得到一次鍵值,windows xp 系統(tǒng)就是這樣做的portd = 0b00000111; / 行線所有輸出低電平portd = 0b00000111; / 重復送一次if ( (key_mask & pind) = key_mask)key_state=0; / 列線所有為高電平返回狀態(tài)0else if(+key_time=5) /每隔50ms為一次連擊的按鍵key_time=0;key_return= (key_line | key_value);break;return key_return;以上用了4個狀態(tài),普通的鍵盤掃描只用前面3個狀態(tài)就可以了,后面一個狀態(tài)是
11、為增強“連鍵”功能設計的。連鍵即假如按下某個鍵不放,則快速的多次響應當鍵值,直到其釋放。在主循環(huán)中每隔10ms讓該鍵盤掃描函數執(zhí)行一次即可;我們定其時限為10ms,固然要求并不嚴格。2 數碼管的顯示普通狀況下我們用的八位一體的數碼管,采納動態(tài)掃描的辦法來完成顯示;十分慶幸人眼在高于50hz以上的閃耀時發(fā)覺不了的。所以我們在動態(tài)掃描數碼管的間隔時光是充裕的。這里我們定其時限為4ms(250hz) ,用定時器定時為2ms,在定時中斷程序中舉行掃描的顯示,每次只顯示其中的一位;固然時限也可以弄長一些,更推舉的辦法是把顯示函數放入主循環(huán)中,而定時中斷中置位相應的標記位即可;/ timer 0 比較匹配
12、中斷服務,4ms定時interrupt tim0_comp void timer0_comp_isr(void)display(); / 調用掃描顯示void display(void) / 8位led數碼管動態(tài)掃描函數portc = 0xff; / 這里把段選都關閉是很須要的,否則數碼管會產生拖影porta = led_7dis_buffposit;portc = positionposit;if (+posit =8 )posit = 0;3 串口接收數據幀串口接收時用中斷方式的,這無可厚非。但假如你試圖在中斷服務程序中完成一幀數據的接收就棘手大了。永久記住,中斷服務函數越短越好,否則影響
13、這個程序的實時性能。一個數據幀普通包括若干個字節(jié),我們需要推斷一幀是否完成,校驗是否正確。在這個過程中我們不能用軟件延時,更不能用死循環(huán)等待等方式;所以我們在串口接收中斷函數中,只是把數據放置于一個緩沖隊列中。至于組成幀,以及檢查幀的工作我們在主循環(huán)中解決,并且每次循環(huán)中我們只處理一個數據,每個字節(jié)數據的處理間隔的彈性比較大,由于我們已經緩存在了隊列里面。/*=功能:串口發(fā)送接收的時光大事解釋:放在大循環(huán)中每10ms一次輸出:none輸入:none=*/void uartimeevent(void)if (txtimer != 0)/發(fā)送需要等待的時光遞減-txtimer;if (+rxtim
14、er rx_frame_reset) /rxcnt = 0; /假如接受超時(即不完整的幀或者接收一幀完成),把接收的不完整幀籠罩/*=功能:串口接收中斷解釋:接收一個數據,存入緩存輸出:none輸入:none=*/interrupt usart_rxc void uart_rx_isr(void)int8u status,data;status = ua;data = udr;if (status & (framing_error | parity_error | data_overrun)=0)rxbufrxbufwridx = data;if (+rxbufwridx = rx_buff
15、er_size) /接收數據于緩沖中rxbufwridx = 0;if (+rxbufcnt = rx_buffer_size)rxbufcnt = 0;/rxbufferovf=1;/*=功能:串口接收數據幀解釋:當非0輸出時,收到一幀數據放在大循環(huán)中執(zhí)行輸出:=0:沒有數據幀!=0:數據幀指令字輸入:none=*/int8u chkrxframe(void)int8u dat;int8u cnt;int8u sum;int8u ret;ret = rx_null;if (rxbufcnt != 0)rxtimer = 0; /清接收計數時光,uartimeevent()中對于接收超時做了放
16、棄整幀數據的處理/display();cnt = rxcnt;dat = rxbufrxbufrdidx; / get charif (+rxbufrdidx = rx_buffer_size)rxbufrdidx = 0;cli();-rxbufcnt;sei();framebufcnt+ = dat;if (cnt = frame_len)/ 組成一幀sum = 0;for (cnt = 0;cnt 5)time4ms = 0;timeevent20ms();/在20ms大事中,我們處理鍵盤掃描read_keyboard_fun2()if (+time100ms 10)time100ms
17、= 0;timeevent1hz();/ 在1s大事中,我們使工作指示燈閃耀uartimeevent();/串口的數據接收大事,在4ms大事中處理明顯囫圇思路已經很清楚了,cpu需要處理的循環(huán)大事都可以按照其對于時光的要求很便利的加入該函數中。但是我們對這大事有要求:執(zhí)行速度快,簡短,不能有太長的延時等待,其全部大事一次執(zhí)行時光和必需小于系統(tǒng)的基及時間片4ms(按照需要可以加大系統(tǒng)基準節(jié)拍)。所以我們的鍵盤掃描程序,數碼管顯示程序,串口接收程序都如我從前所示。假如逼不得已需要用到較長的延時(如模擬iic時序中用到的延時)我們設計了這樣的延時函數:void runtime250hz (int8u
18、 delay)/此延時函數的單位為4ms(系統(tǒng)基準節(jié)拍)while (delay)if (timeintflg)-delay;timeevent();txprocess();rxprocess();我們需要延時的時光=delay*系統(tǒng)記住節(jié)拍4ms,此函數就確保了在延時的同時,我們其它大事(鍵盤掃描,led顯示等)也并沒有被耽擱;好了這樣我們的主函數main()將很簡短:void main (voie)init_all();while (1)timeevent(); /對于循環(huán)大事的處理rxprocess(); /串口對接收的數據處理txprocess();/ 串口發(fā)送數據處理整體看來我們的系統(tǒng)就成了將近一個萬能的模版了,按照自己所
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 商丘學院《模擬電子技術基礎》2023-2024學年第一學期期末試卷
- 2024年版特定電氣設備安裝分包合作合同版B版
- 機電采購安裝合同范例
- 陪同客戶觀展交流合同范例
- 商洛職業(yè)技術學院《數學建模及應用》2023-2024學年第一學期期末試卷
- 商洛學院《電路Ⅱ》2023-2024學年第一學期期末試卷
- 汕尾職業(yè)技術學院《大數據存儲與管理》2023-2024學年第一學期期末試卷
- 精-品解析:廣東省深圳市龍華區(qū)2023-2024學年高一上學期1月期末學業(yè)質量監(jiān)測數學試題(原卷版)
- 汕頭大學《心電圖學》2023-2024學年第一學期期末試卷
- 陜西中醫(yī)藥大學《通信電子電路》2023-2024學年第一學期期末試卷
- 【MOOC】全新版大學進階英語綜合教程II-內蒙古大學 中國大學慕課MOOC答案
- 印刷保密協議
- 輔導員年終匯報
- 中國當代文學專題-003-國開機考復習資料
- 預防校園欺凌主題班會課件(共36張課件)
- 基于PLC的熱水箱恒溫控制系統(tǒng)
- 300KW并網電站方案
- 高速公路施工安全布控圖
- _越南會計科目編碼及定義(越_中_英文)對照表
- 民主推薦測評滿意率測評表(樣表)及匯總表
- 2020年提高TPO防水卷材一次驗收合格率青春飛揚QC小組
評論
0/150
提交評論