第七章函數(shù)程序設計_第1頁
第七章函數(shù)程序設計_第2頁
第七章函數(shù)程序設計_第3頁
第七章函數(shù)程序設計_第4頁
第七章函數(shù)程序設計_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 第七章第七章 函數(shù)程序設計函數(shù)程序設計 v函數(shù)的概念、定義格式函數(shù)的概念、定義格式v函數(shù)的調(diào)用方法函數(shù)的調(diào)用方法v函數(shù)的形式參數(shù)、實際參數(shù)和函數(shù)的返回值函數(shù)的形式參數(shù)、實際參數(shù)和函數(shù)的返回值 主要內(nèi)容主要內(nèi)容 函數(shù)的定義格式函數(shù)的定義格式函數(shù)的調(diào)用方法函數(shù)的調(diào)用方法函數(shù)的返回值函數(shù)的返回值 重點重點 函數(shù)的定義格式函數(shù)的定義格式函數(shù)的調(diào)用方法函數(shù)的調(diào)用方法 難點難點 在程序設計中,常將一些常用的功能模塊編寫成在程序設計中,常將一些常用的功能模塊編寫成函數(shù),放在函數(shù)庫中供公共選用,以減少重復編寫函數(shù),放在函數(shù)庫中供公共選用,以減少重復編寫程序段的工作量。程序段的工作量。 一個較大的程序一般應分

2、為若干個程序模塊,一個較大的程序一般應分為若干個程序模塊,每一個模塊用來實現(xiàn)一個特定的功能。所有高級語每一個模塊用來實現(xiàn)一個特定的功能。所有高級語言中都有子程序這個概念,用子程序?qū)崿F(xiàn)模塊的功言中都有子程序這個概念,用子程序?qū)崿F(xiàn)模塊的功能。在能。在C語言中,子程序的作用是由函數(shù)完成的。一語言中,子程序的作用是由函數(shù)完成的。一個個C程序可由一個主函數(shù)和若干個函數(shù)構(gòu)成,由主函程序可由一個主函數(shù)和若干個函數(shù)構(gòu)成,由主函數(shù)調(diào)用其它函數(shù),其它函數(shù)也可以相互調(diào)用。同一數(shù)調(diào)用其它函數(shù),其它函數(shù)也可以相互調(diào)用。同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次。個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次。三、函數(shù)的分類三、

3、函數(shù)的分類從函數(shù)的形式分從函數(shù)的形式分(1)有參函數(shù):被調(diào)用時需接受主調(diào)函數(shù)傳遞來的數(shù)據(jù)。)有參函數(shù):被調(diào)用時需接受主調(diào)函數(shù)傳遞來的數(shù)據(jù)。(2)無參函數(shù):被調(diào)用時不需要主調(diào)函數(shù)傳遞數(shù)據(jù)。)無參函數(shù):被調(diào)用時不需要主調(diào)函數(shù)傳遞數(shù)據(jù)。一、問題的引入一、問題的引入為什么要用函數(shù)?函數(shù)的作用?為什么要用函數(shù)?函數(shù)的作用?二、函數(shù)的概念二、函數(shù)的概念定義:函數(shù)是一個可反復使用的程序段,從其它的程定義:函數(shù)是一個可反復使用的程序段,從其它的程序段中均可通過調(diào)用語句來執(zhí)行這段程序。序段中均可通過調(diào)用語句來執(zhí)行這段程序。(2)有參函數(shù)的定義格式:有參函數(shù)的定義格式:存儲類型說明符存儲類型說明符 數(shù)據(jù)類型說明符

4、數(shù)據(jù)類型說明符 函數(shù)名(形函數(shù)名(形式參數(shù)表)式參數(shù)表) 形式參數(shù)說明序列;形式參數(shù)說明序列; 數(shù)據(jù)定義語句序列;數(shù)據(jù)定義語句序列; 執(zhí)行語句序列;執(zhí)行語句序列; 四、函數(shù)的定義四、函數(shù)的定義(1)無參函數(shù)的定義格式:無參函數(shù)的定義格式: 存儲類型說明符存儲類型說明符 數(shù)據(jù)類型說明符數(shù)據(jù)類型說明符 函數(shù)名(函數(shù)名(void) 數(shù)據(jù)定義語句序列;數(shù)據(jù)定義語句序列; 執(zhí)行語句序列;執(zhí)行語句序列; void MCU_init() SOPT_COPE = 0; /關(guān)閉看門狗關(guān)閉看門狗ICGC1 = 0 x28; ICGC2 = 0 x51; while(ICGS1_LOCK = 0); PTAD =

5、init_a; PTADD = ctr_a; PTBD = init_b; PTBDD = ctr_b; PTCD = init_c; PTCDD = ctr_c; PTDD = init_d; PTDDD = ctr_d; PTED = init_e; PTEDD = ctr_e; PTFD = init_f; PTFDD = ctr_f; PTGD = init_g; PTGDD = ctr_g; EnableInterrupts;無參數(shù)的函數(shù)定義無參數(shù)的函數(shù)定義:存儲類型說明符存儲類型說明符 數(shù)據(jù)類型說明符數(shù)據(jù)類型說明符 函數(shù)名(函數(shù)名(void) 數(shù)據(jù)定義語句序列;數(shù)據(jù)定義語句序列;

6、執(zhí)行語句序列;執(zhí)行語句序列; 存儲類型說明符存儲類型說明符 在這里并沒有說明在這里并沒有說明數(shù)據(jù)類型說明符為數(shù)據(jù)類型說明符為void說明函數(shù)的沒有計說明函數(shù)的沒有計算結(jié)果給主程序,只是執(zhí)行了一個過程。算結(jié)果給主程序,只是執(zhí)行了一個過程。void main(void) MCU_init(); 無參數(shù)的函數(shù)調(diào)用無參數(shù)的函數(shù)調(diào)用:調(diào)用函數(shù)調(diào)用函數(shù) void MCU_init(void)的格式為函數(shù)名()的格式為函數(shù)名()函數(shù)的調(diào)用相當于執(zhí)行了這個函數(shù)中的語句序列,執(zhí)函數(shù)的調(diào)用相當于執(zhí)行了這個函數(shù)中的語句序列,執(zhí)行了一定的功能。行了一定的功能。練習:將你們的初始化函數(shù)中的初始化代碼使用練習:將你們的初

7、始化函數(shù)中的初始化代碼使用MCU_init()函數(shù)實現(xiàn)函數(shù)實現(xiàn),將斷點放在將斷點放在MCU_init();MCU_init();處,單步處,單步調(diào)試程序直至調(diào)試程序直至void MCU_init(void)void MCU_init(void)里所有的語句執(zhí)里所有的語句執(zhí)行完畢行完畢/*= 164送顯示段碼子函數(shù)送顯示段碼子函數(shù)=*/ void Dsp_seg(byte serial_val) /由高位至低位串行轉(zhuǎn)并行送數(shù)由高位至低位串行轉(zhuǎn)并行送數(shù) byte i; e_strobe=0; for(i=0;i8;i+) e_clk=0; if(serial_val&0 x80)=0) e

8、_data=0; else e_data=1; e_clk=1; serial_valx2) max=x1; if (x1x2) max=x1; else max=x2; else max=x2; if (maxx3) max=x3; if (maxx3) max=x3; return (max); return (max); 調(diào)用時:調(diào)用時: a=maxa=max(1 1,2 2,3 3) 【例【例1】 編寫一個函數(shù),求編寫一個函數(shù),求3個整型參數(shù)的最個整型參數(shù)的最大值并返回這個最大值。大值并返回這個最大值。函數(shù)程序設計函數(shù)程序設計 v函數(shù)調(diào)用中的數(shù)據(jù)傳遞方法函數(shù)調(diào)用中的數(shù)據(jù)傳遞方法v局部變

9、量、全局變量的定義和使用方法局部變量、全局變量的定義和使用方法v函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用 主要內(nèi)容主要內(nèi)容 函數(shù)調(diào)用中的數(shù)據(jù)傳遞方法函數(shù)調(diào)用中的數(shù)據(jù)傳遞方法函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用 重點重點 函數(shù)調(diào)用中的數(shù)據(jù)傳遞方法函數(shù)調(diào)用中的數(shù)據(jù)傳遞方法函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用 難點難點 1值傳遞方式值傳遞方式是在形式參數(shù)和實際參數(shù)之間傳遞數(shù)據(jù)是在形式參數(shù)和實際參數(shù)之間傳遞數(shù)據(jù)所傳遞的是參數(shù)值所傳遞的是參數(shù)值調(diào)用函數(shù)時,將實際參數(shù)的值求出賦予對應的形式參數(shù)。調(diào)用函數(shù)時,將實際參數(shù)的值求出賦予對應的形式參數(shù)。在函在函數(shù)體中對形參的處理與實參無關(guān)。數(shù)體中對形參的處理與實參無關(guān)。當函數(shù)體執(zhí)行完畢,形參

10、的當函數(shù)體執(zhí)行完畢,形參的值可能發(fā)生變化,但值可能發(fā)生變化,但返回后,形參的值不帶回到對應的實參中返回后,形參的值不帶回到對應的實參中。特點:特點:參數(shù)值的單向傳遞參數(shù)值的單向傳遞形參一般是變量;實參可是變量或表達式。形參一般是變量;實參可是變量或表達式。函數(shù)間傳遞數(shù)據(jù)有四種方式:函數(shù)間傳遞數(shù)據(jù)有四種方式:值傳遞方式;地址傳遞方式;值傳遞方式;地址傳遞方式;返回值傳遞方式;全局變量傳遞。前返回值傳遞方式;全局變量傳遞。前2種利用函數(shù)的參數(shù)來種利用函數(shù)的參數(shù)來傳遞數(shù)據(jù),后傳遞數(shù)據(jù),后2種不是利用函數(shù)參數(shù)傳遞數(shù)據(jù)。種不是利用函數(shù)參數(shù)傳遞數(shù)據(jù)。一、函數(shù)調(diào)用中的數(shù)據(jù)傳遞方法一、函數(shù)調(diào)用中的數(shù)據(jù)傳遞方法

11、2地址傳遞方式地址傳遞方式 是在形式參數(shù)和實際參數(shù)之間傳遞數(shù)據(jù)是在形式參數(shù)和實際參數(shù)之間傳遞數(shù)據(jù)所傳遞的是地址所傳遞的是地址調(diào)用函數(shù)時,將實際參數(shù)的地址賦予對應的形式參數(shù)作為其地調(diào)用函數(shù)時,將實際參數(shù)的地址賦予對應的形式參數(shù)作為其地址。由于形參和實參的地址相同(占用相同的內(nèi)存),所以址。由于形參和實參的地址相同(占用相同的內(nèi)存),所以調(diào)調(diào)用時,可看成將實參的值傳遞給形參;返回時,可看成將形參用時,可看成將實參的值傳遞給形參;返回時,可看成將形參的值回帶給對應的實參。的值回帶給對應的實參。特點:特點:參數(shù)值的雙向傳遞參數(shù)值的雙向傳遞形參是數(shù)組名或指針變量;實參是變量的地址、數(shù)組名或指形參是數(shù)組名

12、或指針變量;實參是變量的地址、數(shù)組名或指針變量針變量3值傳遞和地址傳遞方式的區(qū)別值傳遞和地址傳遞方式的區(qū)別值傳遞:傳遞的是數(shù)值值傳遞:傳遞的是數(shù)值地址傳遞:傳遞的是地址。地址傳遞:傳遞的是地址。二、變量的作用域、局部變量和全局變量二、變量的作用域、局部變量和全局變量1 變量的作用域規(guī)則變量的作用域規(guī)則變量只能在它的作用范圍內(nèi)使用。變量只能在它的作用范圍內(nèi)使用。變量的作用域與定義變量的位置有關(guān)。變量的作用域與定義變量的位置有關(guān)。根據(jù)變量的作用域可以分為:局部變量和全局變量。根據(jù)變量的作用域可以分為:局部變量和全局變量。2 局部變量:局部變量: 在一個函數(shù)內(nèi)部(或復合語句內(nèi)部)定義的變量是內(nèi)部變在

13、一個函數(shù)內(nèi)部(或復合語句內(nèi)部)定義的變量是內(nèi)部變量,它只在本函數(shù)范圍內(nèi)有效。量,它只在本函數(shù)范圍內(nèi)有效。說明:說明:函數(shù)名不能使用其他函數(shù)中定義的變量函數(shù)名不能使用其他函數(shù)中定義的變量不同函數(shù)中可使用相同名字的變量,它們代表不同的對象,不同函數(shù)中可使用相同名字的變量,它們代表不同的對象,互不干擾互不干擾 形式參數(shù)也是局部變量形式參數(shù)也是局部變量不同局部變量的定義方法,局部變量的使用也有所不同不同局部變量的定義方法,局部變量的使用也有所不同2 局部變量:局部變量: (1)普通的變量申明普通的變量申明 byte a; 這種方式申明的函數(shù)變量當函數(shù)開始調(diào)用,在棧空間中分這種方式申明的函數(shù)變量當函數(shù)開

14、始調(diào)用,在??臻g中分配一定的空間,函數(shù)調(diào)用結(jié)束時,變量的空間也會消失。配一定的空間,函數(shù)調(diào)用結(jié)束時,變量的空間也會消失。 (2)用用static聲明局部變量聲明局部變量 函數(shù)中變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,函數(shù)中變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,在下次該函數(shù)調(diào)用時,該變量已有值,即為上一次函數(shù)調(diào)用在下次該函數(shù)調(diào)用時,該變量已有值,即為上一次函數(shù)調(diào)用結(jié)束時的值。該局部變量為靜態(tài)局部變量。結(jié)束時的值。該局部變量為靜態(tài)局部變量。)3.全局變量:在函數(shù)之外定義的變量稱外部變量,全局變量:在函數(shù)之外定義的變量稱外部變量,外部變量是外部變量是全局變量(全程變量)。它的有效范全局變量(全

15、程變量)。它的有效范圍為從定義變量的位置開始到本源文件結(jié)束。圍為從定義變量的位置開始到本源文件結(jié)束。補充:中斷函數(shù)補充:中斷函數(shù) 1、用預處理用預處理“#pragma TRAP_PROC”定定義義 2、用關(guān)鍵字用關(guān)鍵字“interrupt” 3、用關(guān)鍵字用關(guān)鍵字“interrupt”和中斷向量號和中斷向量號格式為:格式為:interrupt interrupt / /* *codecode* */ / 中斷向量號與中斷向量表地址的對應關(guān)系如下:復位向量中斷向量號與中斷向量表地址的對應關(guān)系如下:復位向量為為0號位于地址號位于地址0 xFFFE,1號緊跟著號緊跟著0號,位于地址號,位于地址0 xF

16、FFC,其余依此類推。其余依此類推。 8.5 知識鏈接1:定時器模塊8.5.1 手機鬧鐘的設置v手機的鬧鐘如何設置?8.5.2 鬧鐘的工作流程設定鬧鐘要響設定鬧鐘要響的時間的時間鬧鐘的時間鬧鐘的時間1秒秒1秒的增加秒的增加鬧鐘當前的時間鬧鐘當前的時間設定的時間?設定的時間?重新設定重新設定鬧鐘響的時間?鬧鐘響的時間?否否鬧鐘響鬧鐘響是是是是否否鬧鐘的當前時間一秒一秒的鬧鐘的當前時間一秒一秒的增加,增加的節(jié)拍為增加,增加的節(jié)拍為1秒。秒。8.5.3 單片機中的定時模塊 定時器是單片機中產(chǎn)生定時功能的功能模塊定時器是單片機中產(chǎn)生定時功能的功能模塊。MC9S08AC16內(nèi)部包括三個獨立的定時器。內(nèi)部

17、包括三個獨立的定時器。 定時器具有定時器具有定時溢出中斷定時溢出中斷、輸入捕捉、輸出比較和脈寬、輸入捕捉、輸出比較和脈寬調(diào)制輸出調(diào)制輸出4個基本功能。個基本功能。8.5.4 定時器內(nèi)部結(jié)構(gòu)圖定時溢出定時溢出中斷結(jié)構(gòu)中斷結(jié)構(gòu)圖圖輸入捕捉、輸輸入捕捉、輸出比較和脈寬出比較和脈寬調(diào)制輸出結(jié)構(gòu)調(diào)制輸出結(jié)構(gòu)圖圖8.5.5 定時器的定時溢出示意圖PS1PS2PS3預預分分頻頻時時鐘鐘選選擇擇總總線線時時鐘鐘固固定定時時鐘鐘外外部部時時鐘鐘16位位計計數(shù)數(shù)器器TPMxCNT1 16 6位位比比較較器器16位位預預置置器器TPMxMODCLKSBCLKSACNT=MOD溢溢出出標標志志TOF中中斷斷允允許許T

18、OIE中中斷斷邏邏輯輯:當當T TO OI IE E= =1 1且且T TO OF F= =1 1時時將將產(chǎn)產(chǎn)生生溢溢出出中中斷斷請請求求中中斷斷定定時時器器驅(qū)驅(qū)動動時時鐘鐘復復位位計計數(shù)數(shù)器器否否是是8.5.6 和定時溢出功能相關(guān)的寄存器寄存器名稱寄存器名稱命名符號命名符號地址地址用途用途復位初值復位初值狀態(tài)控制寄存器狀態(tài)控制寄存器TPMxSC$0020定時器狀態(tài)和控制定時器狀態(tài)和控制$00計數(shù)器高位寄存器計數(shù)器高位寄存器TPMxCNTH$0021實時計數(shù)值,只能讀出,實時計數(shù)值,只能讀出,不能寫入。不能寫入。相當于鬧鐘相當于鬧鐘的當前時間的當前時間。$00計數(shù)器低位寄存器計數(shù)器低位寄存器T

19、PMxCNTL$0022$00預置值高位寄存器預置值高位寄存器TPMxMODH$0023存放用戶預置的計數(shù)值。存放用戶預置的計數(shù)值。相當于鬧鐘的設定時間相當于鬧鐘的設定時間。$FF預置值低位寄存器預置值低位寄存器TPMxMODL$0024$FF8.5.7 狀態(tài)控制寄存器TPMxSCbit76543210TOFTOIECPWMSCLKSBCLKSAPS2PS1PS0功功能能描描述述溢出標志,當溢出標志,當TPMxCNT的的值為值為$FFFF (自自由計數(shù)狀態(tài)由計數(shù)狀態(tài))或或達到預置值時,達到預置值時,定時器的計數(shù)定時器的計數(shù)器溢出清器溢出清0,同,同時該標志置時該標志置1。溢出中斷溢出中斷允許。

20、發(fā)允許。發(fā)生溢出時,生溢出時,系統(tǒng)可執(zhí)系統(tǒng)可執(zhí)行溢出中行溢出中斷處理程斷處理程序;序;1:允許溢:允許溢出中斷。出中斷。0:不允許:不允許溢出中斷。溢出中斷。定時溢出定時溢出功能中該功能中該位沒有意位沒有意義義0 0:沒有時鐘,定時:沒有時鐘,定時器禁止;器禁止;0 1:總線時鐘:總線時鐘1 0:固定的系統(tǒng)時鐘:固定的系統(tǒng)時鐘1 1:外部時鐘:外部時鐘只要這兩位的值非只要這兩位的值非0,定時器就會被啟動,定時器就會被啟動,TPMxCNT的值循環(huán)遞的值循環(huán)遞增,因此這兩位起到啟增,因此這兩位起到啟停定時器的作用停定時器的作用分頻系數(shù),將時鐘源的頻分頻系數(shù),將時鐘源的頻率除以分頻系數(shù)就得到定率除以

21、分頻系數(shù)就得到定時器的計數(shù)頻率。時器的計數(shù)頻率。000:時鐘源的頻率:時鐘源的頻率/1001:時鐘源的頻率:時鐘源的頻率/2010:時鐘源的頻率:時鐘源的頻率/4011:時鐘源的頻率:時鐘源的頻率/8100:時鐘源的頻率:時鐘源的頻率/6101:時鐘源的頻率:時鐘源的頻率/32110:時鐘源的頻率:時鐘源的頻率/64111:時鐘源的頻率:時鐘源的頻率/128復復位位000000008.5.8 定時器定時溢出參數(shù)的計算舉例 例8-1:v 已知外部晶振的頻率為8MHz,采用禁止內(nèi)部鎖頻環(huán)模式的外時鐘模式,則總線頻率為4MHz。定時器的時鐘源選擇總線時鐘,假設要求定時溢出的周期為0.125ms,且允

22、許定時溢出中斷,請選擇定時器的參數(shù)。 分析:v 定時器的溢出周期為0.125ms,則定時器溢出頻率為溢出周期的倒數(shù),即1/0.1258kHz,選擇分頻因子為1,則預置寄存器TPMxMOD的值為:定時器驅(qū)動時鐘頻率/溢出頻率=(4000000/1)/8000=500。同時由于允許定時溢出中斷,則定時器狀態(tài)和控制寄存器TPMxSC的值為$48。8.5.9 中斷的概念 什么是單片機的中斷? 單片機為什么要引入中斷? 實時性 并行性 效率 如何響應中斷? 監(jiān)控程序 中斷處理函數(shù)8.5.10 中斷向量 我們在第五章學習了復位向量,知道復位向量保存了復我們在第五章學習了復位向量,知道復位向量保存了復位后單片機系統(tǒng)

溫馨提示

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

評論

0/150

提交評論