第三章Cx51數(shù)據(jù)與運(yùn)算_第1頁(yè)
第三章Cx51數(shù)據(jù)與運(yùn)算_第2頁(yè)
第三章Cx51數(shù)據(jù)與運(yùn)算_第3頁(yè)
第三章Cx51數(shù)據(jù)與運(yùn)算_第4頁(yè)
第三章Cx51數(shù)據(jù)與運(yùn)算_第5頁(yè)
已閱讀5頁(yè),還剩53頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第三章Cx51數(shù)據(jù)與運(yùn)算第三章 Cx51數(shù)據(jù)與運(yùn)算 3.1 數(shù)據(jù)與數(shù)據(jù)類型3.2 常量與變量3.3 Cx51數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)3.4 SFR及其Cx51定義3.5 并行接口及其Cx51定義3.6 位變量及其Cx51定義3.7 Cx51的運(yùn)算規(guī)則3.1 數(shù)據(jù)與數(shù)據(jù)類型 Keil C有有ANSI C的所有標(biāo)準(zhǔn)數(shù)據(jù)類型,除此之的所有標(biāo)準(zhǔn)數(shù)據(jù)類型,除此之外為了更加有利地利用外為了更加有利地利用8051的結(jié)構(gòu),還加入了一些的結(jié)構(gòu),還加入了一些特殊的數(shù)據(jù)類型。特殊的數(shù)據(jù)類型。 除了這些標(biāo)準(zhǔn)數(shù)據(jù)類型外,編譯器還支持一種位除了這些標(biāo)準(zhǔn)數(shù)據(jù)類型外,編譯器還支持一種位數(shù)據(jù)類型,一個(gè)位變量存在于內(nèi)部數(shù)據(jù)類型,一個(gè)位變量

2、存在于內(nèi)部RAM的可位尋址的可位尋址區(qū)中,可像操作其它變量那樣對(duì)位變量進(jìn)行操作,區(qū)中,可像操作其它變量那樣對(duì)位變量進(jìn)行操作,而位數(shù)組和位指針是違法的。而位數(shù)組和位指針是違法的。數(shù)據(jù)類型數(shù)據(jù)類型大小大小char/unsigned char8 bitint/unsigned int16 bitlong/unsigned long32 bitfloat/double32bit一般指針一般指針generic pointer24 bit Cx51實(shí)際上不支持雙精度浮點(diǎn)數(shù)實(shí)際上不支持雙精度浮點(diǎn)數(shù)double,即便你,即便你定義了定義了double,也是按照,也是按照float處理的。處理的。1、基本數(shù)據(jù)類

3、型、基本數(shù)據(jù)類型數(shù)組數(shù)組(array)結(jié)構(gòu)體結(jié)構(gòu)體(struct)聯(lián)合體聯(lián)合體(union)枚舉枚舉(enum)2、構(gòu)造數(shù)據(jù)類型、構(gòu)造數(shù)據(jù)類型3、指針類型、指針類型4、空類型、空類型3.2 常量與變量 C語言中的數(shù)據(jù)有常量和變量之分。語言中的數(shù)據(jù)有常量和變量之分。 常量常量在程序運(yùn)行的過程中,其值始終不能改變的量。在程序運(yùn)行的過程中,其值始終不能改變的量。 變量變量在程序運(yùn)行的過程中其值可以改變的量。在程序運(yùn)行的過程中其值可以改變的量。 常量和變量一樣可以有不同的數(shù)據(jù)類型??梢杂靡粋€(gè)常量和變量一樣可以有不同的數(shù)據(jù)類型??梢杂靡粋€(gè)標(biāo)識(shí)符標(biāo)識(shí)符const來聲明一個(gè)量是常量。來聲明一個(gè)量是常量。un

4、signed char data system_status=0;unsigned int data unit_id2;const char data samp_string16;float data outport_value; 我們還要經(jīng)常用到使用預(yù)編譯語句我們還要經(jīng)常用到使用預(yù)編譯語句#define定定義的符號(hào)常量:義的符號(hào)常量:#define CONST100#define NULL0#define TRUE1#define FALSE0 符號(hào)常量和變量的區(qū)別在于,符號(hào)常量的值在符號(hào)常量和變量的區(qū)別在于,符號(hào)常量的值在其作用域其作用域(例如所在的函數(shù)例如所在的函數(shù))中不能改變,也不能用

5、中不能改變,也不能用等號(hào)賦值,它僅僅是代表某個(gè)固定常數(shù)的一個(gè)符號(hào)等號(hào)賦值,它僅僅是代表某個(gè)固定常數(shù)的一個(gè)符號(hào)而已。而已。 習(xí)慣上符號(hào)常量通常用大寫,而變量著用小寫,習(xí)慣上符號(hào)常量通常用大寫,而變量著用小寫,注意養(yǎng)成良好的編程習(xí)慣。注意養(yǎng)成良好的編程習(xí)慣。1、位變量、位變量 位變量位變量(bit)的類型是位,其值可以是的類型是位,其值可以是1(true)或者或者0(false)。這些位變量定義在內(nèi)。這些位變量定義在內(nèi)部部RAM的可位尋址區(qū)。的可位尋址區(qū)。2、字符變量、字符變量字符變量字符變量(char)的類型是一個(gè)字節(jié)共的類型是一個(gè)字節(jié)共8位,是帶位,是帶符號(hào)的單字節(jié)數(shù),其值范圍為符號(hào)的單字節(jié)數(shù)

6、,其值范圍為-128+127。無符號(hào)字符變量無符號(hào)字符變量(unsigned char)也是一個(gè)字也是一個(gè)字節(jié),但是不帶符號(hào),其值范圍為節(jié),但是不帶符號(hào),其值范圍為0+255。3、整型變量、整型變量 整型變量整型變量(int)的類型是雙字節(jié)共的類型是雙字節(jié)共16位,其位,其取值范圍是取值范圍是-32768+32767。 無符號(hào)整型變量無符號(hào)整型變量(unsigned int)為雙字節(jié)但為雙字節(jié)但不帶符號(hào),其值范圍為不帶符號(hào),其值范圍為065535。Keil Cx51中整型變量中整型變量(int)的字節(jié)存放次序:的字節(jié)存放次序:高高8位存放在低地址,低位存放在低地址,低8位則存放在高地址。位則存

7、放在高地址。例如位于地址例如位于地址0 x1100的整數(shù)的整數(shù)0 x1234:低地址低地址0 x1100存放存放0 x12,高地址高地址0 x1101存放存放0 x34。4、浮點(diǎn)變量、浮點(diǎn)變量 浮點(diǎn)變量浮點(diǎn)變量(float)的類型是的類型是4字節(jié)共字節(jié)共32位,其位,其存放格式為:存放格式為:地址地址+0+1+2+3內(nèi)容內(nèi)容SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM Keil Cx51中浮點(diǎn)變量中浮點(diǎn)變量(float)采用采用IEEE-754標(biāo)準(zhǔn),由標(biāo)準(zhǔn),由1位符號(hào)、位符號(hào)、8位指數(shù)和位指數(shù)和23位尾數(shù)位尾數(shù)(最最高位始終為高位始終為1無需保存無需保存)組成,具有組

8、成,具有24位精度位精度 浮點(diǎn)變量浮點(diǎn)變量(float)的字節(jié)次序和編譯器及其版的字節(jié)次序和編譯器及其版本有關(guān)。本有關(guān)。 Keil C編譯器能從你的程序源代碼中產(chǎn)生高編譯器能從你的程序源代碼中產(chǎn)生高度優(yōu)化的代碼,但你可以幫助編譯器產(chǎn)生更好的度優(yōu)化的代碼,但你可以幫助編譯器產(chǎn)生更好的代碼。下面將討論這方面的一些問題。代碼。下面將討論這方面的一些問題。5、使用、使用Keil C時(shí)應(yīng)做的和應(yīng)該避免的時(shí)應(yīng)做的和應(yīng)該避免的 一個(gè)提高代碼效率的最基本的方式就是減小一個(gè)提高代碼效率的最基本的方式就是減小變量的長(zhǎng)度。使用變量的長(zhǎng)度。使用C編程時(shí),我們都習(xí)慣于對(duì)循編程時(shí),我們都習(xí)慣于對(duì)循環(huán)控制變量使用環(huán)控制變量

9、使用int類型,這對(duì)類型,這對(duì)8位的單片機(jī)來位的單片機(jī)來說是一種極大的浪費(fèi)。你應(yīng)該仔細(xì)考慮你所聲明說是一種極大的浪費(fèi)。你應(yīng)該仔細(xì)考慮你所聲明的變量值可能的范圍,然后選擇合適的變量類型。的變量值可能的范圍,然后選擇合適的變量類型。 很明顯,經(jīng)常使用的變量應(yīng)該是很明顯,經(jīng)常使用的變量應(yīng)該是unsigned char,只占用一個(gè)字節(jié),只占用一個(gè)字節(jié):(1)采用短變量)采用短變量unsigned char data n; 為什么要使用無符號(hào)類型呢?為什么要使用無符號(hào)類型呢? 原因是原因是8051不支持符號(hào)運(yùn)算,程序中也不要使不支持符號(hào)運(yùn)算,程序中也不要使用含有帶符號(hào)變量的外部代碼。除了根據(jù)變量長(zhǎng)度用含

10、有帶符號(hào)變量的外部代碼。除了根據(jù)變量長(zhǎng)度來選擇變量類型之外,你還要考慮變量是否會(huì)用于來選擇變量類型之外,你還要考慮變量是否會(huì)用于負(fù)數(shù)的場(chǎng)合,如果你的程序中可以不需要負(fù)數(shù),那負(fù)數(shù)的場(chǎng)合,如果你的程序中可以不需要負(fù)數(shù),那么把變量都定義成無符號(hào)類型的變量么把變量都定義成無符號(hào)類型的變量:(2)使用無符號(hào)類型)使用無符號(hào)類型 unsigned int data n1,n2; 在在8位操作系統(tǒng)上使用位操作系統(tǒng)上使用32位浮點(diǎn)數(shù)是得不償位浮點(diǎn)數(shù)是得不償失的。你可以這樣做,但會(huì)浪費(fèi)大量的時(shí)間。所失的。你可以這樣做,但會(huì)浪費(fèi)大量的時(shí)間。所以當(dāng)你要在系統(tǒng)中使用浮點(diǎn)數(shù)的時(shí)候,你要問問以當(dāng)你要在系統(tǒng)中使用浮點(diǎn)數(shù)的時(shí)

11、候,你要問問自己這是否一定需要??梢酝ㄟ^提高數(shù)值數(shù)量級(jí)自己這是否一定需要??梢酝ㄟ^提高數(shù)值數(shù)量級(jí)和使用整型運(yùn)算來消除浮點(diǎn)指針。處理和使用整型運(yùn)算來消除浮點(diǎn)指針。處理int和和long比處理比處理double和和float要方便得多,你的要方便得多,你的代碼執(zhí)行起來會(huì)更快,也不用連接處理浮點(diǎn)指針代碼執(zhí)行起來會(huì)更快,也不用連接處理浮點(diǎn)指針的模塊。如果你一定要采用浮點(diǎn)指針的話,你應(yīng)的模塊。如果你一定要采用浮點(diǎn)指針的話,你應(yīng)該采用西門子該采用西門子80517和達(dá)拉斯半導(dǎo)體公司的和達(dá)拉斯半導(dǎo)體公司的80320,這些已經(jīng)對(duì)數(shù)處理進(jìn)行過優(yōu)化的單片,這些已經(jīng)對(duì)數(shù)處理進(jìn)行過優(yōu)化的單片機(jī)。機(jī)。 (3)避免使用浮點(diǎn)

12、數(shù))避免使用浮點(diǎn)數(shù)(4)使用位變量)使用位變量對(duì)于某些標(biāo)志位應(yīng)使用位變量而不是對(duì)于某些標(biāo)志位應(yīng)使用位變量而不是unsigned char,這將節(jié)省你的內(nèi)存。你不用多浪費(fèi),這將節(jié)省你的內(nèi)存。你不用多浪費(fèi)7位存儲(chǔ)位存儲(chǔ)區(qū),而且位變量在區(qū),而且位變量在RAM中訪問他們只需要一個(gè)處理中訪問他們只需要一個(gè)處理周期。周期。 把變量定義成局部變量比全局變量更有效率,把變量定義成局部變量比全局變量更有效率,編譯器為局部變量在內(nèi)部存儲(chǔ)區(qū)中分配存儲(chǔ)空間,編譯器為局部變量在內(nèi)部存儲(chǔ)區(qū)中分配存儲(chǔ)空間,而為全局變量在外部存儲(chǔ)區(qū)中分配存儲(chǔ)空間,這而為全局變量在外部存儲(chǔ)區(qū)中分配存儲(chǔ)空間,這會(huì)降低你的訪問速度。會(huì)降低你的訪問

13、速度。 另一個(gè)避免使用全局變量的原因是你必須在另一個(gè)避免使用全局變量的原因是你必須在你系統(tǒng)的處理過程中調(diào)節(jié)使用全局變量,因?yàn)樵谀阆到y(tǒng)的處理過程中調(diào)節(jié)使用全局變量,因?yàn)樵谥袛嘞到y(tǒng)和多任務(wù)系統(tǒng)中,不止一個(gè)過程會(huì)使用中斷系統(tǒng)和多任務(wù)系統(tǒng)中,不止一個(gè)過程會(huì)使用全局變量。全局變量。(5)用局部變量代替全局變量)用局部變量代替全局變量 局部變量和全局變量可被定義在你想要的存儲(chǔ)局部變量和全局變量可被定義在你想要的存儲(chǔ)區(qū)中,根據(jù)先前的討論,當(dāng)你把經(jīng)常使用的變量放區(qū)中,根據(jù)先前的討論,當(dāng)你把經(jīng)常使用的變量放在內(nèi)部在內(nèi)部RAM中時(shí),可使你的程序的速度得到提高。中時(shí),可使你的程序的速度得到提高。除此之外,你還縮短了

14、你的代碼,除此之外,你還縮短了你的代碼, 因?yàn)橥獠看鎯?chǔ)因?yàn)橥獠看鎯?chǔ)區(qū)尋址的指令相對(duì)要麻煩一些。區(qū)尋址的指令相對(duì)要麻煩一些。 考慮到存儲(chǔ)速度,按下面的順序使用存儲(chǔ)器:考慮到存儲(chǔ)速度,按下面的順序使用存儲(chǔ)器:data、idata、pdata、xdata,但要記得留出,但要記得留出足夠的堆??臻g。足夠的堆棧空間。(6)為變量分配內(nèi)部存儲(chǔ)區(qū))為變量分配內(nèi)部存儲(chǔ)區(qū)3.3 Cx51數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu) 因?yàn)橐驗(yàn)镵eil Cx51是面向是面向8051系列單片機(jī)及其硬系列單片機(jī)及其硬件控制系統(tǒng)的開發(fā)工具,所以在討論件控制系統(tǒng)的開發(fā)工具,所以在討論Keil Cx51的的數(shù)據(jù)類型的時(shí)候,必須同時(shí)提及它的存儲(chǔ)類型以數(shù)據(jù)類

15、型的時(shí)候,必須同時(shí)提及它的存儲(chǔ)類型以及它與及它與8051單片機(jī)存儲(chǔ)器結(jié)構(gòu)的關(guān)系。它定義的單片機(jī)存儲(chǔ)器結(jié)構(gòu)的關(guān)系。它定義的任何數(shù)據(jù)類型必須以一定的存儲(chǔ)類型的方式定位任何數(shù)據(jù)類型必須以一定的存儲(chǔ)類型的方式定位在在8051的某一存儲(chǔ)器中,否則便沒有任何的實(shí)際的某一存儲(chǔ)器中,否則便沒有任何的實(shí)際意義。意義。1、通用寄存器區(qū)、通用寄存器區(qū)(001FH) 通用寄存器區(qū)由通用寄存器區(qū)由4個(gè)寄存器組個(gè)寄存器組構(gòu)成:構(gòu)成:0組組(0007H)、 1組組(080FH)、 2組組(1017H)、 3組組(181FH)。 可以通過可以通過PSW中中RS0和和RS1的不同取值來的不同取值來選擇不同的寄存器組。在函數(shù)定義

16、中則可以使用選擇不同的寄存器組。在函數(shù)定義中則可以使用關(guān)鍵詞關(guān)鍵詞using來指明寄存器號(hào)。來指明寄存器號(hào)。 上電復(fù)位后默認(rèn)使用寄存器組上電復(fù)位后默認(rèn)使用寄存器組0。當(dāng)其它組不。當(dāng)其它組不用時(shí),它們都可以當(dāng)作普通的用時(shí),它們都可以當(dāng)作普通的RAM使用。使用。2、可位尋址區(qū)、可位尋址區(qū)(202FH) 這個(gè)區(qū)共這個(gè)區(qū)共16個(gè)字節(jié)個(gè)字節(jié)128位,分別位,分別占有位地址占有位地址0127;另外內(nèi)部地址;另外內(nèi)部地址尾數(shù)為尾數(shù)為8或者或者0的的SFR共共16字節(jié)字節(jié)128位,分別占有位地址位,分別占有位地址128255。 內(nèi)部低內(nèi)部低128字節(jié)的地址字節(jié)的地址307FH作為用戶存取臨時(shí)數(shù)據(jù)作為用戶存取臨

17、時(shí)數(shù)據(jù)區(qū)。區(qū)。 許多單片機(jī)的高許多單片機(jī)的高128字節(jié)除字節(jié)除了直接尋址的了直接尋址的SFR外還有外還有128字字節(jié)間接尋址區(qū)節(jié)間接尋址區(qū)RAM,它們也作為,它們也作為用戶區(qū)。用戶區(qū)。 通常堆棧區(qū)就設(shè)在這里,堆通常堆棧區(qū)就設(shè)在這里,堆棧指針棧指針SP可以設(shè)置這個(gè)區(qū)域??梢栽O(shè)置這個(gè)區(qū)域。3、用戶、用戶 (RAM)區(qū)區(qū) Keil允許使用者指定程序變量的存儲(chǔ)區(qū),這使使用允許使用者指定程序變量的存儲(chǔ)區(qū),這使使用者可以控制存儲(chǔ)區(qū)的使用。編譯器可識(shí)別以下存儲(chǔ)區(qū):者可以控制存儲(chǔ)區(qū)的使用。編譯器可識(shí)別以下存儲(chǔ)區(qū):存儲(chǔ)區(qū)存儲(chǔ)區(qū)描述描述dataRAM的低的低128個(gè)字節(jié),可在一個(gè)周期內(nèi)直接尋址個(gè)字節(jié),可在一個(gè)周期

18、內(nèi)直接尋址bdatadata區(qū)的區(qū)的16個(gè)字節(jié)的可位尋址區(qū)個(gè)字節(jié)的可位尋址區(qū)idataRAM區(qū)的高區(qū)的高128個(gè)字節(jié),必須采用間接尋址個(gè)字節(jié),必須采用間接尋址pdata外部存儲(chǔ)區(qū)的外部存儲(chǔ)區(qū)的256個(gè)字節(jié),一般是片外個(gè)字節(jié),一般是片外RAM第一第一頁(yè)空間;通過頁(yè)空間;通過P0口的地址對(duì)其尋址,使用指令口的地址對(duì)其尋址,使用指令MOVX Ri,需要兩個(gè)指令周期,需要兩個(gè)指令周期xdata外部存儲(chǔ)區(qū),使用外部存儲(chǔ)區(qū),使用DPTR尋址尋址code程序存儲(chǔ)區(qū),使用程序存儲(chǔ)區(qū),使用PC或或DPTR尋址尋址4、存儲(chǔ)類型、存儲(chǔ)類型unsigned char data system_status=0;unsi

19、gned int data unit_id2;char data inp_string16;float data outp_value;(1)data區(qū)區(qū) 對(duì)對(duì)data區(qū)的尋址是最快的,所以應(yīng)該把使用頻率區(qū)的尋址是最快的,所以應(yīng)該把使用頻率高的變量放在高的變量放在data區(qū)。由于空間有限,必須注意使用區(qū)。由于空間有限,必須注意使用data區(qū);除了包含程序變量外,還包含了堆棧和寄存區(qū);除了包含程序變量外,還包含了堆棧和寄存器組在器組在data區(qū)的聲明。區(qū)的聲明。 標(biāo)準(zhǔn)變量和用戶自定義變量都可存儲(chǔ)在標(biāo)準(zhǔn)變量和用戶自定義變量都可存儲(chǔ)在data區(qū)區(qū)中,只要不超過中,只要不超過data區(qū)的范圍。區(qū)的范圍

20、。 因?yàn)橐驗(yàn)镃x51使用默認(rèn)的寄存器組來傳遞參數(shù),使用默認(rèn)的寄存器組來傳遞參數(shù),1個(gè)工作寄存器組就是個(gè)工作寄存器組就是8個(gè)單元字節(jié)。你至少失去了個(gè)單元字節(jié)。你至少失去了8個(gè)字節(jié)。另外要定義足夠大的堆??臻g。當(dāng)你的內(nèi)個(gè)字節(jié)。另外要定義足夠大的堆??臻g。當(dāng)你的內(nèi)部堆棧溢出的時(shí)候,你的程序會(huì)莫名其妙地復(fù)位,部堆棧溢出的時(shí)候,你的程序會(huì)莫名其妙地復(fù)位,實(shí)際原因是實(shí)際原因是8051系列微處理器沒有硬件報(bào)錯(cuò)機(jī)制,系列微處理器沒有硬件報(bào)錯(cuò)機(jī)制,堆棧溢出只能以這種方式表示出來。堆棧溢出只能以這種方式表示出來。(2)bdata區(qū)區(qū) 可以在可以在data區(qū)的位尋址區(qū)定義變量,這個(gè)變量區(qū)的位尋址區(qū)定義變量,這個(gè)變量

21、的每個(gè)位就可進(jìn)行位尋址。的每個(gè)位就可進(jìn)行位尋址。 這對(duì)狀態(tài)寄存器來說是十分有用的,因?yàn)樗柽@對(duì)狀態(tài)寄存器來說是十分有用的,因?yàn)樗枰獑为?dú)地使用變量的每一位。要單獨(dú)地使用變量的每一位。 不一定要用位變量名來引用位變量,下面是一不一定要用位變量名來引用位變量,下面是一些在些在bdata段中聲明變量和使用位變量的例子:段中聲明變量和使用位變量的例子:unsigned char bdata status_byte;unsigned int bdata status_word;unsigned long bdata status_dword;sbit stat_flag=status_byte4;if(

22、status_word15) stat_flag=1; idata區(qū)也可存放使用比較頻繁的變量,使用寄存器區(qū)也可存放使用比較頻繁的變量,使用寄存器作為指針進(jìn)行尋址。在寄存器中設(shè)置作為指針進(jìn)行尋址。在寄存器中設(shè)置8位地址進(jìn)行間接位地址進(jìn)行間接尋址,和外部存儲(chǔ)器尋址比,它的指令執(zhí)行周期和代尋址,和外部存儲(chǔ)器尋址比,它的指令執(zhí)行周期和代碼長(zhǎng)度都比較短:碼長(zhǎng)度都比較短:(3)idata區(qū)區(qū)unsigned char idata system_status=0;unsigned int idata unit_id2;char idata inp_string16;float idata outp_val

23、ue; 在這兩個(gè)區(qū)聲明變量和在其它段的語法是一樣的。在這兩個(gè)區(qū)聲明變量和在其它段的語法是一樣的。pdata段只有段只有256個(gè)字節(jié),而個(gè)字節(jié),而xdata段可達(dá)段可達(dá)65536個(gè)字個(gè)字節(jié)。下面是一些例子:節(jié)。下面是一些例子:(4)pdata和和xdata區(qū)區(qū)unsigned char xdata system_status=0;unsigned int pdata unit_id2;char xdata inp_string16;float pdata outp_value; 對(duì)對(duì)pdata和和xdata的操作是相似的,對(duì)的操作是相似的,對(duì)pdata段尋段尋址比對(duì)址比對(duì)xdata段尋址要快,因

24、為對(duì)段尋址要快,因?yàn)閷?duì)pdata段尋址只需要段尋址只需要裝入裝入8位地址,而對(duì)位地址,而對(duì)xdata段尋址需裝入段尋址需裝入16位地址,所位地址,所以盡量把外部數(shù)據(jù)存儲(chǔ)在以盡量把外部數(shù)據(jù)存儲(chǔ)在pdata段中。對(duì)段中。對(duì)pdata和和xdata尋址要使用尋址要使用MOVX 指令,需要兩個(gè)處理周期。指令,需要兩個(gè)處理周期。inp_byte=XBYTE0 x8500; /從從8500H讀字節(jié)讀字節(jié)inp_word=XWORD0 x4000; /從從4000H讀字讀字c=*(char xdata *) 0 x0000); /從從0000讀字節(jié)讀字節(jié)XBYTE0 x7500=out_val;/寫字節(jié)到寫

25、字節(jié)到7500H 在外部地址段中,除了包含存儲(chǔ)器地址外,還包在外部地址段中,除了包含存儲(chǔ)器地址外,還包含含I/O器件的地址,對(duì)外部器件尋址可通過指針或器件的地址,對(duì)外部器件尋址可通過指針或Cx51提供的宏。提供的宏。 建議使用宏對(duì)外部器件進(jìn)行尋址,因?yàn)檫@樣更有建議使用宏對(duì)外部器件進(jìn)行尋址,因?yàn)檫@樣更有可讀性,宏定義使得存儲(chǔ)段看上去像可讀性,宏定義使得存儲(chǔ)段看上去像char和和int類型的類型的數(shù)組。數(shù)組。下面是一些絕對(duì)寄存器尋址的例子:下面是一些絕對(duì)寄存器尋址的例子:unsigned int code unit_id2=1234;unsigned char code Num= 0 x00, 0

26、 x01, 0 x02, 0 x03, 0 x04, 0 x05, 0 x06, 0 x07, 0 x08, 0 x09, 0 x10, 0 x11, 0 x12, 0 x13, 0 x14, 0 x15;(5)code區(qū)區(qū) 代碼區(qū)的數(shù)據(jù)是不可改變的,代碼區(qū)的數(shù)據(jù)是不可改變的,8051的代碼段不的代碼段不可重寫。一般代碼段中可存放數(shù)據(jù)表、跳轉(zhuǎn)向量和可重寫。一般代碼段中可存放數(shù)據(jù)表、跳轉(zhuǎn)向量和狀態(tài)表,對(duì)狀態(tài)表,對(duì)code段的訪問和對(duì)段的訪問和對(duì)xdata段的訪問的時(shí)間段的訪問的時(shí)間是一樣的。代碼段中的對(duì)象在編譯的時(shí)候初始化,是一樣的。代碼段中的對(duì)象在編譯的時(shí)候初始化,否則你就得不到你想要的值。下

27、面是代碼段的聲明否則你就得不到你想要的值。下面是代碼段的聲明例子:例子:5、存儲(chǔ)器模式、存儲(chǔ)器模式 Cx51提供了提供了3種存儲(chǔ)器模式來存儲(chǔ)變量過程參數(shù)和種存儲(chǔ)器模式來存儲(chǔ)變量過程參數(shù)和分配再入函數(shù)堆棧:分配再入函數(shù)堆棧:存儲(chǔ)模式存儲(chǔ)模式說明說明small參數(shù)及局部變量放入?yún)?shù)及局部變量放入data區(qū),默認(rèn)存儲(chǔ)類型區(qū),默認(rèn)存儲(chǔ)類型是是data,棧空間位于片內(nèi),??臻g位于片內(nèi)idata(片內(nèi)片內(nèi)RAM)compact參數(shù)及局部變量放入?yún)?shù)及局部變量放入pdata區(qū),默認(rèn)存儲(chǔ)類型區(qū),默認(rèn)存儲(chǔ)類型是是pdata(片外片外RAM);棧空間位于片內(nèi);??臻g位于片內(nèi)idata(片內(nèi)片內(nèi)RAM)large參

28、數(shù)及局部變量放入?yún)?shù)及局部變量放入xdata區(qū),默認(rèn)存儲(chǔ)類型區(qū),默認(rèn)存儲(chǔ)類型是是xdata,模擬堆棧位于片外,模擬堆棧位于片外xdata(片外片外RAM) 一般來說如果系統(tǒng)所需要的內(nèi)存數(shù)小于內(nèi)部一般來說如果系統(tǒng)所需要的內(nèi)存數(shù)小于內(nèi)部RAM數(shù)時(shí),都數(shù)時(shí),都應(yīng)以應(yīng)以small模式進(jìn)行編譯。模式進(jìn)行編譯。 在這種模式下,在這種模式下,data段是所有內(nèi)部變量和全局變量的默認(rèn)段是所有內(nèi)部變量和全局變量的默認(rèn)存儲(chǔ)段存儲(chǔ)段,所有參數(shù)傳遞都發(fā)生在,所有參數(shù)傳遞都發(fā)生在data段中段中。 這種這種模式的優(yōu)勢(shì)就是數(shù)據(jù)的存取速度很快,模式的優(yōu)勢(shì)就是數(shù)據(jù)的存取速度很快,但只有但只有1個(gè)字個(gè)字節(jié)尋址的存儲(chǔ)空間供你使用

29、節(jié)尋址的存儲(chǔ)空間供你使用(總共有(總共有128,但至少有,但至少有8個(gè)字節(jié)個(gè)字節(jié)被寄存器組使用)。被寄存器組使用)。(1)small模式。模式。 如果你的系統(tǒng)有如果你的系統(tǒng)有256字節(jié)或更少的外部字節(jié)或更少的外部RAM,你可以,你可以使用使用compact模式,這樣一來,如果不加說明,這種模式將模式,這樣一來,如果不加說明,這種模式將擴(kuò)充你能夠使用的擴(kuò)充你能夠使用的RAM數(shù)量。對(duì)數(shù)量。對(duì)xdata段以外的數(shù)據(jù)存儲(chǔ)仍段以外的數(shù)據(jù)存儲(chǔ)仍然是很快的,然是很快的,變量的參數(shù)傳遞變量的參數(shù)傳遞將在內(nèi)部將在內(nèi)部RAM中進(jìn)行,這樣中進(jìn)行,這樣存儲(chǔ)速度會(huì)比較快。對(duì)存儲(chǔ)速度會(huì)比較快。對(duì)pdata段的數(shù)據(jù)的尋址是

30、通過段的數(shù)據(jù)的尋址是通過R0和和R1進(jìn)行間接尋址的,比使用進(jìn)行間接尋址的,比使用DPTR要快一些。要快一些。(2)compact模式模式 在在large模式中模式中所有變量的默認(rèn)存儲(chǔ)區(qū)所有變量的默認(rèn)存儲(chǔ)區(qū)是是xdata段,段,Keil C盡量使用盡量使用內(nèi)部寄存器組進(jìn)行參數(shù)傳遞內(nèi)部寄存器組進(jìn)行參數(shù)傳遞。在寄存器。在寄存器組中可以傳遞參數(shù)的數(shù)量和組中可以傳遞參數(shù)的數(shù)量和compact模式一樣。對(duì)模式一樣。對(duì)xdata段數(shù)據(jù)的訪問是最慢的,所以要仔細(xì)考慮變量應(yīng)存儲(chǔ)的段數(shù)據(jù)的訪問是最慢的,所以要仔細(xì)考慮變量應(yīng)存儲(chǔ)的位置,使數(shù)據(jù)的存儲(chǔ)速度得到優(yōu)化。位置,使數(shù)據(jù)的存儲(chǔ)速度得到優(yōu)化。(3)large模式模

31、式3.4 特殊功能寄存器SFR及其Cx51定義 特殊功能寄存器用關(guān)鍵詞特殊功能寄存器用關(guān)鍵詞sfr來定義,來定義,sfr16用來定義用來定義16位的特殊功能寄存器,如位的特殊功能寄存器,如DPTR。 通過名字或地址來引用特殊功能寄存器地址必通過名字或地址來引用特殊功能寄存器地址必須高于須高于80H。 可位尋址的字節(jié)地址的位變量定義用關(guān)鍵字可位尋址的字節(jié)地址的位變量定義用關(guān)鍵字sbit。 對(duì)于大多數(shù)對(duì)于大多數(shù)8051成員,成員,Keil提供了一個(gè)包含了提供了一個(gè)包含了所有特殊功能寄存器和它們的位的定義的頭文件,所有特殊功能寄存器和它們的位的定義的頭文件,通過包含頭文件可以很容易地進(jìn)行新的擴(kuò)展。通

32、過包含頭文件可以很容易地進(jìn)行新的擴(kuò)展。sfr SCON=0 x98; /定義定義 SCONsbit SM0=0 x9F; /定義定義 SCON的各位的各位sbit SM1=0 x9E;sbit SM2=0 x9D;sbit REN=0 x9C;sbit TB8=0 x9B;sbit RB8=0 x9A;sbit TI=0 x99;sbit RI=0 x98; 注意,用注意,用sfr16定義的定義的16位特殊功能寄存器的位特殊功能寄存器的字節(jié)順序,前面的為低字節(jié),后面的為高字節(jié),這個(gè)字節(jié)順序,前面的為低字節(jié),后面的為高字節(jié),這個(gè)和和8x86中的順序相同,但是中的順序相同,但是int的高低字節(jié)順序

33、卻正的高低字節(jié)順序卻正好相反。(好相反。(P64、P65)3.5 并行接口及其Cx51定義 8051單片機(jī)具有單片機(jī)具有P0、P1、P2和和P3四個(gè)端口,四個(gè)端口,許多增強(qiáng)型單片機(jī)還有許多增強(qiáng)型單片機(jī)還有P4端口。沒有針對(duì)這些端口端口。沒有針對(duì)這些端口的專用的專用IO操作指令,操作指令,8051對(duì)對(duì)IO口的操作是通過設(shè)口的操作是通過設(shè)置其輸出鎖存器置其輸出鎖存器SFR來實(shí)現(xiàn)的。來實(shí)現(xiàn)的。 部分針對(duì)部分針對(duì)IO口的讀取指令是讀取端口鎖存器,口的讀取指令是讀取端口鎖存器,部分是讀取端口的輸入狀態(tài),通常那些針對(duì)端口的部分是讀取端口的輸入狀態(tài),通常那些針對(duì)端口的讀讀修改修改寫指令讀取的是端口鎖存器(對(duì)

34、應(yīng)寫指令讀取的是端口鎖存器(對(duì)應(yīng)SFR的地址單元)而不是引腳狀態(tài),這樣可以防止因外的地址單元)而不是引腳狀態(tài),這樣可以防止因外部環(huán)境不穩(wěn)定而引起的誤操作。部環(huán)境不穩(wěn)定而引起的誤操作。 P0-3端口的端口的SFR地址的尾數(shù)不是地址的尾數(shù)不是0就是就是8,所以它,所以它們也是可以位尋址的們也是可以位尋址的SFR。端口在。端口在Cx51中可以直接中可以直接用用sfr來定義:來定義:sfr P0=0 x80;/定義定義IO口口P0sfr P1=0 x90;/定義定義IO口口P1sfr P2=0 xA0;/定義定義IO口口P2sfr P3=0 xB0;/定義定義IO口口P3 端口中的每一個(gè)端口中的每一個(gè)

35、IO口線還可以用口線還可以用sbit來定義其每來定義其每一個(gè)位:一個(gè)位:sbit P00=P00;/定義定義IO線線sbit P01=P01;/定義定義IO線線sbit P02=P02;/定義定義IO線線sbit P03=P03;/定義定義IO線線sbit P04=P04;/定義定義IO線線sbit P05=P05;/定義定義IO線線sbit P06=P06;/定義定義IO線線sbit P07=P07;/定義定義IO線線3.6 位變量及其Cx51定義 位變量是位變量是Cx51中針對(duì)其硬件特點(diǎn)引入的一種新中針對(duì)其硬件特點(diǎn)引入的一種新變量,它并不是標(biāo)準(zhǔn)變量,它并不是標(biāo)準(zhǔn)C語言的變量。語言的變量。

36、內(nèi)部?jī)?nèi)部data區(qū)地址區(qū)地址202FH共共128位占有位地址位占有位地址0-127,而地址尾數(shù)為而地址尾數(shù)為0或者或者8的的SFR共共128位占有位地址位占有位地址128-255。 使用使用C51編程時(shí),定義了位變量后,就可以用定義了的編程時(shí),定義了位變量后,就可以用定義了的變量來表示變量來表示MCS-51的位尋址單元。的位尋址單元。 位變量的位變量的C51定義的一般語法格式如下:定義的一般語法格式如下: 位類型標(biāo)識(shí)符位類型標(biāo)識(shí)符(bit) 位變量名;位變量名; 這里,這里, bit是一個(gè)數(shù)據(jù)類型是一個(gè)數(shù)據(jù)類型 例如:例如:bit direction_bit ;/* 把把direction_b

37、it定義為位變量定義為位變量 */bit look_pointer ;/* 把把look_pointer定義為位變量定義為位變量 */ (1) 位變量位變量C51定義。定義。(2) 函數(shù)可包含類型為函數(shù)可包含類型為“bit”的參數(shù),也可以將其作為返回值。的參數(shù),也可以將其作為返回值。例如:例如: bit func(bit b0, bit b1) /* 變量變量b0,b1作為函數(shù)的參數(shù)作為函數(shù)的參數(shù) */ return (b1); /* 變量變量b1作為函數(shù)的返回值作為函數(shù)的返回值 */ 注意,使用禁止中斷注意,使用禁止中斷(#pragma disable)或包含明確的寄存器組或包含明確的寄存器

38、組切換切換(using n)的,函數(shù)不能返回位值。否則編輯器將會(huì)給出一的,函數(shù)不能返回位值。否則編輯器將會(huì)給出一個(gè)錯(cuò)誤信息。個(gè)錯(cuò)誤信息。位變量不能定義成一個(gè)指針,如不能定義:位變量不能定義成一個(gè)指針,如不能定義: bit * bit_pointer。(錯(cuò))。(錯(cuò))不存在位數(shù)組,如不能定義:不存在位數(shù)組,如不能定義:bit b_array 。 (錯(cuò))(錯(cuò)) (3) 對(duì)位變量定義的限制。對(duì)位變量定義的限制??晌粚ぶ纷止?jié)變量的某一個(gè)位使用關(guān)鍵詞可位尋址字節(jié)變量的某一個(gè)位使用關(guān)鍵詞sbit定義定義;bdata區(qū)(片內(nèi)區(qū)(片內(nèi)RAM單元單元20-2F)的獨(dú)立位變量則用關(guān)鍵詞)的獨(dú)立位變量則用關(guān)鍵詞bit

39、定義:定義: 關(guān)鍵詞關(guān)鍵詞sbit和和bit對(duì)位變量定義僅僅是形式上的區(qū)別,在對(duì)位變量定義僅僅是形式上的區(qū)別,在實(shí)際操作中式完全一樣的。實(shí)際操作中式完全一樣的。例例1 先定義變量的數(shù)據(jù)類型和存儲(chǔ)類型(先定義變量的數(shù)據(jù)類型和存儲(chǔ)類型(P69):):bdata int ibase; /* 定義定義ibase為為bdata整型變量,整型變量,16位位 */bdata char bary4;/* bary4定義為定義為bdata字符型數(shù)組字符型數(shù)組 */然后可使用然后可使用sbit定義可獨(dú)立尋址訪問的對(duì)象位:定義可獨(dú)立尋址訪問的對(duì)象位:sbit mybit0 = ibase0 ;/* mybit0定義

40、為定義為ibase的第的第0位位 */sbit mybit15 = ibase15; /* mybit0定義為定義為ibase的第的第15位位 */sbit Ary07 = bary07 ; /* Ary07定義為定義為abry0的第的第7位位 */sbit Ary37 = bary37 ; /* Ary37定義為定義為abry3的第的第7位位 */ 對(duì)象對(duì)象ibase和和bary也可以字節(jié)尋址也可以字節(jié)尋址: ary37=0; /* bary3的第的第7位賦值為位賦值為0 */ bary3=a; /* 字節(jié)尋址字節(jié)尋址,bary3 賦值為賦值為a */問問bary3中放了哪個(gè)數(shù)據(jù)中放了哪個(gè)數(shù)

41、據(jù)? “”操作符后的最大值依賴于指定的數(shù)據(jù)類型,操作符后的最大值依賴于指定的數(shù)據(jù)類型, 對(duì)于對(duì)于char/uchar而言是而言是07; #define uchar unsigned char 對(duì)于對(duì)于int/uint 而言是而言是015; #define uint unsigned char 對(duì)于對(duì)于long/ulong而言是而言是031; #define ulong unsigned char3.7 Cx51的運(yùn)算規(guī)則3.7.1 算術(shù)運(yùn)算及其優(yōu)先級(jí)算術(shù)運(yùn)算及其優(yōu)先級(jí)3.7.2 關(guān)系運(yùn)算及其優(yōu)先級(jí)關(guān)系運(yùn)算及其優(yōu)先級(jí)3.7.3 邏輯運(yùn)算及其優(yōu)先級(jí)邏輯運(yùn)算及其優(yōu)先級(jí)3.7.4 位操作及其表達(dá)式位操

42、作及其表達(dá)式3.7.5 自減、自加和復(fù)合運(yùn)算自減、自加和復(fù)合運(yùn)算一、一、Cx51最基本的最基本的5種算術(shù)運(yùn)算符種算術(shù)運(yùn)算符 +:加法運(yùn)算,或者正值符號(hào);加法運(yùn)算,或者正值符號(hào); -:減法運(yùn)算,或者負(fù)值符號(hào);減法運(yùn)算,或者負(fù)值符號(hào); *:乘法運(yùn)算;乘法運(yùn)算; /:除法運(yùn)算,取商;除法運(yùn)算,取商; %:取模取模(求余求余)運(yùn)算符,取余數(shù)運(yùn)算符,取余數(shù)P69。3.7.1 算術(shù)運(yùn)算及其優(yōu)先級(jí)算術(shù)運(yùn)算及其優(yōu)先級(jí)二、算術(shù)表達(dá)式、優(yōu)先級(jí)與結(jié)合性二、算術(shù)表達(dá)式、優(yōu)先級(jí)與結(jié)合性 用算術(shù)運(yùn)算符和括號(hào)將運(yùn)算對(duì)象連接起來的用算術(shù)運(yùn)算符和括號(hào)將運(yùn)算對(duì)象連接起來的式子稱之為算術(shù)表達(dá)式。式子稱之為算術(shù)表達(dá)式。運(yùn)算優(yōu)先級(jí),指

43、當(dāng)運(yùn)算對(duì)象兩側(cè)都有運(yùn)算符時(shí),運(yùn)算優(yōu)先級(jí),指當(dāng)運(yùn)算對(duì)象兩側(cè)都有運(yùn)算符時(shí),執(zhí)行運(yùn)算的先后次序:先乘、除、模執(zhí)行運(yùn)算的先后次序:先乘、除、模(3者等同者等同),后加、減后加、減(2者等同者等同),括號(hào)最優(yōu)先。,括號(hào)最優(yōu)先。(a+b)*(c-d)-e運(yùn)算結(jié)合性,指當(dāng)運(yùn)算對(duì)象兩側(cè)的運(yùn)算符具有運(yùn)算結(jié)合性,指當(dāng)運(yùn)算對(duì)象兩側(cè)的運(yùn)算符具有相同優(yōu)先級(jí)時(shí),執(zhí)行運(yùn)算的先后次序:先左后相同優(yōu)先級(jí)時(shí),執(zhí)行運(yùn)算的先后次序:先左后右。右。a+b-c三、數(shù)據(jù)類型轉(zhuǎn)換三、數(shù)據(jù)類型轉(zhuǎn)換 如果一個(gè)運(yùn)算符的兩側(cè)的數(shù)據(jù)類型不同,則必須先通如果一個(gè)運(yùn)算符的兩側(cè)的數(shù)據(jù)類型不同,則必須先通過數(shù)據(jù)類型轉(zhuǎn)換,將兩側(cè)的數(shù)據(jù)轉(zhuǎn)換成位相同類型。轉(zhuǎn)過數(shù)據(jù)

44、類型轉(zhuǎn)換,將兩側(cè)的數(shù)據(jù)轉(zhuǎn)換成位相同類型。轉(zhuǎn)換的方法有兩種:換的方法有兩種: 自動(dòng)自動(dòng)(缺省缺省)類型轉(zhuǎn)換,即在程序編譯時(shí)由類型轉(zhuǎn)換,即在程序編譯時(shí)由C編譯器編譯器自動(dòng)從低類型到高類型進(jìn)行類型轉(zhuǎn)換;自動(dòng)從低類型到高類型進(jìn)行類型轉(zhuǎn)換;P70 強(qiáng)制類型轉(zhuǎn)換,需要使用強(qiáng)制類型轉(zhuǎn)換符。強(qiáng)制類型轉(zhuǎn)換,需要使用強(qiáng)制類型轉(zhuǎn)換符。unsigned char a,b,c;c=a+(unsigned int)b; 首先首先(unsigned int)強(qiáng)制把強(qiáng)制把b轉(zhuǎn)換為類型轉(zhuǎn)換為類型unsigned int,編譯,編譯器在編譯加法代碼時(shí)自動(dòng)把器在編譯加法代碼時(shí)自動(dòng)把a(bǔ)轉(zhuǎn)換為轉(zhuǎn)換為unsigned int,最后存放運(yùn),最后存放運(yùn)算結(jié)果時(shí),編譯器又自動(dòng)把算結(jié)果時(shí),編譯器又自動(dòng)把a(bǔ)轉(zhuǎn)換為轉(zhuǎn)換為unsigned char3.7.2 關(guān)系運(yùn)算及其優(yōu)先級(jí)關(guān)系運(yùn)算及其優(yōu)先級(jí)優(yōu)先級(jí)相同優(yōu)先級(jí)相同(高高)優(yōu)先級(jí)相同優(yōu)先級(jí)相同(低低) 小于小于 小于等于小于等于 大于大于 大于等于大于等于 測(cè)試等于測(cè)試等于! 測(cè)試不等于測(cè)試不等于一、關(guān)系運(yùn)算符一、關(guān)系運(yùn)算符二、關(guān)系運(yùn)算符的優(yōu)先級(jí)二、關(guān)系運(yùn)算符的優(yōu)先級(jí) 前前4種關(guān)系運(yùn)算符的優(yōu)先級(jí)相同,后種關(guān)系運(yùn)算符的優(yōu)先級(jí)相同,后2種關(guān)系種關(guān)系運(yùn)算符的優(yōu)先級(jí)也相同,前運(yùn)算符的優(yōu)先級(jí)也相同,前4中關(guān)系運(yùn)算符的優(yōu)中關(guān)系運(yùn)算符的優(yōu)先級(jí)高于后先級(jí)高于后2種。種。 關(guān)系運(yùn)算

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論