




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
單片機實用編程技巧值得學習第一頁,共三十一頁,2022年,8月28日基礎要求熟練運用C語言編程。熟練掌握和運用一款單片機。包括硬件結構、寄存器、外設、了解基本匯編指令等。熟悉一款集成開發環境及編譯器。獨立編寫并調通2000行以上的小型程序。第二頁,共三十一頁,2022年,8月28日一、如何編寫高質量軟件合理劃分函數功能,合并常用函數嚴格的函數、變量命名方法合理劃分軟件層次。如硬件隔離層、驅動程序層、功能函數層、應用層。合理運用宏定義,提高程序可移植性經常查看反匯編代碼,練習優化指令。第三頁,共三十一頁,2022年,8月28日函數劃分常用的功能集合,可以合理合并成一個函數利用參數傳遞,將多個函數合并。例如:某菜單需要將選中的菜單條反色顯示,因此需要2個中文顯示函數:DisplayString(char*ptr,charx,chary);DisplayStringInvert(char*ptr,charx,chary);可以合并成一個函數DisplayString(char*ptr,charx,chary,boolInvertFlag);注意函數過分合并會造成運算性能下降。第四頁,共三十一頁,2022年,8月28日函數與變量命名嚴格按照模塊名_功能名的方法命名,按正確的英文(甚至拼音也可)命名單詞首字母大寫例如:ADC_CailbrateZero()CPU_SleepDelay(intTime_ms)Flash_WriteWord(intAddr,intWord)第五頁,共三十一頁,2022年,8月28日軟件層次劃分合理劃分軟件層次,將使程序結構清晰層次良好的軟件,移植性強對軟件開發者來說,便于管理和維護,甚至可實現“代碼免維護”大大提高開發速度。例:在某液晶上需要做中文菜單、數字顯示、波形顯示、滾動條等。為該應用編寫液晶驅動函數。第六頁,共三十一頁,2022年,8月28日LCD驅動層劃分范例每一層含義明確,功能完整獨立每一層只調用其下一層的函數,禁止跨層調用函數。所有變量對于非其它層函數不透明。禁止跨層使用全局變量層次劃分越多,執行效率越低更改或更換任何一層的函數,不影響其它層函數的執行。第七頁,共三十一頁,2022年,8月28日合理運用宏定義1.用宏定義作硬件隔離
#defineLED1_POUTP1OUT#defineLED1_PDIRP1DIR#defineLED1_BIT(BIT2)/*更換IO只需改以上3行*/#defineLED_ONLED1_POUT|=LED1_BIT/*亮*/#defineLED_OFFLED1_POUT&=~LED1_BIT/*滅*//*更換單片機只需修改以上2行*/
第八頁,共三十一頁,2022年,8月28日用宏定義自動運算#defineOSC(1000)#defineBAUD(9600)...UBR00=((long)OSC*1000/8)/BAUD;UBR10=0x00;...#defineTIMER_PERIOD12000...TH1=(unsignedint)(65536-TIMER_PERIOD)/256;/*51單片機*/TL1=(unsignedint)(65536-TIMER_PERIOD)%256;...第九頁,共三十一頁,2022年,8月28日用宏定義作編譯開關#defineAVE0#defineRMS1#definePEK2#defineUMODEAVE/AVE:平均值RMS真有效值PEK峰值*/...#if(UMODE==RMS)VAC_Ch1=(longint)TempIntV1*TempIntV1;VAC_Ch2=(longint)TempIntV2*TempIntV2;#endif#if(UMODE==AVE)VAC_Ch1=absv(TempIntV1);VAC_Ch2=absv(TempIntV2);#endif...第十頁,共三十一頁,2022年,8月28日用宏定義作功能開關#defineON1#defineOFF0#defineHI_LO2#defineLEV_21#defineNONE0#defineMINORCUTOFF/*是否打開小值切除功能*/#defineRS485ON/*是否打開RS-485通訊功能*/#defineDACON/*是否打開變送功能*/#defineDEFAULTOFF/*是否打開參數備份功能*/#defineALARM_MODENONE /*報警模式NONE=無報警LEV_2=雙限HI_LO=高低限*/#defineOFFSETON /*是否打開偏移補償功能*/#defineKEYTONEON /*按鍵音*/第十一頁,共三十一頁,2022年,8月28日程序優化打開編譯器自帶的優化選項。注意高級別優化會刪除部分“冗余”代碼,或改動程序結構,應注意揮發性變量(volatile)查看反匯編代碼,看匯編代碼是否有冗余操作,合理修改。第十二頁,共三十一頁,2022年,8月28日二、軟件結構如何讓CPU盡可能多地執行多項任務如何讓CPU盡可能快地響應各個事件如何讓程序盡可能少地占用RAM如何讓程序具有盡可能強的可擴展性如何讓編出的程序盡可能通用如何減少編程工作量?如何減少錯誤概率和調試工作量?好的程序結構,可以解決上述問題第十三頁,共三十一頁,2022年,8月28日實時性實時性最高的任務,需要零延遲立即響應。應考慮硬件實現。如用CPLD/FPGA、捕獲等實現。實時性較高任務,允許微秒級延遲的事件,可用中斷實現。但背景程序中不允許長時間關閉中斷。且中斷處理時間不宜過長。實時性較低事件,可以查詢。第十四頁,共三十一頁,2022年,8月28日事件查詢1.事件出現時間較長,允許響應延遲也較長。如某個按鍵,可以在主循環內直接查詢2.事件出現時間較短,小于主循環時間,但允許響應延遲,可以中斷置標志位,主程序處理,完畢后清除標志。比如串口數據楨判別。3.情況2中,若事件無法產生中斷,可以定時中斷查詢,置標志位。主程序處理第十五頁,共三十一頁,2022年,8月28日順序多任務程序voidmain(void){intcounter=0;while(1)/*repeatforever*/{SleepDelay_ms(10);check_serial_io();/*checkforserialinput*/process_serial_cmds();/*processserialinput*/check_kbd_io();/*checkforkeyboardinput*/process_kbd_cmds();/*processkeyboardinput*/adjust_ctrlr_parms();/*adjustthecontroller*/counter++;/*incrementcounter*/if(counter%100==0){…}}}第十六頁,共三十一頁,2022年,8月28日并發多任務程序voidmain(){while(1){LPM0;}}串口中斷{…}鍵盤中斷{…}定時中斷{…}休眠事件B事件C事件A事件D低功耗程序首選結構每個事件不宜執行時間過長注意中斷隨機嵌套,注意保護臨界代碼全部信息通過全局變量傳遞和保存第十七頁,共三十一頁,2022年,8月28日前后臺程序Voidmain(){while(1){
等待1秒延遲讀取電壓計算溫度顯示溫度報警處理
}}定時中斷串口中斷最常見的程序結構背景程序與前臺程序之間通過全局變量傳遞注意中斷用到全局變量的保護注意臨界代碼的保護主程序不能長時間關閉中斷中斷程序盡量簡短,盡快返回。注意避免函數遞歸調用第十八頁,共三十一頁,2022年,8月28日RTOS嵌入一個微型實時操作系統(RTOS),可以輕松實現多任務(進程)并發執行。商品化或免費的的RTOS,如uC-OSII,RTX-TINY,國產Small-RTOS等。允許每個任務都是死循環,由RTOS負責調度CPU程序指針分時執行每個任務。CPU、RAM開銷較大,8位CPU或簡單程序不建議使用。第十九頁,共三十一頁,2022年,8月28日避免函數重入重入(reentrant):指函數直接或間接調用函數自身。和PC不同,PC采用堆棧傳遞允許函數重入。單片機采用靜態變量傳遞,不允許函數重入。造成重入的原因:1.遞歸調用。例如A函數調用B函數,B函數調用C函數,C函數調用A函數。第二十頁,共三十一頁,2022年,8月28日避免函數重入2.中斷重入假設主程序循環會調用A函數,中斷也使用了A函數,那么有可能在主循環A函數執行一半的時候,中斷,又執行A函數,造成A函數原來的變量被更改。3.硬件重入假設主程序操作液晶顯示,中斷也操作液晶顯示,有可能在液晶時序一半的時候,中斷,時序重新開始,造成液晶收到錯誤指令,發生不可恢復的錯誤。第二十一頁,共三十一頁,2022年,8月28日臨界代碼保護臨界代碼(CriticalCode):指運行過程中不允許被中斷打斷的代碼。幾種產生臨界代碼的原因:1.執行時間嚴格,不允許被延長。如軟件模擬串口,軟件循環產生精確延遲,軟件模擬時間嚴格的異步時序(如1Wire總線),不允許被打斷。第二十二頁,共三十一頁,2022年,8月28日臨界代碼保護2.中斷時間很長,某函數不允許長時間暫停。比如液晶。3.因為避免函數重入產生的臨界代碼。再寫一個一樣的函數,專供中斷用。用reentrant關鍵字定義函數(堆棧傳遞參數)進入臨界代碼前關中斷,后開中斷。第二十三頁,共三十一頁,2022年,8月28日臨界代碼保護2.中斷變量傳遞造成的臨界代碼:例如,主程序要得到存有周期計數值的長整形變量PeriodCnt。該值在中斷內被更新。中斷:{PeriodCnt=TAOF_Cnt*65536+TAR;}Main{…Freq=1.0/PeriodCnt;//錯誤!_DINT();TempL=PeriodCnt;_EINT();Freq=1.0/TempL;//正確!}第二十四頁,共三十一頁,2022年,8月28日對象化編程單片機系統的任何一個獨立單元/部件/外設/功能集合,都可以抽象成一個對象(Object)。對象都有其屬性、方法、事件。以IO為例。屬性:方向、電平。方法:置1,置0,取反,讀取輸入值,讀取方向…事件:跳變,中斷…第二十五頁,共三十一頁,2022年,8月28日對象化編程IO1_DIRIO1_IN作為其屬性,可以被設置。方法IO1_Set(Bool),IO1_Neg();事件IO1_Interrupt();第二十六頁,共三十一頁,2022年,8月28日基于狀態機編程例:當某對象處于A狀態時,假設發生了B事件,就執行C代碼,并且跳轉到D狀態。例:電子表。鍵A鍵B1.當顯示時間時(狀態1),按下鍵A,就顯示日期。2.當顯示日期時,按下A鍵,就顯示秒3.當顯示秒時,按下A鍵,回到顯示時間。第二十七頁,共三十一頁,2022年,8月28日例:電子表4.當顯示時間時,按下B鍵,時閃爍,提示設置“時”5.當提示提示設置“時”,按B鍵,分閃爍6.當分閃爍時按B鍵,月閃爍7.當月閃爍時按B鍵,日閃爍8.當日閃爍時按B鍵,恢復時間顯示9.時閃爍時,按A鍵,時+1,若超過12歸010.分閃爍時,按A鍵,分+1,若超過59歸0第二十八頁,共三
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小鹿活動策劃方案
- 工會秋季活動方案
- 少兒過年活動策劃方案
- 巾幗示范小菜園活動方案
- 小班皮影活動方案
- 工會活動釣螃蟹活動方案
- 崖州區新年活動方案
- 少兒門球活動方案
- 小滿節氣幼兒活動方案
- 小班體能線上活動方案
- 2025年四川省眉山市中考化學試卷及答案
- 高效化學滅菌技術-洞察及研究
- 2025年重慶市中考語文試卷(含解析)
- 2025年湖北省普通高中學業水平合格性考試模擬(三)歷史試題(含答案)
- 廣東省中山市2023-2024學年八年級下學期語文期末試卷(含答案)
- 融媒體保密管理制度
- 2025至2030中國消防產業市場深度調研及發展前景及有效策略與實施路徑評估報告
- 2025江蘇揚州寶應縣“鄉村振興青年人才”招聘67人筆試參考題庫附答案詳解
- 2025年河南高考真題化學試題含答案
- 地質災害危險性評估合同模板
- 情趣玩具品類出海指南-上海api+expo官方合作版-雨果跨境-202506
評論
0/150
提交評論