AVR學(xué)習(xí)筆記十四、模塊化程序設(shè)計2_第1頁
AVR學(xué)習(xí)筆記十四、模塊化程序設(shè)計2_第2頁
AVR學(xué)習(xí)筆記十四、模塊化程序設(shè)計2_第3頁
AVR學(xué)習(xí)筆記十四、模塊化程序設(shè)計2_第4頁
AVR學(xué)習(xí)筆記十四、模塊化程序設(shè)計2_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、AVR學(xué)習(xí)習(xí)筆記十四四、模塊化化程序設(shè)計計(二)14.1 程序模模塊化設(shè)計計(二)14.1.1、實例功能能在前面一講講里,我們們已經(jīng)初步步了解了模模塊化程序序設(shè)計的簡簡單知識,今今天我們再再深入探討討一下模塊塊化程序設(shè)設(shè)計。我們先回顧顧一下前面面一講的主主要內(nèi)容:模塊化程程序設(shè)計是是指將實現(xiàn)現(xiàn)同一功能能的程序整整合起來,封封裝到一個個程序模塊塊中,這樣樣在使用該該功能的時時候,可以以直接調(diào)用用該模塊中中的相關(guān)函函數(shù)進行操操作。我們在單片片機編程中中經(jīng)常用到到的按鍵檢檢測、液晶晶顯示、數(shù)數(shù)碼管顯示示、串口通通信、DSS18B220溫度檢檢測、DSS13022實時時鐘鐘等經(jīng)常用用到的程序序都可以實

2、實現(xiàn)模塊化化。模塊化編程程的最大優(yōu)優(yōu)點是:思思路清晰、移植方便便、程序簡簡化。通常的做法法是將某一模模塊中所有有用到的端端口定義,函函數(shù)聲明,函函數(shù)定義等等一起寫到到一個“.h”或者“.c”文件中,然然后在主程程序里面使使用“#inccludee”預(yù)編譯指指令將這些些內(nèi)容包含含到主程序序中,這樣樣做調(diào)用雖雖然簡單,但但是對于模模塊化程序序設(shè)計來說說還是顯得得有些不太太直觀,因因為我們調(diào)調(diào)用模塊中中的函數(shù)的的時候,需需要在這一一個模塊文文件中很費費勁的找出出需要的函函數(shù)。同樣樣對于移植植到別的單單片機系統(tǒng)統(tǒng)中的時候候,需要遍遍歷該模塊塊文件,然然后一一更更改。如果果不小心,很很容易造成成錯誤。更

3、為標(biāo)準(zhǔn)的的做法是我們將某某一個功能能模塊的端端口定義,函函數(shù)聲明這這些內(nèi)容放放在一個“.h”文件中,而而把具體的的函數(shù)實現(xiàn)現(xiàn)(執(zhí)行具具體操作的的函數(shù))放放在一個“.c”文件中。這樣我們在在編寫主程程序文件的的時候,可可以直接使使用“#inccludee”預(yù)編譯指指令將“.h”文件包含含進主程序序文件中,而而在編譯的的時候?qū)ⅰ?c”文件和主主程序文件件一起編譯譯。這樣做的優(yōu)優(yōu)點是,我我們可以直直接在“.h”文件中查查找到我們們需要的函函數(shù)名稱,從從而在主程程序里面直直接調(diào)用,而而不用去關(guān)關(guān)心“.c”文件中的的具體內(nèi)容容。如果我我們要將該該程序移植植到不同型型號的單片片機上,我我們同樣只只需在“.

4、h”文件中修修改相應(yīng)的的端口定義義即可。在這一講中中,我們繼繼續(xù)學(xué)習(xí)一一下模塊化化程序設(shè)計計。本實例有兩兩個功能模模塊: 繼續(xù)續(xù)了解模塊塊化程序設(shè)設(shè)計的思路路和方法。 編寫寫串口通信信的模塊化化程序。通過本實例例的學(xué)習(xí),掌掌握以下知知識點:初步掌握模模塊化程序序設(shè)計的方方法。了解模塊化化程序設(shè)計計中需要注注意的一些些問題14.2 模塊化化程序設(shè)計計需要注意意的兩點14.2.1 模塊塊化程序設(shè)設(shè)計中的重重復(fù)聲明 在編寫寫模塊程序序的過程中中,我們在在編寫具體體函數(shù)實現(xiàn)現(xiàn)的“.c”文件時,需需要調(diào)用包包含相關(guān)的的端口定義義和函數(shù)聲聲明的“.h”文件,調(diào)調(diào)用時,我我們使用使使用“#incllude”

5、預(yù)編譯指指令來調(diào)用用“.h”文件。 同樣的的,在編寫寫主程序文文件時,我我們?nèi)匀恍栊枰獙⑿枰{(diào)用模塊塊的“.h”文件包含含到主程序序中,這樣樣就出現(xiàn)了了一個單片片機系統(tǒng)程程序中同一一個文件被被多次調(diào)用用的情況,這這在很多編編譯系統(tǒng)中中進行編譯譯的時候會會有“某某.hh”文件被重重復(fù)調(diào)用的的編譯警告告或錯誤提提示。 事實上上,再同一一個單片機機系統(tǒng)程序序中,在編編譯的時候候出現(xiàn)任何何的警告或或者錯誤提提示都表示示我們的程程序編寫的的有問題,雖雖然有些警警告信息不不會影響程程序的最終終運行結(jié)果果,但我們們希望編譯譯程序的時時候不出現(xiàn)現(xiàn)任何的警警告或者錯錯誤提示。 那這種重重復(fù)調(diào)用的的情況該怎怎么

6、避免呢呢?一種解解決方法是是,當(dāng)我們們在調(diào)用某某一個程序序文件時,先先判斷一下下在前面的的程序里面面是否已經(jīng)經(jīng)定義或者者調(diào)用了這這個文件,如如果這個文文件沒有被被定義或者者調(diào)用,那那么我們就就執(zhí)行調(diào)用用指令,否否則我們就就略過調(diào)用用指令。要實現(xiàn)這種種判斷,我我們需要用用到條件預(yù)預(yù)編譯指令令。“#ifnndef”,“#deffine”,“#enddif” 這三條指指令使用格格式如下: #ifnndef xxxxxx 語語句塊1#defiine xxxxxxx 語句塊塊2#endiif 具體作用用是: /如如果沒有定定義文件xxxxxxxx以及語語句塊1; #iffndeff xxxxxx(該該處

7、可以為為文件名) 語語句塊1 /定義義文件xxxxxxxx以及語句句塊2#defiine xxxxxxx 語句塊塊2/結(jié)束文文件xxxxxxx以以及語句塊塊的定義#endiif 舉例如下下:下面是是文件“usarrt.h”的避免重重復(fù)定義的的書寫方法法,具體作作用是,先先判斷是否否定義了文文件“usarrt.h”,如果沒沒有定義(#ifnddef)文文件“usarrt.h”,則定義義文件“usarrt.h”,并且填填寫文件“usarrt.h”的具體內(nèi)內(nèi)容(即需需要定義的的內(nèi)容);填寫完需需要定義的的內(nèi)容后,使使用#enndif結(jié)結(jié)束定義。#ifnddef _USAART_HH_ /如果果usa

8、rrt.h沒沒有定義#defiine _USAART_HH_ /則定義義usarrt.h/下面是是usarrt.h的的內(nèi)容#incllude #incllude /中斷斷函數(shù)頭文文件/常量聲聲明#defiine BBAUD 96000/函數(shù)聲聲明void Portt_Iniit(vooid); /端口初初始化配置置void Usarrt_Innit(vvoid); /USAART寄存存器設(shè)置void Usarrt_PuutChaar(unnsignned cchar cTXDData); /字節(jié)發(fā)發(fā)送函數(shù)void Usarrt_PuutStrring(unsiignedd chaar *ppc

9、Strring);/ ussart.h的內(nèi)容容寫完后,結(jié)結(jié)束條件編編譯#endiif /結(jié)束判斷斷條件指示符符可以防止止頭文件的的重復(fù)處理理。標(biāo)準(zhǔn)格格式如下defiine 表表達式ifnddef 表表達式執(zhí)行語句11elsee執(zhí)行語句22endddef意思:在執(zhí)行iifdeff時。如如果在前面面使用deefinee定義了“表達式”的話就執(zhí)行“執(zhí)執(zhí)行語句11”否則執(zhí)執(zhí)行“執(zhí)行行語句2”例如:incllude#defiine DDEBUGGvoid mainn()#ifdeef DEEBUGcoutruun itt!endll;#elseecoutnoot ruun itt!endll;#endi

10、if在上面的例例子中運行行結(jié)果為 run it!如果前面沒沒有定義:deffine DEBUUG則運行的結(jié)結(jié)果是:nnot rrun iit!作用:是為為了防止重重復(fù)定義 包含的文文件重復(fù)時時,就用的的上了一般使用的的格式:#ifnddef NNAME#defiine NNAME執(zhí)行語句#elsee執(zhí)行語句#endiif14.2.2 不同同模塊之間間的函數(shù)調(diào)調(diào)用我們知道,一一般情況下下,我們定定義的函數(shù)數(shù)和變量是是有一定的的作用域的的,也就是是說,我們們在一個模模塊中定義義的變量和和函數(shù),它它的作用于于只限于本本模塊文件件和調(diào)用它它的程序文文件范圍內(nèi)內(nèi),而在沒沒有調(diào)用它它的模塊程程序里面,它它

11、的函數(shù)是是不能被使使用的。在編寫模塊塊化程序的的時候,我我們經(jīng)常會會遇到一種種情況,即即:一個函函數(shù)在不同同的模塊之之間都會用用到,最常常見的就是是延時函數(shù)數(shù),一般的的程序中都都需要調(diào)用用延時函數(shù)數(shù)。出現(xiàn)這這種情況該該怎么辦?難道需要要在每個模模塊中都定定義相同的的函數(shù)?那那程序編譯譯的時候會會提示我們們有重復(fù)定定義的函數(shù)數(shù)。那我們們只好在不不同的模塊塊中為相同同功能的函函數(shù)起不同同的名字,這這樣豈不是是做了很多多重復(fù)勞動動,這樣的的重復(fù)勞動動還會造成成程序的可可讀性變得得很差。怎怎么辦?同樣的情況況也會出現(xiàn)現(xiàn)在不同模模塊程序之之間傳遞數(shù)數(shù)據(jù)變量的的時候。在這樣的情情況下,一一種解決辦辦法是:

12、使使用文件包包含命令“#inccludee”將一個模模塊的文件件包含到另另一個模塊塊文件中,這這種方法在在只包含很很少的模塊塊文件的時時候是很方方便的,對對于比較大大的、很復(fù)復(fù)雜的包含含很多模塊塊文件的單單片機應(yīng)用用程序中,在在每一個模模塊里面都都是用包含含命令就很很麻煩了,并并且很容易易出錯。出現(xiàn)這種情情況的原因因是我們在在編寫單片片機程序的的時候,我我們所定義義的函數(shù)和和變量都被被默認為是是局部函數(shù)數(shù)和變量,那那么它們的的作用范圍圍當(dāng)然是在在調(diào)用他們們的程序之之間了。如如果我們將將這些函數(shù)數(shù)和變量定定義為全局局的函數(shù)和和變量,那那么,在整整個單片機機系統(tǒng)程序序中,所有有的模塊之之間都可以以

13、使用這些些函數(shù)和變變量。最好的解決決方法是:將需要在在不同模塊塊之間互相相調(diào)用的文文件聲明為為外部函數(shù)數(shù)、變量(或或者全局函函數(shù)、變量量)。將函數(shù)和變變量聲明為為全局函數(shù)數(shù)和變量的的方法是:在該函數(shù)數(shù)和變量前前面加“exteern”修飾符?!癳xteern”的英文意意思就是“全局”,這樣我我們就可以以將加了“exteern”修飾符的的函數(shù)和變變量聲明為為全局函數(shù)數(shù)和變量,那那么在整個個單片機系系統(tǒng)程序的的任何地方方,我們都都可以隨意意調(diào)用這些些全局函數(shù)數(shù)和變量。例如:exterrn vooid PPort00_Iniit(vooid); /端口初初始化配置置exterrn vooid UUsa

14、rtt0_Innit(vvoid); /USAART寄存存器設(shè)置exterrn vooid UUsartt0_PuutChaar(unnsignned cchar cTXDData); /字節(jié)發(fā)發(fā)送函數(shù)exterrn vooid UUsartt0_PuutStrring(unsiignedd chaar *ppcStrring);在這里,我我們將這44個函數(shù)都都定義成為為全局函數(shù)數(shù),那么,在在一個單片片機系統(tǒng)中中,在整個個程序的任任何地方,我我們都可以以直接調(diào)用用這寫函數(shù)數(shù)。注意:在調(diào)調(diào)用的之后后直接調(diào)用用函數(shù)名稱稱即可,“exteern”這個修飾飾符不必再再調(diào)用的時時候?qū)懮稀M瑯拥?,對對于?/p>

15、量的的定義我們們可以使用用同樣的方方法:exterrn innt seecondd; 在這里,我我們定義了了一個全局局的整形變變量seccond;14.3 串口通信信模塊化程程序的實現(xiàn)現(xiàn)1)usaart.hh 文件的的編寫 在在這里,我我們使用了了條件編譯譯指令,對對于函數(shù),我我們使用“exteern”關(guān)鍵字,將將函數(shù)聲明明為全局函函數(shù)/*ATmegga16異異步串行通通信模塊化化頭文件,usartt.h變量以及函函數(shù)聲明*/#ifnddef _USAART_HH_#defiine _USAART_HH_#incllude #incllude /中斷斷函數(shù)頭文文件/常量聲聲明#defiine

16、BBAUD 96000/函數(shù)聲聲明exterrn vooid PPort_Initt(voiid); /端口初始始化配置exterrn vooid UUsartt_Iniit(vooid); /USARRT寄存器器設(shè)置exterrn vooid UUsartt_PuttCharr(unssigneed chhar ccTXDaata); /字節(jié)發(fā)送送函數(shù)exterrn vooid UUsartt_PuttStriing(uunsiggned charr *pccStriing);#endiif2)usaart.cc 文件的的編寫/*ATmegga16異異步串行通通信模塊化化頭文件,usartt

17、.c函數(shù)定義部部分*/#incllude #incllude usaart.hh/端口狀狀態(tài)初始化化設(shè)置函數(shù)數(shù)void Portt_Iniit()PORTTD = 0X000; /USAART的發(fā)發(fā)送接收端端口分別為為PD0和PD1DDRDD |= (1 PDD1); /PD0為為接收端口口,置為輸輸入口;PPD1為發(fā)發(fā)送端口,置置為輸出口口/USAART寄存存器配置函函數(shù)void Usarrt_Innit()UCSRRA = 0X000;UCSRRC |= (1URSSEL) | (11 UCSZZ1) | (1 UUCSZ00); /異步步,數(shù)據(jù)格格式8,N,1 /UUCSRCC寄存器與與

18、UBRRRH寄存器器共用相同同的I/OO地址,寫 UCSSRC 時時, URRSEL 應(yīng)設(shè)置為為 1。UBRRRL = (F_CCPU / BAUUD / 16 - 1) % 2556; /波特率設(shè)設(shè)置UBRRRH = (F_CCPU / BAUUD / 16 - 1) / 2556;UCSRRB |= (1 RRXCIEE) | (1 RXXEN) | (11 TXENN); /發(fā)送使能能/字節(jié)發(fā)發(fā)送函數(shù)void Usarrt_PuutChaar(unnsignned cchar cTXDData)whille( !(UCSSRA & (1 UUDRE) ); /只有數(shù)據(jù)據(jù)寄存器為為空時才能能發(fā)送數(shù)據(jù)據(jù)UDR = cTTXDatta; /發(fā)發(fā)送數(shù)據(jù)送送USARRT I/O數(shù)據(jù)寄寄存器UUDR/接收

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論