單片機原理與應用-KFILC項目教程(西電版)項目二霓虹燈控制系統(tǒng)

上傳人:xiao****017 文檔編號:21834299 上傳時間:2021-05-11 格式:PPT 頁數(shù):173 大小:1.95MB
收藏 版權(quán)申訴 舉報 下載
單片機原理與應用-KFILC項目教程(西電版)項目二霓虹燈控制系統(tǒng)_第1頁
第1頁 / 共173頁
單片機原理與應用-KFILC項目教程(西電版)項目二霓虹燈控制系統(tǒng)_第2頁
第2頁 / 共173頁
單片機原理與應用-KFILC項目教程(西電版)項目二霓虹燈控制系統(tǒng)_第3頁
第3頁 / 共173頁

下載文檔到電腦,查找使用更方便

14.9 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《單片機原理與應用-KFILC項目教程(西電版)項目二霓虹燈控制系統(tǒng)》由會員分享,可在線閱讀,更多相關(guān)《單片機原理與應用-KFILC項目教程(西電版)項目二霓虹燈控制系統(tǒng)(173頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、項 目 二 霓 虹 燈 控 制 系 統(tǒng) 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 2.1 項目說明 2.2 基礎(chǔ)知識 2.3 項目實施 2.4 項目評價 2.5 拓展與提高 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 2.1 項 目 說 明 項目任務霓虹燈為美化城市夜景作出了不可磨滅的貢獻。本項目的任務是利用51單片機驅(qū)動8個發(fā)光二極管來模擬霓紅燈控制系統(tǒng)。 知識培養(yǎng)目標(1) 掌握C51變量的定義以及運算符的應用。(2) 掌握延時的實現(xiàn)及其應用。(3) 掌握基本程序的設(shè)計方法。(4) 掌握C51庫函數(shù)的使用。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) (5) 掌握數(shù)組的定義及其應用。(6) 掌握字節(jié)

2、尋址與位尋址的應用。 能力培養(yǎng)目標(1) 培養(yǎng)單片機控制系統(tǒng)的硬件分析與設(shè)計能力。(2) 培養(yǎng)元器件的計算與選擇能力。(3) 培養(yǎng)C51的程序設(shè)計能力。(4) 培養(yǎng)分析問題與解決問題的能力。(5) 培養(yǎng)團隊協(xié)作能力。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 2.2 基 礎(chǔ) 知 識2.2.1 C51變量1. 變量的定義在項目一中,我們對C51中的變量進行了簡要的說明,每個變量要有一個變量名,變量的數(shù)據(jù)類型不同,占用的存儲單元數(shù)也不一樣。在使用前必須對變量進行定義,完整的變量定義形式要指出變量的數(shù)據(jù)類型和存儲類型,以便編譯系統(tǒng)為它分配相應的存儲單元。定義的一般形式為存儲種類 數(shù)據(jù)類型說明符 存儲類

3、型 變量名l=初值, 變量 名2=初值; 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 1) 數(shù)據(jù)類型說明符在定義變量時,必須通過數(shù)據(jù)類型說明符指明變量的數(shù)據(jù)類型,也就是規(guī)定了變量在存儲器中占用的字節(jié)數(shù)。數(shù)據(jù)類型說明符可以是基本數(shù)據(jù)類型說明符,也可以是組合數(shù)據(jù)類型說明符,還可以是用typedef或#define定義的類型別名。例如:typedef unsigned int WORD;#define BYTE unsigned charBYTE A=0 x34; WORD a2=0 x3534; 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 2) 變量名變量名是C51為了區(qū)分不同變量為變量取的名稱。在C51

4、中規(guī)定變量名由字母、數(shù)字和下畫線三種字符組成,且規(guī)定變量名第一個字符必須是字母或下畫線。變量名有普通變量名和指針變量名兩種,它們的區(qū)別是指針變量名前面要帶“*”號。3) 存儲種類存儲種類是指變量在程序執(zhí)行過程中的作用域。C51變量的存儲種類有四種,分別是自動(auto)、外部(extern)、靜態(tài)(static)與寄存器(register)。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) (1) auto:使用auto定義的變量稱為自動變量,其作用范圍在定義它的函數(shù)體或復合語句內(nèi)部。當定義它的函數(shù)體或復合語句執(zhí)行時,C51才為該變量分配內(nèi)存空間,結(jié)束時釋放占用的內(nèi)存空間。自動變量一般分配在內(nèi)存的堆棧

5、空間中。當定義變量時,如果省略存儲種類,則該變量默認為自動(auto)變量。用自動變量能最有效地使用51單片機內(nèi)存。由于51單片機訪問片內(nèi)RAM速度最快,通常將函數(shù)體內(nèi)和復合語句中使用頻繁的變量存放在片內(nèi)RAM中,且定義為自動變量,可有效地利用片內(nèi)有限的RAM資源。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) (2) extern:使用extern定義的變量稱為外部變量。在一個函數(shù)體內(nèi),要使用一個已在該函數(shù)體外或其他程序中定義過的外部變量時,該變量在該函數(shù)體內(nèi)要用extern說明。外部變量被定義后分配固定的內(nèi)存空間,在程序的整個執(zhí)行時間內(nèi)都有效,直到程序結(jié)束才釋放。通常將多個函數(shù)或模塊共享的變量定

6、義為外部變量。外部變量是全局變量,在程序執(zhí)行期間一直占有固定的內(nèi)存空間。當片內(nèi)RAM資源緊張時,不建議將外部變量放在片內(nèi)RAM。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) (3) static:使用static定義的變量稱為靜態(tài)變量。它又分為內(nèi)部靜態(tài)變量和外部靜態(tài)變量。在函數(shù)體內(nèi)部定義的靜態(tài)變量為內(nèi)部靜態(tài)變量,它在對應的函數(shù)體內(nèi)有效,一直存在,但在函數(shù)體外不可見。這樣不僅使變量在定義它的函數(shù)體外被保護,還可以實現(xiàn)變量離開函數(shù)時值不被改變。外部靜態(tài)變量是在函數(shù)外部定義的靜態(tài)變量,它在程序中一直存在,但在定義的范圍之外是不可見的。如在多文件或多模塊處理時,外部靜態(tài)變量只在文件內(nèi)部或模塊內(nèi)部有效。(4

7、) register:使用register定義的變量稱為寄存器變量。它定義的變量存放在CPU內(nèi)部的寄存器中,處理速度快,但數(shù)目少。C51編譯器編譯時能自動識別程序中使用頻率最高 的變量,并自動將其作為寄存器變量,用戶無須專門聲明。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 4) 存儲類型存儲類型是用于指明變量存放在單片機的哪個存儲器中。存儲類型與存儲種類完全不同,存儲類型指明該變量在單片機內(nèi)所處的存儲空間。如果在變量定義時省略了存儲類型標識符,C51編譯器會選擇默認的存儲類型。默認的存儲類型由SMALL、COMPACT和LARGE存儲模式來決定。C51編譯器能識別的存儲類型如表2-1所示。 項

8、目 二 霓 虹 燈 控 制 系 統(tǒng) 表2-1 C51編譯器能識別的存儲類型 項 目 二 霓 虹 燈 控 制 系 統(tǒng) (1) data區(qū):對data區(qū)的訪問是最快的,所以應該把使用頻率高的變量放在data區(qū),由于空間有限,必須有效使用data區(qū),data區(qū)除了包含程序變量外,還包含了堆棧和寄存器組。例如:unsigned char data system_status=0; float data outp_value;unsiged char data new_var; 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 在SMALL存儲模式下,當未說明存儲類型時,變量默認被定位在data區(qū)。標準變量和用戶

9、自定義變量都可以存儲在data區(qū),只要不超過data區(qū)的范圍。因為C51使用默認的寄存器組傳遞參數(shù),至少失去了8 B。另外要定義足夠大的堆棧空間,當內(nèi)部堆棧溢出時,程序會產(chǎn)生莫名其妙的錯誤,實際原因是51系列單片機沒有硬件報錯機制,堆棧溢出只能以這種方式表示出來。(2) bdata區(qū):在片內(nèi)RAM的位尋址區(qū)(bdata區(qū))定義變量,這個變量就可進行位尋址,并且聲明位變量。這對狀態(tài)寄存器來說十分有用,因為這樣可以單獨使用變量的某一位,而不一定要用位變量名引用位變量。下面是一些在bdata區(qū)中 聲明變量和使用位變量的例子。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) unsigned char bda

10、ta status_byte;unsigned int bdata status_word;sbit stat_flag=status_byte4;if(status_word15) stat_flag=1;編譯器不允許在bdata區(qū)中定義float和double類型的變量。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) (3) idata區(qū):idata區(qū)可以存放使用比較頻繁的變量,使用寄存器作為指針進行尋址。在寄存器中設(shè)置8位地址進行間接尋址,與外部存儲器尋址比較,它的指令執(zhí)行周期和代碼長度都比較短。例如:unsigned char idata system_status=0;float idat

11、a outp_value; 項 目 二 霓 虹 燈 控 制 系 統(tǒng) (4) pdata和xdata區(qū):在這兩個區(qū)聲明變量和在其他區(qū)的語法是一樣的,pdata區(qū)只有256 B,而xdata區(qū)可達64 KB。例如:unsigned char xdata system_status=0; float pdata outp_value;對pdata和xdata的操作是相似的,對pdata區(qū)尋址比對xdata區(qū)尋址要快,因為對pdata區(qū)尋址只需要裝入8位地址,而對xdata區(qū)尋址需裝入16位地址。所以盡量把外部數(shù)據(jù)存儲在pdata區(qū)中,匯編語言中對pdata和xdata尋址要使用MOVX指令,需要2個

12、機器周期。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) (5) code區(qū):code區(qū)即51單片機的程序存儲器,所以存入的數(shù)據(jù)是不可以改變的,即不可重寫。程序存儲器除了存放用戶編寫的程序代碼外,還可存放數(shù)據(jù)表、跳轉(zhuǎn)向量和狀態(tài)表,對code區(qū)的訪問和對xdata區(qū)的訪問的時間是一樣的,代碼區(qū)中的變量必須在編譯時初始化,否則就得不到想要的值,下面是代碼區(qū)的聲明例子。unsigned int code unit_id2=0 x1234, 0 x89ab;unsigned char code uchar_data =0 x00,0 x01,0 x02,0 x03,0 x04,0 x05,0 x06,0 x

13、07; 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 2. 變量的存儲模式變量的存儲模式確定了變量在內(nèi)存中的地址空間,C51編譯器允許采用小編譯模式SMALL、緊湊編譯模式COMPACT、大編譯模式LARGE三種存儲模式。SMALL模式下,變量存放在51單片機的內(nèi)部RAM中;COMPACT和LARGE模式下,變量存放在51單片機的外部RAM中。同樣一個函數(shù)的存儲模式確定了函數(shù)的參數(shù)和局部變量在內(nèi)存中的地址空間,SMALL模式下,函數(shù)的參數(shù)和局部變量存放在51單片機的內(nèi)部RAM中;COMPACT和LARGE模式下,函數(shù)的參數(shù)和局部變量存放在51單片機的外部RAM中。例如: 項 目 二 霓 虹 燈 控

14、制 系 統(tǒng) #pragma small /存儲模式為SMALLunsigned char data i,j,k;int xdata m, n;unsigned char a=0 x99,b=0 x88;unsigned char xdata ram128;unsigned int func1(int i, int j) large return(i+j);unsigned int func2(int i, int j) return(i-j); 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 由于是SMALL模式,故a、b、i、j、k都存儲在片內(nèi)數(shù)據(jù)存儲器中。不同的存儲類型訪問速度是不一樣的,如:un

15、signed char data var1;unsigned char pdata var1;unsigned char xdata var1; 在SMALL模式下,var1被定位在DATA區(qū),經(jīng)C51編譯器編譯后,采用內(nèi)部RAM直接尋址方式訪問速度最快;在COMPACT模式下,var1被定位在pdata區(qū),經(jīng)C51編譯器編譯后,采用外部RAM間接尋址方式訪問速度較快;在LARGE模式下,var1被定位在xdata區(qū),經(jīng)C51編譯器編譯后,采用外部RAM間接尋址方式訪問速度最慢。為了提高 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 系統(tǒng)運行速度,建議在編寫源程序時,把存儲模式設(shè)定為SMALL,再在

16、程序中對xdata、pdata和idata等類型變量進行專門聲明。定義變量時也可以省略存儲類型,省略時C51編譯器將按存儲模式選擇存儲類型。單擊圖2-1中所圈圖標或選擇“ProjectOptions for、Target Target1”,出現(xiàn)如圖2-1所示窗口,單擊第二個選項“Target”,“Memory Model”用于選擇數(shù)據(jù)存儲模式,“Code Rom Size”用于選擇程序存儲模式,選擇好后,單擊“確定”按鈕。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 圖2-1 C51編譯器存儲模式 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 3. 特殊功能寄存器變量51系列單片機片內(nèi)有許多特殊功能寄存

17、器,通過這些特殊功能寄存器可以管理與控制51系列單片機的定時器、計數(shù)器、串口、I/O及其他功能部件,每一個特殊功能寄存器都占據(jù)片內(nèi)RAM中的一個或兩個字節(jié)。在C51中,允許用戶對這些特殊功能寄存器進行訪問,訪問時需通過sfr或sfr16類型說明符進行定義,定義時需指明它們在片內(nèi)RAM中對應單元的地址。一般形式為sfr/sfr16特殊功能寄存器名稱=字節(jié)地址; 項 目 二 霓 虹 燈 控 制 系 統(tǒng) sfr用于對51系列單片機中單字節(jié)(8位)的特殊功能寄存器進行定義,sfr16用于對雙字節(jié)(16位)特殊功能寄存器(DPTR)進行定義。特殊功能寄存器名一般用大寫字母表示,地址一般采用直接地址形式,

18、如:sfr PSW=0 xD0; /定義程序狀態(tài)字PSW的地址為D0Hsfr TMOD=0 x89; /定義定時/計數(shù)器方式寄存器TMOD的地址為89Hsfr P1=0 x90; /定義P1端口的地址為90H 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 4. 位變量在C51中,允許用戶通過位類型符定義位變量。關(guān)鍵字有bit和sbit兩個。bit用于定義一般的可進行位處理的位變量,位地址由編譯器在編譯時分配,位地址位于片內(nèi)RAM中的20H27H單元。它的一般形式為bit 位變量名;在格式中可以加上各種修飾,但嚴格來說只能是bdata,如: bit bdata a1;而bit pdata a3是錯誤的

19、。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) sbit用于定義可位尋址特殊功能寄存器中的某一位,定義時需指明其位地址,可以是直接位地址、特殊功能寄存器字節(jié)地址值帶位號或特殊功能寄存器名帶位號。一般形式為sbit 位地址名=位地址;如位地址為直接位地址,其取值范圍為0 x7F0 xFF中可位尋址的位地址;如采用特殊功能寄存器名稱帶位號時,需在定義位地址之前用sfr/sfr16對特殊功能寄存器進行定義,且字節(jié)地址與位號之間、特殊功能寄存器名稱與位號之間一般用“”作間隔。如: 項 目 二 霓 虹 燈 控 制 系 統(tǒng) sbit led1=0 x80; /直接位地址sbit led1=0 x800; /特

20、殊功能寄存器字節(jié)地址值帶位號 sbit led1=P00; /特殊功能寄存器名稱帶位號 這三條指令都可以將P0口最低位的位地址定義為led1。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 5. 局部變量與全局變量局部變量是指在在函數(shù)內(nèi)部定義的變量;全局變量是指在函數(shù)外部定義的變量,也稱外部變量。全局變量和局部變量體現(xiàn)了變量能被有效引用的范圍,即變量的作用域。它們的區(qū)別:局部變量只在當前函數(shù)中有效,即當該函數(shù)被調(diào)用時,為函數(shù)內(nèi)定義的變量分配存儲單元,在該函數(shù)執(zhí)行完后,在它內(nèi)部定義的所有變量將自動銷毀,分配的存儲單元將自動釋放,當下次再被調(diào)用時,編譯器重新為其分配新的存儲單元;而編譯器為全局變量分配存

21、儲單元后,它將永遠占據(jù)這些存儲單元。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 1) 局部變量的作用域注意事項(1) 主函數(shù)中定義的變量也只能在主函數(shù)中使用,不能在其他函數(shù)中使用;同時,主函數(shù)中也不能使用其他函數(shù)中定義的變量,因為主函數(shù)也是一個函數(shù),它與其他函數(shù)是平行關(guān)系。這一點與其他語言不同,應予以注意。(2) 形參變量是屬于被調(diào)函數(shù)的局部變量,實參變量是屬于主調(diào)函數(shù)的局部變量。(3) 允許在不同的函數(shù)中使用相同的變量名,它們代表不同的對象,分配不同的單元,相互間不干擾,也不會發(fā)生混淆。(4) 在復合語句中也可定義變量,其作用域只在復合語 句范圍內(nèi)。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 2

22、) 全局變量的作用域注意事項(1) 全局變量可以被本文件中所有函數(shù)共用,它的作用范圍是從定義變量的位置開始到本源文件結(jié)束。(2) 全局變量定義在使用它的函數(shù)之后,當在該函數(shù)中使用全局變量時,應作全局變量說明,只有在函數(shù)內(nèi)經(jīng)過說明的全局變量才能使用,全局變量的說明符為extern。但在一個函數(shù)之前定義的全局變量,在該函數(shù)內(nèi)使用時可不再加以說明。(3) 在同一源文件中,允許全局變量和局部變量同名。在局部變量的作用域內(nèi),全局變量不起作用。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) (4) 外部變量可加強函數(shù)模塊之間的數(shù)據(jù)聯(lián)系,但是又使函數(shù)要依賴這些變量,因而使得函數(shù)的獨立性降低,從模塊化程序設(shè)計的觀點

23、來看這是不利的,因此在不必要時盡量不要使用全局變量。我們知道單片機內(nèi)部的數(shù)據(jù)存儲器容量有限,51系列單片機供用戶使用的只有128 B,如果定義unsigned int類型變量,一個變量是兩個字節(jié),最多只能定義64個;定義unsigned char類型變量,一個變量為一個字節(jié),最多也只能定義128個。當源程序較長,控制功能較復雜時,會遇到內(nèi)存不夠用的情況,因此用C51編程,雖然降低了對單片機硬件知識的要求,但也要在剛開始學習時養(yǎng)成良好的思考習慣,牢記單片機內(nèi)部的可用資源,從節(jié)省片內(nèi)RAM的角度出發(fā),能用局部變量的就不用全局變量,能用 unsigned char類型的就不用unsigned int

24、類型。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 2.2.2 C51的運算符與表達式C語言中運算符和表達式數(shù)量之多,應用之靈活,是其他高級語言所沒有的。C51中常用運算符主要有算術(shù)運算符、關(guān)系運算符、邏輯運算符、位運算符、賦值運算符。這些運算符按其所在表達式中參與運算的操作數(shù)的個數(shù)可分為單目運算符、雙目運算符和三目運算符。(1) 算術(shù)運算符:用于各類數(shù)值運算,包括加(+)、減(-)、乘(*)、除(/運算)、求余(%)、自增(+)、自減(-),共7種運算。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) (2) 關(guān)系運算符:用于各類比較運算,包括大于()、小于(=)、小于等于(=)和不等于(!=),共6種

25、運算。 (3) 邏輯運算符:用于各類邏輯運算,包括與(”、“a=b=c=5;”都是賦值語句。在項目一中我們已使用過了。如果賦值運算符兩邊的數(shù)據(jù)類型不相同,系統(tǒng)將自動進行類型轉(zhuǎn)換,即把賦值號右邊的類型換成左邊的類型。具體規(guī)定如下: 項 目 二 霓 虹 燈 控 制 系 統(tǒng) (1) 實型量賦予整型變量時,舍去小數(shù)部分。如x為unsigned char 型,在執(zhí)行x=4.56時,只將整數(shù)部分賦給x,即x=4。(2) 整型量賦予實型變量時,數(shù)值不變,但將以浮點形式存放,即增加小數(shù)部分(但小數(shù)部分值為0)。(3) 字符型量賦予整型變量,由于字符型量為一個字節(jié),而整型量為兩個字節(jié),故將字符型的值存放到整型量

26、的低八位中,高八位為0。(4) 整型量賦予字符型變量,只把低八位賦予字符型變量。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 3. 關(guān)系運算符和關(guān)系表達式關(guān)系運算是雙目運算,用于比較兩個操作數(shù)的大小。C51提供了6種關(guān)系運算符,即小于()、小于等于()、大于等于(=)、等于(=)、不等于(!=)。這6個關(guān)系運算符分為兩個優(yōu)先級,前四種高于后兩種。將兩個表達式(可以是算術(shù)表達式、賦值表達式、關(guān)系表達式等)用關(guān)系運算符連接起來就構(gòu)成了關(guān)系表達式。關(guān)系表達式的值是邏輯值“真”或“假”。但是C51中沒有邏輯型變量和常量,也沒有專門的邏輯值,故以“非0”代表“真”,以“0”代表“假”。當關(guān)系表達式成立時,表

27、達式的值為真,否則表達式的值為假。如53,則該表達式為真, 即該關(guān)系表達式的值為1;8=12,該表達式的值為0,即為假。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 算術(shù)、關(guān)系、賦值這三類運算符的優(yōu)先級是由高到低,例如a=bc,該表達式等效于a=(bc+d(a=3)(b=5)(ab)(bc)如a=3、b=4、c=5、d=6,則這三個關(guān)系表達式的值分別為0、1、0。注意:不要誤將關(guān)系運算符“=”寫作賦值運算符“=”。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 4. 邏輯運算符和邏輯表達式 邏輯運算用于判斷運算對象的邏輯關(guān)系,運算對象為關(guān)系表達式或邏輯量。C51提供了邏輯非(!)、邏輯與( b=ba;

28、a=ab;(2) 取反。某數(shù)與0 xFF按位異或時,相當于對該數(shù)取反。例如,0 x880 xFF=0 x77。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 4) 按位非按位非運算符“”為單目運算符,具有右結(jié)合性。其功能是對參與運算的操作數(shù)的各二進位按位求反。如:11000011=00111100按位非的應用:按位非主要用于求取某一二進制數(shù)的反碼,或和其他運算結(jié)合使用。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 5) 左移左移運算符“”是雙目運算符,其功能是把“”左邊的操作數(shù)的各二進位全部左移若干位,由“”右邊的操作數(shù)指定移位的位數(shù),移位時將溢出的高位丟棄,低位補0。如:a=11000011,執(zhí)行 a

29、2=00001100。左移的應用:左移1位相當于該數(shù)乘以2,左移2位相當于該數(shù)乘以4,左移n位相當于該數(shù)乘以2n。但此結(jié)論只適用于該數(shù)左移時被溢出舍棄的高位中不包含1的情況。例如:a”是雙目運算符,其功能是把“”左邊的操作數(shù)的各二進位全部右移若干位,“”右邊的操作數(shù)指定移動的位數(shù)。移到右端的低位被舍棄,對于無符號數(shù),高位補0;對于有符號數(shù),算術(shù)移位是在左邊用符號位填補,邏輯移位則是在左邊補0。例如:a=00110011,執(zhí)行 a2=00001100。右移的應用:右移1位相當于該數(shù)除2,右移2位相當于該數(shù)除4,右移n位相當于該數(shù)除2n。但此結(jié)論只適用于該數(shù)右移時被舍棄的低位中不包含1的情況。設(shè)a

30、為unsigned uchar類型,且a=12,表示把000001100右移2位為00000011(十進制3),即a2=3。對于左邊移出的空 位補入0。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 6. 復合賦值運算符在賦值運算符“=”的前面加上其他運算符,組成復合賦值運算符。C51中支持的復合賦值運算符有:+=加法賦值;-=減法賦值;*=乘法賦值;/=除法賦值;%=取余賦值;”組成。其一般形式為表達式; 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 執(zhí)行表達式語句就是計算表達式的值。例如:x=y+z;是利用賦值語句將y+z保存到x變量中;又如y+z;是合法的加法表達式,但計算結(jié)果不能保留,無實際意義;

31、i+;是自增語句,i值增1。a=3與a=3;是不一樣的。不加分號,為賦值表達式,不是語句;加分號后才是賦值語句。對賦值語句的使用要注意以下幾點:(1) 由于在賦值符“=”右邊的表達式也可以又是一個賦值表達式,因此形式為 變量=(變量=表達式); 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 是成立的,形成嵌套的情形。其展開之后的一般形式為變量=變量=表達式;例如:a=b=c=d=e=5;按照賦值運算符的右結(jié)合性,實際上等效于:e=5;d=e;c=d;b=c;a=b;(2) 在變量定義中給變量賦初值是變量定義的一部分,賦初值后的變量與其后的其他同類變量之間仍必須用逗號間隔,而賦值語句則必須用分號結(jié)尾。

32、(3) 在變量定義中,不允許連續(xù)給多個變量賦初值。如int a=b=c=5是錯誤的,必須寫為int a=5,b=5,c=5; 而賦值語句允許連續(xù)賦值。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) (4) 注意賦值表達式和賦值語句的區(qū)別。賦值表達式是一種表達式,它可以出現(xiàn)在任何允許表達式出現(xiàn)的地方,而賦值語句則不能。如:if(x=y+5)0)z=x; 此語句是合法的,語句的功能是,若表達式x=y+5大于0,則z=x。而下述語句是非法的:if(x=y+5;)0)z=x;因為=y+5;是語句,不能出現(xiàn)在表達式中。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 2) 函數(shù)調(diào)用語句將函數(shù)調(diào)用作為一個語句。函數(shù)調(diào)用

33、的一般形式為函數(shù)名(實際參數(shù)表);執(zhí)行函數(shù)調(diào)用語句就是調(diào)用函數(shù)體并把實際參數(shù)賦予函數(shù)定義中的形式參數(shù),然后執(zhí)行被調(diào)函數(shù)體中的語句,求取函數(shù)值;調(diào)用無參函數(shù)時,無需實際參數(shù)表。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 3) 復合語句把多個語句用括號“”括起來組成一條復合語句。在程序中應把復合語句看成是單條語句,而不是多條語句,例如:x=y+z;a=b+c;z=x/c;復合語句內(nèi)的各條語句都必須以分號“;”結(jié)尾,在括號“”后不能加分號。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 4) 控制語句控制語句用于控制程序的流程,實現(xiàn)程序的各種結(jié)構(gòu)方式??刂普Z句共有九種,它們是: if() else 條件語句

34、 switch 多分支選擇語句 for() 循環(huán)語句 while() 循環(huán)語句 do while() 循環(huán)語句 continue 結(jié)束本次循環(huán)語句 break 中止執(zhí)行swith或循環(huán)語句 goto 轉(zhuǎn)向語句 return 函數(shù)的返回語句 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 括號“()”中表示條件,“”表示內(nèi)部語句。如:if(a45) b=x*y;c=x/y;elseb=c=0;5) 空語句只有分號“;”組成的語句才稱為空語句??照Z句是什么也不執(zhí)行的語句,在程序中空語句可用來作循環(huán)體或內(nèi)部語句。如“while(1);”就是用空語句作循環(huán)體,其作用是無數(shù) 遍執(zhí)行空語句。 項 目 二 霓 虹

35、燈 控 制 系 統(tǒng) 2. for語句for語句是C語言所提供的功能強大且使用廣泛的一種循環(huán)語句。其一般形式為for(表達式1;表達式2;表達式3) 循環(huán)體語句;表達式1用于給循環(huán)變量賦初值,一般為賦值表達式,也允許在for語句外給循環(huán)變量賦初值;表達式2是循環(huán)結(jié)束條件,可以是關(guān)系表達式或邏輯表達式;表達式3用于修改循環(huán)變量的值,一般是賦值語句;循環(huán)體語句可以為空語句。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 表達式13都可以是逗號表達式,即每個表達式都可由多個表達式組成;三個表達式都是任選項,都可以省略,但分號不能省略。for語句的執(zhí)行過程是:第一步:計算表達式1。第二步:計算表達式2,若值為

36、真(非0),則執(zhí)行循環(huán)體語句,然后執(zhí)行第三步;否則結(jié)束for語句,不再執(zhí)行循環(huán)體和第三步,接著執(zhí)行for的下一條語句。圖2-2 for語句執(zhí)行流程圖第三步:計算表達式3。第四步:轉(zhuǎn)至第二步重復執(zhí)行。在整個for語句的執(zhí)行過程中,表達式1只計算一次,表達式2和表達式3則可能計算多次;循環(huán)體可能執(zhí)行多次,也可能一次 都不執(zhí)行;for語句的執(zhí)行過程如圖2-2所示。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 圖2-2 for語句執(zhí)行流程圖 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 3. do-while語句do-while語句也是C51中常用的循環(huán)語句,它的一般形式為do語句;while(表達式);說明:

37、“表達式”為循環(huán)條件,“語句”為循環(huán)體。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) do-while語句的執(zhí)行過程是先執(zhí)行循環(huán)體語句一次,再判別表達式的值,若為真(非0),則繼續(xù)執(zhí)行循環(huán)體語句;若為假,則終止循環(huán)。流程圖如圖2-3所示。do-while語句和while語句的區(qū)別在于do-while是先執(zhí)行后判斷,因此do-while至少要執(zhí)行一次循環(huán)體;而while是先判斷后執(zhí)行,如果條件不滿足,則一次循環(huán)體語句也不執(zhí)行。while語句和do-while語句可以相互替換。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 圖2-3 do-while語句的執(zhí)行流程圖 項 目 二 霓 虹 燈 控 制 系 統(tǒng)

38、例1 用do-while語句與while語句分別執(zhí)行2000次空語句。解:源程序1void delay() unsigned int i=0; do i+; while(i2000); 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 源程序2void delay() unsigned int i=0; while(i2000) i+; 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 2.2.4 C51函數(shù)1. C51函數(shù)的分類C51源程序是由一個或多個函數(shù)組成的,函數(shù)是C51源程序的基本模塊,通過對函數(shù)的調(diào)用實現(xiàn)特定的功能。C51語言不僅提供了許多庫函數(shù),還允許用戶自己定義函數(shù),用戶可把自己的算法編成一個個相

39、對獨立的函數(shù)模塊,然后用調(diào)用的方法來使用這些函數(shù)。由于采用了函數(shù)結(jié)構(gòu),C51易于實現(xiàn)結(jié)構(gòu)化程序設(shè)計,使程序的層次結(jié)構(gòu)更為清晰,便于程序的編寫、閱讀和調(diào)試。在C51中可以從不同的角度對函數(shù)進行分類。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 1) 從函數(shù)定義的角度分類(1) 庫函數(shù):由C51系統(tǒng)提供,用戶無須定義,也不必在程序中作類型說明,只需在程序前包含該函數(shù)原型的頭文件就可以在程序中直接調(diào)用。(2) 用戶定義函數(shù):由用戶按需要寫的函數(shù)。對于用戶自定義函數(shù),不僅要在程序中定義函數(shù)本身,而且在主調(diào)函數(shù)模塊中還必須對該被調(diào)函數(shù)進行類型說明,然后才能使用。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 2)

40、 從有無返回值的角度分類(1) 有返回值函數(shù):此類函數(shù)被調(diào)用后將向調(diào)用者返回一個執(zhí)行結(jié)果,稱為函數(shù)返回值,如數(shù)學函數(shù)即屬于此類函數(shù)。由用戶定義的有返回值函數(shù)必須在函數(shù)定義和函數(shù)說明中明確返回值的類型。(2) 無返回值函數(shù):此類函數(shù)用于完成某項特定的處理任務,執(zhí)行完成后不向調(diào)用者返回函數(shù)值。由于函數(shù)無須返回值,因此用戶在定義此類函數(shù)時可指定其為空類型,空類型的說明符為void。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 3) 從主調(diào)函數(shù)和被調(diào)函數(shù)之間數(shù)據(jù)傳送的角度分類(1) 無參函數(shù):函數(shù)定義、函數(shù)說明及函數(shù)調(diào)用中均不帶參數(shù)。主調(diào)函數(shù)和被調(diào)函數(shù)之間不進行參數(shù)傳送。此類函數(shù)通常用來完成一組指定的功能

41、,可以返回或不返回函數(shù)值。(2) 有參函數(shù):也稱為帶參函數(shù)。在函數(shù)定義及函數(shù)說明時都有參數(shù),稱為形式參數(shù)(簡稱為形參);在函數(shù)調(diào)用時也必須給出參數(shù),稱為實際參數(shù)(簡稱為實參)。在調(diào)用有參函數(shù)時,主調(diào)函數(shù)將把實參的值傳送給形參,供被調(diào)函數(shù)使用。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 在C51中,所有的函數(shù)定義,包括主函數(shù)main在內(nèi),都是平行的,也就是說,在一個函數(shù)的函數(shù)體內(nèi),不能再定義另一個函數(shù),即不能嵌套定義。但是函數(shù)之間允許相互調(diào)用,也允許嵌套調(diào)用,習慣上把調(diào)用者稱為主調(diào)函數(shù),函數(shù)還可以自己調(diào)用自己,稱為遞歸調(diào)用。main函數(shù)是主函數(shù),它可以調(diào)用其他函數(shù)(不包括中斷函數(shù)),而不允許被其他

42、函數(shù)調(diào)用。因此,C51程序的執(zhí)行總是從main函數(shù)開始的,完成對其他函數(shù)的調(diào)用后再返回到main函數(shù),最后由main函數(shù)結(jié)束整個程序執(zhí)行。一個C51源程序必須有,也只能有一個主函數(shù)main。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 2. 函數(shù)的定義與調(diào)用1) 無參函數(shù)的定義與調(diào)用(1) 無參函數(shù)的定義。無參函數(shù)定義的一般形式為類型說明符 函數(shù)名() 類型說明語句;語句; 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 類型說明符和函數(shù)名稱為函數(shù)頭,類型說明符指明了該函數(shù)的類型,函數(shù)的類型實際上是函數(shù)返回值的類型,而無參函數(shù)多數(shù)沒有返回值,可定義為void類型;函數(shù)名是由用戶定義的標識符,函數(shù)名后有一個

43、空括號,其中無參數(shù),但括號不可少。中的內(nèi)容稱為函數(shù)體,在函數(shù)體中也有類型說明,這是對函數(shù)體內(nèi)部所用到的變量的類型說明。在C51中,如果有一些語句多次用到,而語句的內(nèi)容都相同時,就可以將這些語句寫成一個函數(shù),在主函數(shù)中通過調(diào)用該函數(shù)來使用這些語句。(2) 無參函數(shù)的調(diào)用。在C51中,無參函數(shù)調(diào)用的一般形式為 函數(shù)名(); 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 2) 有參函數(shù)的定義與調(diào)用(1) 有參函數(shù)的定義。有參函數(shù)定義的一般形式為類型說明符 函數(shù)名(形參類型1 參數(shù)1,形參類型n 參數(shù)n)類型說明語句;語句; 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 函數(shù)名后“()”中定義的參數(shù)稱為形式參數(shù),

44、它們可以是各種類型的變量,各參數(shù)之間用逗號間隔;在函數(shù)調(diào)用時,主調(diào)函數(shù)將賦予這些形式參數(shù)以實際數(shù)值,這些實際的數(shù)值稱為實參。形參出現(xiàn)在函數(shù)定義中,在整個函數(shù)體內(nèi)都可以使用,離開該函數(shù)則不能使用;實參出現(xiàn)在主調(diào)函數(shù)中,進入被調(diào)函數(shù)后,實參變量也不能使用;形參和實參的功能是作數(shù)據(jù)傳送,當發(fā)生函數(shù)調(diào)用時,主調(diào)函數(shù)把實參的值傳送給被調(diào)函數(shù)的形參,從而實現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送。函數(shù)的形參和實參還具有以下特點: 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 形參變量只有在被調(diào)用時才分配內(nèi)存單元,在調(diào)用結(jié)束時,即刻釋放所分配的內(nèi)存單元。因此形參只有在函數(shù)內(nèi)部有效,函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形

45、參變量。 實參可以是常量、變量、表達式、函數(shù)等,無論實參是何種類型的量,在進行函數(shù)調(diào)用時,它們都必須具有確定的值,以便把這些值傳送給形參。因此應預先用賦值、輸入等辦法使實參獲得確定值。 實參和形參在數(shù)量、類型和順序上應嚴格一致,否則會發(fā)生“類型不匹配”的錯誤。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的,即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。因此在函數(shù)調(diào)用過程中,形參的值會發(fā)生改變,而實參中的值不會產(chǎn)生變化。(2) 有參函數(shù)的調(diào)用。在C51中,有參函數(shù)調(diào)用的一般形式為函數(shù)名(實際參數(shù)表);實際參數(shù)表中的參數(shù)可以是常數(shù)、變量或其他構(gòu)造類型數(shù)據(jù)

46、及表達式。各實參之間用逗號分隔。函數(shù)的調(diào)用方式靈活,常用的還有函數(shù)表達式和函數(shù)實參兩種方式。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 函數(shù)表達式。函數(shù)作為表達式中的一部分出現(xiàn)在表達式中,函數(shù)返回值參與表達式的運算。當采用這種調(diào)用方式時,被調(diào)用的函數(shù)必須有返回值。例如max(x,y)為求x,y之間的最大值,z=max(x,y)是一個賦值表達式,把調(diào)用max函數(shù)的返回值賦予變量z。 函數(shù)實參。函數(shù)作為另一個函數(shù)調(diào)用的實際參數(shù)出現(xiàn),這種情況是把該函數(shù)的返回值作為實參進行傳送,因此被調(diào)函數(shù)也必須要有返回值。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 3. 函數(shù)的聲明在C51中,除主函數(shù)外的其他函數(shù)在定義

47、時可以寫在主函數(shù)的前面,也可以寫在主函數(shù)的后面,但是不可以寫在主函數(shù)的內(nèi)部。當函數(shù)寫在主函數(shù)的后面時,必須要在主函數(shù)之前對函數(shù)進行聲明,聲明的作用是為了編譯器在編譯主函數(shù)過程中,當遇到函數(shù)調(diào)用時,知道有這樣一個函數(shù)存在,才能夠根據(jù)它的類型和參數(shù)等信息為它分配必要的存儲空間。函數(shù)聲明語句的一般形式為無參函數(shù):類型說明符 函數(shù)名(); 如:void delay500ms(); 有參函數(shù):類型說明符 函數(shù)名(類型1, 類型n ); 如:void delay10ms(uchar); 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 可以省略函數(shù)聲明的幾種情況:(1) 當被調(diào)函數(shù)的函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前時,在

48、主調(diào)函數(shù)中可以不對被調(diào)函數(shù)再作說明而直接調(diào)用。 (2) 所有函數(shù)定義之前,在函數(shù)外預先說明各個函數(shù)的類型,這樣則在以后的各主調(diào)函數(shù)中,可不再對被調(diào)函數(shù)作說明。例如:char str(int a); /聲明有參函數(shù)strvoid f(); /聲明無參函數(shù)fmain() 項 目 二 霓 虹 燈 控 制 系 統(tǒng) char str(int a)void f()其中第1、2行對str函數(shù)和f函數(shù)預先作了聲明,因此在以后各函數(shù)中無須對str和f函數(shù)再作聲明就可以直接調(diào)用了。(3) 對庫函數(shù)的調(diào)用不需要再作聲明,但在源程序的開始處須用“#include”命令包含所需的頭文件。 項 目 二 霓 虹 燈 控 制

49、 系 統(tǒng) 4. 函數(shù)的值有返回值的函數(shù)被調(diào)用后,會向主調(diào)函數(shù)返回一個數(shù)值,稱為函數(shù)的值或稱為函數(shù)返回值。關(guān)于函數(shù)的值有以下一些說明:(1) 函數(shù)的值只能通過return語句返回主調(diào)函數(shù)。return語句的一般形式為return表達式; 或return (表達式); 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 該語句的功能是計算表達式的值,并返回給主調(diào)函數(shù)。在函數(shù)中允許有多個return語句,但每次調(diào)用只能有一個return語句被執(zhí)行,因此只能返回一個函數(shù)值。(2) 函數(shù)值的類型和函數(shù)定義中函數(shù)的類型應保持一致,如果兩者不一致,則以函數(shù)類型為準,自動進行類型轉(zhuǎn)換。 項 目 二 霓 虹 燈 控 制 系

50、 統(tǒng) 2.2.5 一個發(fā)光二極管的閃爍1. 閃爍原理控制一個發(fā)光二極管點亮延時熄滅延時點亮,就會形成閃爍的效果,如圖2-4所示流程圖。閃爍的效果與發(fā)光二極管點亮、熄滅的時間有關(guān),如果時間太短,人的眼睛無法分辨;若時間太長,發(fā)光二極管閃爍的速度會太慢,而影響效果。因此發(fā)光二極管點亮或熄滅的時間一般控制在100 ms1 s之間。點亮與熄滅的時間不需要特別準確,可以用延時語句或延時函數(shù)來實現(xiàn),稱為軟件延時。軟件延時的原理就是讓單片機重復執(zhí)行沒有意義的空語句來實現(xiàn)時間的推移,一般由循環(huán)語 句構(gòu)成。在延時時間要求特別精確時可用定時/計數(shù)器來實現(xiàn)。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 圖2-4 發(fā)光二

51、極管閃爍流程圖 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 2for語句實現(xiàn)延時1) 由for構(gòu)成的延時語句C51中的循環(huán)語句均可實現(xiàn)延時,但for語句用得最多。由for構(gòu)成的延時語句為unsigned int i;for(i=0;i1827;i+);先定義了一個unsigned char類型的變量i,用于控制for的循環(huán)次數(shù),表達式1給i賦初值0,表達式2是循環(huán)結(jié)束語句,判斷i是否小于1827,表達式3通過i自增1修改i,循環(huán)體為空語句,什么也不需要做。當變量i從0遞增至1826時,條件i1827為真,執(zhí)行空語句,共1827次;當i遞增至1827時, 條件i1827為假,退出for循環(huán)。 項 目

52、 二 霓 虹 燈 控 制 系 統(tǒng) 由C51編寫的延時語句不能精確地計算出延時時間,通過KEIL C仿真后可知當晶振為12 MHz,for循環(huán)1827次時,約延時10 ms。需要修改延時時間時,以1827為基準進行調(diào)整,或者由for語句的嵌套來實現(xiàn)更長時間的延時,不必每次都進行仿真。如果要延時1 s,可以以10 ms為基準,采用雙重循環(huán)來實現(xiàn)。由于1 s=10010 ms,內(nèi)層循環(huán)實現(xiàn)10 ms延時,外層再循環(huán)100次,就可以達到延時1 s的要求。1 s的延時語句為 unsigned int i,j;for(i=0;i100;i+)for(j=0; j1827;j+); 項 目 二 霓 虹 燈

53、控 制 系 統(tǒng) 定義i、j兩個變量用于控制雙層循環(huán)的次數(shù)。第一個for語句的后面沒有分號,它的循環(huán)體就是第二個for語句;第二個for語句的循環(huán)體是空語句,因此第二個for語句為內(nèi)層循環(huán),由變量j控制循環(huán)1827次,延時10 ms;第一個for語句為外層循環(huán),由變量i控制循環(huán)100次,延時1 s。執(zhí)行時,第一個for語句的i每加一次,第二個for語句的j就需要加1827次,因此兩重循環(huán)共執(zhí)行了1001827次,約延時1 s。若需要更長的時間時可以改變外層for循環(huán)的循環(huán)次數(shù)或增加嵌套的次數(shù)。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 2) 應用舉例例2 編程使圖1-18中發(fā)光二極管LED0閃爍,

54、點亮和熄滅的時間均為1 s。解:只要單片機上電,發(fā)光二極管LED0就能不停地閃爍,即無休止地點亮1 s、熄滅1 s。要求控制一個LED閃爍時,字節(jié)尋址與位尋址均可實現(xiàn),本例中采用位尋址。源程序#include /包含51系列單片機的頭文件#define uchar unsigned char #define uint unsigned intsbit LED0=P20; /定義P2.0為LED0main() /主函數(shù) 項 目 二 霓 虹 燈 控 制 系 統(tǒng) uint i,j; /定義局部變量i、j,用于延時while(1) / while死循環(huán),無數(shù)遍點亮、熄滅LED0LED0=0; /位尋址

55、,點亮LED0 for(i=0;i100;i+) /延時1 sfor(j=0; j1827;j+); /分號必須有LED0=1; /位尋址,熄滅LED0for(i=0;i100;i+) /延時1 sfor(j=0; j1827;j+); /分號必須有 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 主函數(shù)中先定義了i、j兩個變量,在函數(shù)內(nèi)部定義的變量為局部變量,然后執(zhí)行while循環(huán),由于while的表達式是1,永遠為真,形成死循環(huán),因此CPU將一直執(zhí)行while的循環(huán)體語句。在while的循環(huán)體中,先點亮LED0,延時1 s,后熄滅,延時1 s,編譯后下載至單片機就可以觀察到LED0閃爍的效果。 項

56、 目 二 霓 虹 燈 控 制 系 統(tǒng) 例3 編程使圖1-18中發(fā)光二極管LED0閃爍,點亮和熄滅的時間均為500 ms。解:源程序#include /包含51系列單片機的頭文件#define uchar unsigned char#define uint unsigned intsbit LED0=P20; /定義P2.0為LED0/*延時函數(shù)*/void delay500 ms() /延時500 ms 項 目 二 霓 虹 燈 控 制 系 統(tǒng) uint i,j; /定義局部變量i、j,用于延時for(i=0;i50;i+) /外層for語句循環(huán)50次for(j=0; j1827;j+); /內(nèi)

57、層for語句約延時10 ms,分號必須有/*主函數(shù)*/main() while(1) / while死循環(huán),無數(shù)遍點亮、熄滅LED0 項 目 二 霓 虹 燈 控 制 系 統(tǒng) LED0=0; /位尋址,點亮LED0delay500ms(); /調(diào)用延時函數(shù),延時500 msLED0=1; /位尋址,熄滅LED0delay500ms(); /調(diào)用延時函數(shù),延時500 ms“/* */”也是C51的注釋符,可以注釋多行,而“/”只能注釋一行。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 由于關(guān)鍵字unsigned char、unsigned int較長,使用時會很麻煩,英文不好時也容易寫錯,這時可用#d

58、efine命令給它們重新起一個比較簡單的新名字,如:uchar、uint,當然也可以是其他名字,在后續(xù)程序中可直接用這個新名字定義變量,如:uint i,j;。源程序中,在主函數(shù)之前定義了無參延時函數(shù)void delay500ms(),“void”表示該函數(shù)執(zhí)行完后不需要返回任何數(shù)值,是一個無返回值的函數(shù);“delay500ms”是延時函數(shù)的名字,表示它是一個延時500 ms的函數(shù),函數(shù)名可以任意起,但是要注意兩點:一是不能和C51中的關(guān)鍵字相同,二 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 是要做到見名知義;函數(shù)名后的括號中沒有寫任何參數(shù),表示它是一個無參函數(shù)。延時函數(shù)delay500ms()

59、的函數(shù)體內(nèi)定義了i、j兩個變量用于控制循環(huán)次數(shù),它們均為局部變量。在主函數(shù)中需要延時500 ms時,可以通過語句“delay500ms();”調(diào)用延時函數(shù),CPU轉(zhuǎn)去執(zhí)行延時函數(shù),從而實現(xiàn)延時功能,這樣會使主函數(shù)看起來條理清晰,增強了程序的可讀性。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 例4 編程使圖1-18中的發(fā)光二極管LED0閃爍,點亮500 ms、熄滅300 ms。解:該題目要求發(fā)光二極管點亮與熄滅的時間不相同,如果編寫無參延時函數(shù),需將無參延時函數(shù)的時間設(shè)置為100 ms,調(diào)用3次實現(xiàn)300 ms的延時,調(diào)用5次實現(xiàn)500 ms的延時,方可實現(xiàn)題目要求。最好的方法是編寫有參延時函數(shù),

60、在調(diào)用時給以不同的實參,這樣就可以實現(xiàn)不同時間的延時了。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 項 目 二 霓 虹 燈 控 制 系 統(tǒng) main()while(1) / while死循環(huán),無數(shù)遍點亮、熄滅LED0 LED0=0; /位尋址,點亮LED0delay10ms(50 ); /實參為50,延時500 msLED0=1; /位尋址,熄滅LED0delay10ms(30 ); /實參為30,延時300 ms 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 由“void delay10ms(uchar a)”定義一個有參延時函數(shù),括號中的“uchar a”表示a是該函數(shù)的一個形式參數(shù),用a來控制函

61、數(shù)體內(nèi)第一個for語句的循環(huán)次數(shù),兩個for語句共執(zhí)行a1827次,約延時a10 ms;在主函數(shù)中調(diào)用該函數(shù)時,需要對應給出一個具體的數(shù)據(jù),即實參,當執(zhí)行被調(diào)函數(shù)時,將函數(shù)體中的所有形參用實參代替。主函數(shù)中通過調(diào)用語句“delay10 ms (50);”及“delay10ms (30);”調(diào)用delay10 ms函數(shù),并將實參50或30傳送給delay10 ms中的形參a,執(zhí)行延時函數(shù)后可分別獲得500 ms及300 ms的延時,改變實參可以方便地改變延時時間。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 延時函數(shù)是單片機編程中常用的一個函數(shù),除了由for語句構(gòu)成外,也可以由while語句構(gòu)成;循

62、環(huán)變量的修改不僅可以用自增,也可以用自減。3) 思考編寫實現(xiàn)下述要求的源程序。(1) 分別用前述方法實現(xiàn)300 ms延時。(2) 用位尋址使P2.2端口所接發(fā)光二極管閃爍,點亮、熄滅時間自定。(3) 用字節(jié)尋址使P2.3、P2.4端口所接的兩個發(fā)光二極管同時閃爍,點亮、熄滅時間自定。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 2.2.6 流水燈流水燈是霓虹燈中最簡單的一種閃爍效果,要求每次只點亮一個發(fā)光二極管,輪流點亮所有的發(fā)光二極管,點亮時間為500 ms;輪流點亮所有發(fā)光二極管時,既可從高位至低位,也可從低位至高位,還可在高位與低位之間往復。硬件電路如圖1-18所示。從程序流程的角度來看,程

63、序可以分為順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)三種形式,如圖2-5所示。分支結(jié)構(gòu)與循環(huán)結(jié)構(gòu)形式多樣,圖2-5(b)、(c)所示的分支結(jié)構(gòu)與循環(huán)結(jié)構(gòu)只是其中常見的一種。這三種基本結(jié)構(gòu)可以組成各種復雜程序,它們不是絕對獨立的,常常是相互融合的,從前述源程序中 就可以清楚地看到這一點。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 圖2-5 三種程序結(jié)構(gòu) 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 1. 順序結(jié)構(gòu)順序結(jié)構(gòu)是最簡單的程序結(jié)構(gòu),執(zhí)行時單片機按照程序中指令的順序逐條執(zhí)行。在實現(xiàn)復雜的功能時,順序結(jié)構(gòu)常常用于實現(xiàn)一些基本功能或用作循環(huán)結(jié)構(gòu)的循環(huán)體。例5 采用順序結(jié)構(gòu)使P2口所接的8個發(fā)光二極管形成流水燈。解:

64、用順序結(jié)構(gòu)實現(xiàn)流水燈時,只需要按照點亮的次序?qū)⒋a發(fā)送至I/O口即可。從LED0LED7依次點亮,當最高位的LED7點亮后,又從LED0重新開始,流程圖如圖2-6所示。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 圖2-6 流水燈流程圖(順序結(jié)構(gòu)) 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 流水燈在點亮一個LED的同時,要使其他7個LED熄滅,用字節(jié)尋址較為方便。從低位至高位輪流點亮LED時,P2口所需代碼如表2-2所示。 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 表2-2 流水燈代碼 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 從表2-2可知,由于每次只能點亮一個LED,因此每個代碼中都只有一個低電平。

65、源程序#include /包含51系列單片機的頭文件#define uchar unsigned char#define uint unsigned int/*延時函數(shù)*/void delay10ms(uchar a) /定義有參延時函數(shù),延時時間為a10 ms uint i,j; /定義局部變量i、j,用于延時 for(i=0;ia;i+)for(j=0; j1827;j+); /分號必須有 項 目 二 霓 虹 燈 控 制 系 統(tǒng) /*主函數(shù)*/main() while(1) / while死循環(huán),無數(shù)遍點亮LED0LED7 P2=0 xfe; /字節(jié)尋址,點亮LED0delay10ms(5

66、0); /延時500 msP2=0 xfd; /字節(jié)尋址,點亮LED1delay10ms(50); /延時500 msP2=0 xfb; /字節(jié)尋址,點亮LED2delay10ms(50); /延時500 ms P2=0 xf7; /字節(jié)尋址,點亮LED3delay10ms(50); /延時500 msP2=0 xef; /字節(jié)尋址,點亮LED4 項 目 二 霓 虹 燈 控 制 系 統(tǒng) delay10ms(50); /延時500 msP2=0 xdf; /字節(jié)尋址,點亮LED5delay10ms(50); /延時500 msP2=0 xbf; /字節(jié)尋址,點亮LED6delay10ms(50); /延時500 msP2=0 x7f; /字節(jié)尋址,點亮LED7delay10ms(50); /延時500 ms 項 目 二 霓 虹 燈 控 制 系 統(tǒng) 主函數(shù)由while語句構(gòu)成死循環(huán),在while的循環(huán)體中順序向P2口發(fā)送代碼,使LED0LED7輪流點亮,由于while(1)的表達式永遠為真,因此當LED7點亮后又重新從LED0開始點亮。上述源程序之所以稱為順序結(jié)構(gòu),就是指在while的循環(huán)

展開閱讀全文
溫馨提示:
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!

五月丁香婷婷狠狠色,亚洲日韩欧美精品久久久不卡,欧美日韩国产黄片三级,手机在线观看成人国产亚洲