單片機原理:7-6-補-3-2-1-C51語言數(shù)據(jù)類型與存儲類型_第1頁
單片機原理:7-6-補-3-2-1-C51語言數(shù)據(jù)類型與存儲類型_第2頁
單片機原理:7-6-補-3-2-1-C51語言數(shù)據(jù)類型與存儲類型_第3頁
單片機原理:7-6-補-3-2-1-C51語言數(shù)據(jù)類型與存儲類型_第4頁
單片機原理:7-6-補-3-2-1-C51語言數(shù)據(jù)類型與存儲類型_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第3章

C51語言編程基礎

13.2.1C51語言中的數(shù)據(jù)類型與存儲類型1.數(shù)據(jù)類型數(shù)據(jù)是單片機操作的對象,具有一定格式的數(shù)字或數(shù)值,數(shù)據(jù)的不同格式就稱為數(shù)據(jù)類型。

KeilC51支持的基本數(shù)據(jù)類型見表3-1。針對8051的硬件特點,C51在標準C基礎上,擴展了4種數(shù)據(jù)類型(見表3-1中最后4行)。注意,擴展的4種數(shù)據(jù)類型,不能使用指針來對它們存取。..\..\范例\1流水燈-C22.C51的擴展數(shù)據(jù)類型下面對擴展的4種數(shù)據(jù)類型說明。(1)位變量bit的值可以是1(true),也可是0(false)。(2)特殊功能寄存器sfr。8051單片機的特殊功能寄存器分布在片內(nèi)數(shù)據(jù)存儲區(qū)的地址單元80H~FFH之間,“sfr”數(shù)據(jù)類型占用一個內(nèi)存單元。利用它可訪問8051單片機內(nèi)部的所有特殊功能寄存器。

例如:sfrP1=0x90這一語句定義了P1端口在片內(nèi)的寄存器,在程序后續(xù)的語句中可以用“P1=0xff”,使P1的所有引腳輸出為高電平的語句來操作特殊功能寄存器。4(3)特殊功能寄存器sfr16。“sfr16”數(shù)據(jù)類型占用兩個內(nèi)存單元,用于操作占兩個字節(jié)的特殊功能寄存器。例如:“sfr16DPTR=0x82”語句定義了片內(nèi)16位數(shù)據(jù)指針寄存器DPTR,其低8位字節(jié)地址為82H,高8位字節(jié)地址為83H。在程序的后續(xù)語句中就可對DPTR進行操作。(4)特殊功能位sbit。sbit是指AT89S51片內(nèi)特殊功能寄存器的可尋址位。例如:

sfr PSW=0xd0; //定義PSW寄存器地址為0xd0

sbit OV=PSW^2; //定義OV位為PSW.2符號“^”前是特殊功能寄存器名字,“^”后的數(shù)字定義特殊功能寄存器可尋址位在寄存器中的位置,取值必須是0~7。注意,不要把bit與sbit相混淆。bit定義普通的位變量,只能是二進制的0或1。sbit是定義特殊功能寄存器的可尋址位,值是可以進行位尋址的特殊功能寄存器的某位的絕對地址例如,PSW寄存器OV位的絕對地址0xd2。上面的例子還涉及到C51注釋的寫法問題,C51的注釋寫法有兩種:(1)//……,兩個斜杠后面跟著的為注釋語句,本寫法只能注釋一行,當換行時,必須在新行上重新寫兩個斜杠。(2)/*……*/,一個斜杠與星號結(jié)合使用,本寫法可注釋任一行,即斜杠星號與星號斜杠之間的所有文字都作為注釋,即注釋有多行時,只需在注釋的開始處,加斜杠星號,在注釋的結(jié)尾處,加上星號斜杠即可。加注釋的目的是為了便于讀懂程序,所有注釋都不參與程序編譯,編譯器在編譯過程中會自動刪去注釋。63.數(shù)據(jù)存儲類型在討論C51數(shù)據(jù)類型時,須同時提及它的存儲類型,以及它與8051單片機存儲器結(jié)構的關系,因為C51定義的任何數(shù)據(jù)類型必須以一定的方式,定位在8051單片機的某一存儲區(qū)中,否則沒有任何實際意義。8051有片內(nèi)、片外數(shù)據(jù)存儲區(qū),還有程序存儲區(qū)。片內(nèi)的數(shù)據(jù)存儲區(qū)是可讀寫的,內(nèi)部數(shù)據(jù)存儲區(qū)可分為3個不同的數(shù)據(jù)存儲類型:data、idata和bdata。訪問片外數(shù)據(jù)存儲區(qū)比訪問片內(nèi)數(shù)據(jù)存儲區(qū)慢,因為訪問片外數(shù)據(jù)存儲區(qū)要通過對數(shù)據(jù)指針加載地址來間接尋址訪問。C51提供兩種不同的數(shù)據(jù)存儲類型xdata和pdata來訪問片外數(shù)據(jù)存儲區(qū)。程序存儲區(qū)只能讀不能寫,可能在8051單片機內(nèi)部或者外部,或外部和內(nèi)部都有,由8051單片機硬件決定,C51提供了code存儲類型來訪問程序存儲區(qū)。C51存儲類型與8051實際的存儲空間的對應關系見表3-2。下面對表3-2各種存儲區(qū)作以說明。(1)DATA區(qū)。尋址是最快的,應把常使用的變量放在該區(qū),但該區(qū)存儲空間有限,DATA區(qū)除了包含程序變量外,還包含了堆棧和寄存器組。DATA區(qū)聲明中的存儲類型標識符為data,通常指片內(nèi)RAM128字節(jié)的內(nèi)部數(shù)據(jù)存儲的變量,可直接尋址。89聲明舉例: unsignedchardatasystem_status=0; unsignedint

dataunit_id[8]; chardatainp_string[20];標準變量和用戶自聲明變量都可存儲在DATA區(qū)中,只要不超過DATA區(qū)的范圍即可,由于C51用默認的寄存器組來傳遞參數(shù),這樣DATA區(qū)至少失去8字節(jié)空間。另外,當內(nèi)部堆棧溢出的時候,程序會莫名其妙地復位。這是因為8051沒有報錯機制,堆棧溢出只能以這種方式表示,因此要留有較大的堆??臻g來防止堆棧溢出。(2)BDATA區(qū)。DATA中的位尋址區(qū),在該區(qū)中聲明變量就可進行位尋址。BDATA區(qū)聲明中的存儲類型標識符為bdata,指的是片內(nèi)RAM可位尋址的16字節(jié)存儲區(qū)(字節(jié)地址為20H~2FH)中的128個位。10下面是在BDATA區(qū)中聲明的位變量和使用位變量的例子: unsignedcharbdata

status_byte; unsignedint

bdata

status_word; sbit

stat_flag=status_byte^4; if(status_word^15) {……} stat_flag=1;C51編譯器不允許在BDATA區(qū)中聲明float和double型變量。(3)IDATA區(qū)。該區(qū)使用寄存器作為指針來對片內(nèi)RAM進行間接尋址,常用來存放使用比較頻繁的變量。與外部存儲器尋址相比,它的指令執(zhí)行周期和代碼長度相對較短。IDATA區(qū)聲明中的存儲類型標識符為idata,指的是片內(nèi)RAM的256字節(jié)的存儲區(qū),只能間接尋址,速度比直接尋址慢。11聲明舉例如下: unsignedcharidata

system_status=0; unsignedint

idataunit_id[8]; charidatainp_string[16]; floatidata

out_value;(4)PDATA區(qū)和XDATA區(qū)位于片外存儲區(qū),PDATA區(qū)和XDATA區(qū)聲明中的存儲類型標識符分別為pdata和xdata。PDATA區(qū)只有256字節(jié),僅指定256字節(jié)的外部數(shù)據(jù)存儲區(qū)。但XDATA區(qū)最多可達64KB,對應的xdata存儲類型標識符可指定外部數(shù)據(jù)區(qū)64KB內(nèi)的任何地址。12對PDATA區(qū)的尋址要比對XDATA區(qū)尋址快,因為對PDATA區(qū)尋址,只需裝入8位地址,而對XDATA區(qū)尋址要裝入16位地址,所以盡量把外部數(shù)據(jù)存儲在PDATA區(qū)中。對PDATA區(qū)和XDATA區(qū)的聲明舉例如下: unsignedcharxdata

system_status=0; unsignedint

pdataunit_id[8]; charxdatainp_string[16]; floatpdata

out_value;由于外部數(shù)據(jù)存儲器與外部I/O口是統(tǒng)一編址的,外部數(shù)據(jù)存儲器地址段中除了包含數(shù)據(jù)存儲器地址外,還包含外部I/O口的地址。對外部數(shù)據(jù)存儲器及外部I/O口的尋址將在本章的絕對地址尋址中介紹。13(5)程序存儲區(qū)CODE。程序存儲區(qū)CODE聲明的標識符為code,儲存的數(shù)據(jù)是不可改變的。在C51編譯器中可以用存儲區(qū)類型標識符code來訪問程序存儲區(qū)。聲明舉例如下:unsignedcharcodea[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};上面介紹了C51的數(shù)據(jù)存儲類型,其大小和值域見表3-3。單片機訪問片內(nèi)RAM比訪問片外RAM相對快一些,所以應盡量把頻繁使用的變量置于片內(nèi)RAM。即采用data、bdata或idata存儲類型,而將容量較大或使用不太頻繁的那些變量置于片外RAM,即采用pdata或xdata存儲類型。常量只能采用code存儲類型。1415變量存儲類型定義舉例:(1)chardataa1; /*字符變量a1被定義為data型,分配在 片內(nèi)RAM低128字節(jié)中*/(2)floatidata

x,y; /*浮點變量x和y被定義為idata型,定位在

片內(nèi)RAM中,只能用間接尋址方式尋址*/

(3)bitbdatap; /*位變量p被定義為bdata型,定位在片內(nèi)

RAM中的位尋址區(qū)*/

(4)unsignedint

pdatavar1;/*無符號整型變量var1定義為pdata型,定位在片外RAM中,相當于@Ri間接尋址*/

(5)unsignedcharxdataa[2][4];/*無符號字符型二維數(shù)組變量a[2][4]被定義為xdata存儲類型,定位在片外RAM中,占據(jù)2×4=8字節(jié),相當于@DPTR間接尋址*/

4.數(shù)據(jù)存儲模式如果在變量定義時略去存儲類型標識符,編譯器會自動默認存儲類型。16進一步由SMALL、COMPACT和LARGE存儲模式指令限制。例如,若聲明charvar1,則在使用SMALL存儲模式下,var1被定位在data存儲區(qū),在使用COMPACT模式下,var1被定位在idata存儲區(qū);在LARGE模式下,var1被定位在xdata存儲區(qū)中。下面對存儲模式作進一步說明。(1)SMALL模式。該模式下,所有變量都默認位于8051單片機內(nèi)部的數(shù)據(jù)存儲器,與使用data指定存儲器類型的方式一樣。在此模式下,變量訪問的效率高,但是所有數(shù)據(jù)對象和堆棧必須使用內(nèi)部RAM。(2)COMPACT模式本模式下所有變量都默認在外部數(shù)據(jù)存儲器的1頁(256字節(jié))內(nèi),這與使用pdata指定存儲器類型是一樣的。該類型適用于變量不超過256字節(jié)的情況,此限制是由尋址方式?jīng)Q定的,相當于使用數(shù)據(jù)指針@Ri尋址。與SMALL模式相比,該存儲模式的效率比較低,對變量訪問的速度也慢一些,但比LARGE模式快。17(3)LARGE模式本模式下所有變量都

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論