版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、西京學(xué)院工程技術(shù)系電子信息教研室單片機原理與應(yīng)用課程單片機原理與應(yīng)用1第3講 單片機C語言開發(fā)基礎(chǔ)盡管匯編語言具有執(zhí)行效率高的優(yōu)點,但由于編程效率低、可移植性差、可讀性差等缺點,應(yīng)有受到了很大的限制。而簡潔、結(jié)構(gòu)優(yōu)化的C語言以開發(fā)速度快、執(zhí)行效率高、可移植性強等優(yōu)點,受到了越來越多的單片機開發(fā)人員的喜愛。 (1)可以大幅度加快開發(fā)速度。特別是一些復(fù)雜的系統(tǒng)。程序量越大,C語言就越有優(yōu)勢。(2)無須精通單片機指令集和過多地了解硬件結(jié)構(gòu),也能迅速開發(fā)出功能強大的單片機應(yīng)用系統(tǒng)。2第3講 單片機C語言開發(fā)基礎(chǔ) 盡管C語言代碼比匯編語言占用的空間大5%20%,但是由于半導(dǎo)體技術(shù)的飛速發(fā)展,芯片容量和速
2、度已有大幅度的提高,占用的空間大小不再是開發(fā)者關(guān)心的主要因素。而隨著市場競爭的日趨激烈,軟件開發(fā)速度和質(zhì)量才是決定能否在競爭中取勝的關(guān)鍵。所以,使用C語言已成為單片機應(yīng)用系統(tǒng)開發(fā)的趨勢。3第3講 單片機C語言開發(fā)基礎(chǔ)3.1 C語言源程序的結(jié)構(gòu)特點C語言是一種結(jié)構(gòu)化語言,它層次清晰,可以按模塊化方式阻組織程序,易于調(diào)試何維護。它不僅有豐富的運算符和數(shù)據(jù)類型,便于實現(xiàn)各種運算,還可以直接對硬件進行操作。因此,C語言既具有高級語言的功能,也具有低級語言的優(yōu)勢。下面通過一個簡單實例介紹C語言的結(jié)構(gòu)特點和書寫格式。 4第3講 單片機C語言開發(fā)基礎(chǔ) 這個程序的作用是通過單片機向P0口所接的硬件輸出一個數(shù)據(jù)
3、,如可以點亮P0.0引腳的LED。(1)“文件包含”處理 程序的第一行是一個“文件包含”處理,是指一個文件將另一個文件的內(nèi)容全部包含進來。由于單片機不認識“P0”(某寄存器的名字),因此必須給“P0”作定義。5第3講 單片機C語言開發(fā)基礎(chǔ)這種定義已經(jīng)由開發(fā)軟件(如Keil C51)完成了。在編程時必須將這種定義“包含”進去,才能使單片機認識“P0”等各種寄存器的名字。打開Keil的安裝目錄,在C51文件夾下找到“INC”子文件夾,打開里面的“reg51.h”文件,可以看到以下定義:6第3講 單片機C語言開發(fā)基礎(chǔ)7第3講 單片機C語言開發(fā)基礎(chǔ) 如果將“sfr P0= 0 x80;”語句中的“P0
4、”改為其他名字,如“Q0”。那么,在編程時,使用第一行的“文件包含”處理命令后,單片機就不再認識“P0”,而只認識“Q0”了。 (2)main()函數(shù) main()函數(shù)稱為主函數(shù),每個C語言程序必須有且只有一個主函數(shù),函數(shù)后面一定要有一對“”,程序就寫在大括號里面。 (3)語句結(jié)束標志 語句必須以分號“;”結(jié)尾。8第3講 單片機C語言開發(fā)基礎(chǔ) (4)注釋 C語言程序中的注釋是為了提高程序的可讀性。在編譯時,注釋的內(nèi)容不會被執(zhí)行。3.2 標識符與關(guān)鍵字C語言規(guī)定:標志符只能是字母(A-Z,a-z)、數(shù)字(0-9)和下劃線組成的字符串,并且第一個字符必須是字母或下劃線。 在C語言編程中,為了定義變
5、量、表達語句功能和對一些文件預(yù)處理,還必須用到一些特殊意義的字符串,即關(guān)鍵字。關(guān)鍵字已被軟件本身使用,不能再作為標志符使用。9第3講 單片機C語言開發(fā)基礎(chǔ)C語言的關(guān)鍵字分為三類:(1)類型說明符:用來定義變量、函數(shù)或其他數(shù)據(jù)類型,如unsigned char、int、long等。(2)語句定義符:用來標志一個語句的功能,如條件判斷語句“if”、“while”等。函數(shù)printf,scanf,sin,isalum等等。 (3)預(yù)處理命令:表示預(yù)處理的關(guān)鍵字,如程序開頭的“include”.所謂預(yù)處理是指在進行編譯的第一遍掃描(詞法掃描和語法分析)之前所作的工作。 ANSI C標準規(guī)定可以在C源程
6、序中加入一些“預(yù)處理命令”,以改進程序的10第3講 單片機C語言開發(fā)基礎(chǔ)設(shè)計環(huán)境,提高編程效率。預(yù)處理命令不是C語言本身的組成部分,不能直接對它們進行那個編譯。必須在進行編譯之前根據(jù)預(yù)處理命令對程序作相應(yīng)的處理。由ANSI標準定義的32個關(guān)鍵字:11第3講 單片機C語言開發(fā)基礎(chǔ)12第3講 單片機C語言開發(fā)基礎(chǔ)13第3講 單片機C語言開發(fā)基礎(chǔ)另外,為了能夠直接訪問單片機的一些內(nèi)部寄存器,Keil C51編譯器擴充了關(guān)鍵字sfr。調(diào)用格式如下: sfr特殊功能寄存器名=地址常數(shù)示例: sfr P0=0 x80; /*定義地址為“0 x80”的特殊功能寄存器名字為“P0”,對P0的操作也就是對地址為
7、“0 x80”的寄存器操作*/。在8051系列單片機應(yīng)用系統(tǒng)中,經(jīng)常需要訪問特殊功能寄存器的某些位,Keil C51編譯器為此提供了另一種擴充關(guān)鍵字sbit,利用它可以定義位尋址對象。定義方法如下:14第3講 單片機C語言開發(fā)基礎(chǔ)sbit位變量名=特殊功能寄存器名位位置示例如下: sfr LED=P13; /位定義LED為P1.3(寄存器P1 的第三位) 作上述定義后,如果要點亮如圖所示的發(fā)光二極管VD1,編程時就可以直接使用一下命令:LED=0; /將引腳P1.3電平置為“0”,對LED的操作 就是對P1.3的操作。15第3講 單片機C語言開發(fā)基礎(chǔ)3.3 C語言的數(shù)據(jù)類型與運算符3.3.1
8、數(shù)據(jù)類型在C語言中,可以將數(shù)據(jù)分為常量與變量兩種。常量可以不經(jīng)說明直接引用,而變量則必須定義類型后才能使用。常用的數(shù)據(jù)類型包括整型數(shù)據(jù)、字符型數(shù)據(jù)、實型數(shù)據(jù)、指針型數(shù)據(jù)和空類型數(shù)據(jù)等。1.常量與變量在程序運行過程中,數(shù)值不能被改變的變量為常量。常量分為不同類型,如12、0為整型常量,3.14、2.55為實型常量,“a”、“b”為字符型常量。16第3講 單片機C語言開發(fā)基礎(chǔ)C語言中還有一種符號常量,定義格式如下:#define符號常量的標志符 常量其中,#define是一條預(yù)編譯處理命令,稱為宏定義命令,功能是把該標志符定義為其后的符號常量值。一經(jīng)定義,在程序中所有出現(xiàn)該標志的地方,就用之前定義
9、好的常量來代替。習(xí)慣上符號常量的標志符用大寫字母表示。在程序運行中,數(shù)據(jù)可以改變的量成為變量,變量標志符常用小寫字母表示。變量必須先定義后使用,一般放在程序的開頭部分。17第3講 單片機C語言開發(fā)基礎(chǔ)2.整型數(shù)據(jù)整型數(shù)據(jù)包括整型常量和整型變量。(1)整型常量 不同的進制區(qū)分,整型常數(shù)有三種表示方法: 十進制數(shù):以非0開始的數(shù)如:220,-560,45900 八進制數(shù):以0開始的數(shù)如:06;0106,05788 十六進制數(shù):以0X或0 x開始的數(shù)如:0X0D,0XFF(2)整型變量 整型變量可以分為基本型整型變量和無符號型整型變量,前者說明符為signed,在內(nèi)存中占用2個字節(jié);后者說 18第3
10、講 單片機C語言開發(fā)基礎(chǔ)明符為unsigned,在內(nèi)存中占用1個字節(jié)。表列出了keil C51編譯器支持的數(shù)據(jù)類型。19第3講 單片機C語言開發(fā)基礎(chǔ)整型變量定義的形式如下:類型說明符 變量標志1,變量標識2,3.實型數(shù)據(jù) 實型數(shù)據(jù)的表示形式 (1)小數(shù)形式數(shù)字和小數(shù)點組成3.14123.56-52.6812.5 (2)指數(shù)形式eE1.2356*1021.2356e2E前后必須有數(shù)字,E之后必須是整數(shù),E和數(shù)字之間沒有間隔。20第3講 單片機C語言開發(fā)基礎(chǔ)4.字符型數(shù)據(jù)字符型數(shù)據(jù)包括字符常量和字符變量。(1)字符常量用單引號括起來的一個字符,稱為字符常量,如:“x”、“u”、“=”等。常用作顯示
11、說明。(2)字符變量字符變量用來存儲單個字符,說明符是“char”,定義形式如下: char a,b; char型數(shù)據(jù)的長度是1個字節(jié)。unsigned char與 21第3講 單片機C語言開發(fā)基礎(chǔ)signed char型數(shù)據(jù)的區(qū)別是有無符號位。(3)字符串常量由一對雙引號括起來的字符序列稱為字符串常量,如“beijing time:”等。5. 指針型數(shù)據(jù)指針是一個特殊的變量,存儲的是某變量的地址,使用指針式C語言的精華所在,其使用方法后面介紹。6.位類型數(shù)據(jù) 位類型數(shù)據(jù)是C51編譯器的一種擴充數(shù)據(jù)類型,利用它可以定義一個位變量,但不能定義位指針,也不能定義位數(shù)22第3講 單片機C語言開發(fā)基礎(chǔ)
12、組。該類型數(shù)據(jù)只能有兩個取值:“0”和“1”。 7. 空類型數(shù)據(jù) C語言經(jīng)常使用函數(shù),當(dāng)函數(shù)被調(diào)用完后,通常會返回一個函數(shù)值。函數(shù)值也有一定類型,示例如下:int add( ) /將函數(shù)定義位整型數(shù)據(jù) int sum; sum=12345+76543; Return sum; /返回計算值 23第3講 單片機C語言開發(fā)基礎(chǔ)函數(shù)add()返回一個整型數(shù)據(jù),就說該函數(shù)是整型函數(shù)。但常有些函數(shù)不需要返回函數(shù)值,如LED流水燈點亮控制程序中的延時函數(shù): void delay( ) /用“void”說明該函數(shù)為“空類 型”,即無返回值 unsigned int x; for(x=0;x20000;x+
13、24第3講 單片機C語言開發(fā)基礎(chǔ)8. 變量賦值在程序中常常需要變量賦值,C語言中的賦值方法如下: 類型說明符 變量=值;示例: int a=12345; unsigned char n=0 xab; 25第3講 單片機C語言開發(fā)基礎(chǔ)3.3.2 運算符1.算術(shù)運算符C語言有5中算術(shù)運算符。26第3講 單片機C語言開發(fā)基礎(chǔ)C語言中表示加1和減1時可以采用自增運算符和自減運算符。 2.關(guān)系運算符 用于比較運算。C語言有6種比較運算符,關(guān)系運算符的結(jié)果只有“0”和“1”兩種,即滿足條件時結(jié)果為“1”,否則為“0”。 27第3講 單片機C語言開發(fā)基礎(chǔ)28第3講 單片機C語言開發(fā)基礎(chǔ) 3. 邏輯運算符 邏
14、輯運算的結(jié)果只有“真”和“假”兩種,“1”表示真,“0”表示假。29第3講 單片機C語言開發(fā)基礎(chǔ) 4. 位運算符利用位操作運算可以對一個二進制格式進行位操作。設(shè)x=25(0001 1001B),y=77(0100 1101B)為例介紹位操作運算符的使用。(1)按位“與”運算“&” “&”運算的功能是對二進制數(shù)按位進行“與”運算。根據(jù)“與”運算規(guī)則“有0為0,全1出1”,則30第3講 單片機C語言開發(fā)基礎(chǔ) (2)按位“或”運算符“|” “|”運算的功能是對二進制數(shù)按位進行“或”運算。根據(jù)“或”運算規(guī)則“有1為1,全0出0”,則31第3講 單片機C語言開發(fā)基礎(chǔ) (3)按位“異或”運算符“” “”運
15、算的功能是對二進制數(shù)按位進行“異或”運算。根據(jù)“異或”運算規(guī)則“相異1,相同出0”,則32第3講 單片機C語言開發(fā)基礎(chǔ) (4)按位“取反”運算符“” “”運算的功能是對二進制數(shù)按位進行“取反”運算。根據(jù)“取反”運算規(guī)則“有1為0,有0出1”. (5)左移運算符“”右移運算是將一個二進制位的操作數(shù)按指定移動的位數(shù)向右移動,移出位被丟棄,左邊移出的空位,正數(shù)高位補0,負數(shù)的高位補1。5.賦值運算符 賦值運算符將一個數(shù)據(jù)賦給一個變量,也可以將一個表達式的值賦給一個變量。C語言中有以下兩類賦值運算符。34第3講 單片機C語言開發(fā)基礎(chǔ)(1)簡單賦值運算符(=),他的作用是將一個數(shù)據(jù)賦給一個變量,如c=a
16、+b。(2)復(fù)合賦值運算符(+=、-=、*=、/=、%=、&=、|=、=、=、b)?a:b因為ab為假,所以應(yīng)取表達式2即b的值,結(jié)果max=13.38第3講 單片機C語言開發(fā)基礎(chǔ)8.強制轉(zhuǎn)換符當(dāng)參與運算的數(shù)據(jù)類型不同時,則先轉(zhuǎn)換成同一數(shù)據(jù)類型,再進行計算。數(shù)據(jù)類型的轉(zhuǎn)換方式有兩種:一種是自動轉(zhuǎn)換,另一種是強制轉(zhuǎn)換。在C語言程序中進行算術(shù)運算時,必須注意數(shù)據(jù)類型的轉(zhuǎn)換。自動類型轉(zhuǎn)換是在對程序進行編譯時由編譯器自動處理的。自動類型轉(zhuǎn)換的基本規(guī)則是轉(zhuǎn)換后計算精度不能降低,所以當(dāng)char、int、unsigned、long、double類型的數(shù)據(jù)同時存在時,其轉(zhuǎn)換高低關(guān)系為charintunsign
17、edlongdouble。39第3講 單片機C語言開發(fā)基礎(chǔ)例如,當(dāng)char型數(shù)據(jù)與int型數(shù)據(jù)共存時,則先將char型轉(zhuǎn)化為int型再計算。強制轉(zhuǎn)換通過強制類型轉(zhuǎn)換運算符“()”進行的,其作用是將一個表達式轉(zhuǎn)化為所需類型。格式如下:(類型名)(表達式)示例如下: (int) a; /將a強制轉(zhuǎn)化為整型 (int)(3.58) ; /將實型變量3.58轉(zhuǎn)化為整 型,結(jié)果為340第3講 單片機C語言開發(fā)基礎(chǔ)3.3.3 實例8:用不同數(shù)據(jù)類型的數(shù)據(jù)控制LED的閃爍 本例使用無符號整型數(shù)據(jù)和無符號字符型數(shù)據(jù)設(shè)計延時函數(shù),分別用以控制圖3-2中的VD1和VD2的閃爍,從而研究這兩種不同數(shù)據(jù)的不同效果。
18、1.實現(xiàn)方法 為比較這兩種數(shù)據(jù)的使用效果,將延時函數(shù)的循環(huán)次數(shù)設(shè)置相同,然后通過比較延時效果,直觀地看出兩種數(shù)據(jù)類型的效果。 2.程序設(shè)計 先建立文件夾“Ex8”,然后建立“Ex8”工程項目,最后建立源41第3講 單片機C語言開發(fā)基礎(chǔ)程序文件“Ex8.c”。輸入源程序。圖3.2 不同數(shù)據(jù)類型控制LED閃爍42第3講 單片機C語言開發(fā)基礎(chǔ) 3.用Proteus軟件仿真 經(jīng)keil軟件編譯通過后,利用Proteus軟件仿真。可以看到VD1的閃爍時間明顯慢于VD2,即整型數(shù)據(jù)實現(xiàn)的延時函數(shù)延時時間較長。 由于整型數(shù)據(jù)占兩個字節(jié),而無符號字符型數(shù)據(jù)占一個字節(jié),因此無符號整型數(shù)據(jù)進行操作花費的時間長。所
19、以,為了提高程序的運行速度,盡可能采用無符號字符型數(shù)據(jù)。43第3講 單片機C語言開發(fā)基礎(chǔ)3.3.4 實例9:用P0口、P1口分別顯示加法和減法運算結(jié)果 本例用單片機實現(xiàn)“63+40”和“63-40”兩道運算,并將加法運算結(jié)果送P1口顯示,減法結(jié)果送P0口顯示,采用電路如圖3.4所示。 1.實現(xiàn)方法 設(shè)置兩個無符號字符型變量n和m,并將其值分別賦值為63和40,然后直接將(n+m)和(n-m)的結(jié)果分別送入寄存器P1和P0。 2.程序設(shè)計 先建立文件夾“Ex9”,然后建立“Ex9”工程項目,最后建立源44第3講 單片機C語言開發(fā)基礎(chǔ)圖3.345第3講 單片機C語言開發(fā)基礎(chǔ)程序文件“Ex9.c”。
20、輸入源程序按。46第3講 單片機C語言開發(fā)基礎(chǔ) 3.用Proteus軟件仿真 經(jīng)keil軟件編譯通過后,利用Proteus軟件仿真。可以看到VD1的閃爍時間明顯慢于VD2,即整型數(shù)據(jù)實現(xiàn)的延時函數(shù)延時時間較長。 由于整型數(shù)據(jù)占兩個字節(jié),而無符號字符型數(shù)據(jù)占一個字節(jié),因此無符號整型數(shù)據(jù)進行操作花費的時間長。所以,為了提高程序的運行速度,盡可能采用無符號字符型數(shù)據(jù)。47第3講 單片機C語言開發(fā)基礎(chǔ)3.3.5 實例10:用P0口、P1口顯示乘法運算結(jié)果 本例用單片機實現(xiàn)乘法“64X71”的運算,并通過P1口和P0口顯示結(jié)果,用LED亮滅驗證。本例采用如圖3.4所示電路。 1.實現(xiàn)方法 先設(shè)置兩個字符
21、變量m和n,并將其賦值為64和71.再設(shè)置一個整型變量s存儲m和n的乘積。s=64X71=4544,需要16為二進制數(shù)表示,可將高8為送P1口,低8為送P0口。 2.程序設(shè)計 先建立文件夾“Ex10”,然后建立“Ex10”工程項目,最后建立源程序文件“Ex10.c”。輸入源程序。48第3講 單片機C語言開發(fā)基礎(chǔ)圖3.449第3講 單片機C語言開發(fā)基礎(chǔ)源程序50第3講 單片機C語言開發(fā)基礎(chǔ) 3.用Proteus軟件仿真 經(jīng)keil軟件編譯通過后,利用Proteus軟件仿真。可以看到P1.0口、P1.4口的LED熄滅,其余均被點亮,表明高8位數(shù)P1=0001 0001B=0 x11;而P0口除P0
22、.6和P0.7口的LED熄滅外,其余均被點亮,表明低8為數(shù)P0=1100 0000B=0 xc0,則P1口和P0口表示的16進制數(shù)為11c0H,化為10進制數(shù)為4544. 51第3講 單片機C語言開發(fā)基礎(chǔ)3.3.6 實例11:用P0口、P1口顯示除法運算結(jié)果 本例用單片機實現(xiàn)除法“36/5=7.2”的運算,所得商的整數(shù)部分送P1口顯示,小數(shù)部分送P0口顯示。電路如圖3.4所以。 1.實現(xiàn)方法 整數(shù)部分“7”可以用除法運算“36/5=7”來實現(xiàn)。36除以5的余數(shù)為1,若用除法運算“1/5”則得“0”(小數(shù)部分自動舍去)。因此需將余數(shù)“1”再乘以10,然后用所得的積除以“5”,即(36%5)*10
23、)/5,結(jié)果即為小說部分的數(shù)字“2”。 注意:上述方法在單片機控制小數(shù)的顯示時非常有用。 (如溫度為29.6攝氏度) 52第3講 單片機C語言開發(fā)基礎(chǔ)圖3.453第3講 單片機C語言開發(fā)基礎(chǔ) 2.程序設(shè)計 先建立文件夾“Ex11”,然后建立“Ex10”工程項目,最后建立源程序文件“Ex11.c”。輸入源程序。54第3講 單片機C語言開發(fā)基礎(chǔ) 3.用Proteus軟件仿真 經(jīng)keil軟件編譯通過后,利用Proteus軟件仿真??梢钥吹剑琍1.2口、P1.1口、P1.0口LED熄滅,其余均被點亮,表明P1=0000 0111B=7;而P0口只有P0.1口LED熄滅,其余均被點亮,表明P0=0000
24、 0010B=2. 55第3講 單片機C語言開發(fā)基礎(chǔ)3.3.7 實例12:用自增運算控制P0口8位LED的閃爍花樣 本例用單片機自增運算控制P0口8位LED的流水花樣,采用的電路圖如圖3.4. 1.實現(xiàn)方法 只要 送到P0口的數(shù)值發(fā)生變化,P0口8位LED點亮的狀態(tài)就會發(fā)生變化。可以先將變量的初值送到P0口延時一段時間,再利用自增運算使變量加1,然后將新的變量值送到P0口并延時一段時間,即可使8為LED的閃爍花樣變化。56第3講 單片機C語言開發(fā)基礎(chǔ)圖3.457第3講 單片機C語言開發(fā)基礎(chǔ) 2.程序設(shè)計 先建立文件夾“Ex12”,然后建立“Ex12”工程項目,最后建立源程序文件“Ex12.c”
25、。輸入源程序。58第3講 單片機C語言開發(fā)基礎(chǔ) 3.用Proteus軟件仿真 經(jīng)keil軟件編譯通過后,利用Proteus軟件仿真??梢钥吹剑琍0口8位LED的閃爍花樣不斷發(fā)生變化. 59第3講 單片機C語言開發(fā)基礎(chǔ)3.3.8 實例13:用Po口顯示邏輯“與”運算結(jié)果 本例用P0口顯示邏輯與運算(40&(90 xab)的結(jié)果,采用的電路圖如圖3.4. 1.實現(xiàn)方法 (40)&(90 xab)=1&0=0,直接將結(jié)果送到P0口,8位LED即可全部被點亮。 2.程序設(shè)計 先建立文件夾“Ex13”,然后建立“Ex12”工程項目,最后建立源程序文件“Ex13.c”。輸入源程序。60第3講 單片機C語言
26、開發(fā)基礎(chǔ)圖3.461第3講 單片機C語言開發(fā)基礎(chǔ)62第3講 單片機C語言開發(fā)基礎(chǔ) 3.用Proteus軟件仿真 經(jīng)keil軟件編譯通過后,利用Proteus軟件仿真。可以看到,P0口8位LED全部被點亮. 63第3講 單片機C語言開發(fā)基礎(chǔ)3.3.9 實例14:用P0口顯示條件運算結(jié)果 本例用P0口顯示邏輯與運算“(84)?8:4”的結(jié)果,采用的電路圖如圖3.4. 1.實現(xiàn)方法 先判斷條件“84”是否滿足,若滿足,取8作為計算結(jié)果;否則,取4作為計算結(jié)果,本例條件運算的結(jié)果為8,直接將結(jié)果送到P0口即可。 2.程序設(shè)計 先建立文件夾“Ex14”,然后建立“Ex14”工程項目,最后建立源程序文件“
27、Ex14.c”。輸入源程序。64第3講 單片機C語言開發(fā)基礎(chǔ)圖3.465第3講 單片機C語言開發(fā)基礎(chǔ) 3.用Proteus軟件仿真 經(jīng)keil軟件編譯通過后,利用Proteus軟件仿真??梢钥吹剑琍0口8位LED全部被點亮. 66第3講 單片機C語言開發(fā)基礎(chǔ)3.3.10 實例15:用P0口顯示按位“異或”運算結(jié)果 本例用P0口顯示“異或”運算“0 xa20 x3c”的結(jié)果,采用的電路圖如圖3.4. 1.實現(xiàn)方法 異或運算的規(guī)則是“相異出1,相同出0”。因此 將該結(jié)果送到P0口即可。因為P0=1001 1110=0 x9e,所以P0.5、P0.0、P0.6引腳LED被點亮,其它LED均處于熄滅狀
28、態(tài)。67第3講 單片機C語言開發(fā)基礎(chǔ) 2.程序設(shè)計 先建立文件夾“Ex15”,然后建立“Ex15”工程項目,最后建立源程序文件“Ex15.c”。輸入源程序。68第3講 單片機C語言開發(fā)基礎(chǔ) 3.用Proteus軟件仿真 經(jīng)keil軟件編譯通過后,利用Proteus軟件仿真。可以看到,P0.5、P0.0、P0.6引腳LED被點亮,其它LED均處于熄滅狀態(tài)。69第3講 單片機C語言開發(fā)基礎(chǔ)3.3.11 實例16:用P0口顯示左移運算結(jié)果 本例用P0口顯示左移運算“0 x3bb) max=a; else max=b; 82第3講 單片機C語言開發(fā)基礎(chǔ) (3)if(表達式1) 語句1 else if(
29、表達式2) 語句2 else if(表達式3) 語句3 2. switchcase語句 if語句比較適合從兩者之間選擇。當(dāng)要實現(xiàn)從多種選一時,采用switchcase多分支選擇語句,可是程序變得更為簡潔。一般格式如下:83第3講 單片機C語言開發(fā)基礎(chǔ)84第3講 單片機C語言開發(fā)基礎(chǔ) 注意:對于switch語句,有兩點注意事項,一是表達式的必須是整型或字符型;而是最好使用“break”。 85第3講 單片機C語言開發(fā)基礎(chǔ)86第3講 單片機C語言開發(fā)基礎(chǔ) 3. for循環(huán)語句 for循環(huán)語句結(jié)構(gòu)可以使程序按指定的次數(shù)重復(fù)執(zhí)行一個語句或一組語句。一般格式如下: for(初始化表達式;條件表達式;增量
30、表達式) 語句; for循環(huán)語句的執(zhí)行過程如下: 初始化表達式 求解條件表達式。若值為“真”,則執(zhí)行for后面的 語句;若值為“假”,跳過循環(huán)語句。 若條件表達式為“真”,則執(zhí)行指定語句,執(zhí)行增87第3講 單片機C語言開發(fā)基礎(chǔ) 量表達式。 執(zhí)行for后面的語句 4. while循環(huán)語句 while語句先判定循環(huán)條件為真或假。如果為真,則執(zhí)行循環(huán)體;否則,跳出循環(huán)體,執(zhí)行后續(xù)操作。一個是如下: while(表達式) 循環(huán)體 注意:1.循環(huán)體包含一個以上的語句,應(yīng)該用括 起來。 2.一般情況下,在循環(huán)體中應(yīng)該有讓循環(huán)最終能 結(jié)束的語句,否則將造成死循環(huán)。 88第3講 單片機C語言開發(fā)基礎(chǔ)89第3講
31、 單片機C語言開發(fā)基礎(chǔ) 5. dowhile循環(huán)語句 dowhile循環(huán)是先執(zhí)行一次循環(huán)體,再判斷表達式的值。若為真,則繼續(xù)執(zhí)行循環(huán);否則退出循環(huán)。格式如下: do 循環(huán)體語句 while(表達式) dowhile循環(huán)語句執(zhí)行過程如下: 先執(zhí)行一次指定的循環(huán)體語句,然后判斷表達式 當(dāng)表達式的值為非零時,返回到第一步重新執(zhí)行循環(huán) 體語句 如此反復(fù),直到表達式的值等于0時,結(jié)束循環(huán) 90第3講 單片機C語言開發(fā)基礎(chǔ) 注意:1.do是C語言關(guān)鍵字,必須和while聯(lián)合使用。 2.while(表達式)后的分號不能丟,它表示整 個循環(huán)語句的結(jié)束。 6.goto無條件轉(zhuǎn)移語句 goto語句是無條件轉(zhuǎn)移語句
32、,它將程序執(zhí)行流向轉(zhuǎn)到它指定的標號處去執(zhí)行。格式如下: goto標號; 使用goto語句時應(yīng)謹慎,盡量避免使用goto語句。因為該語句會破壞程序的模塊化結(jié)構(gòu),使得可讀性變差,難于正確運行和維護。 91第3講 單片機C語言開發(fā)基礎(chǔ)3.4.4 實例20:用switch語句控制P0口8位LED的點亮狀態(tài) 本例用switch實現(xiàn)方法語句控制P0口8位LED的點亮狀態(tài)。第一次按下S1時,VD1被點亮,第一次按下S2時,VD2被點亮,以此類推,第八次按下S1時,VD8被點亮.然后再次次按下S1時,VD1又被點亮,如此循環(huán)電路圖如圖3.9所示。 1.實現(xiàn)方法 設(shè)置一個變量i,當(dāng)i=1時,點亮VD1;當(dāng)i=2
33、時,點亮VD2;以此類推,當(dāng)i=8時,點亮VD8.由switch語句根據(jù)i的值來實現(xiàn)相應(yīng)的功能。 需要說明的是,按下按鍵時,通常都會有抖動(后面詳92第3講 單片機C語言開發(fā)基礎(chǔ)細介紹)。表面上看是按了一次按鍵,但由于按鍵的抖動,單片機可能認為按了多次,從而使輸入不可控制。此問題可用“軟件消抖”來解決。當(dāng)單片機第一次檢測到按鍵按下時,將認為是抖動而不理會,若延時2080ms后,再次檢測到按鍵按下,才認為按鍵確實按下了,再執(zhí)行相應(yīng)的程序。 2.程序設(shè)計 先建立文件夾“Ex20”,然后建立“Ex20”工程項目,最后建立源程序文件“Ex20.c”。輸入源程序。93第3講 單片機C語言開發(fā)基礎(chǔ)圖3.9
34、94第3講 單片機C語言開發(fā)基礎(chǔ)95第3講 單片機C語言開發(fā)基礎(chǔ)96第3講 單片機C語言開發(fā)基礎(chǔ) 3.用Proteus軟件仿真 經(jīng)keil軟件編譯通過后,利用Proteus軟件仿真。啟動仿真可以看到,當(dāng)用鼠標按下按鍵S1時,P0口的LED將按照S1被按下的次數(shù)而被點亮。97第3講 單片機C語言開發(fā)基礎(chǔ)3.4.5 實例21:用for語句設(shè)計鳴笛報警器程序 本例硬件電路如下圖所示。要求用for語句設(shè)計一個鳴笛報警程序。具體設(shè)計要求如下: (1)能交替發(fā)出頻率為1600Hz和800Hz的聲音; (2)高音(1600Hz)發(fā)音的時間約為0.5s,低音發(fā)音的時間約為0.5s。注意:本例看似是一個簡單的小
35、程序,但該程序用到的一些方法將在后面章節(jié)經(jīng)常用到,尤其在寫某些芯片的驅(qū)動程序時必須用到。98第3講 單片機C語言開發(fā)基礎(chǔ)99第3講 單片機C語言開發(fā)基礎(chǔ) 1.實現(xiàn)方法 (1)音頻的實現(xiàn) 首先分析如何發(fā)出頻率為f的聲音。因為該聲音的周期T=1/f,所以要讓蜂蜜器發(fā)出頻率f的聲音,只要讓單片機給蜂蜜器輸送圖3-10所示周期為T的脈沖方波電平即可。也就是讓單片機的輸出電平每半個周期取反一次。以1600Hz為例,周期T=(1/1600)s=0.000625s=625us,半個周期T/2312u即需要輸出電平312us取反一次。顯然,半周期可通過延時實現(xiàn)。100第3講 單片機C語言開發(fā)基礎(chǔ) (2)延時時
36、間的控制通過前面的例子可知,采用循環(huán)的方法可以實現(xiàn)延時,但延時時間和循環(huán)次數(shù)之間有什么關(guān)系呢?下面通過一個實例分析。先編寫如下的C語言程序:101第3講 單片機C語言開發(fā)基礎(chǔ)102第3講 單片機C語言開發(fā)基礎(chǔ) 在Keil C51環(huán)境下編譯后,先單擊菜單“調(diào)試”“開始/停止”命令;再單擊菜單“視圖”“反匯編”命令。此時,系統(tǒng)彈出圖3.11所示的反匯編代碼窗口。圖3.11103第3講 單片機C語言開發(fā)基礎(chǔ) 其中有一段匯編程序(以0 x001D開頭) 這一段代碼就是由C語言延時函數(shù)形成的匯編代碼,它消耗的機器周期等于C語言延時程序消耗的機器周期。查匯編指令表可以知道,在上述程序段中:第01行指令“C
37、LR”消耗1個機器周期第02行指令“MOV”消耗1個機器周期第03行指令“INC”消耗一個機器周期第04行指令“CJNE”消耗2個機器周期104第3講 單片機C語言開發(fā)基礎(chǔ) 根據(jù)循環(huán)條件,第03行和第04行總共要執(zhí)行100次(0 x64=100)。所以,上述程序共消耗機器周期數(shù):N=1+1+(1+2)x100=302根據(jù)上述分析可知,一重循環(huán)for(i=0;in;i+)所消耗的機器周期為N=3n+2。其中,N為消耗的機器周期數(shù);n為設(shè)定的循環(huán)次數(shù)(n必須為無符號字符型數(shù)據(jù))。同理可得,二重循環(huán)程序:for(i=0;in;i+) for(i=0;im;i+) ;105第3講 單片機C語言開發(fā)基礎(chǔ)
38、所消耗的機器周期數(shù)為N=3nm+5m+2.(3)聲音周期的控制如果單片機的晶振頻率為11.059MHz,則機器周期為1.085us。根據(jù)分析要發(fā)出頻率為1600Hz的聲音,就要讓單片機每312us將輸出電平取反一次,而延時312us需要消耗機器周期數(shù)N=312/1.085286300(一般應(yīng)用,延時不需要特別精確)。循環(huán)次數(shù)應(yīng)選為n=300/3=100,即每循環(huán)100次,讓輸出電平取反1次就可以得到1600Hz的音頻。因此1600Hz音頻延時函數(shù)的定義如下:106第3講 單片機C語言開發(fā)基礎(chǔ)107第3講 單片機C語言開發(fā)基礎(chǔ)(4)音頻發(fā)聲時間的控制 以1600Hz音頻發(fā)聲時間控制為例,要使其發(fā)
39、聲0.5s=500ms。該音頻的一個震動周期為625us06ms,則共需要500/0.6830個聲音周期。類似的,800Hz音頻發(fā)聲時間需設(shè)置約200個聲音周期。 2.程序設(shè)計 先建立文件夾“Ex21”,然后建立“Ex21”工程項目,最后建立源程序文件“Ex21.c”。輸入源程序。108第3講 單片機C語言開發(fā)基礎(chǔ)109第3講 單片機C語言開發(fā)基礎(chǔ)110第3講 單片機C語言開發(fā)基礎(chǔ) 3.用Proteus軟件仿真 經(jīng)keil軟件編譯通過后,利用Proteus軟件仿真。啟動仿真可以聽到發(fā)出的報警聲。111第3講 單片機C語言開發(fā)基礎(chǔ)3.4.6 實例22:用while語句控制P0口8位LED閃爍花樣
40、 本例用while語句控制P0口8位LED閃爍花樣,硬件電路圖及某時刻的仿真效果圖如3.12所示。 1.實現(xiàn)方法 在while循環(huán)中設(shè)置一個變量i,當(dāng)i0 xff時,將i的值送到P0口顯示并自增1;當(dāng)i等于0 xff時,跳出while循環(huán)。 2.程序設(shè)計 先建立文件夾“Ex22”,然后建立“Ex22”工程項目,最后建立源程序文件“Ex22.c”。輸入源程序。112第3講 單片機C語言開發(fā)基礎(chǔ)圖3.12113第3講 單片機C語言開發(fā)基礎(chǔ)114第3講 單片機C語言開發(fā)基礎(chǔ) 3.用Proteus軟件仿真 經(jīng)keil軟件編譯通過后,利用Proteus軟件仿真。啟動仿真可以看到P0口的8位LED以各種花
41、樣不斷閃爍。115第3講 單片機C語言開發(fā)基礎(chǔ)3.4.7 實例23:用dowhile語句控制P0口8位LED流水點亮 本例用dowhile語句控制P0口8位LED流水點亮,硬件電路圖如3.12所示。 1.實現(xiàn)方法 本例只需在循環(huán)中將8位LED依次點亮,再將循環(huán)條件設(shè)為“死循環(huán)”即可。 2.程序設(shè)計 先建立文件夾“Ex23”,然后建立“Ex23”工程項目,最后建立源程序文件“Ex23.c”。輸入源程序。116第3講 單片機C語言開發(fā)基礎(chǔ)117第3講 單片機C語言開發(fā)基礎(chǔ) 3.用Proteus軟件仿真 經(jīng)keil軟件編譯通過后,利用Proteus軟件仿真。啟動仿真可以看到P0口的8位LED被循環(huán)流
42、水點亮。118第3講 單片機C語言開發(fā)基礎(chǔ)3.5 C語言的數(shù)組 數(shù)組是同類型的一組變量,引用這些變量時可用同一個標志,借助于下標來區(qū)分各個變量。數(shù)組中的每一個變量稱為數(shù)組元素。數(shù)組連續(xù)的存儲區(qū)域組成,最低地址對應(yīng)于數(shù)組的第一個元素,最高地址對應(yīng)于最后一個元素。數(shù)組可以是一維的,也可以使多維的。3.5.1 數(shù)組的定義和引用1.一維數(shù)組一維數(shù)組的表達形式如下: 類型說明符 數(shù)組名常量;119第3講 單片機C語言開發(fā)基礎(chǔ)方括號中的常量稱為下標。C語言中,下標是從0開始的。示例如下: int a10;/定義整型數(shù)組a,它有a0-a9共10 個元素,每個元素都是整型變量一維數(shù)組的賦值方法有一下幾種。(1
43、)在數(shù)組定義時賦值,示例如下: int a10=0,1,2,3,4,5,6,7,8,9;數(shù)組元素的下標從0開始,賦值后,a0=0,a1=1,依次類推,直至a9=9。120第3講 單片機C語言開發(fā)基礎(chǔ)(2)對于一個數(shù)組也可以部分賦值,示例如下: int a10=0,1,2,3,4,5; 這里面對前6個元素賦值。對于沒有賦值的a6至a9,默認的初始值為0.(3)如果一個數(shù)組的全部元素都已經(jīng)賦值,可以省去方括號中的下標,示例如下: int a =0,1,2,3,4,5,6,7,8,9;數(shù)組元素的賦值與普通變量相同??梢园褦?shù)組元素像普通變量一樣使用。121第3講 單片機C語言開發(fā)基礎(chǔ)2.二維數(shù)組C語言
44、允許使用多維數(shù)組,最簡單的多維數(shù)組是二維數(shù)組。其一般表達形式如下: 類型說明符 數(shù)組名下標1下標2;示例如下: Unsigned char x34; /定義無符號字符型二 維數(shù)組,第二個下標表示列 二維數(shù)組的賦值表達方法可以采用以下幾種方式。 (1)按存儲順序整體賦值,這是一種比較直觀的賦值方式,示例如下:122第3講 單片機C語言開發(fā)基礎(chǔ) int 34=0,1,2,3,4,5,6,7,8,9,10,11; 如果是全部元素賦值,可以不指定行數(shù),即 int 4=0,1,2,3,4,5,6,7,8,9,10,11;(2)按每行分別賦值。為了能更直觀的給二維數(shù)組賦值,可以按每行分別賦值,這時要用 標
45、明,沒有說明的部分默認為0,示例如下: int 34=0,1,2,3, 4,5,6,7, 8/最后三個元素被默認為0123第3講 單片機C語言開發(fā)基礎(chǔ) 3.字符數(shù)組用來存放字符型數(shù)據(jù)的數(shù)組稱為字符數(shù)組。與整型數(shù)組一樣,字符數(shù)組也可以在定義時進行初始化賦值。示例如下: char a8=B,e,i,-,J,i,n,g;上述語句定義了字符型數(shù)組,它有a0-a7共有8個元素,每個元素都是字符型變量。還可以用字符串的形式來對全體字符數(shù)組進行賦值,示例如下: char str =“Now,Temperature is:”;或者寫成更簡潔形式: char str =“Now,Temperature is:”
46、;124第3講 單片機C語言開發(fā)基礎(chǔ)注意:字符串是以0作為結(jié)束標志的。所以,當(dāng)把一個字符串存入數(shù)組時,也把結(jié)束標志0存入了數(shù)組。因此,上面定義的字符數(shù)組”str20”最后一個元素不是“:”,而是0。 4.數(shù)組元素的引用 數(shù)組必須先定義,然后才能使用。在C語言中只能逐個引用數(shù)組元素。125第3講 單片機C語言開發(fā)基礎(chǔ)3.5.2 實例24:用字符型數(shù)組控制P0口8位LED流水點亮 本例用字符型數(shù)組控P0口8位LED流水點亮,硬件電路圖如3.12所示。 1.實現(xiàn)方法 只要把流水點亮P0口8位LED的控制碼賦給一個數(shù)組,再依次引用數(shù)組元素,并送P0口顯示即可。本例使用無符號字符型數(shù)組,定義如下: un
47、signed char code Tab = 0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f; 因為上述數(shù)組中的各個元素在使用過程中不發(fā)生變化,126第3講 單片機C語言開發(fā)基礎(chǔ)圖3.12127第3講 單片機C語言開發(fā)基礎(chǔ)所以使用關(guān)鍵字“code”可以大大減小數(shù)組的存儲空間。 2.程序設(shè)計 先建立文件夾“Ex24”,然后建立“Ex24”工程項目,最后建立源程序文件“Ex24.c”。輸入源程序。 3.用Proteus軟件仿真 經(jīng)keil軟件編譯通過后,利用Proteus軟件仿真。啟動仿真可以看到P0口的8位LED被流水點亮。128第3講 單片機C語
48、言開發(fā)基礎(chǔ)129第3講 單片機C語言開發(fā)基礎(chǔ)3.5.3 實例25:用P0口顯示字符串常量 本例用字符型數(shù)組控P0口8位LED流水點亮,硬件電路圖如3.12所示。 1.實現(xiàn)方法 只要把流水點亮P0口8位LED的控制碼賦給一個數(shù)組,再依次引用數(shù)組元素,并送P0口顯示即可。本例使用無符號字符型數(shù)組,定義如下: unsigned char code Tab = 0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f; 因為上述數(shù)組中的各個元素在使用過程中不發(fā)生變化,130第3講 單片機C語言開發(fā)基礎(chǔ)4.6 C語言的指針 指針是C語言中的一個重要概念,也是C語言的
49、一個重要特色。正確靈活的運用指針,可以有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu),動態(tài)的分配內(nèi)存,方便地使用字符串,有效地使用數(shù)組。4.6.1 指針的定義和引用1.指針的概念 一個數(shù)據(jù)的“指針”就是它的地址。通過變量的地址能找到該變量在內(nèi)存中的存儲單元,從而能得到它的值。指針是一種特殊類型的變量。它具有一般變量的三個要素:名字、類型和值。指針的命名和一般變量的區(qū)別在于類型和值上。131第3講 單片機C語言開發(fā)基礎(chǔ) (1)指針的值 指針存放的是某個變量在內(nèi)存中的地址。被定義過的變量都有一個內(nèi)存地址。如果一個指針存放了某個變量的地址,就稱這個指針指向該變量。由此可見,指針本身具有一個內(nèi)存地址。另外,它還存放了它所指
50、向的變量的地址值。 (2)指針的類型 指針的類型就是該指針指向的變量的類型。例如,一個指針指向int型變量,該指針就是int型指針。 (3)指針的定義格式 指針變量不同于整型或字符型等其它類型的數(shù)據(jù),使用132第3講 單片機C語言開發(fā)基礎(chǔ)前必須將其定義為“指針類型”。指針定義的一般形式如下: 類型說明符 *指針名字 示例如下: int i;/定義一個整型變量 int *pointer;/定義整型指針,名字為pointer 可以用取地址運算符“&”使一個指針變量指向一個變量,例如: pointer=&i;/“&i表示取i的地址,將i的地址 存放在指針變量pointer中。133第3講 單片機C語
51、言開發(fā)基礎(chǔ) 在定義指針時要注意兩點: (1)指針名字前的”*”表示該變量為指針變量。 (2)一個指針變量只能指向同一個類型的變量。 2.指針的初始化 在使用指針前必須初始化,一般格式如下: 類型說明符 指針變量=初始地址值; 未經(jīng)初始化的指針變量嚴禁使用,否則會引起嚴重后果。 3.指針數(shù)組 指針可以指向某類變量,也可以指向數(shù)組。以指針變量為元素的數(shù)組稱為指針數(shù)組。這些指針變量應(yīng)具有相同的存134第3講 單片機C語言開發(fā)基礎(chǔ)儲類型,并且指向的數(shù)據(jù)類型也必須相同。 指針數(shù)組定義的一般格式如下: 類型說明符 *指針數(shù)組名元素個數(shù) 示例如下: int *p2;/是含有兩個指針的指針數(shù)組 指針數(shù)組的初始
52、化可以在定義時同時進行,示例如下: unsigned char a =0,1,2,3; unsigned char *p4=&a0,&a1,&a2,&a3; 4.指向數(shù)組的指針 一個變量有地址,一個數(shù)組元素也有地址,所以可以用一個指針指向一個數(shù)組元素。如果一個指針存放了某數(shù)組的135第3講 單片機C語言開發(fā)基礎(chǔ)第一個元素的地址,就是該指針是指向這一數(shù)組的指針。數(shù)組的指針即數(shù)組的起始地址。示例如下: unsigned char a =0,1,2,3; unsigned char *p; p=&a0; /將數(shù)組a的首地址存放在指針變量P 經(jīng)上述定義以后,指針p就是數(shù)組a的指針。 C語言規(guī)定:數(shù)組名
53、代表數(shù)組的首地址,也就是第一個元素的地址。 引用數(shù)組元素可以用下標(a3),但是用指針速度更快,且占用內(nèi)存少。這正是是用指針的優(yōu)點和C語言的精華所在。136第3講 單片機C語言開發(fā)基礎(chǔ) 對于二維數(shù)組,C語言規(guī)定:如果指針p指向該二維數(shù)組的首地址(可以用a表示,也可以用&a00表示),那么pi+j指向的元素就是aij。這里i,j分別表示二維數(shù)組的第i行和第j列。137第3講 單片機C語言開發(fā)基礎(chǔ)3.6.2 實例26:用P0口顯示指針運算結(jié)果 本例進行一個簡單的指針運算“*p1+*p2,并用P0口顯示運算結(jié)果,采用的電路圖如圖3-12所示。 1.實現(xiàn)方法 先對指針進行定義初始化,使指針p1和p2都
54、有特定的指向,再用指針運算符“*”取得兩個指針所指變量的值,然后將兩個值的和送P0口即可。 2.程序設(shè)計 先建立文件夾“Ex26”,然后建立“Ex24”工程項目,最后建立源程序文件“Ex26.c”。輸入源程序。138第3講 單片機C語言開發(fā)基礎(chǔ)139第3講 單片機C語言開發(fā)基礎(chǔ) 3.用Proteus軟件仿真 經(jīng)keil軟件編譯通過后,利用Proteus軟件仿真。啟動仿真可以看到仿真效果。此時,P0.3、P0.5引腳LED處于熄滅狀態(tài),其余均被點亮,表明P0=0010 1000B=0 x28=2x16+8=40,與預(yù)期的“25+15”相同。140第3講 單片機C語言開發(fā)基礎(chǔ)3.6.3 實例27:
55、用指針數(shù)組控制P0口8位LED流水點亮 本例使用指針數(shù)組控制P0口8位LED流水點亮,采用的電路圖如圖3-12所示。 1.實現(xiàn)方法 顯然,指針數(shù)組的元素必須為流水燈控制碼的地址。可先定義如下控制碼組: unsigned char code Tab=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f; 然后將元素的地址一次存入如下指針數(shù)組: 141第3講 單片機C語言開發(fā)基礎(chǔ) unsignedchar*p = &Tab0,&Tab1,&Tab2,&Tab3,&Tab4,&Tab5, &Tab6,&Tab7; 最后利用指針運算符“*”取得各個指針所指的值
56、,并送P0口即可。 2.程序設(shè)計 先建立文件夾“Ex27”,然后建立“Ex24”工程項目,最后建立源程序文件“Ex27.c”。輸入源程序。142第3講 單片機C語言開發(fā)基礎(chǔ)143第3講 單片機C語言開發(fā)基礎(chǔ) 3.用Proteus軟件仿真 經(jīng)keil軟件編譯通過后,利用Proteus軟件仿真。啟動仿真可以看到P0口位LED被流水點亮。144第3講 單片機C語言開發(fā)基礎(chǔ)3.6.4 實例28:用數(shù)組的指針控制P0口8位LED流水點亮 本例使用指針數(shù)組控制P0口8位LED流水點亮,采用的電路圖如圖3-12所示。 1.實現(xiàn)方法 先定義流水燈控制碼組,再將數(shù)組名(數(shù)組的首地址)賦給指針。然后即可通過指針引
57、用數(shù)組的元素,從而控制8位LED的流水點亮。 2.程序設(shè)計 先建立文件夾“Ex28”,然后建立“Ex28”工程項目,最后建立源程序文件“Ex28.c”。輸入源程序。145第3講 單片機C語言開發(fā)基礎(chǔ)146第3講 單片機C語言開發(fā)基礎(chǔ) 3.用Proteus軟件仿真 經(jīng)keil軟件編譯通過后,利用Proteus軟件仿真。啟動仿真可以看到P0口8位LED顯示出更為豐富的流水花樣。147第3講 單片機C語言開發(fā)基礎(chǔ)4.7 C語言的函數(shù) 一個C語言程序可以由一個主函數(shù)main()和若干個其他函數(shù)構(gòu)成。主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以相互調(diào)用,但其他函數(shù)不能調(diào)用主函數(shù)。4.7.1 函數(shù)的定義與調(diào)用1.函數(shù)的定義 從函數(shù)的形式看,函數(shù)可以分為無參數(shù)函數(shù)和有參數(shù)函數(shù)。前者在被調(diào)用時沒有參數(shù)傳遞,后者在被
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廚房衛(wèi)生工具管理規(guī)定(3篇)
- 《工程合同管理》課程教學(xué)大綱
- 船舶側(cè)向推進器課程設(shè)計
- 物聯(lián)網(wǎng)煙霧報警課程設(shè)計
- 生物數(shù)學(xué)的基礎(chǔ)課程設(shè)計
- 自動服務(wù)課程設(shè)計
- 2024幼兒園安全生產(chǎn)月活動工作總結(jié)范文(31篇)
- 藝術(shù)家作品課程設(shè)計
- 航空公司服務(wù)員工作總結(jié)
- 教育行業(yè)營銷策略分享
- 中學(xué)消防安全應(yīng)急演練方案
- 2.1.1 區(qū)域發(fā)展的自然環(huán)境基礎(chǔ) 課件 高二地理人教版(2019)選擇性必修2
- ASTM-A269-A269M無縫和焊接奧氏體不銹鋼管
- 中、高級鉗工訓(xùn)練圖紙
- 2024-2030年中國車載動態(tài)稱重行業(yè)投融資規(guī)模與發(fā)展態(tài)勢展望研究報告
- 乒乓球教案完整版本
- 2024年重慶公交車從業(yè)資格證考試題庫
- 銀行解押合同范本
- 2024-2030年中國紋身針行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報告
- 部編版道德與法治九年級上冊每課教學(xué)反思
- 2024云南保山電力股份限公司招聘(100人)(高頻重點提升專題訓(xùn)練)共500題附帶答案詳解
評論
0/150
提交評論