




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第三章Cx51數(shù)據(jù)與運算第三章 Cx51數(shù)據(jù)與運算 3.1 數(shù)據(jù)與數(shù)據(jù)類型3.2 常量與變量3.3 Cx51數(shù)據(jù)的存儲結構3.4 SFR及其Cx51定義3.5 并行接口及其Cx51定義3.6 位變量及其Cx51定義3.7 Cx51的運算規(guī)則3.1 數(shù)據(jù)與數(shù)據(jù)類型 Keil C有有ANSI C的所有標準數(shù)據(jù)類型,除此之的所有標準數(shù)據(jù)類型,除此之外為了更加有利地利用外為了更加有利地利用8051的結構,還加入了一些的結構,還加入了一些特殊的數(shù)據(jù)類型。特殊的數(shù)據(jù)類型。 除了這些標準數(shù)據(jù)類型外,編譯器還支持一種位除了這些標準數(shù)據(jù)類型外,編譯器還支持一種位數(shù)據(jù)類型,一個位變量存在于內(nèi)部數(shù)據(jù)類型,一個位變量
2、存在于內(nèi)部RAM的可位尋址的可位尋址區(qū)中,可像操作其它變量那樣對位變量進行操作,區(qū)中,可像操作其它變量那樣對位變量進行操作,而位數(shù)組和位指針是違法的。而位數(shù)組和位指針是違法的。數(shù)據(jù)類型數(shù)據(jù)類型大小大小char/unsigned char8 bitint/unsigned int16 bitlong/unsigned long32 bitfloat/double32bit一般指針一般指針generic pointer24 bit Cx51實際上不支持雙精度浮點數(shù)實際上不支持雙精度浮點數(shù)double,即便你,即便你定義了定義了double,也是按照,也是按照float處理的。處理的。1、基本數(shù)據(jù)類
3、型、基本數(shù)據(jù)類型數(shù)組數(shù)組(array)結構體結構體(struct)聯(lián)合體聯(lián)合體(union)枚舉枚舉(enum)2、構造數(shù)據(jù)類型、構造數(shù)據(jù)類型3、指針類型、指針類型4、空類型、空類型3.2 常量與變量 C語言中的數(shù)據(jù)有常量和變量之分。語言中的數(shù)據(jù)有常量和變量之分。 常量常量在程序運行的過程中,其值始終不能改變的量。在程序運行的過程中,其值始終不能改變的量。 變量變量在程序運行的過程中其值可以改變的量。在程序運行的過程中其值可以改變的量。 常量和變量一樣可以有不同的數(shù)據(jù)類型。可以用一個常量和變量一樣可以有不同的數(shù)據(jù)類型??梢杂靡粋€標識符標識符const來聲明一個量是常量。來聲明一個量是常量。un
4、signed char data system_status=0;unsigned int data unit_id2;const char data samp_string16;float data outport_value; 我們還要經(jīng)常用到使用預編譯語句我們還要經(jīng)常用到使用預編譯語句#define定定義的符號常量:義的符號常量:#define CONST100#define NULL0#define TRUE1#define FALSE0 符號常量和變量的區(qū)別在于,符號常量的值在符號常量和變量的區(qū)別在于,符號常量的值在其作用域其作用域(例如所在的函數(shù)例如所在的函數(shù))中不能改變,也不能用
5、中不能改變,也不能用等號賦值,它僅僅是代表某個固定常數(shù)的一個符號等號賦值,它僅僅是代表某個固定常數(shù)的一個符號而已。而已。 習慣上符號常量通常用大寫,而變量著用小寫,習慣上符號常量通常用大寫,而變量著用小寫,注意養(yǎng)成良好的編程習慣。注意養(yǎng)成良好的編程習慣。1、位變量、位變量 位變量位變量(bit)的類型是位,其值可以是的類型是位,其值可以是1(true)或者或者0(false)。這些位變量定義在內(nèi)。這些位變量定義在內(nèi)部部RAM的可位尋址區(qū)。的可位尋址區(qū)。2、字符變量、字符變量字符變量字符變量(char)的類型是一個字節(jié)共的類型是一個字節(jié)共8位,是帶位,是帶符號的單字節(jié)數(shù),其值范圍為符號的單字節(jié)數(shù)
6、,其值范圍為-128+127。無符號字符變量無符號字符變量(unsigned char)也是一個字也是一個字節(jié),但是不帶符號,其值范圍為節(jié),但是不帶符號,其值范圍為0+255。3、整型變量、整型變量 整型變量整型變量(int)的類型是雙字節(jié)共的類型是雙字節(jié)共16位,其位,其取值范圍是取值范圍是-32768+32767。 無符號整型變量無符號整型變量(unsigned int)為雙字節(jié)但為雙字節(jié)但不帶符號,其值范圍為不帶符號,其值范圍為065535。Keil Cx51中整型變量中整型變量(int)的字節(jié)存放次序:的字節(jié)存放次序:高高8位存放在低地址,低位存放在低地址,低8位則存放在高地址。位則存
7、放在高地址。例如位于地址例如位于地址0 x1100的整數(shù)的整數(shù)0 x1234:低地址低地址0 x1100存放存放0 x12,高地址高地址0 x1101存放存放0 x34。4、浮點變量、浮點變量 浮點變量浮點變量(float)的類型是的類型是4字節(jié)共字節(jié)共32位,其位,其存放格式為:存放格式為:地址地址+0+1+2+3內(nèi)容內(nèi)容SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM Keil Cx51中浮點變量中浮點變量(float)采用采用IEEE-754標準,由標準,由1位符號、位符號、8位指數(shù)和位指數(shù)和23位尾數(shù)位尾數(shù)(最最高位始終為高位始終為1無需保存無需保存)組成,具有組
8、成,具有24位精度位精度 浮點變量浮點變量(float)的字節(jié)次序和編譯器及其版的字節(jié)次序和編譯器及其版本有關。本有關。 Keil C編譯器能從你的程序源代碼中產(chǎn)生高編譯器能從你的程序源代碼中產(chǎn)生高度優(yōu)化的代碼,但你可以幫助編譯器產(chǎn)生更好的度優(yōu)化的代碼,但你可以幫助編譯器產(chǎn)生更好的代碼。下面將討論這方面的一些問題。代碼。下面將討論這方面的一些問題。5、使用、使用Keil C時應做的和應該避免的時應做的和應該避免的 一個提高代碼效率的最基本的方式就是減小一個提高代碼效率的最基本的方式就是減小變量的長度。使用變量的長度。使用C編程時,我們都習慣于對循編程時,我們都習慣于對循環(huán)控制變量使用環(huán)控制變量
9、使用int類型,這對類型,這對8位的單片機來位的單片機來說是一種極大的浪費。你應該仔細考慮你所聲明說是一種極大的浪費。你應該仔細考慮你所聲明的變量值可能的范圍,然后選擇合適的變量類型。的變量值可能的范圍,然后選擇合適的變量類型。 很明顯,經(jīng)常使用的變量應該是很明顯,經(jīng)常使用的變量應該是unsigned char,只占用一個字節(jié),只占用一個字節(jié):(1)采用短變量)采用短變量unsigned char data n; 為什么要使用無符號類型呢?為什么要使用無符號類型呢? 原因是原因是8051不支持符號運算,程序中也不要使不支持符號運算,程序中也不要使用含有帶符號變量的外部代碼。除了根據(jù)變量長度用含
10、有帶符號變量的外部代碼。除了根據(jù)變量長度來選擇變量類型之外,你還要考慮變量是否會用于來選擇變量類型之外,你還要考慮變量是否會用于負數(shù)的場合,如果你的程序中可以不需要負數(shù),那負數(shù)的場合,如果你的程序中可以不需要負數(shù),那么把變量都定義成無符號類型的變量么把變量都定義成無符號類型的變量:(2)使用無符號類型)使用無符號類型 unsigned int data n1,n2; 在在8位操作系統(tǒng)上使用位操作系統(tǒng)上使用32位浮點數(shù)是得不償位浮點數(shù)是得不償失的。你可以這樣做,但會浪費大量的時間。所失的。你可以這樣做,但會浪費大量的時間。所以當你要在系統(tǒng)中使用浮點數(shù)的時候,你要問問以當你要在系統(tǒng)中使用浮點數(shù)的時
11、候,你要問問自己這是否一定需要??梢酝ㄟ^提高數(shù)值數(shù)量級自己這是否一定需要??梢酝ㄟ^提高數(shù)值數(shù)量級和使用整型運算來消除浮點指針。處理和使用整型運算來消除浮點指針。處理int和和long比處理比處理double和和float要方便得多,你的要方便得多,你的代碼執(zhí)行起來會更快,也不用連接處理浮點指針代碼執(zhí)行起來會更快,也不用連接處理浮點指針的模塊。如果你一定要采用浮點指針的話,你應的模塊。如果你一定要采用浮點指針的話,你應該采用西門子該采用西門子80517和達拉斯半導體公司的和達拉斯半導體公司的80320,這些已經(jīng)對數(shù)處理進行過優(yōu)化的單片,這些已經(jīng)對數(shù)處理進行過優(yōu)化的單片機。機。 (3)避免使用浮點
12、數(shù))避免使用浮點數(shù)(4)使用位變量)使用位變量對于某些標志位應使用位變量而不是對于某些標志位應使用位變量而不是unsigned char,這將節(jié)省你的內(nèi)存。你不用多浪費,這將節(jié)省你的內(nèi)存。你不用多浪費7位存儲位存儲區(qū),而且位變量在區(qū),而且位變量在RAM中訪問他們只需要一個處理中訪問他們只需要一個處理周期。周期。 把變量定義成局部變量比全局變量更有效率,把變量定義成局部變量比全局變量更有效率,編譯器為局部變量在內(nèi)部存儲區(qū)中分配存儲空間,編譯器為局部變量在內(nèi)部存儲區(qū)中分配存儲空間,而為全局變量在外部存儲區(qū)中分配存儲空間,這而為全局變量在外部存儲區(qū)中分配存儲空間,這會降低你的訪問速度。會降低你的訪問
13、速度。 另一個避免使用全局變量的原因是你必須在另一個避免使用全局變量的原因是你必須在你系統(tǒng)的處理過程中調(diào)節(jié)使用全局變量,因為在你系統(tǒng)的處理過程中調(diào)節(jié)使用全局變量,因為在中斷系統(tǒng)和多任務系統(tǒng)中,不止一個過程會使用中斷系統(tǒng)和多任務系統(tǒng)中,不止一個過程會使用全局變量。全局變量。(5)用局部變量代替全局變量)用局部變量代替全局變量 局部變量和全局變量可被定義在你想要的存儲局部變量和全局變量可被定義在你想要的存儲區(qū)中,根據(jù)先前的討論,當你把經(jīng)常使用的變量放區(qū)中,根據(jù)先前的討論,當你把經(jīng)常使用的變量放在內(nèi)部在內(nèi)部RAM中時,可使你的程序的速度得到提高。中時,可使你的程序的速度得到提高。除此之外,你還縮短了
14、你的代碼,除此之外,你還縮短了你的代碼, 因為外部存儲因為外部存儲區(qū)尋址的指令相對要麻煩一些。區(qū)尋址的指令相對要麻煩一些。 考慮到存儲速度,按下面的順序使用存儲器:考慮到存儲速度,按下面的順序使用存儲器:data、idata、pdata、xdata,但要記得留出,但要記得留出足夠的堆??臻g。足夠的堆??臻g。(6)為變量分配內(nèi)部存儲區(qū))為變量分配內(nèi)部存儲區(qū)3.3 Cx51數(shù)據(jù)的存儲結構 因為因為Keil Cx51是面向是面向8051系列單片機及其硬系列單片機及其硬件控制系統(tǒng)的開發(fā)工具,所以在討論件控制系統(tǒng)的開發(fā)工具,所以在討論Keil Cx51的的數(shù)據(jù)類型的時候,必須同時提及它的存儲類型以數(shù)據(jù)類
15、型的時候,必須同時提及它的存儲類型以及它與及它與8051單片機存儲器結構的關系。它定義的單片機存儲器結構的關系。它定義的任何數(shù)據(jù)類型必須以一定的存儲類型的方式定位任何數(shù)據(jù)類型必須以一定的存儲類型的方式定位在在8051的某一存儲器中,否則便沒有任何的實際的某一存儲器中,否則便沒有任何的實際意義。意義。1、通用寄存器區(qū)、通用寄存器區(qū)(001FH) 通用寄存器區(qū)由通用寄存器區(qū)由4個寄存器組個寄存器組構成:構成:0組組(0007H)、 1組組(080FH)、 2組組(1017H)、 3組組(181FH)。 可以通過可以通過PSW中中RS0和和RS1的不同取值來的不同取值來選擇不同的寄存器組。在函數(shù)定義
16、中則可以使用選擇不同的寄存器組。在函數(shù)定義中則可以使用關鍵詞關鍵詞using來指明寄存器號。來指明寄存器號。 上電復位后默認使用寄存器組上電復位后默認使用寄存器組0。當其它組不。當其它組不用時,它們都可以當作普通的用時,它們都可以當作普通的RAM使用。使用。2、可位尋址區(qū)、可位尋址區(qū)(202FH) 這個區(qū)共這個區(qū)共16個字節(jié)個字節(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ù)據(jù)作為用戶存取臨
17、時數(shù)據(jù)區(qū)。區(qū)。 許多單片機的高許多單片機的高128字節(jié)除字節(jié)除了直接尋址的了直接尋址的SFR外還有外還有128字字節(jié)間接尋址區(qū)節(jié)間接尋址區(qū)RAM,它們也作為,它們也作為用戶區(qū)。用戶區(qū)。 通常堆棧區(qū)就設在這里,堆通常堆棧區(qū)就設在這里,堆棧指針棧指針SP可以設置這個區(qū)域??梢栽O置這個區(qū)域。3、用戶、用戶 (RAM)區(qū)區(qū) Keil允許使用者指定程序變量的存儲區(qū),這使使用允許使用者指定程序變量的存儲區(qū),這使使用者可以控制存儲區(qū)的使用。編譯器可識別以下存儲區(qū):者可以控制存儲區(qū)的使用。編譯器可識別以下存儲區(qū):存儲區(qū)存儲區(qū)描述描述dataRAM的低的低128個字節(jié),可在一個周期內(nèi)直接尋址個字節(jié),可在一個周期
18、內(nèi)直接尋址bdatadata區(qū)的區(qū)的16個字節(jié)的可位尋址區(qū)個字節(jié)的可位尋址區(qū)idataRAM區(qū)的高區(qū)的高128個字節(jié),必須采用間接尋址個字節(jié),必須采用間接尋址pdata外部存儲區(qū)的外部存儲區(qū)的256個字節(jié),一般是片外個字節(jié),一般是片外RAM第一第一頁空間;通過頁空間;通過P0口的地址對其尋址,使用指令口的地址對其尋址,使用指令MOVX Ri,需要兩個指令周期,需要兩個指令周期xdata外部存儲區(qū),使用外部存儲區(qū),使用DPTR尋址尋址code程序存儲區(qū),使用程序存儲區(qū),使用PC或或DPTR尋址尋址4、存儲類型、存儲類型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ū) 對對data區(qū)的尋址是最快的,所以應該把使用頻率區(qū)的尋址是最快的,所以應該把使用頻率高的變量放在高的變量放在data區(qū)。由于空間有限,必須注意使用區(qū)。由于空間有限,必須注意使用data區(qū);除了包含程序變量外,還包含了堆棧和寄存區(qū);除了包含程序變量外,還包含了堆棧和寄存器組在器組在data區(qū)的聲明。區(qū)的聲明。 標準變量和用戶自定義變量都可存儲在標準變量和用戶自定義變量都可存儲在data區(qū)區(qū)中,只要不超過中,只要不超過data區(qū)的范圍。區(qū)的范圍
20、。 因為因為Cx51使用默認的寄存器組來傳遞參數(shù),使用默認的寄存器組來傳遞參數(shù),1個工作寄存器組就是個工作寄存器組就是8個單元字節(jié)。你至少失去了個單元字節(jié)。你至少失去了8個字節(jié)。另外要定義足夠大的堆??臻g。當你的內(nèi)個字節(jié)。另外要定義足夠大的堆??臻g。當你的內(nèi)部堆棧溢出的時候,你的程序會莫名其妙地復位,部堆棧溢出的時候,你的程序會莫名其妙地復位,實際原因是實際原因是8051系列微處理器沒有硬件報錯機制,系列微處理器沒有硬件報錯機制,堆棧溢出只能以這種方式表示出來。堆棧溢出只能以這種方式表示出來。(2)bdata區(qū)區(qū) 可以在可以在data區(qū)的位尋址區(qū)定義變量,這個變量區(qū)的位尋址區(qū)定義變量,這個變量
21、的每個位就可進行位尋址。的每個位就可進行位尋址。 這對狀態(tài)寄存器來說是十分有用的,因為它需這對狀態(tài)寄存器來說是十分有用的,因為它需要單獨地使用變量的每一位。要單獨地使用變量的每一位。 不一定要用位變量名來引用位變量,下面是一不一定要用位變量名來引用位變量,下面是一些在些在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ū)也可存放使用比較頻繁的變量,使用寄存器作為指針進行尋址。在寄存器中設置作為指針進行尋址。在寄存器中設置8位地址進行間接位地址進行間接尋址,和外部存儲器尋址比,它的指令執(zhí)行周期和代尋址,和外部存儲器尋址比,它的指令執(zhí)行周期和代碼長度都比較短:碼長度都比較短:(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; 在這兩個區(qū)聲明變量和在其它段的語法是一樣的。在這兩個區(qū)聲明變量和在其它段的語法是一樣的。pdata段只有段只有256個字節(jié),而個字節(jié),而xdata段可達段可達65536個字個字節(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; 對對pdata和和xdata的操作是相似的,對的操作是相似的,對pdata段尋段尋址比對址比對xdata段尋址要快,因
24、為對段尋址要快,因為對pdata段尋址只需要段尋址只需要裝入裝入8位地址,而對位地址,而對xdata段尋址需裝入段尋址需裝入16位地址,所位地址,所以盡量把外部數(shù)據(jù)存儲在以盡量把外部數(shù)據(jù)存儲在pdata段中。對段中。對pdata和和xdata尋址要使用尋址要使用MOVX 指令,需要兩個處理周期。指令,需要兩個處理周期。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 在外部地址段中,除了包含存儲器地址外,還包在外部地址段中,除了包含存儲器地址外,還包含含I/O器件的地址,對外部器件尋址可通過指針或器件的地址,對外部器件尋址可通過指針或Cx51提供的宏。提供的宏。 建議使用宏對外部器件進行尋址,因為這樣更有建議使用宏對外部器件進行尋址,因為這樣更有可讀性,宏定義使得存儲段看上去像可讀性,宏定義使得存儲段看上去像char和和int類型的類型的數(shù)組。數(shù)組。下面是一些絕對寄存器尋址的例子:下面是一些絕對寄存器尋址的例子: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ù)表、跳轉向量和可重寫。一般代碼段中可存放數(shù)據(jù)表、跳轉向量和狀態(tài)表,對狀態(tài)表,對code段的訪問和對段的訪問和對xdata段的訪問的時間段的訪問的時間是一樣的。代碼段中的對象在編譯的時候初始化,是一樣的。代碼段中的對象在編譯的時候初始化,否則你就得不到你想要的值。下
27、面是代碼段的聲明否則你就得不到你想要的值。下面是代碼段的聲明例子:例子:5、存儲器模式、存儲器模式 Cx51提供了提供了3種存儲器模式來存儲變量過程參數(shù)和種存儲器模式來存儲變量過程參數(shù)和分配再入函數(shù)堆棧:分配再入函數(shù)堆棧:存儲模式存儲模式說明說明small參數(shù)及局部變量放入?yún)?shù)及局部變量放入data區(qū),默認存儲類型區(qū),默認存儲類型是是data,??臻g位于片內(nèi),棧空間位于片內(nèi)idata(片內(nèi)片內(nèi)RAM)compact參數(shù)及局部變量放入?yún)?shù)及局部變量放入pdata區(qū),默認存儲類型區(qū),默認存儲類型是是pdata(片外片外RAM);??臻g位于片內(nèi);??臻g位于片內(nèi)idata(片內(nèi)片內(nèi)RAM)large參
28、數(shù)及局部變量放入?yún)?shù)及局部變量放入xdata區(qū),默認存儲類型區(qū),默認存儲類型是是xdata,模擬堆棧位于片外,模擬堆棧位于片外xdata(片外片外RAM) 一般來說如果系統(tǒng)所需要的內(nèi)存數(shù)小于內(nèi)部一般來說如果系統(tǒng)所需要的內(nèi)存數(shù)小于內(nèi)部RAM數(shù)時,都數(shù)時,都應以應以small模式進行編譯。模式進行編譯。 在這種模式下,在這種模式下,data段是所有內(nèi)部變量和全局變量的默認段是所有內(nèi)部變量和全局變量的默認存儲段存儲段,所有參數(shù)傳遞都發(fā)生在,所有參數(shù)傳遞都發(fā)生在data段中段中。 這種這種模式的優(yōu)勢就是數(shù)據(jù)的存取速度很快,模式的優(yōu)勢就是數(shù)據(jù)的存取速度很快,但只有但只有1個字個字節(jié)尋址的存儲空間供你使用
29、節(jié)尋址的存儲空間供你使用(總共有(總共有128,但至少有,但至少有8個字節(jié)個字節(jié)被寄存器組使用)。被寄存器組使用)。(1)small模式。模式。 如果你的系統(tǒng)有如果你的系統(tǒng)有256字節(jié)或更少的外部字節(jié)或更少的外部RAM,你可以,你可以使用使用compact模式,這樣一來,如果不加說明,這種模式將模式,這樣一來,如果不加說明,這種模式將擴充你能夠使用的擴充你能夠使用的RAM數(shù)量。對數(shù)量。對xdata段以外的數(shù)據(jù)存儲仍段以外的數(shù)據(jù)存儲仍然是很快的,然是很快的,變量的參數(shù)傳遞變量的參數(shù)傳遞將在內(nèi)部將在內(nèi)部RAM中進行,這樣中進行,這樣存儲速度會比較快。對存儲速度會比較快。對pdata段的數(shù)據(jù)的尋址是
30、通過段的數(shù)據(jù)的尋址是通過R0和和R1進行間接尋址的,比使用進行間接尋址的,比使用DPTR要快一些。要快一些。(2)compact模式模式 在在large模式中模式中所有變量的默認存儲區(qū)所有變量的默認存儲區(qū)是是xdata段,段,Keil C盡量使用盡量使用內(nèi)部寄存器組進行參數(shù)傳遞內(nèi)部寄存器組進行參數(shù)傳遞。在寄存器。在寄存器組中可以傳遞參數(shù)的數(shù)量和組中可以傳遞參數(shù)的數(shù)量和compact模式一樣。對模式一樣。對xdata段數(shù)據(jù)的訪問是最慢的,所以要仔細考慮變量應存儲的段數(shù)據(jù)的訪問是最慢的,所以要仔細考慮變量應存儲的位置,使數(shù)據(jù)的存儲速度得到優(yōu)化。位置,使數(shù)據(jù)的存儲速度得到優(yōu)化。(3)large模式模
31、式3.4 特殊功能寄存器SFR及其Cx51定義 特殊功能寄存器用關鍵詞特殊功能寄存器用關鍵詞sfr來定義,來定義,sfr16用來定義用來定義16位的特殊功能寄存器,如位的特殊功能寄存器,如DPTR。 通過名字或地址來引用特殊功能寄存器地址必通過名字或地址來引用特殊功能寄存器地址必須高于須高于80H。 可位尋址的字節(jié)地址的位變量定義用關鍵字可位尋址的字節(jié)地址的位變量定義用關鍵字sbit。 對于大多數(shù)對于大多數(shù)8051成員,成員,Keil提供了一個包含了提供了一個包含了所有特殊功能寄存器和它們的位的定義的頭文件,所有特殊功能寄存器和它們的位的定義的頭文件,通過包含頭文件可以很容易地進行新的擴展。通
32、過包含頭文件可以很容易地進行新的擴展。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é),這個字節(jié)順序,前面的為低字節(jié),后面的為高字節(jié),這個和和8x86中的順序相同,但是中的順序相同,但是int的高低字節(jié)順序
33、卻正的高低字節(jié)順序卻正好相反。(好相反。(P64、P65)3.5 并行接口及其Cx51定義 8051單片機具有單片機具有P0、P1、P2和和P3四個端口,四個端口,許多增強型單片機還有許多增強型單片機還有P4端口。沒有針對這些端口端口。沒有針對這些端口的專用的專用IO操作指令,操作指令,8051對對IO口的操作是通過設口的操作是通過設置其輸出鎖存器置其輸出鎖存器SFR來實現(xiàn)的。來實現(xiàn)的。 部分針對部分針對IO口的讀取指令是讀取端口鎖存器,口的讀取指令是讀取端口鎖存器,部分是讀取端口的輸入狀態(tài),通常那些針對端口的部分是讀取端口的輸入狀態(tài),通常那些針對端口的讀讀修改修改寫指令讀取的是端口鎖存器(對
34、應寫指令讀取的是端口鎖存器(對應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 端口中的每一個端口中的每一個
35、IO口線還可以用口線還可以用sbit來定義其每來定義其每一個位:一個位: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中針對其硬件特點引入的一種新中針對其硬件特點引入的一種新變量,它并不是標準變量,它并不是標準C語言的變量。語言的變量。
36、內(nèi)部內(nèi)部data區(qū)地址區(qū)地址202FH共共128位占有位地址位占有位地址0-127,而地址尾數(shù)為而地址尾數(shù)為0或者或者8的的SFR共共128位占有位地址位占有位地址128-255。 使用使用C51編程時,定義了位變量后,就可以用定義了的編程時,定義了位變量后,就可以用定義了的變量來表示變量來表示MCS-51的位尋址單元。的位尋址單元。 位變量的位變量的C51定義的一般語法格式如下:定義的一般語法格式如下: 位類型標識符位類型標識符(bit) 位變量名;位變量名; 這里,這里, bit是一個數(shù)據(jù)類型是一個數(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ù)不能返回位值。否則編輯器將會給出一的,函數(shù)不能返回位值。否則編輯器將會給出一個錯誤信息。個錯誤信息。位變量不能定義成一個指針,如不能定義:位變量不能定義成一個指針,如不能定義: bit * bit_pointer。(錯)。(錯)不存在位數(shù)組,如不能定義:不存在位數(shù)組,如不能定義:bit b_array 。 (錯)(錯) (3) 對位變量定義的限制。對位變量定義的限制??晌粚ぶ纷止?jié)變量的某一個位使用關鍵詞可位尋址字節(jié)變量的某一個位使用關鍵詞sbit定義定義;bdata區(qū)(片內(nèi)區(qū)(片內(nèi)RAM單元單元20-2F)的獨立位變量則用關鍵詞)的獨立位變量則用關鍵詞bit
39、定義:定義: 關鍵詞關鍵詞sbit和和bit對位變量定義僅僅是形式上的區(qū)別,在對位變量定義僅僅是形式上的區(qū)別,在實際操作中式完全一樣的。實際操作中式完全一樣的。例例1 先定義變量的數(shù)據(jù)類型和存儲類型(先定義變量的數(shù)據(jù)類型和存儲類型(P69):):bdata int ibase; /* 定義定義ibase為為bdata整型變量,整型變量,16位位 */bdata char bary4;/* bary4定義為定義為bdata字符型數(shù)組字符型數(shù)組 */然后可使用然后可使用sbit定義可獨立尋址訪問的對象位:定義可獨立尋址訪問的對象位: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位位 */ 對象對象ibase和和bary也可以字節(jié)尋址也可以字節(jié)尋址: ary37=0; /* bary3的第的第7位賦值為位賦值為0 */ bary3=a; /* 字節(jié)尋址字節(jié)尋址,bary3 賦值為賦值為a */問問bary3中放了哪個數(shù)據(jù)中放了哪個數(shù)
41、據(jù)? “”操作符后的最大值依賴于指定的數(shù)據(jù)類型,操作符后的最大值依賴于指定的數(shù)據(jù)類型, 對于對于char/uchar而言是而言是07; #define uchar unsigned char 對于對于int/uint 而言是而言是015; #define uint unsigned char 對于對于long/ulong而言是而言是031; #define ulong unsigned char3.7 Cx51的運算規(guī)則3.7.1 算術運算及其優(yōu)先級算術運算及其優(yōu)先級3.7.2 關系運算及其優(yōu)先級關系運算及其優(yōu)先級3.7.3 邏輯運算及其優(yōu)先級邏輯運算及其優(yōu)先級3.7.4 位操作及其表達式位操
42、作及其表達式3.7.5 自減、自加和復合運算自減、自加和復合運算一、一、Cx51最基本的最基本的5種算術運算符種算術運算符 +:加法運算,或者正值符號;加法運算,或者正值符號; -:減法運算,或者負值符號;減法運算,或者負值符號; *:乘法運算;乘法運算; /:除法運算,取商;除法運算,取商; %:取模取模(求余求余)運算符,取余數(shù)運算符,取余數(shù)P69。3.7.1 算術運算及其優(yōu)先級算術運算及其優(yōu)先級二、算術表達式、優(yōu)先級與結合性二、算術表達式、優(yōu)先級與結合性 用算術運算符和括號將運算對象連接起來的用算術運算符和括號將運算對象連接起來的式子稱之為算術表達式。式子稱之為算術表達式。運算優(yōu)先級,指
43、當運算對象兩側都有運算符時,運算優(yōu)先級,指當運算對象兩側都有運算符時,執(zhí)行運算的先后次序:先乘、除、模執(zhí)行運算的先后次序:先乘、除、模(3者等同者等同),后加、減后加、減(2者等同者等同),括號最優(yōu)先。,括號最優(yōu)先。(a+b)*(c-d)-e運算結合性,指當運算對象兩側的運算符具有運算結合性,指當運算對象兩側的運算符具有相同優(yōu)先級時,執(zhí)行運算的先后次序:先左后相同優(yōu)先級時,執(zhí)行運算的先后次序:先左后右。右。a+b-c三、數(shù)據(jù)類型轉換三、數(shù)據(jù)類型轉換 如果一個運算符的兩側的數(shù)據(jù)類型不同,則必須先通如果一個運算符的兩側的數(shù)據(jù)類型不同,則必須先通過數(shù)據(jù)類型轉換,將兩側的數(shù)據(jù)轉換成位相同類型。轉過數(shù)據(jù)
44、類型轉換,將兩側的數(shù)據(jù)轉換成位相同類型。轉換的方法有兩種:換的方法有兩種: 自動自動(缺省缺省)類型轉換,即在程序編譯時由類型轉換,即在程序編譯時由C編譯器編譯器自動從低類型到高類型進行類型轉換;自動從低類型到高類型進行類型轉換;P70 強制類型轉換,需要使用強制類型轉換符。強制類型轉換,需要使用強制類型轉換符。unsigned char a,b,c;c=a+(unsigned int)b; 首先首先(unsigned int)強制把強制把b轉換為類型轉換為類型unsigned int,編譯,編譯器在編譯加法代碼時自動把器在編譯加法代碼時自動把a轉換為轉換為unsigned int,最后存放運,最后存放運算結果時,編譯器又自動把算結果時,編譯器又自動把a轉換為轉換為unsigned char3.7.2 關系運算及其優(yōu)先級關系運算及其優(yōu)先級優(yōu)先級相同優(yōu)先級相同(高高)優(yōu)先級相同優(yōu)先級相同(低低) 小于小于 小于等于小于等于 大于大于 大于等于大于等于 測試等于測試等于! 測試不等于測試不等于一、關系運算符一、關系運算符二、關系運算符的優(yōu)先級二、關系運算符的優(yōu)先級 前前4種關系運算符的優(yōu)先級相同,后種關系運算符的優(yōu)先級相同,后2種關系種關系運算符的優(yōu)先級也相同,前運算符的優(yōu)先級也相同,前4中關系運算符的優(yōu)中關系運算符的優(yōu)先級高于后先級高于后2種。種。 關系運算
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《電商平臺商業(yè)模式》課件
- 商鋪水電安裝合同范本
- 高級評茶員練習復習試題
- 入學申請書模板范文格式
- 干部教師信息素養(yǎng)提升測試客觀題復習測試有答案
- 吊車指揮人員理論測試復習測試附答案
- 農(nóng)村建筑工程承包合同書
- 團體演出合同范本
- 員工轉合伙合同范本
- 土地抵押糾紛合同范本
- 教科版科學四年級下冊教師用書
- 娛樂主播如何轉型做帶貨主播
- 四川省德陽市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細及行政區(qū)劃代碼
- 青島版三年級數(shù)學下冊全套單元測試卷
- (參考)食品加工操作流程圖
- 2023高中物理步步高大一輪 第十章 第1講 磁場及其對電流的作用
- 空分設備安全培訓課件
- Adobe-Illustrator-(Ai)基礎教程
- 沒頭腦和不高興-竇桂梅.精選優(yōu)秀PPT課件
- 鋼棧橋計算書(excel版)
- 租賃合同審批表
評論
0/150
提交評論