![89C51單片機(jī)C語(yǔ)言編程_第1頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-9/9/4c49b539-3852-407a-a540-00fecdb4a138/4c49b539-3852-407a-a540-00fecdb4a1381.gif)
![89C51單片機(jī)C語(yǔ)言編程_第2頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-9/9/4c49b539-3852-407a-a540-00fecdb4a138/4c49b539-3852-407a-a540-00fecdb4a1382.gif)
![89C51單片機(jī)C語(yǔ)言編程_第3頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-9/9/4c49b539-3852-407a-a540-00fecdb4a138/4c49b539-3852-407a-a540-00fecdb4a1383.gif)
![89C51單片機(jī)C語(yǔ)言編程_第4頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-9/9/4c49b539-3852-407a-a540-00fecdb4a138/4c49b539-3852-407a-a540-00fecdb4a1384.gif)
![89C51單片機(jī)C語(yǔ)言編程_第5頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-9/9/4c49b539-3852-407a-a540-00fecdb4a138/4c49b539-3852-407a-a540-00fecdb4a1385.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第三章 單片機(jī)C語(yǔ)言程序設(shè)計(jì),3.1 C語(yǔ)言與89C51單片機(jī),3.1.1 C語(yǔ)言的特點(diǎn)及程序結(jié)構(gòu),一C語(yǔ)言的特點(diǎn) 1語(yǔ)言簡(jiǎn)潔、緊湊,使用方便、靈活。 2運(yùn)算符豐富。 3數(shù)據(jù)結(jié)構(gòu)豐富。具有現(xiàn)代化語(yǔ)言的各種數(shù)據(jù)結(jié)構(gòu)。 4可進(jìn)行結(jié)構(gòu)化程序設(shè)計(jì)。 5可以直接對(duì)計(jì)算機(jī)硬件進(jìn)行操作。 6生成的目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高。 7可移植性好。,二C語(yǔ)言的程序結(jié)構(gòu),C語(yǔ)言程序采用函數(shù)結(jié)構(gòu),每個(gè)C語(yǔ)言程序由一個(gè)或多個(gè)函數(shù)組成,在這些函數(shù)中至少應(yīng)包含一個(gè)主函數(shù)main(),也可以包含一個(gè)main()函數(shù)和若干個(gè)其它的功能函數(shù)。不管main()函數(shù)放于何處,程序總是從main()函數(shù)開(kāi)始執(zhí)行,執(zhí)行到main()函
2、數(shù)結(jié)束則結(jié)束。在main()函數(shù)中調(diào)用其它函數(shù),其它函數(shù)也可以相互調(diào)用,但main()函數(shù)只能調(diào)用其它的功能函數(shù),而不能被其它的函數(shù)所調(diào)用。 功能函數(shù)可以是C語(yǔ)言編譯器提供的庫(kù)函數(shù),也可以是由用戶定義的自定義函數(shù)。在編制C程序時(shí),程序的開(kāi)始部分一般是預(yù)處理命令、函數(shù)說(shuō)明和變量定義等。,3.1.2 C語(yǔ)言與89C51單片機(jī),用C語(yǔ)言編寫(xiě)89C51單片機(jī)程序與用匯編語(yǔ)言編寫(xiě)89C51單片機(jī)程序不一樣。 用匯編語(yǔ)言編寫(xiě)89C51單片機(jī)程序必須要考慮其存儲(chǔ)器結(jié)構(gòu),尤其必須考慮其片內(nèi)數(shù)據(jù)存儲(chǔ)器與特殊功能寄存器的使用以及按實(shí)際地址處理端口數(shù)據(jù)。 用C語(yǔ)言編寫(xiě)的89C51單片機(jī)應(yīng)用程序,則不用像匯編語(yǔ)言那樣
3、須具體組織、分配存儲(chǔ)器資源和處理端口數(shù)據(jù),但在C語(yǔ)言編程中,對(duì)數(shù)據(jù)類型與變量的定義,必須要與單片機(jī)的存儲(chǔ)結(jié)構(gòu)相關(guān)聯(lián),否則編譯器不能正確地映射定位。,C語(yǔ)言編寫(xiě)單片機(jī)應(yīng)用程序時(shí),需根據(jù)單片機(jī)存儲(chǔ)結(jié)構(gòu)及內(nèi)部資源定義相應(yīng)的數(shù)據(jù)類型和變量,而標(biāo)準(zhǔn)的C語(yǔ)言程序不需要考慮這些問(wèn)題; C51包含的數(shù)據(jù)類型、變量存儲(chǔ)模式、輸入輸出處理、函數(shù)等方面與標(biāo)準(zhǔn)的C語(yǔ)言有一定的區(qū)別。其它的語(yǔ)法規(guī)則、程序結(jié)構(gòu)及程序設(shè)計(jì)方法等與標(biāo)準(zhǔn)的C語(yǔ)言程序設(shè)計(jì)相同。,用C語(yǔ)言編寫(xiě)單片機(jī)應(yīng)用程序與標(biāo)準(zhǔn)的C語(yǔ)言程序也有相應(yīng)的區(qū)別:,現(xiàn)在支持89C51系列單片機(jī)的C語(yǔ)言編譯器有很多種,如American Automation、Avocet、
4、BSO/TASKING、DUNFIELD SHAREWARE、KEIL/Franklin等。各種編譯器的基本情況相同,但具體處理時(shí)有一定的區(qū)別,其中KEIL/Franklin以它的代碼緊湊和使用方便等特點(diǎn)優(yōu)于其它編譯器,現(xiàn)在使用特別廣泛。 本章主要以KEIL編譯器介紹89C51單片機(jī)C語(yǔ)言程序設(shè)計(jì)。,3.1.3 C51程序結(jié)構(gòu),C51的語(yǔ)法規(guī)定、程序結(jié)構(gòu)及程序設(shè)計(jì)方法都與標(biāo)準(zhǔn)的C語(yǔ)言程序設(shè)計(jì)相同,但C51程序與標(biāo)準(zhǔn)的C程序在以下幾個(gè)方面不一樣: (1)C51中定義的庫(kù)函數(shù)和標(biāo)準(zhǔn)C語(yǔ)言定義的庫(kù)函數(shù)不同。標(biāo)準(zhǔn)的C語(yǔ)言定義的庫(kù)函數(shù)是按通用微型計(jì)算機(jī)來(lái)定義的,而C51中的庫(kù)函數(shù)是按89C51單片機(jī)相應(yīng)
5、情況來(lái)定義的; (2)C51中的數(shù)據(jù)類型與標(biāo)準(zhǔn)C的數(shù)據(jù)類型也有一定的區(qū)別,在C51中還增加了幾種針對(duì)89C51單片機(jī)特有的數(shù)據(jù)類型;,(3)C51變量的存儲(chǔ)模式與標(biāo)準(zhǔn)C中變量的存儲(chǔ)模式不一樣,C51中變量的存儲(chǔ)模式是與89C51單片機(jī)的存儲(chǔ)器緊密相關(guān); (4)C51與標(biāo)準(zhǔn)C的輸入輸出處理不一樣,C51中的輸入輸出是通過(guò)89C51串行口來(lái)完成的,輸入輸出指令執(zhí)行前必須要對(duì)串行口進(jìn)行初始化; (5)C51與標(biāo)準(zhǔn)C在函數(shù)使用方面也有一定的區(qū)別,C51中有專門的中斷函數(shù)。,3.2 C51的數(shù)據(jù)類型,C51的數(shù)據(jù)類型分為基本數(shù)據(jù)類型和組合數(shù)據(jù)類型,情況與標(biāo)準(zhǔn)C中的數(shù)據(jù)類型基本相同,但其中char型與sh
6、ort型相同,float型與double型相同,另外,C51中還有專門針對(duì)于89C51單片機(jī)的特殊功能寄存器型和位類型。,特殊功能寄存器型 這是C51擴(kuò)充的數(shù)據(jù)類型,用于訪問(wèn)89C51單片機(jī)中的特殊功能寄存器數(shù)據(jù),它分sfr和sfr16兩種類型。其中: sfr為字節(jié)型特殊功能寄存器類型,占一個(gè)內(nèi)存單元,利用它可以訪問(wèn)89C51內(nèi)部的所有特殊功能寄存器; sfr16為雙字節(jié)型特殊功能寄存器類型,占用兩個(gè)字節(jié)單元,利用它可以訪問(wèn)89C51內(nèi)部的所有兩個(gè)字節(jié)的特殊功能寄存器。 在C51中對(duì)特殊功能寄存器的訪問(wèn)必須先用sfr或sfr16進(jìn)行聲明。,位類型 這也是C51中擴(kuò)充的數(shù)據(jù)類型,用于訪問(wèn)MCS-
7、51單片機(jī)中的可尋址的位單元。在C51中,支持兩種位類型:bit型和sbit型。它們?cè)趦?nèi)存中都只占一個(gè)二進(jìn)制位,其值可以是“1”或“0”。 其中:用bit定義的位變量在C51編譯器編譯時(shí),在不同的時(shí)候位地址是可以變化的,而用sbit定義的位變量必須與89C51單片機(jī)的一個(gè)可以尋址位單元或可位尋址的字節(jié)單元中的某一位聯(lián)系在一起,在C51編譯器編譯時(shí),其對(duì)應(yīng)的位地址是不可變化的。,KEIL C51編譯器能夠識(shí)別的基本數(shù)據(jù)類型:,在C51語(yǔ)言程序中,有可能會(huì)出現(xiàn)在運(yùn)算中數(shù)據(jù)類型不一致的情況。C51允許任何標(biāo)準(zhǔn)數(shù)據(jù)類型的隱式轉(zhuǎn)換,隱式轉(zhuǎn)換的優(yōu)先級(jí)順序如下: bitcharintlongfloat si
8、gnedunsigned 也就是說(shuō),當(dāng)char型與int型進(jìn)行運(yùn)算時(shí),先自動(dòng)對(duì)char型擴(kuò)展為int型,然后與int型進(jìn)行運(yùn)算,運(yùn)算結(jié)果為int型。C51除了支持隱式類型轉(zhuǎn)換外,還可以通過(guò)強(qiáng)制類型轉(zhuǎn)換符“()”對(duì)數(shù)據(jù)類型進(jìn)行人為的強(qiáng)制轉(zhuǎn)換。 C5l編譯器除了能支持以上這些基本數(shù)據(jù)類型之外,還能支持一些復(fù)雜的組合型數(shù)據(jù)類型,如數(shù)組類型、指針類型、結(jié)構(gòu)類型、聯(lián)合類型等這些復(fù)雜的數(shù)據(jù)類型,在后面將相繼介紹。,3.3.1 常量 常量是指在程序執(zhí)行過(guò)程中其值不能改變的量。在C51中支持整型常量、浮點(diǎn)型常量、字符型常量和字符串型常量。,3.3 C51的運(yùn)算量,3.3.2 變量 變量是在程序運(yùn)行過(guò)程中其值可
9、以改變的量。一個(gè)變量由兩部分組成:變量名和變量值。 在C51中,變量在使用前必須對(duì)變量進(jìn)行定義,指出變量的數(shù)據(jù)類型和存儲(chǔ)模式。以便編譯系統(tǒng)為它分配相應(yīng)的存儲(chǔ)單元。定義的格式如下: 存儲(chǔ)種類 數(shù)據(jù)類型說(shuō)明符 存儲(chǔ)器類型 變量名1=初值,變量名2初值;,三存儲(chǔ)種類 存儲(chǔ)種類是指變量在程序執(zhí)行過(guò)程中的作用范圍。C51變量的存儲(chǔ)種類有四種,分別是自動(dòng)(auto)、外部(extern)、靜態(tài)(static)和寄存器(register)。 1auto: 使用auto定義的變量稱為自動(dòng)變量,其作用范圍在定義它的函數(shù)體或復(fù)合語(yǔ)句內(nèi)部,當(dāng)定義它的函數(shù)體或復(fù)合語(yǔ)句執(zhí)行時(shí),C51才為該變量分配內(nèi)存空間,結(jié)束時(shí)占用的
10、內(nèi)存空間釋放。自動(dòng)變量一般分配在內(nèi)存的堆??臻g中。定義變量時(shí),如果省略存儲(chǔ)種類,則該變量默認(rèn)為自動(dòng)(auto)變量。,2extern: 使用extern定義的變量稱為外部變量。在一個(gè)函數(shù)體內(nèi),要使用一個(gè)已在該函數(shù)體外或別的程序中定義過(guò)的外部變量時(shí),該變量在該函數(shù)體內(nèi)要用extern說(shuō)明。外部變量被定義后分配固定的內(nèi)存空間,在程序整個(gè)執(zhí)行時(shí)間內(nèi)都有效,直到程序結(jié)束才釋放。 3static: 使用static定義的變量稱為靜態(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ù)體外被保
11、護(hù),還可以實(shí)現(xiàn)當(dāng)離開(kāi)函數(shù)時(shí)值不被改變。外部靜態(tài)變量上在函數(shù)外部定義的靜態(tài)變量。它在程序中一直存在,但在定義的范圍之外是不可見(jiàn)的。如在多文件或多模塊處理中,外部靜態(tài)變量只在文件內(nèi)部或模塊內(nèi)部有效。,4register: 使用register定義的變量稱為寄存器變量。它定義的變量存放在CPU內(nèi)部的寄存器中,處理速度快,但數(shù)目少。C51編譯器編譯時(shí)能自動(dòng)識(shí)別程序中使用頻率最高的變量,并自動(dòng)將其作為寄存器變量,用戶可以無(wú)需專門聲明。,四存儲(chǔ)器類型 存儲(chǔ)器類型是用于指明變量所處的單片機(jī)的存儲(chǔ)器區(qū)域情況。存儲(chǔ)器類型與存儲(chǔ)種類完全不同。C51編譯器能識(shí)別的存儲(chǔ)器類型有以下幾種,見(jiàn)表所示。,定義變量時(shí)也可以省
12、“存儲(chǔ)器類型”,省時(shí)C51編譯器將按編譯模式默認(rèn)存儲(chǔ)器類型,具體編譯模式的情況在后面介紹。,【例】變量定義存儲(chǔ)種類和存儲(chǔ)器類型相關(guān)情況。 char data varl; /*在片內(nèi)RAM低128B定義用直接尋址方式訪問(wèn)的字符型變量var1*/ int idata var2; /*在片內(nèi)RAM256B定義用間接尋址方式訪問(wèn)的整型變量var2*/ auto unsigned long data var3; /*在片內(nèi)RAM128B定義用直接尋址方式訪問(wèn)的自動(dòng)無(wú)符號(hào)長(zhǎng)整型變量var3*/ extern float xdata var4; /*在片外RAM64KB空間定義用間接尋址方式訪問(wèn)的外部實(shí)型變
13、量var4*/ int code var5; /*在ROM空間定義整型變量var5*/ unsign char bdata var6; /*在片內(nèi)RAM位尋址區(qū)20H2FH單元定義可字節(jié)處理和位處理的無(wú)符號(hào)字符型變量var6*/,五特殊功能寄存器變量 89C51系列單片機(jī)片內(nèi)有許多特殊功能寄存器,通過(guò)這些特殊功能寄存器可以控制89C51系列單片機(jī)的定時(shí)器、計(jì)數(shù)器、串口、I/O及其它功能部件,每一個(gè)特殊功能寄存器在片內(nèi)RAM中都對(duì)應(yīng)于一個(gè)字節(jié)單元或兩個(gè)字節(jié)單元。 在C51中,允許用戶對(duì)這些特殊功能寄存器進(jìn)行訪問(wèn),訪問(wèn)時(shí)須通過(guò)sfr或sfr16類型說(shuō)明符進(jìn)行定義,定義時(shí)須指明它們所對(duì)應(yīng)的片內(nèi)RAM
14、單元的地址。格式如下: sfr或sfr16 特殊功能寄存器名=地址; sfr用于對(duì)89C51單片機(jī)中單字節(jié)的特殊功能寄存器進(jìn)行定義,sfr16用于對(duì)雙字節(jié)特殊功能寄存器進(jìn)行定義。特殊功能寄存器名一般用大寫(xiě)字母表示。地址一般用直接地址形式,具體特殊功能寄存器地址見(jiàn)前面內(nèi)容。,【例3-3】特殊功能寄存器的定義。 sfr PSW=0 xd0; sfr SCON=0 x98; sfr TMOD=0 x89; sfr P1=0 x90; sfr16 DPTR=0 x82; sfr16 T1=0X8A;,六位變量 在C51中,允許用戶通過(guò)位類型符定義位變量。位類型符有兩個(gè):bit和sbit??梢远x兩種位
15、變量。 bit位類型符用于定義一般的可位處理位變量。它的格式如下: bit 位變量名; 在格式中可以加上各種修飾,但注意存儲(chǔ)器類型只能是bdata、data、idata。只能是片內(nèi)RAM的可位尋址區(qū),嚴(yán)格來(lái)說(shuō)只能是bdata。 【例】 bit型變量的定義。 bit data a1; /*正確*/ bit bdata a2; /*正確*/ bit pdata a3; /*錯(cuò)誤*/ bit xdata a4; /*錯(cuò)誤*/,sbit位類型符用于定義在可位尋址字節(jié)或特殊功能寄存器中的位,定義時(shí)須指明其位地址,可以是位直接地址,可以是可位尋址變量帶位號(hào),也可以是特殊功能寄存器名帶位號(hào)。格式如下: sb
16、it 位變量名=位地址; 如位地址為位直接地址,其取值范圍為0 x000 xff;如位地址是可位尋址變量帶位號(hào)或特殊功能寄存器名帶位號(hào),則在它前面須對(duì)可位尋址變量或特殊功能寄存器進(jìn)行定義。字節(jié)地址與位號(hào)之間、特殊功能寄存器與位號(hào)之間一般用“”作間隔。,【例】sbit型變量的定義: sbit OV=0 xd2; sbit CY=oxd7; unsigned char bdata flag; sbit flag0=flag0; sfr P1=0 x90; sbit P1_0=P10; sbit P1_1=P11; sbit P1_2=P12; sbit P1_3=P13; sbit P1_4=P1
17、4; sbit P1_5=P15; sbit P1_6=P16; sbit P1_7=P17;,在C51中,為了用戶處理方便,C51編譯器把89C51單片機(jī)的常用的特殊功能寄存器和特殊位進(jìn)行了定義,放在一個(gè)“reg51.h”或“reg52.h”的頭文件中,當(dāng)用戶要使用時(shí),只須要在使用之前用一條預(yù)處理命令#include 把這個(gè)頭文件包含到程序中,然后就可使用殊功能寄存器名和特殊位名稱。,4.3.3 存儲(chǔ)模式,C51編譯器支持三種存儲(chǔ)模式:SMALL模式、COMPACT模式和LARGE模式。不同的存儲(chǔ)模式對(duì)變量默認(rèn)的存儲(chǔ)器類型不一樣。 (1)SMALL模式。SMALL模式稱為小編譯模式,在SMA
18、LL模式下,編譯時(shí),函數(shù)參數(shù)和變量被默認(rèn)在片內(nèi)RAM中,存儲(chǔ)器類型為data。 (2)COMPACT模式。COMPACT模式稱為緊湊編譯模式,在COMPACT模式下,編譯時(shí),函數(shù)參數(shù)和變量被默認(rèn)在片外RAM的低256字節(jié)空間,存儲(chǔ)器類型為pdata。 (3)LARGE模式。LARGE模式稱為大編譯模式,在LARGE模式下,編譯時(shí)函數(shù)參數(shù)和變量被默認(rèn)在片外RAM的64K字節(jié)空間,存儲(chǔ)器類型為xdata。,在程序中變量的存儲(chǔ)模式的指定通過(guò)#pragma預(yù)處理命令來(lái)實(shí)現(xiàn)。函數(shù)的存儲(chǔ)模式可通過(guò)在函數(shù)定義時(shí)后面帶存儲(chǔ)模式說(shuō)明。如果沒(méi)有指定,則系統(tǒng)都隱含為SMALL模式。,【例】變量的存儲(chǔ)模式。 #pra
19、gma small /*變量的存儲(chǔ)模式為SMALL*/ char k1; int xdata m1; #pragma compact /*變量的存儲(chǔ)模式為compact*/ char k2; int xdata m2; int func1(int x1,int y1) large /*函數(shù)的存儲(chǔ)模式為L(zhǎng)ARGE*/ return(x1+y1); int func2(int x2,int y2) /*函數(shù)的存儲(chǔ)模式隱含為SMALL*/ return(x2-y2);,程序編譯時(shí),k1變量存儲(chǔ)器類型為data,k2變量存儲(chǔ)器類型為pdata,而m1和m2由于定義時(shí)帶了存儲(chǔ)器類型xdata,因而它們?yōu)?/p>
20、xdata型;函數(shù)func1的形參x1和y1的存儲(chǔ)器類型為xdata型,而函數(shù)func2由于沒(méi)有指明存儲(chǔ)模式,隱含為SMALL模式,形參x2和y2的存儲(chǔ)器類型為data。,3.3.4 絕對(duì)地址的訪問(wèn),一使用C51運(yùn)行庫(kù)中預(yù)定義宏 C51編譯器提供了一組宏定義來(lái)對(duì)51系列單片機(jī)的code、data、pdata和xdata空間進(jìn)行絕對(duì)尋址。規(guī)定只能以無(wú)符號(hào)數(shù)方式訪問(wèn),定義了8個(gè)宏定義,其函數(shù)原型如下:,#define CBYTE(unsigned char volatile*)0 x50000L) #define DBYTE(unsigned char volatile*)0 x40000L) #
21、define PBYTE(unsigned char volatile*)0 x30000L) #define XBYTE(unsigned char volatile*)0 x20000L) #define CWORD(unsigned int volatile*)0 x50000L) #define DWORD(unsigned int volatile*)0 x40000L) #define PWORD(unsigned int volatile*)0 x30000L) #define XWORD(unsigned int volatile*)0 x20000L) 這些函數(shù)原型放在abs
22、acc.h文件中。使用時(shí)須用預(yù)處理命令把該頭文件包含到文件中,形式為:#include 。 其中:CBYTE以字節(jié)形式對(duì)code區(qū)尋址,DBYTE以字節(jié)形式對(duì)data區(qū)尋址,PBYTE以字節(jié)形式對(duì)pdata區(qū)尋址,XBYTE以字節(jié)形式對(duì)xdata區(qū)尋址,CWORD以字形式對(duì)code區(qū)尋址,DWORD以字形式對(duì)data區(qū)尋址,PWORD以字形式對(duì)pdata區(qū)尋址,XWORD以字形式對(duì)xdata區(qū)尋址。,【例】絕對(duì)地址對(duì)存儲(chǔ)單元的訪問(wèn) #include /*將絕對(duì)地址頭文件包含在文件中*/ #include /*將寄存器頭文件包含在文件中*/ #define uchar unsigned char
23、 /*定義符號(hào)uchar為數(shù)據(jù)類 型符unsigned char*/ #define uint unsigned int /*定義符號(hào)uint為數(shù)據(jù)類型 符unsigned int*/ void main(void) uchar var1; uint var2; var1=XBYTE0 x0005; /*XBYTE0 x0005訪問(wèn)片外RAM 的0005字節(jié)單元*/ var2=XWORD0 x0002; /*XWORD0 x0002訪問(wèn)片外RAM 的000字單元*/ . while(1); ,在上面程序中,其中XBYTE0 x0005就是以絕對(duì)地址方式訪問(wèn)的片外RAM 0005字節(jié)單元;XWO
24、RD0 x0002就是以絕對(duì)地址方式訪問(wèn)的片外RAM 0002字單元。,【例】 通過(guò)指針實(shí)現(xiàn)絕對(duì)地址的訪問(wèn)。 #define uchar unsigned char /*定義符號(hào)uchar為數(shù)據(jù)類 型符unsigned char*/ #define uint unsigned int /*定義符號(hào)uint為數(shù)據(jù)類型 符unsigned int*/ void func(void) uchar data var1; uchar pdata *dp1; /*定義一個(gè)指向pdata區(qū)的指針dp1*/ uint xdata *dp2; /*定義一個(gè)指向xdata區(qū)的指針dp2*/ uchar data
25、*dp3; /*定義一個(gè)指向data區(qū)的指針dp3*/ dp1=0 x30; /*dp1指針賦值,指向pdata區(qū)的30H單元*/ dp2=0 x1000; /*dp2指針賦值,指向xdata區(qū)的1000H單元*/ *dp1=0 xff; /*將數(shù)據(jù)0 xff送到片外RAM30H單元*/ *dp2=0 x1234; /*將數(shù)據(jù)0 x1234送到片外RAM1000H單元*/ dp3= /*給變量var1賦值0 x20*/ ,二通過(guò)指針訪問(wèn) 采用指針的方法,可以實(shí)現(xiàn)在C51程序中對(duì)任意指定的存儲(chǔ)器單元進(jìn)行訪問(wèn)。,三使用C51擴(kuò)展關(guān)鍵字_at_ 使用_at_對(duì)指定的存儲(chǔ)器空間的絕對(duì)地址進(jìn)行訪問(wèn),一般
26、格式如下: 存儲(chǔ)器類型 數(shù)據(jù)類型說(shuō)明符 變量名 _at_ 地址常數(shù); 其中,存儲(chǔ)器類型為data、bdata、idata、pdata等C51能識(shí)別的數(shù)據(jù)類型,如省略則按存儲(chǔ)模式規(guī)定的默認(rèn)存儲(chǔ)器類型確定變量的存儲(chǔ)器區(qū)域;數(shù)據(jù)類型為C51支持的數(shù)據(jù)類型。地址常數(shù)用于指定變量的絕對(duì)地址,必須位于有效的存儲(chǔ)器空間之內(nèi);使用_at_定義的變量必須為全局變量。,【例】通過(guò)_at_實(shí)現(xiàn)絕對(duì)地址的訪問(wèn)。 #define uchar unsigned char /*定義符號(hào)uchar為數(shù)據(jù)類 型符unsigned char*/ #define uint unsigned int /*定義符號(hào)uint為數(shù)據(jù)類型
27、符unsigned int*/ void main(void) data uchar x1 _at_ 0 x40; /*在data區(qū)中定義字節(jié)變量 x1,它的地址為40H*/ xdata uint x2 _at_ 0 x2000; /*在xdata區(qū)中定義字變量 x2,它的地址為2000H*/ x1=0 xff; x2=0 x1234; . while(1); ,3.4 C51的運(yùn)算符及表達(dá)式,3.4.1 賦值運(yùn)算 3.4.2 算術(shù)運(yùn)算 3.4.3 邏輯運(yùn)算 3.4.4 位運(yùn)算 3.4.5 復(fù)合賦值運(yùn)算 3.4.6 逗號(hào)運(yùn)算 3.4.7 條件運(yùn)算 3.4.8 指針與地址運(yùn)算,3.5 表達(dá)式語(yǔ)句
28、及復(fù)合語(yǔ)句,3.5.1 表達(dá)式語(yǔ)句,在表達(dá)式的后邊加一個(gè)分號(hào)“;”就構(gòu)成了表達(dá)式語(yǔ)句 ,如: a=+b*9; x=8;y=7; +k; 可以一行放一個(gè)表達(dá)式形成表達(dá)式語(yǔ)句,也可以一行放多個(gè)表達(dá)式形成表達(dá)式語(yǔ)句,這時(shí)每個(gè)表達(dá)式后面都必須帶“;”號(hào),另外,還可以僅由個(gè)分號(hào)“;”占一行形成一個(gè)表達(dá)式語(yǔ)句,這種語(yǔ)句稱為空語(yǔ)句。,空語(yǔ)句在程序設(shè)計(jì)中通常用于兩種情況: (1)在程序中為有關(guān)語(yǔ)句提供標(biāo)號(hào),用以標(biāo)記程序執(zhí)行的位置。例如采用下面的語(yǔ)句可以構(gòu)成一個(gè)循環(huán)。 repeat:; ; goto repeat; (2)在用while語(yǔ)句構(gòu)成的循環(huán)語(yǔ)句后面加一個(gè)分號(hào),形成一個(gè)不執(zhí)行其它操作的空循環(huán)體。這種結(jié)構(gòu)
29、通常用于對(duì)某位進(jìn)行判斷,當(dāng)不滿足條件則等待,滿足條件則執(zhí)行。,【例】下面這段子程序用于讀取8051單片機(jī)的串行口的數(shù)據(jù),當(dāng)沒(méi)有接收到則等待,當(dāng)接收到,接收數(shù)據(jù)后返回,返回值為接收的數(shù)據(jù)。 #include char getchar() char c; while(!RI); /當(dāng)接收中斷標(biāo)志位RI為0則等待, 當(dāng)接收中斷標(biāo)志位為1則;等待結(jié)束 c=SBUF; RI=0; return(c); ,3.5.2 復(fù)合語(yǔ)句,復(fù)合語(yǔ)句是由若干條語(yǔ)句組合而成的一種語(yǔ)句,在C51中,用一個(gè)大括號(hào)“ ”將若干條語(yǔ)句括在一起就形成了一個(gè)復(fù)合語(yǔ)句,復(fù)合語(yǔ)句最后不需要以分號(hào)“;”結(jié)束,但它內(nèi)部的各條語(yǔ)句仍需以分號(hào)“
30、;”結(jié)束。復(fù)合語(yǔ)句的一般形式為: 局部變量定義; 語(yǔ)句l; 語(yǔ)句2; ,復(fù)合語(yǔ)句在執(zhí)行時(shí),其中的各條單語(yǔ)句按順序依次執(zhí)行,整個(gè)復(fù)合語(yǔ)句在語(yǔ)法上等價(jià)于一條單語(yǔ)句,因此在C51中可以將復(fù)合語(yǔ)句視為一條單語(yǔ)句。通常復(fù)合語(yǔ)句出現(xiàn)在函數(shù)中,實(shí)際上,函數(shù)的執(zhí)行部分(即函數(shù)體)就是一個(gè)復(fù)合語(yǔ)句;復(fù)合語(yǔ)句中的單語(yǔ)句一般是可執(zhí)行語(yǔ)句,此外還可以是變量的定義語(yǔ)句(說(shuō)明變量的數(shù)據(jù)類型)。在復(fù)合語(yǔ)句內(nèi)部語(yǔ)句所定義的變量,稱為該復(fù)合語(yǔ)句中的局部變量,它僅在當(dāng)前這個(gè)復(fù)合語(yǔ)句中有效。利用復(fù)合語(yǔ)句將多條單語(yǔ)句組合在起,以及在復(fù)合語(yǔ)句中進(jìn)行局部變量定義是C51語(yǔ)言的一個(gè)重要特征。,3.6 C51的輸入輸出,在C51語(yǔ)言中,它本
31、身不提供輸入和輸出語(yǔ)句,輸入和輸出操作是由函數(shù)來(lái)實(shí)現(xiàn)的。在C51的標(biāo)準(zhǔn)函數(shù)庫(kù)中提供了一個(gè)名為“stdio.h”的一般I/O函數(shù)庫(kù),它當(dāng)中定義了C51中的輸入和輸出函數(shù)。當(dāng)對(duì)輸入和輸出函數(shù)使用時(shí),須先用預(yù)處理命令“#include ”將該函數(shù)庫(kù)包含到文件中。,在C51的一般I/O函數(shù)庫(kù)中定義的I/O函數(shù)都是通過(guò)串行接口實(shí)現(xiàn),在使用I/O函數(shù)之前,應(yīng)先對(duì)MCS-51單片機(jī)的串行接口進(jìn)行初始化。選擇串口工作于方式2(8位自動(dòng)重載方式),波特率由定時(shí)器/計(jì)數(shù)器1溢出率決定。例如,設(shè)系統(tǒng)時(shí)鐘為12MHZ,波特率為2400,則初始化程序如下: SCON=0 x52; TMOD=0X20; TH1=0 xf
32、3; TR1=1;,3.6.1 格式輸出函數(shù)printf(),printf()函數(shù)的的作用是通過(guò)串行接口輸出若干任意類型的數(shù)據(jù),它的格式如下: printf(格式控制,輸出參數(shù)表) 格式控制是用雙引號(hào)括起來(lái)的字符串,也稱轉(zhuǎn)換控制字符串,它包括三種信息:格式說(shuō)明符、普通字符和轉(zhuǎn)義字符。 (1)格式說(shuō)明符,由“%”和格式字符組成,它的作用是用于指明輸出的數(shù)據(jù)的格式輸出,如%d、%f等,它們的具體情況見(jiàn)下表。 (2)普通字符,這些字符按原樣輸出,用來(lái)輸出某些提示信息。 (3)轉(zhuǎn)義字符,就是前面介紹的轉(zhuǎn)義字符(下表),用來(lái)輸出特定的控制符,如輸出轉(zhuǎn)義字符n就是使輸出換一行。 輸出參數(shù)表是需要輸出的一組
33、數(shù)據(jù),可以是表達(dá)式。,3.6.2 格式輸入函數(shù)scanf(),scanf()函數(shù)的作用是通過(guò)串行接口實(shí)現(xiàn)數(shù)據(jù)輸入,它的使用方法與printf()類似,scanf()的格式如下: scanf(格式控制,地址列表) 格式控制與printf()函數(shù)的情況類似,也是用雙引號(hào)括起來(lái)的一些字符,可以包括以下三種信息:空白字符、普通字符和格式說(shuō)明。 (1)空白字符,包含空格、制表符、換行符等,這些字符在輸出時(shí)被忽略。 (2)普通字符,除了以百分號(hào)“%”開(kāi)頭的格式說(shuō)明符而外的所有非空白字符,在輸入時(shí)要求原樣輸入。 (3)格式說(shuō)明,由百分號(hào)“%”和格式說(shuō)明符組成,用于指明輸入數(shù)據(jù)的格式,它的基本情況與print
34、f()相同,具體情況見(jiàn)表4-5。 地址列表是由若干個(gè)地址組成,它可以是指針變量、取地址運(yùn)算符“ /定義整型變量x和y SCON=0 x52; /串口初始化 TMOD=0 x20; TH1=0XF3; TR1=1; printf(“input x,y:n”); /輸出提示信息 scanf(“%d%d”, /結(jié)束 ,3.7 C51程序基本結(jié)構(gòu)與相關(guān)語(yǔ)句,3.7.1 C51的基本結(jié)構(gòu),一、順序結(jié)構(gòu) 二、選擇結(jié)構(gòu) 三、循環(huán)結(jié)構(gòu),3.7.2 C51的相關(guān)語(yǔ)句,一、if else Switch/case 二、while do while for 三、break/continue 四、return,3.8
35、函 數(shù),3.8.1 函數(shù)的定義,函數(shù)定義的一般格式如下: 函數(shù)類型 函數(shù)名(形式參數(shù)表) reentrantinterrupt musing n 形式參數(shù)說(shuō)明 局部變量定義 函數(shù)體 ,前面部件稱為函數(shù)的首部,后面稱為函數(shù)的尾部,格式說(shuō)明: 1函數(shù)類型 函數(shù)類型說(shuō)明了函數(shù)返回值的類型。 2函數(shù)名 函數(shù)名是用戶為自定義函數(shù)取的名字以便調(diào)用函數(shù)時(shí)使用。 3形式參數(shù)表 形式參數(shù)表用于列錄在主調(diào)函數(shù)與被調(diào)用函數(shù)之間進(jìn)行數(shù)據(jù)傳遞的形式參數(shù)。,4reentrant修飾符,這個(gè)修飾符用于把函數(shù)定義為可重入函數(shù)。所謂可重入函數(shù)就是允許被遞歸調(diào)用的函數(shù)。函數(shù)的遞歸調(diào)用是指當(dāng)一個(gè)函數(shù)正被調(diào)用尚未返回時(shí),又直接或間接
36、調(diào)用函數(shù)本身。一般的函數(shù)不能做到這樣,只有重入函數(shù)才允許遞歸調(diào)用。,關(guān)于重入函數(shù),注意以下幾點(diǎn): (1)用reentrant修飾的重入函數(shù)被調(diào)用時(shí),實(shí)參表內(nèi)不允許使用bit類型的參數(shù)。函數(shù)體內(nèi)也不允許存在任何關(guān)于位變量的操作,更不能返回bit類型的值。 (2)編譯時(shí),系統(tǒng)為重入函數(shù)在內(nèi)部或外部存儲(chǔ)器中建立一個(gè)模擬堆棧區(qū),稱為重入棧。重入函數(shù)的局部變量及參數(shù)被放在重入棧中,使重入函數(shù)可以實(shí)現(xiàn)遞歸調(diào)用。 (3)在參數(shù)的傳遞上,實(shí)際參數(shù)可以傳遞給間接調(diào)用的重入函數(shù)。無(wú)重入屬性的間接調(diào)用函數(shù)不能包含調(diào)用參數(shù),但是可以使用定義的全局變量來(lái)進(jìn)行參數(shù)傳遞。,5interrupt m修飾符,interrupt
37、 m是C51函數(shù)中非常重要的一個(gè)修飾符,這是因?yàn)橹袛嗪瘮?shù)必須通過(guò)它進(jìn)行修飾。在C51程序設(shè)計(jì)中,當(dāng)函數(shù)定義時(shí)用了interrupt m修飾符,系統(tǒng)編譯時(shí)把對(duì)應(yīng)函數(shù)轉(zhuǎn)化為中斷函數(shù),自動(dòng)加上程序頭段和尾段,并按MCS-51系統(tǒng)中斷的處理方式自動(dòng)把它安排在程序存儲(chǔ)器中的相應(yīng)位置。,在該修飾符中,m的取值為031,對(duì)應(yīng)的中斷情況如下: 0外部中斷0 1定時(shí)/計(jì)數(shù)器T0 2外部中斷1 3定時(shí)/計(jì)數(shù)器T1 4串行口中斷 5定時(shí)/計(jì)數(shù)器T2 其它值預(yù)留。,編寫(xiě)89C51中斷函數(shù)注意如下: (1)中斷函數(shù)不能進(jìn)行參數(shù)傳遞,如果中斷函數(shù)中包含任何參數(shù)聲明都將導(dǎo)致編譯出錯(cuò)。 (2)中斷函數(shù)沒(méi)有返回值,如果企圖定義一個(gè)返回值將得不到正確的結(jié)果,建議在定義中斷函數(shù)時(shí)將其定義為void類型
溫馨提示
- 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. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《魯迅的翻譯思想》課件
- 《隱函數(shù)微分》課件
- 《機(jī)械振動(dòng)Pa》課件
- 《燃?xì)庹羝麆?dòng)力循環(huán)》課件
- 《中醫(yī)藥與人生》課件
- 三大眾傳播媒介的更新課件
- 《圖案的組織形式》課件
- 《林語(yǔ)堂翻譯思想》課件
- 《離散數(shù)學(xué)ch》課件
- 2023一年級(jí)數(shù)學(xué)上冊(cè) 七 加與減(二)第4課時(shí) 有幾瓶牛奶說(shuō)課稿 北師大版
- 2024年江蘇蘇??毓杉瘓F(tuán)有限公司招聘筆試沖刺題(帶答案解析)
- 2023年4月自考00504藝術(shù)概論試題及答案含解析
- 美麗的大自然(教案)2023-2024學(xué)年美術(shù)一年級(jí)下冊(cè)
- 2024年低壓電工考試題庫(kù)(試題含答案)
- 成都特色民俗課件
- 地質(zhì)勘探行業(yè)分析
- 花城版音樂(lè)四下-第四課-認(rèn)知音樂(lè)節(jié)奏(教案)
- 寵物醫(yī)院?jiǎn)T工手冊(cè)
- 2024年高考英語(yǔ)讀后續(xù)寫(xiě)高分寶典專題08讀后續(xù)寫(xiě)肢體動(dòng)作描寫(xiě)積累1(詞-句-文)講義
- 商業(yè)與公積金貸款政策
- 初中美術(shù)教學(xué)策略與方法
評(píng)論
0/150
提交評(píng)論