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

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

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

14.9 積分

下載資源

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

資源描述:

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

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

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

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

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

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

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

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

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

9、自定義變量都可以存儲(chǔ)在data區(qū),只要不超過(guò)data區(qū)的范圍。因?yàn)镃51使用默認(rèn)的寄存器組傳遞參數(shù),至少失去了8 B。另外要定義足夠大的堆??臻g,當(dāng)內(nèi)部堆棧溢出時(shí),程序會(huì)產(chǎn)生莫名其妙的錯(cuò)誤,實(shí)際原因是51系列單片機(jī)沒(méi)有硬件報(bào)錯(cuò)機(jī)制,堆棧溢出只能以這種方式表示出來(lái)。(2) bdata區(qū):在片內(nèi)RAM的位尋址區(qū)(bdata區(qū))定義變量,這個(gè)變量就可進(jìn)行位尋址,并且聲明位變量。這對(duì)狀態(tài)寄存器來(lái)說(shuō)十分有用,因?yàn)檫@樣可以單獨(dú)使用變量的某一位,而不一定要用位變量名引用位變量。下面是一些在bdata區(qū)中 聲明變量和使用位變量的例子。 項(xiàng) 目 二 霓 虹 燈 控 制 系 統(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類(lèi)型的變量。 項(xiàng) 目 二 霓 虹 燈 控 制 系 統(tǒng) (3) idata區(qū):idata區(qū)可以存放使用比較頻繁的變量,使用寄存器作為指針進(jìn)行尋址。在寄存器中設(shè)置8位地址進(jìn)行間接尋址,與外部存儲(chǔ)器尋址比較,它的指令執(zhí)行周期和代碼長(zhǎng)度都比較短。例如:unsigned char idata system_status=0;float idat

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

12、機(jī)器周期。 項(xiàng) 目 二 霓 虹 燈 控 制 系 統(tǒng) (5) code區(qū):code區(qū)即51單片機(jī)的程序存儲(chǔ)器,所以存入的數(shù)據(jù)是不可以改變的,即不可重寫(xiě)。程序存儲(chǔ)器除了存放用戶編寫(xiě)的程序代碼外,還可存放數(shù)據(jù)表、跳轉(zhuǎn)向量和狀態(tài)表,對(duì)code區(qū)的訪問(wèn)和對(duì)xdata區(qū)的訪問(wèn)的時(shí)間是一樣的,代碼區(qū)中的變量必須在編譯時(shí)初始化,否則就得不到想要的值,下面是代碼區(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; 項(xiàng) 目 二 霓 虹 燈 控 制 系 統(tǒng) 2. 變量的存儲(chǔ)模式變量的存儲(chǔ)模式確定了變量在內(nèi)存中的地址空間,C51編譯器允許采用小編譯模式SMALL、緊湊編譯模式COMPACT、大編譯模式LARGE三種存儲(chǔ)模式。SMALL模式下,變量存放在51單片機(jī)的內(nèi)部RAM中;COMPACT和LARGE模式下,變量存放在51單片機(jī)的外部RAM中。同樣一個(gè)函數(shù)的存儲(chǔ)模式確定了函數(shù)的參數(shù)和局部變量在內(nèi)存中的地址空間,SMALL模式下,函數(shù)的參數(shù)和局部變量存放在51單片機(jī)的內(nèi)部RAM中;COMPACT和LARGE模式下,函數(shù)的參數(shù)和局部變量存放在51單片機(jī)的外部RAM中。例如: 項(xiàng) 目 二 霓 虹 燈 控

14、制 系 統(tǒng) #pragma small /存儲(chǔ)模式為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); 項(xiàng) 目 二 霓 虹 燈 控 制 系 統(tǒng) 由于是SMALL模式,故a、b、i、j、k都存儲(chǔ)在片內(nèi)數(shù)據(jù)存儲(chǔ)器中。不同的存儲(chǔ)類(lèi)型訪問(wèn)速度是不一樣的,如:un

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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àn)的一種。這三種基本結(jié)構(gòu)可以組成各種復(fù)雜程序,它們不是絕對(duì)獨(dú)立的,常常是相互融合的,從前述源程序中 就可以清楚地看到這一點(diǎn)。 項(xiàng) 目 二 霓 虹 燈 控 制 系 統(tǒng) 圖2-5 三種程序結(jié)構(gòu) 項(xiàng) 目 二 霓 虹 燈 控 制 系 統(tǒng) 1. 順序結(jié)構(gòu)順序結(jié)構(gòu)是最簡(jiǎn)單的程序結(jié)構(gòu),執(zhí)行時(shí)單片機(jī)按照程序中指令的順序逐條執(zhí)行。在實(shí)現(xiàn)復(fù)雜的功能時(shí),順序結(jié)構(gòu)常常用于實(shí)現(xiàn)一些基本功能或用作循環(huán)結(jié)構(gòu)的循環(huán)體。例5 采用順序結(jié)構(gòu)使P2口所接的8個(gè)發(fā)光二極管形成流水燈。解:

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

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

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

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

相關(guān)資源

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

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

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


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

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