《單片機(jī)應(yīng)用系統(tǒng)》課件_第1頁(yè)
《單片機(jī)應(yīng)用系統(tǒng)》課件_第2頁(yè)
《單片機(jī)應(yīng)用系統(tǒng)》課件_第3頁(yè)
《單片機(jī)應(yīng)用系統(tǒng)》課件_第4頁(yè)
《單片機(jī)應(yīng)用系統(tǒng)》課件_第5頁(yè)
已閱讀5頁(yè),還剩125頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

《單片機(jī)應(yīng)用系統(tǒng)》江陰職業(yè)技術(shù)學(xué)院電子工程系包軍衛(wèi)邱玉娟《單片機(jī)應(yīng)用系統(tǒng)》江陰職業(yè)技術(shù)學(xué)院電子工程系1第1章C51語(yǔ)言基礎(chǔ)本章主要內(nèi)容一、C51概述二、數(shù)據(jù)類(lèi)型三、常量和變量四、運(yùn)算符和表達(dá)式五、C程序的基本結(jié)構(gòu)六、函數(shù)實(shí)訓(xùn)1C程序設(shè)計(jì)第1章C51語(yǔ)言基礎(chǔ)本章主要內(nèi)容一、C51概述

(一)C語(yǔ)言的特點(diǎn)C語(yǔ)言簡(jiǎn)潔、緊湊,使用方便、靈活。一共只有32個(gè)關(guān)鍵字運(yùn)算符豐富。共有34種。C把括號(hào)、賦值、逗號(hào)等都作為運(yùn)算符處理。從而使C的運(yùn)算類(lèi)型極為豐富,可以實(shí)現(xiàn)其他高級(jí)語(yǔ)言難以實(shí)現(xiàn)的運(yùn)算。數(shù)據(jù)結(jié)構(gòu)類(lèi)型豐富。具有結(jié)構(gòu)化的控制語(yǔ)句。語(yǔ)法限制不太嚴(yán)格,程序設(shè)計(jì)自由度大。生成目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高。與匯編語(yǔ)言相比,用C語(yǔ)言寫(xiě)的程序可移植性好C語(yǔ)言允許直接訪問(wèn)物理地址,能進(jìn)行位(bit)操作,能實(shí)現(xiàn)匯編語(yǔ)言的大部分功能,可以直接對(duì)硬件進(jìn)行操作。因此有人把它稱為中級(jí)語(yǔ)言。一、C51概述

(一)C語(yǔ)言的特點(diǎn)C語(yǔ)言簡(jiǎn)潔、緊湊,使用方(二)C51和匯編比較下面結(jié)合8051介紹單片機(jī)C語(yǔ)言的優(yōu)越性:不懂得單片機(jī)的指令集,也能夠編寫(xiě)完美的單片機(jī)程序;無(wú)須懂得單片機(jī)的具體硬件,也能夠編出符合硬件實(shí)際的專(zhuān)業(yè)水平的程序;不同函數(shù)的數(shù)據(jù)實(shí)行覆蓋,有效利用片上有限的RAM空間;程序具有堅(jiān)固性:數(shù)據(jù)被破壞是導(dǎo)致程序運(yùn)行異常的重要因素。C語(yǔ)言對(duì)數(shù)據(jù)進(jìn)行了許多專(zhuān)業(yè)性的處理,避免了運(yùn)行中間非異步的破壞;C語(yǔ)言提供復(fù)雜的數(shù)據(jù)類(lèi)型(數(shù)組、結(jié)構(gòu)、聯(lián)合、枚舉、指針等),極大地增強(qiáng)了程序處理能力和靈活性;(二)C51和匯編比較下面結(jié)合8051介紹單片機(jī)C語(yǔ)言的優(yōu)越提供auto、static、const等存儲(chǔ)類(lèi)型和專(zhuān)門(mén)針對(duì)8051單片機(jī)的data、idata、pdata、xdata、code等存儲(chǔ)類(lèi)型,自動(dòng)為變量合理地分配地址;提供small、compact、large等編譯模式,以適應(yīng)片上存儲(chǔ)器的大小;中斷服務(wù)程序的現(xiàn)場(chǎng)保護(hù)和恢復(fù),中斷向量表的填寫(xiě),是直接與單片機(jī)相關(guān)的,都由C編譯器代辦;提供常用的標(biāo)準(zhǔn)函數(shù)庫(kù),以供用戶直接使用;頭文件中定義宏、說(shuō)明復(fù)雜數(shù)據(jù)類(lèi)型和函數(shù)原型,有利于程序的移植和支持單片機(jī)的系列化產(chǎn)品的開(kāi)發(fā);有嚴(yán)格的句法檢查,錯(cuò)誤很少,可容易地在高級(jí)語(yǔ)言的水平上迅速地被排掉;可方便地接受多種實(shí)用程序的服務(wù):如片上資源的初始化有專(zhuān)門(mén)的實(shí)用程序自動(dòng)生成;再如,有實(shí)時(shí)多任務(wù)操作系統(tǒng)可調(diào)度多道任務(wù),簡(jiǎn)化用戶編程,提高運(yùn)行的安全性等等。提供auto、static、const等存儲(chǔ)類(lèi)型和專(zhuān)門(mén)針對(duì)8(三)KEILC上機(jī)步驟(1)建立項(xiàng)目。點(diǎn)擊Project菜單,選擇彈出的下拉式菜單中的NewProject,一個(gè)C程序項(xiàng)目名稱,的名稱,,只要符合Windows文件規(guī)則的文件名都行?!氨4妗焙蟮奈募U(kuò)展名為uv2,這是KEILuVision2項(xiàng)目文件擴(kuò)展名。(2)選擇單片機(jī)類(lèi)型,這里我們選擇常用的Ateml公司的AT89C51。(3)建立文件,編輯源文件,注意保存文件時(shí)后綴為.c(4)向項(xiàng)目中添加剛編輯的C文件。(5)編譯。如發(fā)現(xiàn)錯(cuò)誤根據(jù)輸出窗口的信息進(jìn)行修改。(6)全速運(yùn)行。此時(shí)打開(kāi)串行窗口,進(jìn)行觀察串行調(diào)試窗口中不斷的打出HelloWorld!"。學(xué)學(xué)練練:例1-1:(三)KEILC上機(jī)步驟例1-1 #include<REG51.H>

#include<stdio.h>

voidmain(void)

{

SCON=0x50; //串口方式1,允許接收

TMOD=0x20; //定時(shí)器1定時(shí)方式2

TCON=0x40; //設(shè)定時(shí)器1開(kāi)始計(jì)數(shù)

TH1=0xE8; //11.0592MHz1200波特率

TL1=0xE8;

TI=1;

TR1=1; //啟動(dòng)定時(shí)器

while(1)

{

printf("HelloWorld!\n");//顯示HelloWorld

}

}例1-1二、數(shù)據(jù)類(lèi)型C語(yǔ)言的標(biāo)識(shí)符和關(guān)鍵字在C51編譯器中,只支持標(biāo)識(shí)符的前32位為有效標(biāo)識(shí),故用戶標(biāo)識(shí)符不宜過(guò)長(zhǎng)。關(guān)鍵字則是編程語(yǔ)言保留的特殊標(biāo)識(shí)符,它們具有固定名稱和含義,在程序編寫(xiě)中不允許標(biāo)識(shí)符與關(guān)鍵字相同。在KEILuVision2中的關(guān)鍵字除了有ANSIC標(biāo)準(zhǔn)的32個(gè)關(guān)鍵字外還根據(jù)51單片機(jī)的特點(diǎn)擴(kuò)展了相關(guān)的關(guān)鍵字。表4-1,表中列出了KEILuVision2C51編譯器所支持的數(shù)據(jù)類(lèi)型。二、數(shù)據(jù)類(lèi)型C語(yǔ)言的標(biāo)識(shí)符和關(guān)鍵字?jǐn)?shù)據(jù)類(lèi)型長(zhǎng)度值域unsignedchar單字節(jié)0~255signedchar單字節(jié)-128~+127unsignedint雙字節(jié)0~65535signedint雙字節(jié)-32768~+32767unsignedlong四字節(jié)0~4294967295signedlong四字節(jié)-2147483648~+2147483647float四字節(jié)±1.175494E-38~±3.402823E+38*1~3字節(jié)對(duì)象的地址bit位0或1sfr單字節(jié)0~255sfr16雙字節(jié)0~65535sbit位0或1數(shù)據(jù)類(lèi)型長(zhǎng)度值域unsignedchar單字節(jié)0~25關(guān)鍵字用途說(shuō)明bit位標(biāo)量聲明聲明一個(gè)位標(biāo)量或位類(lèi)型的函數(shù)sbit位標(biāo)量聲明聲明一個(gè)可位尋址變量Sfr特殊功能寄存器聲明聲明一個(gè)特殊功能寄存器Sfr16特殊功能寄存器聲明聲明一個(gè)16位的特殊功能寄存器data存儲(chǔ)器類(lèi)型說(shuō)明直接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器bdata存儲(chǔ)器類(lèi)型說(shuō)明可位尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器idata存儲(chǔ)器類(lèi)型說(shuō)明間接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器pdata存儲(chǔ)器類(lèi)型說(shuō)明分頁(yè)尋址的外部數(shù)據(jù)存儲(chǔ)器xdata存儲(chǔ)器類(lèi)型說(shuō)明外部數(shù)據(jù)存儲(chǔ)器code存儲(chǔ)器類(lèi)型說(shuō)明程序存儲(chǔ)器interrupt中斷函數(shù)說(shuō)明定義一個(gè)中斷函數(shù)reentrant再入函數(shù)說(shuō)明定義一個(gè)再入函數(shù)using寄存器組定義定義芯片的工作寄存器關(guān)鍵字用途說(shuō)明bit位標(biāo)量聲明聲明一個(gè)位標(biāo)量或位類(lèi)型的函1.char字符類(lèi)型char類(lèi)型的長(zhǎng)度是一個(gè)字節(jié),通常用于定義處理字符數(shù)據(jù)的變量或常量,分無(wú)符號(hào)字符類(lèi)型unsignedchar表達(dá)的數(shù)值范圍是0~255有符號(hào)字符類(lèi)型signedchar,用字節(jié)中最高位字節(jié)表示數(shù)據(jù)的符號(hào),“0”表示正數(shù),“1”表示負(fù)數(shù),負(fù)數(shù)用補(bǔ)碼表示。所能表示的數(shù)值范圍是-128~+127。默認(rèn)值為signedchar類(lèi)型。unsignedchar常用于處理ASCII字符或用于處理小于或等于255的整型數(shù)。1.char字符類(lèi)型char類(lèi)型的長(zhǎng)度是一個(gè)字節(jié),通常用于2.int整型int整型長(zhǎng)度為兩個(gè)字節(jié),用于存放一個(gè)雙字節(jié)數(shù)據(jù)。分signedint,表示的數(shù)值范圍是-32768~32767,unsignedint,表示的數(shù)值范圍是0~65535。

默認(rèn)值為signedint類(lèi)型。在C51程序設(shè)計(jì)中,變量數(shù)據(jù)類(lèi)型的定義極其重要,因?yàn)樵谒袛?shù)據(jù)類(lèi)型中只有bit和unsignedchar兩種數(shù)據(jù)類(lèi)型可以直接支持機(jī)器指令,對(duì)于其他的數(shù)據(jù)類(lèi)型C51編譯器都要進(jìn)行一系列復(fù)雜的變量數(shù)據(jù)和變量類(lèi)型的處理,而這種處理將會(huì)對(duì)應(yīng)很長(zhǎng)一段機(jī)器指令,最終會(huì)使程序變得復(fù)雜、龐大,運(yùn)行速度降低。2.int整型int整型長(zhǎng)度為兩個(gè)字節(jié),用于存放一個(gè)雙字節(jié)由此可見(jiàn),在C51程序設(shè)計(jì)過(guò)程中,在滿足數(shù)據(jù)要求的情況下,應(yīng)盡可能使用unsignedchar變量和bit變量。signedchar變量雖然也只占用一個(gè)字節(jié),但需要進(jìn)行額外的操作來(lái)測(cè)試代碼的符號(hào)位,因此會(huì)降低代碼執(zhí)行效率。學(xué)學(xué)練練:例1-2:用用戶板2硬件仿真,看看unsignedchar和unsignedint用于延時(shí)的不同效果: 看P1口L0和L1發(fā)光二極管亮的時(shí)間。由此可見(jiàn),在C51程序設(shè)計(jì)過(guò)程中,在滿足數(shù)據(jù)要求的情況下,應(yīng)例1-2#include<reg51.h>//預(yù)處理命令sbitP1_0=P1^0;sbitP1_1=P1^1;voidmain(void)//主函數(shù)名

{

unsignedinta; //定義變量a為unsignedint類(lèi)型

unsignedcharb; //定義變量b為unsignedchar類(lèi)型

do{ //dowhile組成循環(huán)

for(a=0;a<65535;a++)

P1_0=0; //65535次設(shè)P1.0口為低電平,點(diǎn)亮LED

P1_0=1; //設(shè)P1.0口為高電平,熄滅LED

for(a=0;a<30000;a++);//空循環(huán)

for(b=0;b<255;b++)

P1_1=0; //255次設(shè)P1.1口為低電平,點(diǎn)亮LED

P1_1=1; //設(shè)P1.1口為高電平,熄滅LED

for(a=0;a<30000;a++); //空循環(huán)

}while(1);

}例1-23.long長(zhǎng)整型long長(zhǎng)整型長(zhǎng)度為四個(gè)字節(jié),用于存放一個(gè)四字節(jié)數(shù)據(jù)。分signedlong。表示的數(shù)值范圍是-2147483648~+2147483647,unsignedlong,表示的數(shù)值范圍是0~4294967295。

默認(rèn)值為signedlong3.long長(zhǎng)整型long長(zhǎng)整型長(zhǎng)度為四個(gè)字節(jié),用于存放一4.float浮點(diǎn)型

float浮點(diǎn)型在十進(jìn)制中具有7位有效數(shù)字,是符合IEEE-754標(biāo)準(zhǔn)的單精度浮點(diǎn)型數(shù)據(jù),占用四個(gè)字節(jié)。

5.*指針型

指針型本身就是一個(gè)變量,在這個(gè)變量中存放的指向另一個(gè)數(shù)據(jù)的地址。這個(gè)指針變量要占據(jù)一定的內(nèi)存單元,對(duì)不同的處理器長(zhǎng)度也不盡相同,在C51中它的長(zhǎng)度一般為1~3個(gè)字節(jié)。指針變量也具有類(lèi)型。6.bit位標(biāo)量

bit位標(biāo)量是C51編譯器的一種擴(kuò)充數(shù)據(jù)類(lèi)型,利用它可定義一個(gè)位標(biāo)量,但不能定義位指針,也不能定義位數(shù)組。它的值是一個(gè)二進(jìn)制位,不是0就是1,類(lèi)似一些高級(jí)語(yǔ)言中的Boolean類(lèi)型中的True和False。4.float浮點(diǎn)型

float浮點(diǎn)型在十進(jìn)制中具有7位有變量數(shù)據(jù)類(lèi)型的選擇在C51程序設(shè)計(jì)中,變量數(shù)據(jù)類(lèi)型的定義極其重要,因?yàn)樵谒袛?shù)據(jù)類(lèi)型中只有bit和unsignedchar兩種數(shù)據(jù)類(lèi)型可以直接支持機(jī)器指令,對(duì)于其他的數(shù)據(jù)類(lèi)型C51編譯器都要進(jìn)行一系列復(fù)雜的變量數(shù)據(jù)和變量類(lèi)型的處理,而這種處理將會(huì)對(duì)應(yīng)很長(zhǎng)一段機(jī)器指令,最終會(huì)使程序變得復(fù)雜、龐大,運(yùn)行速度降低。由此可見(jiàn),在C51程序設(shè)計(jì)過(guò)程中,在滿足數(shù)據(jù)要求的情況下,應(yīng)盡可能使用unsignedchar變量和bit變量。signedchar變量雖然也只占用一個(gè)字節(jié),但需要進(jìn)行額外的操作來(lái)測(cè)試代碼的符號(hào)位,因此會(huì)降低代碼執(zhí)行效率。變量數(shù)據(jù)類(lèi)型的選擇在C51程序設(shè)計(jì)中,變量數(shù)7、sfr特殊功能寄存器sfr也是一種擴(kuò)充數(shù)據(jù)類(lèi)型,點(diǎn)用一個(gè)內(nèi)存單元,值域?yàn)?~255。利用它可以訪問(wèn)51單片機(jī)內(nèi)部的所有特殊功能寄存器。如用sfrP1=0x90這一句定P1為P1端口在片內(nèi)的寄存器,在后面的語(yǔ)句中我們用以用P1=255(對(duì)P1端口的所有引腳置高電平)之類(lèi)的語(yǔ)句來(lái)操作特殊功能寄存器。7、sfr特殊功能寄存器sfr也是一種擴(kuò)充數(shù)據(jù)類(lèi)型,點(diǎn)用一8、sfr1616位特殊功能寄存器sfr16占用兩個(gè)內(nèi)存單元,值域?yàn)?~65535。sfr16和sfr一樣用于操作特殊功能寄存器,所不同的是它用于操作占兩個(gè)字節(jié)的寄存器,如定時(shí)器T0和T1。sfr和sfr16可以直接對(duì)51單片機(jī)的特殊寄存器進(jìn)行定義,定義方法如下:

sfr特殊功能寄存器名=特殊功能寄存器地址常數(shù);

sfr16特殊功能寄存器名=特殊功能寄存器地址常數(shù);

我們可以這樣定義AT89C51的P1口

sfrP1=0x90; //定義P1I/O口,其地址90H

sfr16T2=0xCC;

//這里定義8052定時(shí)器2,地址為T(mén)2L=CCH,T2H=CDH8、sfr1616位特殊功能寄存器sfr16占用兩個(gè)內(nèi)存單說(shuō)明:sfr關(guān)鍵字后面是一個(gè)要定義的名字,可任意選取,但要符合標(biāo)識(shí)符的命名規(guī)則,最好有一定的含義,如P1口可以用P1。等號(hào)后面必須是常數(shù)(特殊寄存器直接地址),不允許有帶運(yùn)算符的表達(dá)式,而且該常數(shù)必須在特殊功能寄存器的地址范圍之內(nèi)(80H-FFH),具體可查看教材8051內(nèi)部RAM地址表。用sfr16定義16位特殊功能寄存器時(shí),等號(hào)后面是它的低位地址,高位地址一定要位于物理低位地址之上。注意:該方法不能用于定時(shí)器0和1的定義。

說(shuō)明:sfr關(guān)鍵字后面是一個(gè)要定義的名字,可任意選取,但要符9、sbitsbit是C51中的一種擴(kuò)充數(shù)據(jù)類(lèi)型,利用它可以訪問(wèn)芯片內(nèi)部的RAM中的可尋址位或特殊功能寄存器中的可尋址位。如要訪問(wèn)P1.1,定義方法有三:

(1)sbit位變量名=位地址

sbitP1_1=0x91; //把位的絕對(duì)地址賦給位變量。 同sfr一樣sbit的位地址必須位于80H-FFH之間。

(2)Sbit位變量名=特殊功能寄存器名^位位置

sfrP1=0x90;

sbitP1_1=P1^1;

當(dāng)可尋址位位于特殊功能寄存器中時(shí)可采用這種方法

(3)sbit位變量名=字節(jié)地址^位位置

sbitP1_1=0x90^1;9、sbitsbit是C51中的一種擴(kuò)充數(shù)據(jù)類(lèi)型,利用它可以這樣我們?cè)谝院蟮某绦蛘Z(yǔ)句中就可以用P1_1來(lái)對(duì)P1.1引腳進(jìn)行讀寫(xiě)操作了。通常這些可以直接使用系統(tǒng)提供的預(yù)處理文件,里面已定義好各特殊功能寄存器的簡(jiǎn)單名字。這種方法其實(shí)和匯編是一樣的,只是把特殊功能寄存器的位址符號(hào)化了。

學(xué)學(xué)練練:打開(kāi)例1-2項(xiàng)目中REG51.h頭文件查看各特殊寄存器的定義。這樣我們?cè)谝院蟮某绦蛘Z(yǔ)句中就可以用P1_1來(lái)對(duì)P1.1引腳進(jìn)五、常量和變量 常量是在程序運(yùn)行過(guò)程中不能改變值的量,常量的數(shù)據(jù)類(lèi)型有整型、浮點(diǎn)型、字符型、字符串型和位標(biāo)量。

1.整型常量可以表示為十進(jìn)制如123,0,-89等。十六進(jìn)制則以0x開(kāi)頭如0x34,-0x3B等。長(zhǎng)整型就在數(shù)字后面加字母L,如104L,034L,0xF340等。

2.浮點(diǎn)型常量可分為十進(jìn)制和指數(shù)表示形式。十進(jìn)制由數(shù)字和小數(shù)點(diǎn)組成,如0.888,3345.345,0.0等,整數(shù)或小數(shù)部分為0,可以省略但必須有小數(shù)點(diǎn)。指數(shù)表示形式為[±]數(shù)字[.數(shù)字]e[±]數(shù)字,[]中的內(nèi)容為可選項(xiàng),其中內(nèi)容根據(jù)具體情況可有可無(wú),但其余部分必須有,如125e3,7e9,-3.0e-3。五、常量和變量 常量是在程序運(yùn)行過(guò)程中不能改變值的量,常量的3.字符型常量是單引號(hào)內(nèi)的字符,如‘a(chǎn)’,‘d’等,不可以顯示的控制字符,可以在該字符前面加一個(gè)反斜杠“\”組成專(zhuān)用轉(zhuǎn)義字符。4.字符串型常量由雙引號(hào)內(nèi)的字符組成,如“test”,“OK”等。當(dāng)引號(hào)內(nèi)的沒(méi)有字符時(shí),為空字符串。在使用特殊字符時(shí)同樣要使用轉(zhuǎn)義字符如雙引號(hào)。在C中字符串常量是做為字符類(lèi)型數(shù)組來(lái)處理的,在存儲(chǔ)字符串時(shí)系統(tǒng)會(huì)在字符串尾部加上\o轉(zhuǎn)義字符以作為該字符串的結(jié)束符。字符串常量“A”和字符常量‘A’是不同的,前者在存儲(chǔ)時(shí)多占用一個(gè)字節(jié)的字間。5.位標(biāo)量,它的值是一個(gè)二進(jìn)制。3.字符型常量是單引號(hào)內(nèi)的字符,如‘a(chǎn)’,‘d’等,不可以常量可用在不必改變值的場(chǎng)合,如固定的數(shù)據(jù)表,字庫(kù)等。常量的定義方式有幾種,下面來(lái)加以說(shuō)明。 #defineFalse0x0;//用預(yù)定義語(yǔ)句可以定義常量

#defineTrue0x1;//這里定義False為0,True為1 在程序中用到False編譯時(shí)自動(dòng)用0替換,同理True替換為1

unsignedintcodea=100;//這一句用code把a(bǔ)定義在程序存儲(chǔ)器中并賦值 constunsignedintc=100;//用const定義c為無(wú)符號(hào)int常量并賦值

以上兩句它們的值都保存在程序存儲(chǔ)器中,而程序存儲(chǔ)器在運(yùn)行中是不允許被修改的,所以如果在這兩句后面用了類(lèi)似a=110,a++這樣的賦值語(yǔ)句,編譯時(shí)將會(huì)出錯(cuò)。

學(xué)學(xué)練練:例1-3:用用戶板2硬件仿真,看運(yùn)行效果常量可用在不必改變值的場(chǎng)合,如固定的數(shù)據(jù)表,字庫(kù)等。常量的定例1-3#include<REG51.H> //預(yù)處理文件里面定義了特殊寄存器的名稱如P1口定義為P1

voidmain(void){

//定義花樣數(shù)據(jù)

constunsignedchardesign[32]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,

0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,

0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x0,

0xE7,0xDB,0xBD,0x7E,0xFF};

unsignedinta; //定義循環(huán)用的變量

unsignedcharb; //在C51編程中因內(nèi)存有限盡可能注意變量類(lèi)型的使用

//盡可能使用少字節(jié)的類(lèi)型,在大型的程序中很受用

do{

for(b=0;b<32;b++)

{

for(a=0;a<30000;a++); //延時(shí)一段時(shí)間

P1=design[b]; //讀已定義的花樣數(shù)據(jù)并寫(xiě)花樣數(shù)據(jù)到P1口

}

}while(1);}例1-3思考:上述用常量數(shù)組實(shí)現(xiàn)顯示效果的方式,對(duì)應(yīng)在匯編中應(yīng)該是如何實(shí)現(xiàn)的?如要改變顯示效果,如流水燈從中間向兩側(cè)擴(kuò)散,或兩側(cè)向中間移動(dòng),程序該如何修改。思考:上述用常量數(shù)組實(shí)現(xiàn)顯示效果的方式,對(duì)應(yīng)在匯編中應(yīng)該是如變量變量就是一種在程序執(zhí)行過(guò)程中其值能不斷變化的量。變量必須先定義后使用標(biāo)準(zhǔn)C定義一個(gè)變量的格式如下:[存儲(chǔ)種類(lèi)]數(shù)據(jù)類(lèi)型變量名表如autointa;//存儲(chǔ)種類(lèi)分:auto,static,register,extern

C51定義一個(gè)變量的格式如下:[存儲(chǔ)種類(lèi)]數(shù)據(jù)類(lèi)型[存儲(chǔ)器類(lèi)型]變量名表

可選必選可選必選存儲(chǔ)器類(lèi)型的說(shuō)明就是指定該變量在C51硬件系統(tǒng)中所使用的存儲(chǔ)區(qū)域,并在編譯時(shí)準(zhǔn)確的定位。變量變量就是一種在程序執(zhí)行過(guò)程中其值能不斷變化的量。變量必須注意:AT89C51芯片中RAM只有低128字節(jié),位于80H到FFH的高128字節(jié)則在52芯片中才有用,并和特殊寄存器地址重疊。(見(jiàn)下表)如果省略存儲(chǔ)器類(lèi)型,系統(tǒng)則會(huì)按編譯模式SMALL,COMPACT或LARGE所規(guī)定的默認(rèn)存儲(chǔ)器類(lèi)型去指定變量的存儲(chǔ)區(qū)域。無(wú)論什么存儲(chǔ)模式都可以聲明變量在任何的8051存儲(chǔ)區(qū)范圍,然而把最常用的命令如循環(huán)計(jì)數(shù)器和隊(duì)列索引放在內(nèi)部數(shù)據(jù)區(qū)可以顯著的提高系統(tǒng)性能。變量的存儲(chǔ)種類(lèi)與存儲(chǔ)器類(lèi)型是完全無(wú)關(guān)的。注意:存儲(chǔ)器類(lèi)型說(shuō)明data直接訪問(wèn)內(nèi)部數(shù)據(jù)存儲(chǔ)器(128字節(jié)),訪問(wèn)速度最快bdata可位尋址內(nèi)部數(shù)據(jù)存儲(chǔ)器(16字節(jié)),允許位與字節(jié)混合訪問(wèn)idata間接訪問(wèn)內(nèi)部數(shù)據(jù)存儲(chǔ)器(256字節(jié)),允許訪問(wèn)全部?jī)?nèi)部地址pdata分頁(yè)訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器(256字節(jié)),用MOVX@Ri指令訪問(wèn)xdata外部數(shù)據(jù)存儲(chǔ)器(64KB),用MOVX@DPTR指令訪問(wèn)code程序存儲(chǔ)器(64KB),用MOVC@A+DPTR指令訪問(wèn)存儲(chǔ)器類(lèi)型說(shuō)明data直接訪問(wèn)內(nèi)部數(shù)據(jù)存儲(chǔ)器(128字節(jié))SMALL存儲(chǔ)模式

所有缺省變量參數(shù)均裝入內(nèi)部RAM(與使用顯式的data關(guān)鍵字來(lái)定義結(jié)果相同)。使用該模式的優(yōu)點(diǎn)是訪問(wèn)速度快,缺點(diǎn)是空間有限,而且分配給堆棧的空間比較少,遇到函數(shù)嵌套調(diào)用和函數(shù)遞歸調(diào)用時(shí)必須小心,該模式適用于較小的程序。SMALL存儲(chǔ)模式所有缺省變量參數(shù)均裝入內(nèi)部RCOMPACT存儲(chǔ)模式

所有缺省變量均位于外部RAM區(qū)的一頁(yè)(與使用顯式的pdata關(guān)鍵字來(lái)定義結(jié)果相同),最多能夠定義256字節(jié)變量。使用該模式的優(yōu)點(diǎn)是變量定義空間比SMALL模式大,但運(yùn)行速度比SMALL模式慢。使用本模式時(shí),程序通過(guò)@R0和@R1來(lái)訪問(wèn)變量。COMPACT存儲(chǔ)模式所有缺省變量均位于外部RLARGE存儲(chǔ)模式所有缺省變量可放在多達(dá)64K字節(jié)的外部RAM區(qū)(與使用顯式的xdata關(guān)鍵字來(lái)定義結(jié)果相同),均使用數(shù)據(jù)指針DPTR來(lái)尋址。該模式的優(yōu)點(diǎn)是空間大,可定義變量多,缺點(diǎn)是速度較慢,一般用于較大的程序,或擴(kuò)展了大容量外部RAM的系統(tǒng)中。LARGE存儲(chǔ)模式所有缺省變量可放在多達(dá)64存儲(chǔ)模式?jīng)Q定了變量的默認(rèn)存儲(chǔ)類(lèi)型、參數(shù)傳遞區(qū)和無(wú)明確存儲(chǔ)類(lèi)型的說(shuō)明。例如: 若定義chars,在SMALL存儲(chǔ)模式下,s被定位在DATA存儲(chǔ)區(qū);在COMPACT存儲(chǔ)模式下,s被定位在pDATA存儲(chǔ)區(qū);在LARGE存儲(chǔ)模式下,s被定位在XDATA存儲(chǔ)區(qū)。存儲(chǔ)模式?jīng)Q定了變量的默認(rèn)存儲(chǔ)類(lèi)型、參數(shù)傳遞區(qū)和無(wú)明確在C51存儲(chǔ)器類(lèi)型中提供有一個(gè)bdata的存儲(chǔ)器類(lèi)型,這個(gè)是指可位尋址的數(shù)據(jù)存儲(chǔ)器,位于單片機(jī)的可位尋址區(qū)中??梢詫⒁罂晌粚ぶ返臄?shù)據(jù)定義為bdata,如:

unsignedcharbdataib;//在可位尋址區(qū)定義unsignedchar類(lèi)型的變量ib

intbdataab[2];//在可位尋址區(qū)定義數(shù)組ab[2],sbitib7=ib^7//用關(guān)鍵字sbit定義位變量來(lái)獨(dú)立訪問(wèn)可尋址位對(duì)象的其中一位

sbitab12=ab[1]^12;

注意:操作符"^"后面的位位置的最大值取決于指定的基址類(lèi)型,char0-7,int0-15,long0-31。在C51存儲(chǔ)器類(lèi)型中提供有一個(gè)bdata的存儲(chǔ)器類(lèi)型,這個(gè)是外部RAM與擴(kuò)展I/O地址的C51定義MCS-51單片機(jī)擴(kuò)展外部I/O口采用與片外RAM相同的尋址方法,所有擴(kuò)展的I/O口以及通過(guò)擴(kuò)展I/O口連接的外設(shè)都與片外RAM統(tǒng)一編址,在匯編語(yǔ)言程序設(shè)計(jì)中,使用以下指令訪問(wèn)外部I/O口地址:MOVX@DPTR,A;尋址外部64K字節(jié)地址范圍0000H~FFFFHMOVX A,@DPTRMOVX @Ri,A;尋址低256字節(jié)地址范圍00H~FFHMOVX A,@Ri外部RAM與擴(kuò)展I/O地址的C51定義而在C51程序設(shè)計(jì)中,如何定義外部RAM和擴(kuò)展I/O口的地址呢?首先在程序中必須包含“absacc.h”絕對(duì)地址訪問(wèn)頭文件,然后用關(guān)鍵字XBYTE來(lái)定義I/O口地址或外部RAM地址。

#include“absacc.h"在絕對(duì)地址訪問(wèn)頭文件absacc.h中,定義了MCS-51單片機(jī)所有存儲(chǔ)區(qū)域的絕對(duì)地址訪問(wèn)關(guān)鍵字CBYTE、DBYTE、PBYTE和XBYTE,可以對(duì)相應(yīng)的存儲(chǔ)區(qū)域的絕對(duì)地址進(jìn)行字節(jié)尋址。其中包括,CBYTE尋址CODE區(qū),DBYTE尋址DATA區(qū),PBYTE尋址分頁(yè)XDATA區(qū)(低256字節(jié)),XBYTE尋址XDATA區(qū)。如果要訪問(wèn)外部數(shù)據(jù)存儲(chǔ)區(qū)域0x2000處的內(nèi)容,可以使用如下語(yǔ)句:unsignedcharval;val=XBYTE[0x2000];而在C51程序設(shè)計(jì)中,如何定義外部RAM和擴(kuò)展I例1-4//向串口(波特率為2400)不斷發(fā)送Hi,可用串口調(diào)試窗口查看#include"absacc.h"http://#include<reg51.H>;沒(méi)用聲明文件sfrSCON=0X98;sfrTMOD=0X89;sfrTH1=0X8D;sfrTL1=0X8B;sfrSBUF=0X99;sbitTR1=0X8E;sbitTI=SCON^1;sbitSM2=SCON^5;#defineBUFXBYTE[0X1000]//外RAM絕對(duì)地址聲明#defineBUF1XBYTE[0X1001]#defineBUF2XBYTE[0X1002]main(){unsignedchar*p=&BUF,*q;BUF='H';BUF1='i';BUF2='\0';SCON=0X50;TMOD=0X20;TH1=0Xf4;TL1=0Xf4;TR1=1;;串口初始化while(1){ q=p; while(*q!='\0'){ SBUF=*q; q++; while(!TI); TI=0; } }}例1-4//向串口(波特率為2400)不斷發(fā)送Hi,可用串口四、運(yùn)算符和表達(dá)式賦值運(yùn)算符=

變量=表達(dá)式;a=0xFF;//將常數(shù)十六進(jìn)制數(shù)FF賦于變量a

b=c=33;//同時(shí)賦值給變量b,c

d=e;//將變量e的值賦于變量d

f=a+b;//將變量a+b的值賦于變量f

注意:=和==的區(qū)別四、運(yùn)算符和表達(dá)式賦值運(yùn)算符=

變量=表達(dá)式;算術(shù),增減量運(yùn)算符+加或取正值運(yùn)算符

-減或取負(fù)值運(yùn)算符

*乘運(yùn)算符

/除運(yùn)算符

%取余運(yùn)算符

除法運(yùn)算符和一般的算術(shù)運(yùn)算規(guī)則有所不同,如是兩浮點(diǎn)數(shù)相除,其結(jié)果為浮點(diǎn)數(shù),如10.0/20.0所得值為0.5,而兩個(gè)整數(shù)相除時(shí),所得值就是整數(shù),如7/3,值為2。關(guān)于優(yōu)先級(jí)和結(jié)合性,查看相關(guān)教材。算術(shù),增減量運(yùn)算符+加或取正值運(yùn)算符

-減或取負(fù)值關(guān)系運(yùn)算符 >大于

<小于

>=大于等于

<=小于等于

==等于

!=等于

前四個(gè)具有相同的優(yōu)先級(jí),后兩個(gè)也具有相同的優(yōu)先級(jí),但是前四個(gè)的優(yōu)先級(jí)要高于后2個(gè)的。關(guān)系運(yùn)算符 >大于

<小于

>=大于等于

<=小于等 關(guān)系表達(dá)式通常是用來(lái)判別某個(gè)條件是否滿足。要注意的是用關(guān)系運(yùn)算符的運(yùn)算結(jié)果只有0和1兩種,也就是邏輯的真與假,當(dāng)指定的條件滿足時(shí)結(jié)果為1,不滿足時(shí)結(jié)果為0。

表達(dá)式1關(guān)系運(yùn)算符表達(dá)式2

如:I<J,I==J,(I=4)>(J=3),J+I>J

學(xué)學(xué)練練:用KEIL軟件仿真下列程序,打開(kāi)P1,P2口,運(yùn)行時(shí)不斷改變兩口的值,看串口輸出結(jié)果。 關(guān)系表達(dá)式通常是用來(lái)判別某個(gè)條件是否滿足。要注意的是用關(guān)系例1-5#include<REG51.H>#include<stdio.h>voidmain(void){intx,y;SCON=0x50;//串口方式1,允許接收TMOD=0x20;//定時(shí)器1定時(shí)方式2TH1=0xE8;//11.0592,1200波特率TL1=0xE8;TI=1;TR1=1;//啟動(dòng)定時(shí)器while(1)

{x=P1;y=P2;

if(x<y)

printf("X<Y\n");//當(dāng)X小于Y時(shí)

else//當(dāng)X不小于Y時(shí)再作判斷

{

if(x==y)

printf("X=Y\n");//當(dāng)X等于Y時(shí)

else

printf("X>Y\n");//當(dāng)X大于Y時(shí)

}

}

}例1-5#include<REG51.H>while(1位運(yùn)算符C51完全支持按位運(yùn)算符,這與匯編語(yǔ)言的位操作有些相似。

操作符

作用

────────────────────────────

&

位邏輯與

|

位邏輯或

^

位邏輯異或

-

位邏輯反

>>

右移

<<

左移如:unsignedchara=1;a=a<<1;//將a的內(nèi)容左移1位,右補(bǔ)0按位運(yùn)算是對(duì)字節(jié)或字中的實(shí)際位進(jìn)行檢測(cè)、設(shè)置或移位,它只適用于字符型和整數(shù)型變量以及它們的變體,對(duì)其它數(shù)據(jù)類(lèi)型

不適用。位運(yùn)算符C51完全支持按位運(yùn)算符,這與匯編語(yǔ)言的位操作有些相注意&

、&&

的區(qū)別>>為右移,高端添0<<為左移,低端添0而在匯編中,移位均為循環(huán)移位注意&

、&&

的區(qū)別#include“reg51.h”delay();main(){inti,w; while(1){w=0x01; //燈的位置初值為01hfor(i=0;i<8;i++){P1=~w; //循環(huán)點(diǎn)亮燈w<<=1; //點(diǎn)亮燈的位置移動(dòng)delay(); //調(diào)用延時(shí)}}}例1-6delay()//延時(shí)函數(shù){unsignedchari,j;for(i=0;i<200;i++)for(j=0;j<250;j++);}#include“reg51.h”例1-6delay() 由于單片機(jī)C語(yǔ)言程序和單片機(jī)硬件緊密相關(guān),因此會(huì)用到大量的位運(yùn)算或邏輯運(yùn)算。為了使亮燈的順序移動(dòng),采用了取反和左移操作,具體操作如下: 初值: w=0x01;w:00000001(初值)

P1=~w;11111110 (“1”使相應(yīng)燈熄滅,“0”使相應(yīng)燈點(diǎn)亮)

W<<=1;00000010(左移一位)思考:如果將該程序中初值直接寫(xiě)成:“11111110”,應(yīng)該如何修改程序? 由于單片機(jī)C語(yǔ)言程序和單片機(jī)硬件緊密相關(guān),因此會(huì)用到大量的復(fù)合賦值運(yùn)算符

復(fù)合賦值運(yùn)算符就是在賦值運(yùn)算符“=”的前面加上其他運(yùn)算符。以下是C語(yǔ)言中的復(fù)合賦值運(yùn)算符:

+=加法賦值 >>=右移位賦值

-=減法賦值 &=邏輯與賦值

*=乘法賦值 |=邏輯或賦值

/=除法賦值 ^=邏輯異或賦值

%=取模賦值 -=邏輯非賦值

<<=左移位賦值

注意:采用復(fù)合賦值運(yùn)算符會(huì)降低程序的可讀性,但這樣卻可以使程序代碼簡(jiǎn)單化。復(fù)合賦值運(yùn)算符逗號(hào)運(yùn)算符表達(dá)式1,表達(dá)式2,表達(dá)式3……表達(dá)式n注意:整個(gè)逗號(hào)表達(dá)式的值為最后一個(gè)表達(dá)式的值指針和地址運(yùn)算符

*取內(nèi)容

&取地址例: inta,*p; p=&a; *p=5; //和a=5等價(jià)逗號(hào)運(yùn)算符表達(dá)式1,表達(dá)式2,表達(dá)式3……表達(dá)式n五、C程序的基本結(jié)構(gòu)C51的程序結(jié)構(gòu)同ANSIC語(yǔ)言相同。C語(yǔ)言是一種結(jié)構(gòu)化編程語(yǔ)言。結(jié)構(gòu)化程序由若干模塊組成,每個(gè)模塊中包含著若干個(gè)基本結(jié)構(gòu),而每個(gè)基本結(jié)構(gòu)中有若干條語(yǔ)句。

C語(yǔ)言有3種基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。五、C程序的基本結(jié)構(gòu)C51的程序結(jié)構(gòu)同ANSIC順序結(jié)構(gòu)、選擇結(jié)構(gòu)順序結(jié)構(gòu)是一種最基本、最簡(jiǎn)單的程序結(jié)構(gòu),程序由低地址到高地址順序執(zhí)行程序代碼。選擇結(jié)構(gòu)也稱為分支結(jié)構(gòu),根據(jù)條件測(cè)試結(jié)果選擇不同的程序執(zhí)行方向,常用的選擇語(yǔ)句有:if語(yǔ)句,switch語(yǔ)句。

if語(yǔ)句在單片機(jī)中,經(jīng)常用到對(duì)位的檢測(cè),如:if(TF0){TF0=0;TH0=ox3c;TL0=0xb0;}順序結(jié)構(gòu)、選擇結(jié)構(gòu)順序結(jié)構(gòu)是一種最基本、最簡(jiǎn)單的程C語(yǔ)言提供了3種形式的條件語(yǔ)句:

1:if(條件表達(dá)式)語(yǔ)句

當(dāng)條件表達(dá)式的結(jié)果為真時(shí),就執(zhí)行語(yǔ)句,否則就跳過(guò)。

如if(a==b)a++;當(dāng)a等于b時(shí),a就加12:if(條件表達(dá)式)語(yǔ)句1

else語(yǔ)句2

當(dāng)條件表達(dá)式成立時(shí),就執(zhí)行語(yǔ)句1,否則就執(zhí)行語(yǔ)句2

如if(a==b)

a++;

else

a--;

當(dāng)a等于b時(shí),a加1,否則a-1。3:if(條件表達(dá)式1)語(yǔ)句1

elseif(條件表達(dá)式2)語(yǔ)句2

elseif(條件表達(dá)式3)語(yǔ)句3

elseif(條件表達(dá)式m)語(yǔ)句n

else語(yǔ)句m

這是由ifelse語(yǔ)句組成的嵌套,用來(lái)實(shí)現(xiàn)多方向條件分支,使用時(shí)因注意if和else的配對(duì)使用,要是少了一個(gè)就會(huì)語(yǔ)法出錯(cuò),記住else總是與最臨近的if相配對(duì)。C語(yǔ)言提供了3種形式的條件語(yǔ)句:

Switch語(yǔ)句 用多個(gè)條件語(yǔ)句可以實(shí)現(xiàn)多方向條件分支,但是可以發(fā)現(xiàn)使用過(guò)多的條件語(yǔ)句實(shí)現(xiàn)多方向分支會(huì)使條件語(yǔ)句嵌套過(guò)多,程序冗長(zhǎng),這樣讀起來(lái)也很不好讀。這時(shí)使用開(kāi)關(guān)語(yǔ)句同樣可以達(dá)到處理多分支選擇的目的,又可以使程序結(jié)構(gòu)清晰。它的語(yǔ)法為下:

switch(表達(dá)式)

{

case常量表達(dá)式1:語(yǔ)句1;break;

case常量表達(dá)式2:語(yǔ)句2;break;

case常量表達(dá)式3:語(yǔ)句3;break;

case常量表達(dá)式n:語(yǔ)句n;break;

default:語(yǔ)句

}

運(yùn)行中switch后面的表達(dá)式的值將會(huì)做為條件,與case后面的各個(gè)常量表達(dá)式的值相對(duì)比,如果相等時(shí)則執(zhí)行后面的語(yǔ)句,再執(zhí)行break(間斷語(yǔ)句)語(yǔ)句,跳出switch語(yǔ)句。如果case沒(méi)有和條件相等的值時(shí)就執(zhí)行default后的語(yǔ)句。當(dāng)要求沒(méi)有符合的條件時(shí)不做任何處理,則可以不寫(xiě)default語(yǔ)句。Switch語(yǔ)句循環(huán)結(jié)構(gòu) 循環(huán)結(jié)構(gòu)是指重復(fù)執(zhí)行某一程序段的程序結(jié)構(gòu),是選擇結(jié)構(gòu)的一種特殊情形,程序設(shè)計(jì)中使用非常廣泛。C語(yǔ)言中用于循環(huán)的語(yǔ)句有:while,dowhile,for語(yǔ)句。在C51中,通常的用途有:(1)單片機(jī)控制程序的主程序,即main函數(shù)中都有一個(gè)后臺(tái)無(wú)限循環(huán)語(yǔ)句,結(jié)構(gòu)如下:main(){...... //初始化部分while(1){ //無(wú)限循環(huán)

}}循環(huán)結(jié)構(gòu) 循環(huán)結(jié)構(gòu)是指重復(fù)執(zhí)行某一程序段的程序結(jié)構(gòu),是選擇結(jié)(2)延時(shí)程序:while,for構(gòu)成的循環(huán)語(yǔ)句后面加一個(gè)分號(hào),形成一個(gè)不執(zhí)行其它操作的空循環(huán)體。如for(a=0;a<50000;a++);當(dāng)延時(shí)時(shí)間較長(zhǎng)時(shí),也可采用雙重循環(huán)的結(jié)構(gòu):delay(intt) //延時(shí)函數(shù){inti,j;for(i=0;i<t;i++)for(j=0;j<10;j++);}(2)延時(shí)程序:while,for構(gòu)成的循環(huán)語(yǔ)句后面加一個(gè)分 在上面的雙重循環(huán)結(jié)構(gòu)中,循環(huán)體是空的,表示什么都不做,僅用于延時(shí)的功能。(3)等待(鍵盤(pán)或其他)事件發(fā)生。如P3接有鍵盤(pán)當(dāng)S0按下時(shí),P1.0口燈亮 while(P3_0); P1_0=0;(4)其他需重復(fù)執(zhí)行的操作,如顯示程序等. 在上面的雙重循環(huán)結(jié)構(gòu)中,循環(huán)體是空的,表示什么都不做,僅用六、函數(shù) 函數(shù)是C語(yǔ)言程序的組成部分,C語(yǔ)言程序的功能可以通過(guò)函數(shù)之間的調(diào)用來(lái)實(shí)現(xiàn)。 C語(yǔ)言函數(shù)分為兩類(lèi):

1、標(biāo)準(zhǔn)函數(shù):系統(tǒng)提供的已設(shè)計(jì)好的函數(shù)。 標(biāo)準(zhǔn)庫(kù)函數(shù)中的每個(gè)函數(shù)都在相應(yīng)的頭文件(.h)中有原型聲明,因此如果程序中使用了哪個(gè)庫(kù)函數(shù),在程序開(kāi)頭必須包含相應(yīng)的“.h”頭文件。如常用的頭文件:#include"reg51.h" //MCS-51寄存器符號(hào)定義#include"absacc.h" //絕對(duì)地址訪問(wèn)#include“ctype.h” //字符函數(shù)#include“stdlib.h” //標(biāo)準(zhǔn)函數(shù)#include“math.h” //數(shù)學(xué)函數(shù)#include“stdio.h” //一般I/O函數(shù)六、函數(shù) 函數(shù)是C語(yǔ)言程序的組成部分,C語(yǔ)言程序的功能可以通 2、用戶定義的函數(shù):用戶自己編寫(xiě)的用來(lái)解決具體問(wèn)題的函數(shù)。函數(shù)調(diào)用方式(1)函數(shù)語(yǔ)句。把函數(shù)調(diào)用作為一個(gè)語(yǔ)句。例如:display();這時(shí)不要求函數(shù)帶回值,只要求函數(shù)完成一定的操作。(2)函數(shù)表達(dá)式。函數(shù)出現(xiàn)在一表達(dá)式中,這種表達(dá)式稱為函數(shù)表達(dá)式。這時(shí)要求函數(shù)帶回一個(gè)確定的值以參加表達(dá)式的計(jì)算。 例如:C=2*max(a,b);(3)函數(shù)參數(shù)。函數(shù)調(diào)用作為一個(gè)函數(shù)的實(shí)參。 例如:M=max(a,max(a,b)); 2、用戶定義的函數(shù):用戶自己編寫(xiě)的用來(lái)解決具體問(wèn)題的函數(shù)。 標(biāo)準(zhǔn)庫(kù)函數(shù)的類(lèi)型選擇考慮到了MCS-51系列單片機(jī)的結(jié)構(gòu)特性,因此和ANSIC語(yǔ)言中的參數(shù)與格式有所不同。在C51標(biāo)準(zhǔn)函數(shù)中,盡可能使用最小的數(shù)據(jù)類(lèi)型以最大程度地發(fā)揮程序的性能及減小程序的長(zhǎng)度。如果用bit,則足已引出結(jié)果,就不要采用較大的數(shù)據(jù)類(lèi)型如char、int或long等,也可以進(jìn)一步采用unsigned類(lèi)型來(lái)提高程序性能。 所有標(biāo)準(zhǔn)庫(kù)函數(shù)都獨(dú)立于寄存器組,因此,所有函數(shù)都能和任何特定寄存器組一起工作。 標(biāo)準(zhǔn)庫(kù)函數(shù)的類(lèi)型選擇考慮到了MCS-51系列單片C51函數(shù)的參數(shù)傳遞規(guī)則

參數(shù)傳遞的寄存器選擇函數(shù)返回值的寄存器返回值

bit

unsignedchar

unsignedint

unsignedlong

float

指針

寄存器

CARRY-FLAG

R7

R6,R7

R4~R7

R4~R7

R1~R3

參數(shù)類(lèi)型

char

1字節(jié)ptr

int

2字節(jié)ptr

long

float

一般指針

1個(gè)參數(shù)

R7

R6,R7

R4~R7

R1~R3

2個(gè)參數(shù)

R5

R4,R5

R4~R7

R1~R3

3個(gè)參數(shù)

R3

R2,R3

無(wú)

R1~R3

C51函數(shù)的參數(shù)傳遞規(guī)則函數(shù)返回值的寄存器返回值bit例子:func1(inta); //整型數(shù)據(jù)a在R6和R7中傳遞func2(intb,intc,int*d); //b和c分別在R6R7和R5R4中傳遞,d在R1R2R3中傳遞_transmit(unsignedcharc);//c在R7中傳遞unsignedcharreceive(void);//返回值應(yīng)放在R7中例子:func1(inta); //整型數(shù)據(jù)a在R例1-7

按鈕監(jiān)控:用軟件仿真,設(shè)P3口為按鈕,在P1口實(shí)現(xiàn)如下功能: P3.1 P3.0 0 0全亮

0 1左移

1 0右移

1 1全滅例1-7

按鈕監(jiān)控:用軟件仿真,設(shè)P3口為按鈕,在P1口實(shí)#include<REG51.H>

voidmain(void){unsignedchart,a,i;while(1){t=P3&0x3;if(t==0)P1=0;elseif(t==1)left();elseif(t==2) right(); elseP1=0xff;}}delay(){unsignedchara,b;a=255;while(a--){b=255; while(b--); }}#include<REG51.H>delay()left(){unsignedchari=8,a=1; while(i--) {P1=~a; a=a<<1; delay();}}right(){unsignedchari=8,a=0x80; while(i--) {P1=~a; a=a>>1; delay(); }}left()right()實(shí)訓(xùn)1C程序設(shè)計(jì)1、從左到右流水燈程序:要求兩種方法實(shí)現(xiàn)(移位法,查表法,延時(shí)時(shí)間根據(jù)實(shí)際顯示效果調(diào)整。)。2、按鈕監(jiān)控:用軟件仿真,設(shè)P3口為按鈕,在P1口實(shí)現(xiàn)如下功能: P3.3P3.2 00全亮

01兩兩從中間向外

10兩兩從外向中間 11全滅

實(shí)訓(xùn)1C程序設(shè)計(jì)1、從左到右流水燈程序:要求兩種方法實(shí)《單片機(jī)應(yīng)用系統(tǒng)》江陰職業(yè)技術(shù)學(xué)院電子工程系包軍衛(wèi)邱玉娟《單片機(jī)應(yīng)用系統(tǒng)》江陰職業(yè)技術(shù)學(xué)院電子工程系66第1章C51語(yǔ)言基礎(chǔ)本章主要內(nèi)容一、C51概述二、數(shù)據(jù)類(lèi)型三、常量和變量四、運(yùn)算符和表達(dá)式五、C程序的基本結(jié)構(gòu)六、函數(shù)實(shí)訓(xùn)1C程序設(shè)計(jì)第1章C51語(yǔ)言基礎(chǔ)本章主要內(nèi)容一、C51概述

(一)C語(yǔ)言的特點(diǎn)C語(yǔ)言簡(jiǎn)潔、緊湊,使用方便、靈活。一共只有32個(gè)關(guān)鍵字運(yùn)算符豐富。共有34種。C把括號(hào)、賦值、逗號(hào)等都作為運(yùn)算符處理。從而使C的運(yùn)算類(lèi)型極為豐富,可以實(shí)現(xiàn)其他高級(jí)語(yǔ)言難以實(shí)現(xiàn)的運(yùn)算。數(shù)據(jù)結(jié)構(gòu)類(lèi)型豐富。具有結(jié)構(gòu)化的控制語(yǔ)句。語(yǔ)法限制不太嚴(yán)格,程序設(shè)計(jì)自由度大。生成目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高。與匯編語(yǔ)言相比,用C語(yǔ)言寫(xiě)的程序可移植性好C語(yǔ)言允許直接訪問(wèn)物理地址,能進(jìn)行位(bit)操作,能實(shí)現(xiàn)匯編語(yǔ)言的大部分功能,可以直接對(duì)硬件進(jìn)行操作。因此有人把它稱為中級(jí)語(yǔ)言。一、C51概述

(一)C語(yǔ)言的特點(diǎn)C語(yǔ)言簡(jiǎn)潔、緊湊,使用方(二)C51和匯編比較下面結(jié)合8051介紹單片機(jī)C語(yǔ)言的優(yōu)越性:不懂得單片機(jī)的指令集,也能夠編寫(xiě)完美的單片機(jī)程序;無(wú)須懂得單片機(jī)的具體硬件,也能夠編出符合硬件實(shí)際的專(zhuān)業(yè)水平的程序;不同函數(shù)的數(shù)據(jù)實(shí)行覆蓋,有效利用片上有限的RAM空間;程序具有堅(jiān)固性:數(shù)據(jù)被破壞是導(dǎo)致程序運(yùn)行異常的重要因素。C語(yǔ)言對(duì)數(shù)據(jù)進(jìn)行了許多專(zhuān)業(yè)性的處理,避免了運(yùn)行中間非異步的破壞;C語(yǔ)言提供復(fù)雜的數(shù)據(jù)類(lèi)型(數(shù)組、結(jié)構(gòu)、聯(lián)合、枚舉、指針等),極大地增強(qiáng)了程序處理能力和靈活性;(二)C51和匯編比較下面結(jié)合8051介紹單片機(jī)C語(yǔ)言的優(yōu)越提供auto、static、const等存儲(chǔ)類(lèi)型和專(zhuān)門(mén)針對(duì)8051單片機(jī)的data、idata、pdata、xdata、code等存儲(chǔ)類(lèi)型,自動(dòng)為變量合理地分配地址;提供small、compact、large等編譯模式,以適應(yīng)片上存儲(chǔ)器的大小;中斷服務(wù)程序的現(xiàn)場(chǎng)保護(hù)和恢復(fù),中斷向量表的填寫(xiě),是直接與單片機(jī)相關(guān)的,都由C編譯器代辦;提供常用的標(biāo)準(zhǔn)函數(shù)庫(kù),以供用戶直接使用;頭文件中定義宏、說(shuō)明復(fù)雜數(shù)據(jù)類(lèi)型和函數(shù)原型,有利于程序的移植和支持單片機(jī)的系列化產(chǎn)品的開(kāi)發(fā);有嚴(yán)格的句法檢查,錯(cuò)誤很少,可容易地在高級(jí)語(yǔ)言的水平上迅速地被排掉;可方便地接受多種實(shí)用程序的服務(wù):如片上資源的初始化有專(zhuān)門(mén)的實(shí)用程序自動(dòng)生成;再如,有實(shí)時(shí)多任務(wù)操作系統(tǒng)可調(diào)度多道任務(wù),簡(jiǎn)化用戶編程,提高運(yùn)行的安全性等等。提供auto、static、const等存儲(chǔ)類(lèi)型和專(zhuān)門(mén)針對(duì)8(三)KEILC上機(jī)步驟(1)建立項(xiàng)目。點(diǎn)擊Project菜單,選擇彈出的下拉式菜單中的NewProject,一個(gè)C程序項(xiàng)目名稱,的名稱,,只要符合Windows文件規(guī)則的文件名都行?!氨4妗焙蟮奈募U(kuò)展名為uv2,這是KEILuVision2項(xiàng)目文件擴(kuò)展名。(2)選擇單片機(jī)類(lèi)型,這里我們選擇常用的Ateml公司的AT89C51。(3)建立文件,編輯源文件,注意保存文件時(shí)后綴為.c(4)向項(xiàng)目中添加剛編輯的C文件。(5)編譯。如發(fā)現(xiàn)錯(cuò)誤根據(jù)輸出窗口的信息進(jìn)行修改。(6)全速運(yùn)行。此時(shí)打開(kāi)串行窗口,進(jìn)行觀察串行調(diào)試窗口中不斷的打出HelloWorld!"。學(xué)學(xué)練練:例1-1:(三)KEILC上機(jī)步驟例1-1 #include<REG51.H>

#include<stdio.h>

voidmain(void)

{

SCON=0x50; //串口方式1,允許接收

TMOD=0x20; //定時(shí)器1定時(shí)方式2

TCON=0x40; //設(shè)定時(shí)器1開(kāi)始計(jì)數(shù)

TH1=0xE8; //11.0592MHz1200波特率

TL1=0xE8;

TI=1;

TR1=1; //啟動(dòng)定時(shí)器

while(1)

{

printf("HelloWorld!\n");//顯示HelloWorld

}

}例1-1二、數(shù)據(jù)類(lèi)型C語(yǔ)言的標(biāo)識(shí)符和關(guān)鍵字在C51編譯器中,只支持標(biāo)識(shí)符的前32位為有效標(biāo)識(shí),故用戶標(biāo)識(shí)符不宜過(guò)長(zhǎng)。關(guān)鍵字則是編程語(yǔ)言保留的特殊標(biāo)識(shí)符,它們具有固定名稱和含義,在程序編寫(xiě)中不允許標(biāo)識(shí)符與關(guān)鍵字相同。在KEILuVision2中的關(guān)鍵字除了有ANSIC標(biāo)準(zhǔn)的32個(gè)關(guān)鍵字外還根據(jù)51單片機(jī)的特點(diǎn)擴(kuò)展了相關(guān)的關(guān)鍵字。表4-1,表中列出了KEILuVision2C51編譯器所支持的數(shù)據(jù)類(lèi)型。二、數(shù)據(jù)類(lèi)型C語(yǔ)言的標(biāo)識(shí)符和關(guān)鍵字?jǐn)?shù)據(jù)類(lèi)型長(zhǎng)度值域unsignedchar單字節(jié)0~255signedchar單字節(jié)-128~+127unsignedint雙字節(jié)0~65535signedint雙字節(jié)-32768~+32767unsignedlong四字節(jié)0~4294967295signedlong四字節(jié)-2147483648~+2147483647float四字節(jié)±1.175494E-38~±3.402823E+38*1~3字節(jié)對(duì)象的地址bit位0或1sfr單字節(jié)0~255sfr16雙字節(jié)0~65535sbit位0或1數(shù)據(jù)類(lèi)型長(zhǎng)度值域unsignedchar單字節(jié)0~25關(guān)鍵字用途說(shuō)明bit位標(biāo)量聲明聲明一個(gè)位標(biāo)量或位類(lèi)型的函數(shù)sbit位標(biāo)量聲明聲明一個(gè)可位尋址變量Sfr特殊功能寄存器聲明聲明一個(gè)特殊功能寄存器Sfr16特殊功能寄存器聲明聲明一個(gè)16位的特殊功能寄存器data存儲(chǔ)器類(lèi)型說(shuō)明直接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器bdata存儲(chǔ)器類(lèi)型說(shuō)明可位尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器idata存儲(chǔ)器類(lèi)型說(shuō)明間接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器pdata存儲(chǔ)器類(lèi)型說(shuō)明分頁(yè)尋址的外部數(shù)據(jù)存儲(chǔ)器xdata存儲(chǔ)器類(lèi)型說(shuō)明外部數(shù)據(jù)存儲(chǔ)器code存儲(chǔ)器類(lèi)型說(shuō)明程序存儲(chǔ)器interrupt中斷函數(shù)說(shuō)明定義一個(gè)中斷函數(shù)reentrant再入函數(shù)說(shuō)明定義一個(gè)再入函數(shù)using寄存器組定義定義芯片的工作寄存器關(guān)鍵字用途說(shuō)明bit位標(biāo)量聲明聲明一個(gè)位標(biāo)量或位類(lèi)型的函1.char字符類(lèi)型char類(lèi)型的長(zhǎng)度是一個(gè)字節(jié),通常用于定義處理字符數(shù)據(jù)的變量或常量,分無(wú)符號(hào)字符類(lèi)型unsignedchar表達(dá)的數(shù)值范圍是0~255有符號(hào)字符類(lèi)型signedchar,用字節(jié)中最高位字節(jié)表示數(shù)據(jù)的符號(hào),“0”表示正數(shù),“1”表示負(fù)數(shù),負(fù)數(shù)用補(bǔ)碼表示。所能表示的數(shù)值范圍是-128~+127。默認(rèn)值為signedchar類(lèi)型。unsignedchar常用于處理ASCII字符或用于處理小于或等于255的整型數(shù)。1.char字符類(lèi)型char類(lèi)型的長(zhǎng)度是一個(gè)字節(jié),通常用于2.int整型int整型長(zhǎng)度為兩個(gè)字節(jié),用于存放一個(gè)雙字節(jié)數(shù)據(jù)。分signedint,表示的數(shù)值范圍是-32768~32767,unsignedint,表示的數(shù)值范圍是0~65535。

默認(rèn)值為signedint類(lèi)型。在C51程序設(shè)計(jì)中,變量數(shù)據(jù)類(lèi)型的定義極其重要,因?yàn)樵谒袛?shù)據(jù)類(lèi)型中只有bit和unsignedchar兩種數(shù)據(jù)類(lèi)型可以直接支持機(jī)器指令,對(duì)于其他的數(shù)據(jù)類(lèi)型C51編譯器都要進(jìn)行一系列復(fù)雜的變量數(shù)據(jù)和變量類(lèi)型的處理,而這種處理將會(huì)對(duì)應(yīng)很長(zhǎng)一段機(jī)器指令,最終會(huì)使程序變得復(fù)雜、龐大,運(yùn)行速度降低。2.int整型int整型長(zhǎng)度為兩個(gè)字節(jié),用于存放一個(gè)雙字節(jié)由此可見(jiàn),在C51程序設(shè)計(jì)過(guò)程中,在滿足數(shù)據(jù)要求的情況下,應(yīng)盡可能使用unsignedchar變量和bit變量。signedchar變量雖然也只占用一個(gè)字節(jié),但需要進(jìn)行額外的操作來(lái)測(cè)試代碼的符號(hào)位,因此會(huì)降低代碼執(zhí)行效率。學(xué)學(xué)練練:例1-2:用用戶板2硬件仿真,看看unsignedchar和unsignedint用于延時(shí)的不同效果: 看P1口L0和L1發(fā)光二極管亮的時(shí)間。由此可見(jiàn),在C51程序設(shè)計(jì)過(guò)程中,在滿足數(shù)據(jù)要求的情況下,應(yīng)例1-2#include<reg51.h>//預(yù)處理命令sbitP1_0=P1^0;sbitP1_1=P1^1;voidmain(void)//主函數(shù)名

{

unsignedinta; //定義變量a為unsignedint類(lèi)型

unsignedcharb; //定義變量b為unsignedchar類(lèi)型

do{ //dowhile組成循環(huán)

for(a=0;a<65535;a++)

P1_0=0; //65535次設(shè)P1.0口為低電平,點(diǎn)亮LED

P1_0=1; //設(shè)P1.0口為高電平,熄滅LED

for(a=0;a<30000;a++);//空循環(huán)

for(b=0;b<255;b++)

P1_1=0; //255次設(shè)P1.1口為低電平,點(diǎn)亮LED

P1_1=1; //設(shè)P1.1口為高電平,熄滅LED

for(a=0;a<30000;a++); //空循環(huán)

}while(1);

}例1-23.long長(zhǎng)整型long長(zhǎng)整型長(zhǎng)度為四個(gè)字節(jié),用于存放一個(gè)四字節(jié)數(shù)據(jù)。分signedlong。表示的數(shù)值范圍是-2147483648~+2147483647,unsignedlong,表示的數(shù)值范圍是0~4294967295。

默認(rèn)值為signedlong3.long長(zhǎng)整型long長(zhǎng)整型長(zhǎng)度為四個(gè)字節(jié),用于存放一4.float浮點(diǎn)型

float浮點(diǎn)型在十進(jìn)制中具有7位有效數(shù)字,是符合IEEE-754標(biāo)準(zhǔn)的單精度浮點(diǎn)型數(shù)據(jù),占用四個(gè)字節(jié)。

5.*指針型

指針型本身就是一個(gè)變量,在這個(gè)變量中存放的指向另一個(gè)數(shù)據(jù)的地址。這個(gè)指針變量要占據(jù)一定的內(nèi)存單元,對(duì)不同的處理器長(zhǎng)度也不盡相同,在C51中它的長(zhǎng)度一般為1~3個(gè)字節(jié)。指針變量也具有類(lèi)型。6.bit位標(biāo)量

bit位標(biāo)量是C51編譯器的一種擴(kuò)充數(shù)據(jù)類(lèi)型,利用它可定義一個(gè)位標(biāo)量,但不能定義位指針,也不能定義位數(shù)組。它的值是一個(gè)二進(jìn)制位,不是0就是1,類(lèi)似一些高級(jí)語(yǔ)言中的Boolean類(lèi)型中的True和False。4.float浮點(diǎn)型

float浮點(diǎn)型在十進(jìn)制中具有7位有變量數(shù)據(jù)類(lèi)型的選擇在C51程序設(shè)計(jì)中,變量數(shù)據(jù)類(lèi)型的定義極其重要,因?yàn)樵谒袛?shù)據(jù)類(lèi)型中只有bit和unsignedchar兩種數(shù)據(jù)類(lèi)型可以直接支持機(jī)器指令,對(duì)于其他的數(shù)據(jù)類(lèi)型C51編譯器都要進(jìn)行一系列復(fù)雜的變量數(shù)據(jù)和變量類(lèi)型的處理,而這種處理將會(huì)對(duì)應(yīng)很長(zhǎng)一段機(jī)器指令,最終會(huì)使程序變得復(fù)雜、龐大,運(yùn)行速度降低。由此可見(jiàn),在C51程序設(shè)計(jì)過(guò)程中,在滿足數(shù)據(jù)要求的情況下,應(yīng)盡可能使用unsignedchar變量和bit變量。signedchar變量雖然也只占用一個(gè)字節(jié),但需要進(jìn)行額外的操作來(lái)測(cè)試代碼的符號(hào)位,因此會(huì)降低代碼執(zhí)行效率。變量數(shù)據(jù)類(lèi)型的選擇在C51程序設(shè)計(jì)中,變量數(shù)7、sfr特殊功能寄存器sfr也是一種擴(kuò)充數(shù)據(jù)類(lèi)型,點(diǎn)用一個(gè)內(nèi)存單元,值域?yàn)?~255。利用它可以訪問(wèn)51單片機(jī)內(nèi)部的所有特殊功能寄存器。如用sfrP1=0x90這一句定P1為P1端口在片內(nèi)的寄存器,在后面的語(yǔ)句中我們用以用P1=255(對(duì)P1端口的所有引腳置高電平)之類(lèi)的語(yǔ)句來(lái)操作特殊功能寄存器。7、sfr特殊功能寄存器sfr也是一種擴(kuò)充數(shù)據(jù)類(lèi)型,點(diǎn)用一8、sfr1616位特殊功能寄存器sfr16占用兩個(gè)內(nèi)存單元,值域?yàn)?~65535。sfr16和sfr一樣用于操作特殊功能寄存器,所不同的是它用于操作占兩個(gè)字節(jié)的寄存器,如定時(shí)器T0和T1。sfr和sfr16可以直接對(duì)51單片機(jī)的特殊寄存器進(jìn)行定義,定義方法如下:

sfr特殊功能寄存器名=特殊功能寄存器地址常數(shù);

sfr16特殊功能寄存器名=特殊功能寄存器地址常數(shù);

我們可以這樣定義AT89C51的P1口

sfrP1=0x90; //定義P1I/O口,其地址90H

sfr16T2=0xCC;

//這里定義8052定時(shí)器2,地址為T(mén)2L=CCH,T2H=CDH8、sfr1616位特殊功能寄存器sfr16占用兩個(gè)內(nèi)存單說(shuō)明:sfr關(guān)鍵字后面是一個(gè)要定義的名字,可任意選取,但要符合標(biāo)識(shí)符的命名規(guī)則,最好有一定的含義,如P1口可以用P1。等號(hào)后面必須是常數(shù)(特殊寄存器直接地址),不允許有帶運(yùn)算符的表達(dá)式,而且該常數(shù)必須在特殊功能寄存器的地址范圍之內(nèi)(80H-FFH),具體可查看教材8051內(nèi)部RAM地址表。用sfr16定義16位特殊功能寄存器時(shí),等號(hào)后面是它的低位地址,高位地址一定要位于物理低位地址之上。注意:該方法不能用于定時(shí)器0和1的定義。

說(shuō)明:sfr關(guān)鍵字后面是一個(gè)要定義的名字,可任意選取,但要符9、sbitsbit是C51中的一種擴(kuò)充數(shù)據(jù)類(lèi)型,利用它可以訪問(wèn)芯片內(nèi)部的RAM中的可尋址位或特殊功能寄存器中的可尋址位。如要訪問(wèn)P1.1,定義方法有三:

(1)sbit位變量名=位地址

sbitP1_1=0x91; //把位的絕對(duì)地址賦給位變量。 同sfr一樣sbit的位地址必須位于80H-FFH之間。

(2)Sbit位變量名=特殊功能寄存器名^位位置

sfrP1=0x90;

sbitP1_1=P1^1;

當(dāng)可尋址位位于特殊功能寄存器中時(shí)可采用這種方法

(3)sbit位變量名=字節(jié)地址^位位置

sbitP1_1=0x90^1;9、sbitsbit是C51中的一種擴(kuò)充數(shù)據(jù)類(lèi)型,利用它可以這樣我們?cè)谝院蟮某绦蛘Z(yǔ)句中就可以用P1_1來(lái)對(duì)P1.1引腳進(jìn)行讀寫(xiě)操作了。通常這些可以直接使用系統(tǒng)提供的預(yù)處理文件,里面已定義好各特殊功能寄存器的簡(jiǎn)單名字。這種方法其實(shí)和匯編是一樣的,只是把特殊功能寄存器的位址符號(hào)化了。

學(xué)學(xué)練練:打開(kāi)例1-2項(xiàng)目中REG51.h頭文件查看各特殊寄存器的定義。這樣我們?cè)谝院蟮某绦蛘Z(yǔ)句中就可以用P1_1來(lái)對(duì)P1.1引腳進(jìn)五、常量和變量 常量是在程序運(yùn)行過(guò)程中不能改變值的量,常量的數(shù)據(jù)類(lèi)型有整型、浮點(diǎn)型、字符型、字符串型和位標(biāo)量。

1.整型常量可以表示為十進(jìn)制如123,0,-89等。十六進(jìn)制則以0x開(kāi)頭如0x34,-0x3B等。長(zhǎng)整型就在數(shù)字后面加字母L,如104L,034L,0xF340等。

2.浮點(diǎn)型常量可分為十進(jìn)制和指數(shù)表示形式。十進(jìn)制由數(shù)字和小數(shù)點(diǎn)組成,如0.888,3345.345,0.0等,整數(shù)或小數(shù)部分為0,可以省略但必須有小數(shù)點(diǎn)。指數(shù)表示形式為[±]數(shù)字[.數(shù)字]e[±]數(shù)字,[]中的內(nèi)容為可選項(xiàng),其中內(nèi)容根據(jù)具體情況可有可無(wú),但其余部分必須有,如125e3,7e9,-3.0e-3。五、常量和變量 常量是在程序運(yùn)行過(guò)程中不能改變值的量,常量的3.字符型常量是單引號(hào)內(nèi)的字符,如‘a(chǎn)’,‘d’等,不可以顯示的控制字符,可以在該字符前面加一個(gè)反斜杠“\”組成專(zhuān)用轉(zhuǎn)義字符。4.字符串型常量由雙引號(hào)內(nèi)的字符組成,如“test”,“OK”等。當(dāng)引號(hào)內(nèi)的沒(méi)有字符時(shí),為空字符串。在使用特殊字符時(shí)同樣要使用轉(zhuǎn)義字符如雙引號(hào)。在C中字符串常量是做為字符類(lèi)型數(shù)組來(lái)處理的,在存儲(chǔ)字符串時(shí)系統(tǒng)會(huì)在字符串尾部加上\o轉(zhuǎn)義字符以作為該字符串的結(jié)束符。字符串常量“A”和字符常量‘A’是不同的,前者在存儲(chǔ)時(shí)多占用一個(gè)字節(jié)的字間。5.位標(biāo)量,它的值是一個(gè)二進(jìn)制。3.字符型常量是單引號(hào)內(nèi)的字符,如‘a(chǎn)’,‘d’等,不可以常量可用在不必改變值的場(chǎng)合,如固定的數(shù)據(jù)表,字庫(kù)等。常量的定義方式有幾種,下面來(lái)加以說(shuō)明。 #defineFalse0x0;//用預(yù)定義語(yǔ)句可以定義常量

#defineTrue0x1;//這里定義False為0,True為1 在程序中用到False編譯時(shí)自動(dòng)用0替換,同理True替換為1

unsignedintcodea=100;//這一句用code把a(bǔ)定義在程序存儲(chǔ)器中并賦值 constunsignedintc=100;//用const定義c為無(wú)符號(hào)int常量并賦值

以上兩句它們的值都保存在程序存儲(chǔ)器中,而程序存儲(chǔ)器在運(yùn)行中是不允許被修改的,所以如果在這兩句后面用了類(lèi)似a=110,a++這樣的賦值語(yǔ)句,編譯時(shí)將會(huì)出錯(cuò)。

學(xué)學(xué)練練:例1-3:用用戶板2硬件仿真,看運(yùn)行效果常量可用在不必改變值的場(chǎng)合,如固定的數(shù)據(jù)表,字庫(kù)等。常量的定例1-3#include<REG51.H> //預(yù)處理文件里面定義了特殊寄存器的名稱如P1口定義為P1

voidmain(void){

//定義花樣數(shù)據(jù)

constunsignedchardesign[32]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,

0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,

0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x0,

0xE7,0xDB,0xBD,0x7E,0xFF};

unsignedinta; //定義循環(huán)用的變量

unsignedcharb; //在C51編程中因內(nèi)存有限盡可能注意變量類(lèi)型的使用

//盡可能使用少字節(jié)的類(lèi)型,在大型的程序中很受用

do{

for(b=0;b<32;b++)

{

for(a=0;a<30000;a++); //延時(shí)一段時(shí)間

P1=design[b]; //讀已定義的花樣數(shù)據(jù)并寫(xiě)花樣數(shù)據(jù)到P1口

}

}while(1);}例1-3思考:上述用常量數(shù)組實(shí)現(xiàn)顯示效果的方式,對(duì)應(yīng)在匯編中應(yīng)該是如何實(shí)現(xiàn)的?如要改變顯示效果,如流水燈從中間向兩側(cè)擴(kuò)散,或兩側(cè)向中間移動(dòng),程序該如何修改。思考:上述用常量數(shù)組實(shí)現(xiàn)顯示效果的方式,對(duì)應(yīng)在匯編中應(yīng)該是如變量變量就是一種在程序執(zhí)行過(guò)程中其值能不斷變化的量。變量必須先定義后使用標(biāo)準(zhǔn)C定義一個(gè)變量的格式如下:[存儲(chǔ)種類(lèi)]數(shù)據(jù)類(lèi)型變量名表如autointa;//存儲(chǔ)種類(lèi)分:auto,static,register,extern

C51定義一個(gè)變量的格式如下:[存儲(chǔ)種類(lèi)]數(shù)據(jù)類(lèi)型[存儲(chǔ)器類(lèi)型]變量名表

可選必選可選必選存儲(chǔ)器類(lèi)型的說(shuō)明就是指定該變量在C51硬件系統(tǒng)中所使用的存儲(chǔ)區(qū)域,并在編譯時(shí)準(zhǔn)確的定位。變量變量就是一種在程序執(zhí)行過(guò)程中其值能不斷變化的量。變量必須注意:AT89C51芯片中RAM只有低128字節(jié),位于80H到FFH的高128字節(jié)則在52芯片中才有用,并和特殊寄存器地址重疊。(見(jiàn)下表)如果省略存儲(chǔ)器類(lèi)型,系統(tǒng)則會(huì)按編譯模式SMALL,COMPACT或LARGE所規(guī)定的默認(rèn)存儲(chǔ)器類(lèi)型去指定變量的存儲(chǔ)區(qū)域。無(wú)論什么存儲(chǔ)模式都可以聲明變量在任何的8051存儲(chǔ)區(qū)范圍,然而把最常用的命令如循環(huán)計(jì)數(shù)器和隊(duì)列索引放在內(nèi)部數(shù)據(jù)區(qū)可以顯著的提高系統(tǒng)性能。變量的存儲(chǔ)種類(lèi)與存儲(chǔ)器類(lèi)型是完全無(wú)關(guān)的。注意:存儲(chǔ)器類(lèi)型說(shuō)明data直接訪問(wèn)內(nèi)部數(shù)據(jù)存儲(chǔ)器(128字節(jié)),訪問(wèn)速度最快bdata可位尋址內(nèi)部數(shù)據(jù)存儲(chǔ)器(16字節(jié)),允許位與字節(jié)混合訪問(wèn)idata間接訪問(wèn)內(nèi)部數(shù)據(jù)存儲(chǔ)器(256字節(jié)),允許訪問(wèn)全部?jī)?nèi)部地址pdata分頁(yè)訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器(256字節(jié)),用MOVX@Ri指令訪問(wèn)xdata外部數(shù)據(jù)存儲(chǔ)器(64KB),用MOVX@DPTR指令訪問(wèn)code程序存儲(chǔ)器(64KB),用MOVC@A+DPTR指令訪問(wèn)存儲(chǔ)器類(lèi)型說(shuō)明data直接訪問(wèn)內(nèi)部數(shù)據(jù)存儲(chǔ)器(128字節(jié))SMALL存儲(chǔ)模式

所有缺省變量參數(shù)均裝入內(nèi)部RAM(與使用顯式的data關(guān)鍵字來(lái)定義結(jié)果相同)。使用該模式的優(yōu)點(diǎn)是訪問(wèn)速度快,缺點(diǎn)是空間有限,而且分配給堆棧的空間比較少,遇到函數(shù)嵌套調(diào)用和函數(shù)遞歸調(diào)用時(shí)必須小心,該模式適用于較小的程序。SMALL存儲(chǔ)模式所有缺省變量參數(shù)均裝入內(nèi)部RCOMPACT存儲(chǔ)模式

所有缺省變量均位于外部RAM區(qū)的一頁(yè)(與使用顯式的pdata關(guān)鍵字來(lái)定義結(jié)果相同),最多能夠定義256字節(jié)變量。使用該模式的優(yōu)點(diǎn)是變量定義空間比SMALL模式大,但運(yùn)行速度比SMALL模式慢。使用本模式時(shí),程序通過(guò)@R0和@R1來(lái)訪問(wèn)變量。COMPACT存儲(chǔ)模式所有缺省變量均位于外部RLARGE存儲(chǔ)模式所有缺省變量可放在多達(dá)64K字節(jié)的外部RAM區(qū)(與使用顯式的xdata關(guān)鍵字來(lái)定義結(jié)果相同),均使用數(shù)據(jù)指針DPTR來(lái)尋址。該模式的優(yōu)點(diǎn)是空間大,可定義變量多,缺點(diǎn)是速度較慢,一般用于較大的程序,或擴(kuò)展了大容量外部RAM的系統(tǒng)中。LARGE存儲(chǔ)模式所有缺省變量可放在多達(dá)64存儲(chǔ)模式?jīng)Q定了變量的默認(rèn)存儲(chǔ)類(lèi)型、參數(shù)傳遞區(qū)和無(wú)明確存儲(chǔ)類(lèi)型的說(shuō)明。例如: 若定義chars,在SMALL存儲(chǔ)模式下,s被定位在DATA存儲(chǔ)區(qū);在COMPACT存儲(chǔ)模式下,s被定位在pDATA存儲(chǔ)區(qū);在LARGE存儲(chǔ)模式下,s被定位在XDATA存儲(chǔ)區(qū)。存儲(chǔ)模式?jīng)Q定了變量的默認(rèn)存儲(chǔ)類(lèi)型、參數(shù)傳遞區(qū)和無(wú)明確在C51存儲(chǔ)器類(lèi)型中提供有一個(gè)bdata的存儲(chǔ)器類(lèi)型,這個(gè)是指可位尋址的數(shù)據(jù)存儲(chǔ)器,位于單片機(jī)的可位尋址區(qū)中??梢詫⒁罂晌粚ぶ返臄?shù)據(jù)定義為bdata,如:

unsignedcharbdataib;//在可位尋址區(qū)定義unsignedchar類(lèi)型的變量ib

intbdataab[2];//在可位尋址區(qū)定義數(shù)組ab[2],sbitib7=ib^7//用關(guān)鍵字sbit定義位變量來(lái)獨(dú)立訪問(wèn)可尋址位對(duì)象的其中一位

sbitab12=ab[1]^

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論