第4章 單片機(jī)C語(yǔ)言及程序設(shè)計(jì)_第1頁(yè)
第4章 單片機(jī)C語(yǔ)言及程序設(shè)計(jì)_第2頁(yè)
第4章 單片機(jī)C語(yǔ)言及程序設(shè)計(jì)_第3頁(yè)
第4章 單片機(jī)C語(yǔ)言及程序設(shè)計(jì)_第4頁(yè)
第4章 單片機(jī)C語(yǔ)言及程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩78頁(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)介

第4章單片機(jī)C語(yǔ)言及程序設(shè)計(jì)Ag4.1C51概述4.2C51數(shù)據(jù)類(lèi)型及存儲(chǔ)4.3C51變量的定義及數(shù)據(jù)存儲(chǔ)區(qū)域4.4C51位變量的定義4.5C51特殊功能寄存器的定義4.6C51指針的定義4.7C51的輸入/輸出4.8C51函數(shù)的定義4.9C51與匯編語(yǔ)言混合編程4.10C51集成開(kāi)發(fā)軟件KeilC目錄12-11-6第4章單片機(jī)C語(yǔ)言及程序設(shè)計(jì) 本章主要討論C51變量的定義和函數(shù)的定義,以及KeilC軟件的使用等。

本章內(nèi)容的安排,認(rèn)為讀者已經(jīng)學(xué)習(xí)過(guò)C語(yǔ)言,具有C語(yǔ)言的基本知識(shí),因此,本章內(nèi)容完全是結(jié)合單片機(jī)來(lái)講解,也就是補(bǔ)充C語(yǔ)言在單片機(jī)方面的概念、數(shù)據(jù)定義和函數(shù)定義等。 通過(guò)本章學(xué)習(xí),讀者能夠比較順利地編寫(xiě)C51程序。

4.1.2C語(yǔ)言與ANSI的區(qū)別

用匯編語(yǔ)言編寫(xiě)單片機(jī)程序時(shí),必須要考慮其存儲(chǔ)器的結(jié)構(gòu),尤其要考慮其片內(nèi)數(shù)據(jù)存儲(chǔ)器、特殊功能寄存器是否正確合理的使用,以及按照實(shí)際地址端口數(shù)據(jù)的處理。 用C51編寫(xiě)程序,雖然不像匯編語(yǔ)言那樣需要具體地組織、分配存儲(chǔ)器資源,但是C51對(duì)數(shù)據(jù)類(lèi)型和變量的定義,必須要與單片機(jī)的存儲(chǔ)結(jié)構(gòu)相關(guān)聯(lián),否則編譯器不能正確地映射定位。

用C51編寫(xiě)單片機(jī)程序,與用ANSIC編寫(xiě)程序的不同之處是,需要根據(jù)單片機(jī)存儲(chǔ)器結(jié)構(gòu)及內(nèi)部資源,定義相應(yīng)的數(shù)據(jù)類(lèi)型和變量。 其它的語(yǔ)法規(guī)定、程序結(jié)構(gòu)及程序設(shè)計(jì)方法,都與ANSIC相同。所以本章主要介紹C51各種變量的定義、函數(shù)定義。4.2C51數(shù)據(jù)類(lèi)型及存儲(chǔ)主要內(nèi)容4.2.1C51的數(shù)據(jù)類(lèi)型4.2.2C51數(shù)據(jù)的存儲(chǔ)4.2.1C51的數(shù)據(jù)類(lèi)型表4-1C51數(shù)據(jù)類(lèi)型、長(zhǎng)度和數(shù)值范圍數(shù)據(jù)類(lèi)型表示方法長(zhǎng)度數(shù)值范圍無(wú)符號(hào)字符型unsignedchar1字節(jié)0~255有符號(hào)字符型signedchar1字節(jié)-128~127無(wú)符號(hào)整型unsignedint2字節(jié)0~65535有符號(hào)整型signedint2字節(jié)-32768~32767無(wú)符號(hào)長(zhǎng)整型unsignedlong4字節(jié)0~4294967295有符號(hào)長(zhǎng)整型signedlong4字節(jié)-2147483648~2147483647浮點(diǎn)型float4字節(jié)±1.1755E-38~±3.40E+38雙精度型double8字節(jié)±1.1755E-38~±3.40E+38位類(lèi)型bit、sbit1位0或1特殊功能寄存器型sfrsfr161字節(jié)2字節(jié)0~2550~655354.2.2C51數(shù)據(jù)的存儲(chǔ)

MCS-51單片機(jī)只有bit和unsignedchar兩種數(shù)據(jù)類(lèi)型支持機(jī)器指令,而其它類(lèi)型的數(shù)據(jù)都需要轉(zhuǎn)換成bit或unsignedchar型進(jìn)行存儲(chǔ)。 為了減少單片機(jī)的存儲(chǔ)空間和提高運(yùn)行速度,要盡可能地使用unsignedchar型數(shù)據(jù)。

一、位變量的存儲(chǔ) bit和sbit型位變量,直接存于RAM的位尋址空間,包括低128位和特殊功能寄存器位。 二、字符變量的存儲(chǔ)

字符變量(char):無(wú)論是unsignedchar數(shù)據(jù)還是signedchar數(shù)據(jù),均為1個(gè)字節(jié),能夠被直接存儲(chǔ)在RAM中,可以存儲(chǔ)在0~0x7f區(qū)域,也可以存儲(chǔ)在0x80~0xff區(qū)域,與變量的定義有關(guān)。

unsignedchar數(shù)據(jù):可直接被MSC-51接受

signedchar數(shù)據(jù):用補(bǔ)碼表示。需要額外的操作來(lái)測(cè)試、處理符號(hào)位,使用的是兩種庫(kù)函數(shù),代碼量大,運(yùn)算速度降低。

三、整型變量的存儲(chǔ)

整型變量(int):不管是unsignedint數(shù)據(jù)還是signedint數(shù)據(jù),均為2個(gè)字節(jié),其存儲(chǔ)方法是高位字節(jié)保存在低地址(在前面),低位字節(jié)保存在高地址(在后面)?!?x120x34……地址低高

例如,整型變量的值為0x1234,在內(nèi)存中的存放如右圖所示。 signedint數(shù)據(jù)用補(bǔ)碼表示。4.2.2C51數(shù)據(jù)的存儲(chǔ)

四、長(zhǎng)整型變量的存儲(chǔ) 長(zhǎng)整型變量(long)為4個(gè)字節(jié),其存儲(chǔ)方法與整型數(shù)據(jù)一樣,是最高位字節(jié)保存的地址最低(在最前面),最低位字節(jié)保存的地址最高(在最后面)。…0x120x340x560x78…地址低高 如長(zhǎng)整型變量的值為0x12345678,在內(nèi)存中的存放方法如右圖所示。不管是unsignedlong數(shù)據(jù)還是signedlong數(shù)據(jù)。4.3C51變量的定義及數(shù)據(jù)存儲(chǔ)區(qū)域主要內(nèi)容4.3.1C51變量的定義4.3.2C51變量的存儲(chǔ)類(lèi)型4.3.3C51變量的存儲(chǔ)區(qū)域4.3.4C51變量定義舉例4.3.5C51變量的存儲(chǔ)模式4.3.6C51變量的絕對(duì)定位4.3.1C51變量的定義

C51變量定義的一般格式為:[存儲(chǔ)類(lèi)型]數(shù)據(jù)類(lèi)型[存儲(chǔ)區(qū)]變量名1[=初值][,變量名2[=初值]][,…]或 [存儲(chǔ)類(lèi)型][存儲(chǔ)區(qū)]數(shù)據(jù)類(lèi)型變量名1[=初值][,變量名2[=初值]][,…]

可見(jiàn)變量(非位變量)的定義由4部分組成,即在變量定義時(shí),指定變量4種屬性:存儲(chǔ)類(lèi)型、數(shù)據(jù)類(lèi)型、存儲(chǔ)區(qū)和變量名。

數(shù)據(jù)類(lèi)型:在前面的4.2中已經(jīng)敘述過(guò),對(duì)于變量名也無(wú)須多說(shuō),下面主要解釋“存儲(chǔ)類(lèi)型”和“存儲(chǔ)區(qū)”等概念。

4.3.2C51變量的存儲(chǔ)類(lèi)型

存儲(chǔ)類(lèi)型這個(gè)屬性我們?nèi)匝赜肁NSIC的說(shuō)法,盡量不改變?cè)瓉?lái)的含義。

按照ANSIC,C語(yǔ)言的變量有4種存儲(chǔ)類(lèi)型: 動(dòng)態(tài)存儲(chǔ)(auto) 靜態(tài)存儲(chǔ)(static) 全局存儲(chǔ)(extern) 寄存器存儲(chǔ)(register)

4.3.3C51變量的存儲(chǔ)區(qū)域

變量的存儲(chǔ)區(qū)屬性是單片機(jī)擴(kuò)展的概念,非常重要,它涉及到7個(gè)新的關(guān)鍵字。

MCS-51單片機(jī)有四個(gè)存儲(chǔ)空間,分成三類(lèi),它們是片內(nèi)數(shù)據(jù)存儲(chǔ)空間、片外數(shù)據(jù)存儲(chǔ)空間和程序存儲(chǔ)空間。

MCS-51單片機(jī)有更多的存儲(chǔ)區(qū)域:由于片內(nèi)數(shù)據(jù)存儲(chǔ)器和片外數(shù)據(jù)存儲(chǔ)器又分成不同的區(qū)域,所以單片機(jī)的變量有更多的存儲(chǔ)區(qū)域,在定義時(shí),必須明確指出是存放在哪個(gè)區(qū)域。4.3.3C51變量的存儲(chǔ)區(qū)域表4-2C51存儲(chǔ)區(qū)與MCS-51存儲(chǔ)空間的對(duì)應(yīng)關(guān)系符號(hào)對(duì)應(yīng)的存儲(chǔ)空間及范圍bit片內(nèi)RAM位尋找區(qū),位地址0x00~0x7fdata直接尋址片內(nèi)RAM低128字節(jié)bdata片內(nèi)RAM位尋址區(qū)0x20~0x2f,也可字節(jié)訪問(wèn)idata間接尋址片內(nèi)RAM的256字節(jié),與MOV@Ri對(duì)應(yīng)pdata分頁(yè)尋址片外RAM的256字節(jié),與MOVX@Ri對(duì)應(yīng),P2不變xdata片外RAM全空間,64KBcode全部程序存儲(chǔ)空間,64KB注:bit存儲(chǔ)區(qū)只對(duì)位變量有效,對(duì)一般變量沒(méi)有意義4.3.4C51變量定義舉例 1)定義存儲(chǔ)在data區(qū)域的動(dòng)態(tài)unsignedchar變量:

unsignedchardatasec=0,min=0,hou=0; 2)定義存儲(chǔ)在data區(qū)域的靜態(tài)unsignedchar變量:

staticunsignedchardatascan_code=0xfe;

3)定義存儲(chǔ)在data區(qū)域的靜態(tài)unsignedint變量:

staticunsignedintdatadd; 4)定義存儲(chǔ)在bdata區(qū)域的動(dòng)態(tài)unsignedchar變量:

unsignedcharbdataoperate,operate1;//定義指示操作的可位尋址的變量 5)定義存儲(chǔ)在idata區(qū)域的動(dòng)態(tài)unsignedchar數(shù)組:

unsignedcharidatatemp[20]; 6)定義在pdata區(qū)域的動(dòng)態(tài)有符號(hào)int數(shù)組:

intpdatasend_data[30]; //定義存放發(fā)送數(shù)據(jù)的數(shù)組 7)定義存儲(chǔ)在xdata區(qū)域的動(dòng)態(tài)unsignedint數(shù)組:

unsignedintxdatareceiv_buf[50]; //定義存放接受數(shù)據(jù)的數(shù)組 8)定義存儲(chǔ)在code區(qū)域的unsignedchar數(shù)組:

unsignedcharcodedis_code[10]= {0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; //定義共陰極數(shù)碼管段碼數(shù)組4.3.5C51變量的存儲(chǔ)模式

存儲(chǔ)模式:如果在定義變量時(shí)缺省了存儲(chǔ)區(qū)屬性,則編譯器會(huì)自動(dòng)選擇默認(rèn)的存儲(chǔ)區(qū)域,也就是存儲(chǔ)模式。

變量的存儲(chǔ)模式也就是程序(或函數(shù))的編譯模式。編譯模式?jīng)Q定了變量的默認(rèn)存儲(chǔ)區(qū)域和參數(shù)的傳遞方法分為三種,分別是小模式(small):data和idata緊湊模式(compact):pdata大模式(large):xdata編譯模式由編譯控制命令“#pragmasmall(或compact、large)”決定,放在文件的開(kāi)始。

如果文件或函數(shù)沒(méi)指明編譯模式,則按small模式處理。

4.3.6C51變量的絕對(duì)定位 在一些情況下,希望把一些變量定位在某個(gè)固定地址上,如I/O端口和指定訪問(wèn)某個(gè)單元等。C51有三種方式可以對(duì)變量絕對(duì)定位:絕對(duì)定位關(guān)鍵字_at_,指針,庫(kù)函數(shù)的絕對(duì)定位宏。對(duì)于后兩種方式,在后面指針一節(jié)介紹。

C51擴(kuò)展的關(guān)鍵字_at_專(zhuān)門(mén)用于對(duì)變量作絕對(duì)定位,_at_使用在變量的定義中,其格式為:[存儲(chǔ)類(lèi)型]數(shù)據(jù)類(lèi)型[存儲(chǔ)區(qū)]變量名1_at_地址常數(shù)[,變量名2…]舉例說(shuō)明_at_的使用方法 1)對(duì)data區(qū)域中的unsignedchar變量aa作絕對(duì)定位: unsigned char dataaa_at_0x30; 2)對(duì)pdata區(qū)域中的unsignedint數(shù)組cc作絕對(duì)定位: unsigned intpdatacc[10]_at_0x1234; 3)對(duì)xdata區(qū)域中的unsignedchar變量printer_port作絕對(duì)定位: unsigned char xdataprinter_port_at_0x7fff;4.3.6C51變量的絕對(duì)定位

對(duì)變量絕對(duì)定位的幾點(diǎn)說(shuō)明: 1)絕對(duì)地址變量在定義時(shí)不能初始化,因此不能對(duì)code型變量絕對(duì)定位; 2)絕對(duì)地址變量只能夠是全局變量,不能在函數(shù)中對(duì)變量絕對(duì)定位; 3)絕對(duì)地址變量多用于I/O端口,一般情況下不對(duì)變量作絕對(duì)定位; 4)位變量不能被絕對(duì)定位。

4.4C51位變量的定義主要內(nèi)容4.4.1bit型位變量的定義4.4.2sbit型位變量的定義4.4.1bit型位變量的定義

常說(shuō)的位變量指的就是bit型位變量。C51的bit型位變量定義的一般格式為:[存儲(chǔ)類(lèi)型]bit位變量名1[=初值][,位變量名2[=初值]][,…]

bit位變量被保存在RAM中的位尋址區(qū)域(字節(jié)地址為0x20~0x2f,16字節(jié))。例如: bit flag_run,receiv_bit=0; staticbit send_bit;

幾點(diǎn)說(shuō)明: 1)bit型位變量與其它變量一樣,可以作為函數(shù)的形參,也可以作為函數(shù)的返回值,即函數(shù)的類(lèi)型可以是位型的; 2)位變量不能使用關(guān)鍵字“_at_”絕對(duì)定位; 3)位變量不能定義指針,不能定義數(shù)組。4.4.2sbit型位變量的定義 對(duì)于能夠按位尋址的特殊功能寄存器,可以對(duì)寄存器各位定義位變量。位變量定義的一般格式為:

sbit 位變量名=位地址表達(dá)式

這里的位地址表達(dá)式有三種形式:

直接位地址 特殊功能寄存器名帶位號(hào) 字節(jié)地址帶位號(hào)一、用直接位地址定義位變量

這種情況下位變量的定義格式為:

sbit 位變量名=位地址常數(shù)

這里的位地址常數(shù)范圍為0x80~0xff,實(shí)際是定義特殊功能寄存器的位。例如: sbit P0_0=0x80; sbit P1_1=0x91; sbit RS0=0xd3; //定義PSW的第3位 sbit ET0=0xa9; //定義IE的第1位

二、特殊功能寄存器名帶位號(hào)定義

這時(shí)位變量的定義格式為:

sbit 位變量名=特殊功能寄存器名^位號(hào)常數(shù) 這里的位號(hào)常數(shù)為0~7。例如: sbit P0_3=P0^3; sbit P1_4=P1^4; sbit OV=PSW^2; //定義PSW的第2位 sbit ES=IE^4; //定義IE的第4位

三、寄存器地址帶位號(hào)定義位變量

在這種情況下位變量的定義格式為:

sbit 位變量名=特殊功能寄存器地址^位號(hào)常數(shù) 這里的位號(hào)常數(shù)同上,為0~7。例如: sbit P0_6=0x80^6; sbit P1_7=0x90^7; sbit AC=0xd0^6; //定義PSW的第6位 sbit EA=0xa8^7; //定義IE的第7位4.4.2sbit型位變量的定義

幾點(diǎn)說(shuō)明: 1)用sbit定義的位變量,必須能夠按位尋址和按位操作,而不能夠?qū)o(wú)位操作功能的位定義位變量。 2)用sbit定義位變量,必須放在函數(shù)外面作為全局位變量,而不能在函數(shù)內(nèi)部定義。 3)用sbit每次只能定義一個(gè)位變量。 4)對(duì)其它模塊定義的位變量(bit型或sbit型)的引用聲明,也可以使用bit。 5)用sbit定義的是一種絕對(duì)定位的位變量(因?yàn)槊质桥c確定位地址對(duì)應(yīng)的),具有特定的意義,在應(yīng)用時(shí)不能像bit型位變量那樣隨便使用。4.5C51特殊功能寄存器的定義主要內(nèi)容4.5.18位特殊功能寄存器的定義4.5.216位特殊功能寄存器的定義4.5.18位特殊功能寄存器的定義

定義的一般格式為:

sfr 特殊功能寄存器名=地址常數(shù) 對(duì)于MCS-51單片機(jī),地址常數(shù)為8位的,其范圍為0x80~0xff。特殊功能寄存器定義如下(見(jiàn)reg51.h、reg52.h等文件): sfr P0=0x80; //定義P0寄存器 sfr P1=0x90; //定義P1口寄存器 sfr PSW=0xd0; //定義PSW sfr IE=0xa8; //定義IE

4.5.216位特殊功能寄存器的定義

定義的一般格式為:

sfr16 特殊功能寄存器名=地址常數(shù) 對(duì)于MCS-51單片機(jī),地址常數(shù)為8位的,其范圍為0x80~0xff。例如(見(jiàn)reg51.h、reg52.h等文件):

sfr16DPTR=0x82; sfr16T2=0xcc; //含TL2和TH2 sfr16RCAP2=0xca;

//含RCAP2L //和RCAP2H,0xca為RCAP2L的地址4.5.216位特殊功能寄存器的定義

幾點(diǎn)說(shuō)明:

1)定義特殊功能寄存器中的地址必須在0x80~0xff范圍內(nèi)。 2)定義特殊功能寄存器,必須放在函數(shù)外面作為全局位變量。 3)用sfr或sfr16每次只能定義一個(gè)特殊功能寄存器。 4)像sbit一樣,用sfr或sfr16定義的是絕對(duì)定位的變量(因?yàn)槊质桥c確定地址對(duì)應(yīng)的),具有特定的意義,在應(yīng)用時(shí)不能像一般變量那樣隨便使用。

4.6C51指針的定義主要內(nèi)容4.6.1通用指針4.6.2存儲(chǔ)器專(zhuān)用指針4.6.3指針變換4.6.4C51指針應(yīng)用4.6C51指針的定義

由于MCS-51單片機(jī)有三種不同類(lèi)型的存儲(chǔ)空間,并且空間范圍也不同,因此C51指針的內(nèi)容更豐富。 除了像變量的四種屬性(存儲(chǔ)類(lèi)型、數(shù)據(jù)類(lèi)型、存儲(chǔ)區(qū)、變量名)外,按存儲(chǔ)區(qū),將指針?lè)譃橥ㄓ弥羔樅筒煌鎯?chǔ)空間的專(zhuān)用指針。

4.6.1通用指針

所謂通用指針,就是通過(guò)該類(lèi)指針可以訪問(wèn)所有的存儲(chǔ)空間。所以在C51庫(kù)函數(shù)中通常使用這種指針來(lái)訪問(wèn)。

通用指針用3個(gè)字節(jié)來(lái)存儲(chǔ): 第一個(gè)字節(jié):表示指針?biāo)赶虻拇鎯?chǔ)空間 第二個(gè)字節(jié):為指針地址的高字節(jié) 第三個(gè)字節(jié):為指針地址的低字節(jié)

通用指針的定義與一般C語(yǔ)言的指針定義相同,其格式為: [存儲(chǔ)類(lèi)型]數(shù)據(jù)類(lèi)型*指針名1[,*指針名2][,…]例如: unsignedchar*cc; int*dd; long*numptr; staticchar*ccptr;

通用指針的特點(diǎn):定義簡(jiǎn)單、能訪問(wèn)所有空間、訪問(wèn)速度慢,在實(shí)際應(yīng)用中要盡可能地使用專(zhuān)用指針。4.6.2存儲(chǔ)器專(zhuān)用指針

所謂存儲(chǔ)器專(zhuān)用指針,就是通過(guò)該類(lèi)指針,只能夠訪問(wèn)規(guī)定的存儲(chǔ)空間。 指針本身占用1個(gè)字節(jié)(data*,idata*,bdata*,pdata*)或2個(gè)字節(jié)(xdata*,code*)。

存儲(chǔ)器專(zhuān)用指針的一般定義格式為:[存儲(chǔ)類(lèi)型]數(shù)據(jù)類(lèi)型指向存儲(chǔ)區(qū)*[指針存儲(chǔ)區(qū)]指針名1[,*[指針存儲(chǔ)區(qū)]指針名2,…]

unsignedchardata*idatacpt1,*idatacpt2;

指向存儲(chǔ)區(qū):

是指針變量所指向的數(shù)據(jù)存儲(chǔ)空間區(qū)域。不能夠缺省。

指針存儲(chǔ)區(qū):

是指針變量本身所存儲(chǔ)的空間區(qū)域。

缺省時(shí)認(rèn)為指針存儲(chǔ)區(qū)在默認(rèn)的存儲(chǔ)區(qū)域,其默認(rèn)存儲(chǔ)區(qū)域決定于所設(shè)定的編譯模式。

指向存儲(chǔ)區(qū)和指針存儲(chǔ)區(qū),兩者可以是同一種區(qū)域,但多數(shù)情況下不會(huì)是同一種區(qū)域。

存儲(chǔ)器專(zhuān)用指針例子:(P81) unsignedchardata*cpt1,*cpt2; signedintidata*dpt1,*dpt2; unsignedcharpdata*ppt; signedlongxdata*lpt1,*lpt2; unsignedcharcode*ccpt; 上面所定義的指針雖然所指向的空間不同,但指針變量本身都存儲(chǔ)在默認(rèn)的存儲(chǔ)區(qū)域。又如:

1)unsignedchardata*idatacpt1,*idatacpt2; 2)signedintidata*datadpt1,*datadpt2; 3)unsignedcharpdata*xdatappt; 4)signedlongxdata*lpt1,*xdatalpt2; 5)unsignedcharcode*dataccpt;注意:(1)要區(qū)分指針變量指向的空間區(qū)域和指針變量本身所存儲(chǔ)的區(qū)域;(2)定義時(shí),指針的指向存儲(chǔ)區(qū)屬性不能缺省,而指針存儲(chǔ)區(qū)屬性可以缺??;(3)指向區(qū)域不同的指針變量,本身所占的字節(jié)數(shù)不同。

說(shuō)明:指針變量本身所存儲(chǔ)的區(qū)域,在定義指針時(shí)一般都省略了,指針變量本身保存在缺省存儲(chǔ)的區(qū)域中,這樣顯得簡(jiǎn)單些,并且對(duì)初學(xué)者來(lái)說(shuō)更容易理解。

4.6.4C51指針應(yīng)用

指針在PC機(jī)上的C語(yǔ)言中應(yīng)用很廣泛。在單片機(jī)中,由于不使用操作系統(tǒng),指針的應(yīng)用完全可以獨(dú)立于變量,可以獨(dú)立指向所需要的存儲(chǔ)空間位置。本節(jié)通過(guò)例子來(lái)學(xué)習(xí)和認(rèn)識(shí)C51指針的這種獨(dú)立應(yīng)用性。 借助于指針,能夠方便地對(duì)所有空間的任一位置進(jìn)行訪問(wèn),也可以訪問(wèn)函數(shù)。下面介紹兩種訪問(wèn)空間任一單元的方法。

一、通過(guò)專(zhuān)用指針直接訪問(wèn)存儲(chǔ)器 使用指針直接訪問(wèn)存儲(chǔ)器對(duì)PC機(jī)是禁止的,但對(duì)于單片機(jī)來(lái)說(shuō)使用時(shí)注意是可以的。

使用指針直接訪問(wèn)存儲(chǔ)器方法是先定義所需要的指針,給指針賦地址值,然后使用指針訪問(wèn)存儲(chǔ)器。例如: unsignedcharxdata*xcpt; xcpt=0x2000; *xcpt=123; xcpt++; *xcpt=234;

例4-1編寫(xiě)程序,將單片機(jī)片外數(shù)據(jù)存儲(chǔ)器中地址從0x1000開(kāi)始20個(gè)字節(jié)數(shù)據(jù),傳送到片內(nèi)數(shù)據(jù)存儲(chǔ)器地址從0x30開(kāi)始的區(qū)域。

程序段如下: unsignedchardata i,*dcpt; unsignedcharxdata *xcpt; dcpt=0x30; //給指針賦地址 xcpt=0x1000; for(i=0;i<20;i++) *(dcpt+i)=*(xcpt+i);

4.7C51的輸入/輸出主要內(nèi)容4.7.1格式輸出函數(shù)printf4.7.2格式輸入函數(shù)scanfC51的輸入/輸出函數(shù),都是通過(guò)單片機(jī)的串行接口實(shí)現(xiàn)的。在使用這些I/O函數(shù)之前,必須先對(duì)單片機(jī)的串行口、定時(shí)器/計(jì)數(shù)器T1進(jìn)行初始化。具體內(nèi)容到后面介紹。4.8C51函數(shù)的定義主要內(nèi)容4.8.1C51函數(shù)的定義4.8.2C51中斷函數(shù)的定義 C51函數(shù)的定義與ANSIC相似,但有更多的屬性要求。本節(jié)先討論函數(shù)的一般定義,然后專(zhuān)門(mén)給出中斷函數(shù)的定義,因?yàn)橹袛嗪瘮?shù)有其特殊性。

4.8.1C51函數(shù)的定義 在C51中,函數(shù)的定義與ANSIC中是相同的。唯一不同的就是在函數(shù)的后面需要帶上若干個(gè)C51的專(zhuān)用關(guān)鍵字。C51函數(shù)定義的一般格式如下:返回類(lèi)型函數(shù)名(形參表)[函數(shù)模式][reentrant][interruptm][usingn]{ 局部變量定義 執(zhí)行語(yǔ)句}

各屬性含義如下:

函數(shù)模式:也就是編譯模式、存儲(chǔ)模式,可以為small、compact和large。缺省時(shí)則使用文件的編譯模式。

關(guān)鍵字reentrant表示重入函數(shù)。所謂可重入函數(shù),就是允許被遞歸調(diào)用的函數(shù)。是C51定義的。在編譯時(shí)會(huì)為重入函數(shù)生成一個(gè)堆棧,通過(guò)這個(gè)堆棧來(lái)完成參數(shù)的傳遞和存放局部變量。重入函數(shù)不能使用bit型參數(shù);函數(shù)返回值也不能是bit型。

interruptm表示中斷處理函數(shù)及中斷號(hào)。interrupt是C51定義的。C51支持32個(gè)中斷源,中斷入口地址與中斷號(hào)m的關(guān)系為:中斷入口地址=3+8×m。表4-7單片機(jī)中斷源與中斷號(hào)的關(guān)系中斷源外中斷0T0中斷外中斷1T1中斷串行中斷T2中斷中斷號(hào)012345中斷入口地址0x00030x000b0x00130x001b0x00230x002b

usingn表示選擇工作寄存器組及組號(hào),n可以為0~3,對(duì)應(yīng)第0組到第3組。關(guān)鍵字using是C51定義的。

如果函數(shù)有返回值,不能使用該屬性,因?yàn)榉祷刂凳谴嬗诩拇嫫髦?,函?shù)返回時(shí)要恢復(fù)原來(lái)的寄存器組,導(dǎo)致返回值錯(cuò)誤。

4.8.2C51中斷函數(shù)的定義 C51函數(shù)的定義實(shí)際上已經(jīng)包含了中斷服務(wù)函數(shù),但為了明確起見(jiàn),下面專(zhuān)門(mén)給出中斷處理函數(shù)的具體定義形式:void函數(shù)名(void)[函數(shù)模式]interruptm[usingn]{ 局部變量定義 執(zhí)行語(yǔ)句}

中斷服務(wù)函數(shù)需要注意以下幾點(diǎn): 1)中斷服務(wù)函數(shù)不傳遞參數(shù); 2)中斷服務(wù)函數(shù)沒(méi)有返回值; 3)中斷服務(wù)函數(shù)必須有interruptm屬性; 4)進(jìn)入中斷服務(wù)函數(shù),ACC、B、PSW會(huì)進(jìn)棧,根據(jù)需要,DPL、DPH也可能進(jìn)棧,如果沒(méi)有usingn屬性,R0~R7也可能進(jìn)棧,否則不進(jìn)棧; 5)在中斷服務(wù)函數(shù)中調(diào)用其它函數(shù),被調(diào)函數(shù)最好設(shè)置為可重入的,因?yàn)橹袛嗍请S機(jī)的,有可能中斷服務(wù)函數(shù)所調(diào)用的函數(shù)出現(xiàn)嵌套調(diào)用; 6)不能夠直接調(diào)用中斷服務(wù)函數(shù)。

例4-4編寫(xiě)程序,使用定時(shí)器/計(jì)數(shù)器0定時(shí)并產(chǎn)生中斷,實(shí)現(xiàn)從P1.7產(chǎn)生方波的功能。

程序如下:#include<reg52.h>#define TIMER0L 0x18 //設(shè)振蕩頻率為12MHz#define TIMER0H 0xfc //定時(shí)1ms(1000微秒)voidtimer0_int(void)interrupt1{ TL0=TIMER0L;

TH0=TIMER0H;

P1_7=~P1_7; //產(chǎn)生的方波頻率為500Hz}

void main(void){ TMOD=0x01; //設(shè)置T1模式1定時(shí)

TL0=TIMER0L; //設(shè)置T0低8位初值

TH0=TIMER0H; //設(shè)置T0高8位初值

IE=0x82; //開(kāi)T0中斷和總中斷

TR0=1; //開(kāi)T0運(yùn)行 while(1); //等待中斷,產(chǎn)生方波}

4.10C51集成開(kāi)發(fā)軟件KeilC主要內(nèi)容4.10.1KeilC集成開(kāi)發(fā)工具簡(jiǎn)介4.10.2KeilC操作界面4.10.3KeilC的使用4.10.4項(xiàng)目的運(yùn)行調(diào)試4.10C51集成開(kāi)發(fā)軟件KeilC

KeilC:是德國(guó)KEIL公司開(kāi)發(fā)的單片機(jī)C語(yǔ)言編譯器。其前身是FRANKLINC51,功能相當(dāng)強(qiáng)大。

μVision2:是一個(gè)forWindows的、集成化的C51開(kāi)發(fā)環(huán)境。集成了文件編輯處理、項(xiàng)目管理、編譯鏈接、軟件仿真調(diào)試等多種功能,是強(qiáng)大的C51開(kāi)發(fā)工具。 在后面的討論中,對(duì)KeilC和μVision2兩個(gè)術(shù)語(yǔ)不做嚴(yán)格的區(qū)分,一般多稱(chēng)呼為KeilC,包含有μVision2集成開(kāi)發(fā)環(huán)境之意。

4.10.1KeilC集成工具簡(jiǎn)介

一、編譯器和鏈接器 KeilC的編譯器和鏈接器包括C51、A51、L51和BL51。

C51是C語(yǔ)言編譯器,其功能是將C源代碼編譯生成可重新定位的目標(biāo)模塊。

A51是匯編語(yǔ)言編譯器,其功能是將匯編源代碼編譯生成可重新定位的目標(biāo)模塊。

L51是鏈接/定位器,其功能是將匯編源代碼和C源代碼生成的可重定位的目標(biāo)模塊文件(.OBJ),與庫(kù)文件鏈接、定位生成絕對(duì)目標(biāo)文件。

4.10.1KeilC集成工具簡(jiǎn)介

BL51也是鏈接/定位器,除了具有L51所有的功能之外,(1)可以鏈接定位大于64KB的程序;(2)具有代碼域及域切換功能;(3)可用于RTX51實(shí)時(shí)多任務(wù)操作系統(tǒng)。

二、LIB51庫(kù)管理器

LIB51庫(kù)管理器可以把由匯編器、編譯器創(chuàng)建的目標(biāo)文件構(gòu)建成目標(biāo)庫(kù)(.LIB)。 這些庫(kù)是按規(guī)定格式排列的目標(biāo)模塊,可在以后被鏈接器所使用。4.10.1KeilC集成工具簡(jiǎn)介

三、軟件模擬調(diào)試器

dScope51是一個(gè)源級(jí)軟件模擬調(diào)試器,功能強(qiáng)大。它可以調(diào)試由C51編譯器、A51匯編器、ASM-51匯編器產(chǎn)生的程序;

可以模擬CPU及其外圍器件,如內(nèi)部串行口、定時(shí)器/計(jì)數(shù)器,外部I/O口等。 除了軟件模擬調(diào)試器dScope51之外,μVision2還集成有硬件調(diào)試器tScope51和監(jiān)視程序Monitor51。tScope51用于對(duì)硬件目標(biāo)板進(jìn)行調(diào)試。Monitor51通過(guò)PC的串行口與目標(biāo)板進(jìn)行通信,在PC機(jī)的顯示器上顯示程序的運(yùn)行情況。

4.10.2KeilC操作界面

編輯狀態(tài)的操作界面主要由5部分組成:最上面的菜單欄、菜單欄下面的工具欄、左邊的工程管理窗口、中間的編輯窗口、下面的輸出信息窗口。

菜單項(xiàng)主要有:文件、編輯、視圖(View)、工程、調(diào)試、片內(nèi)外設(shè)(Peripherals)、工具、軟件版本控制系統(tǒng)(SVCS)、窗口、幫助。

工具都是相應(yīng)菜單項(xiàng)的快捷操作按鈕,所以,下面以介紹菜單項(xiàng)為主線,并指明對(duì)應(yīng)的工具按鈕。4.10.2KeilC操作界面圖4-6KeilC51在編輯狀態(tài)下的操作界面輸出信息窗口工程管理器窗口工具欄菜單欄編輯窗口4.10.2KeilC操作界面

一、文件(File)菜單 文件菜單下都是常見(jiàn)的項(xiàng),不再給出對(duì)應(yīng)的工具按鈕。 1)New 2)Open 3)Close 4)Save 5)Saveas…

6)DeviceDatabase:維護(hù)器件數(shù)據(jù)庫(kù) 7)PrintSetup…:設(shè)置打印機(jī) 8)Print 9)Exit4.10.2KeilC操作界面

二、編輯(Edit)菜單1)Undo 2)Redo:恢復(fù)上次的撤銷(xiāo)3)Cut 4)Copy5)Paste6)IndentSelectText:縮進(jìn)一個(gè)制表符位7)UnindentSelectText左移一個(gè)制表符位8)ToggleBookmark:在當(dāng)前行置書(shū)簽9)GotoNextBookmark移光標(biāo)到下一書(shū)簽10)GotoPreviousBookmark: 移光標(biāo)到上一個(gè)書(shū)簽4.10.2KeilC操作界面11)ClearAllBookmark: 清除當(dāng)前文件中所有的書(shū)簽12)Find…13)Replace…:查找與替換14)FindinFiles…: 在多個(gè)文件中查找字符串15)GotoMatchingBrace: 尋找匹配的各種括號(hào)

4.10.2KeilC操作界面

三、查看(View)菜單1)StatusBar:顯示或隱藏狀態(tài)欄2)FileToolbar:顯示或隱藏文件工具欄3)BuildToolbar:顯示或隱藏編譯工具欄4)DebugToolbar:顯示或隱藏調(diào)試工具欄5)ProjectWindows:顯示或隱藏工程窗口6)OutputWindows:顯示或隱藏輸出窗口7)SourceBrowser:打開(kāi)源文件瀏覽器窗口8)DisassemblyWindows: 顯示或隱藏反匯編窗口4.10.2KeilC操作界面9)Watch&CallStackWindows: 顯示或隱藏觀察和堆棧窗口10)MemoryWindows: 顯示或隱藏存儲(chǔ)器窗口11)CodeCoverageWindows: 顯示或隱藏代碼覆蓋窗口12)PerformanceAnalyzerWindows: 顯示或隱藏性能分析窗口13)SymbolWindows: 顯示或隱藏符號(hào)變量窗口4.10.2KeilC操作界面 14)SerialWindows#1: 顯示或隱藏串行口窗口1 15)SerialWindows#2: 顯示或隱藏串行口窗口2 16)Toolbox:顯示或隱藏工具箱 17)PeriodicWindowsUpdate: 在調(diào)試運(yùn)行程序時(shí),周期刷新調(diào)試窗口 18)WorkbookMode: 顯示或隱藏工作簿窗口的標(biāo)簽 19)Option…: 設(shè)置顏色、字體、快捷鍵和編輯器選項(xiàng)4.10.2KeilC操作界面

四、工程(Project)菜單1)NewProject…: 創(chuàng)建一個(gè)新工程2)ImportμVision2Project…: 導(dǎo)入工程文件3)OpenProject:打開(kāi)一個(gè)已有工程4)CloseProject:關(guān)閉當(dāng)前工程5)ComponentsEnvironmentandBooks: 設(shè)置工具書(shū)、包含文件和庫(kù)文件的路徑6)SelectDeviceforTarget: 從器件庫(kù)中選擇一種CPU4.10.2KeilC操作界面7)RemoveGroups…: 從工程中刪去組或文件8)OptionforTarget…: 設(shè)置對(duì)象、組或文件的工具選項(xiàng),設(shè)置當(dāng)前目標(biāo)選項(xiàng),選擇當(dāng)前目標(biāo)9)BuildTarget: 編譯修改過(guò)的文件并生成應(yīng)用10)RebuildTarget: 重新編譯所有的文件并生成應(yīng)用11)Translate…:編譯當(dāng)前文件12)StopBuild:停止當(dāng)前的編譯過(guò)程4.10.2KeilC操作界面

五、調(diào)試(Debug)菜單1)Start/StopDebugging: 啟動(dòng)/停止調(diào)試模式2)Go:全速運(yùn)行3)Step:跟蹤運(yùn)行4)StepOver:?jiǎn)尾竭\(yùn)行5)Stepoutofcurrentfunction: 一步執(zhí)行完當(dāng)前函數(shù)并返回6)RuntoCursorline: 一步運(yùn)行到當(dāng)前光標(biāo)處7)StopRunning:停止運(yùn)行4.10.2KeilC操作界面8)Breakpointing…:打開(kāi)斷點(diǎn)對(duì)話框9)Insert/RemoveBreakpoint: 在當(dāng)前行設(shè)置/清除斷點(diǎn)10)Enable/DisableBreakpoint: 使能/禁止當(dāng)前行的斷點(diǎn)11)DisableAllBreakpoints: 禁止所有斷點(diǎn)12)KillAllBreakpoints:清除所有斷點(diǎn)13)ShowNextStatement: 顯示下一條指令4.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)論