keil軟件數(shù)據(jù)類型_第1頁
keil軟件數(shù)據(jù)類型_第2頁
keil軟件數(shù)據(jù)類型_第3頁
keil軟件數(shù)據(jù)類型_第4頁
keil軟件數(shù)據(jù)類型_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、數(shù)據(jù)類型在標準C語言中,存在著如下六種基本數(shù)據(jù)類型:1、char:字符型;2、short = short int:短整型3、int:整型4、long = long int:長整型5、float:單精度浮點型6 double:雙精度浮點型而面向51單片機的Keil uVision4對此進行了簡化,因此,可以理解為只存在如下四種基本數(shù)據(jù)類型:1、char:字符型2、int = short = short int: 整型3、Io ng = long int:長整型4、float = double:單精度浮點型其中,基本整型數(shù)據(jù)類型又可以通過signed關(guān)鍵詞擴展為有符號的signedchar、sig

2、ned int、signed long類型,或通過 unsigned關(guān)鍵詞擴展為無符號的 unsigned char、unsigned int、unsigned long類型;而對于不加關(guān)鍵詞擴展的 char、int、long 本身,Keil uVision4則一律認為是signed類型(和c語言一致,均是默認為是有 符號數(shù)字類型)。應對51單片機硬件的一些特點,Keil uVision4還擴展了 bit、sbit、sfr、sfr16 等四種特殊基本數(shù)據(jù)類型,它們都是標準C中所沒有的。其中:1、bit:聲明一個普通的位變量。例如:"bit flag;"。2、 sbit:聲明

3、特殊功能寄存器中的某一位。例如,使用"sbit TI = SCONS;", 就聲明了 TI為特殊功能寄存器SCON的第0位。3、sfr:聲明一個8位寄存器為特殊功能寄存器。例如,將51單片機內(nèi)存地 址0x98處的存儲單元聲明為8位特殊功能寄存器SCON,可以使用"sfr SCON = 0x98;"語句。4、sfr16:聲明一個16位的寄存器為特殊功能寄存器。為了將 51單片機內(nèi) 存地址0xCC處開始的連續(xù)兩個存儲單元聲明為一個統(tǒng)一的 16位特殊功能寄存 器T2,可以使用"sfr16 T2 = 0xCC;"語句。需要注意的是,在 Kei

4、l uVision4中,用sbit、sfr、sfr16聲明特殊功能寄存 器變量或特殊功能寄存器位變量時,其聲明語句都只能放在函數(shù)外,而不能放在函數(shù)內(nèi),否則出現(xiàn)語法錯誤;而用 bit聲明普通位變量時,聲明語句既可放在函 數(shù)外,也可放在函數(shù)內(nèi)(凡是帶s的只能放在函數(shù)外)。此外,bit、sbit、sfr、sfr16 都不支持指針和數(shù)組擴展,因此,不能定義bit、sbit、sfr、sfr16型指針和數(shù)組, 且由這四種類型定義時就像普通類型定義一樣,后邊需加分號。當然,根據(jù)C語言標準,無論是sbit、sfr、sfr16還是bit,變量必須在使用之前(至少在使用 之時)聲明:這一點是顯然的。對于初學者來說

5、,其實沒有必要深究 sbit、sfr、sfr16的用法,它們通常用在 51單片機的系統(tǒng)自帶頭文件中,一般情況下無需用戶關(guān)心。表1整理了 Keil uVision4支持的各種基本數(shù)據(jù)類型和屬性,希望讀者認真理 解和領(lǐng)會。表1 Keil uVision4面向51單片機的基本數(shù)據(jù)類型各種屬性一覽表1類I別|數(shù)據(jù)類型|長度|值域11| un sig nedchar11字節(jié)| 02551字符型signed char| 1字節(jié)| -128+1271| char11字節(jié)| -128+127I I unsigned short int | 2 字節(jié) I 0 65535| signed short int| s

6、hort int|1 2字節(jié)| 2字節(jié)|-32768 -32768+32767 丿 +32767| unsigned short| 2字節(jié)| 0 65535整型 | signed short| 2字節(jié)|-32768 丿 +32767| short| 2字節(jié)|-32768-+32767| unsigned int| 2字節(jié)| 0 65535| signed int| 2字節(jié)|-32768 丿 +32767| int| 2字節(jié)-32768 -+32767| unsigned long int| 4字節(jié)|0 4294967295I signed long int | 4 字節(jié) | -21474836

7、48+2147483647long int| 4 字節(jié) | -2147483648+2147483647I長整型III unsigned longI 4 字節(jié) I 0 4294967295III signed longI 4 字節(jié) I -2147483648+2147483647III longI 4 字節(jié) I -2147483648+2147483647IIIII floatI 4 字節(jié) I 土 1.75494E-38土3.402823E+38 II 浮點型 I doubleI 4 字節(jié) I 土 1.75494E-38土3.402823E+38 IIIII bitI 1 位 I 0 ,1II

8、 位 型 I sbitI 1 位 I 0 , 1IIIII sbitI 1 位 I 0 ,1II SFR 型 I sfrI 1 字節(jié) I 0 255III sfr16I 2 字節(jié) I 0 65535I<reg51頭文件剖析我們平時寫單片機應用程序的時候,所使用的頭文件大多都是用reg51.h或是用reg52h打開 reg52.h頭文件,會發(fā)現(xiàn)是由大量的sfr ,sbit的聲明組成,甚至于還有sfr16.其實這樣的聲明都是與單片機內(nèi)部功能寄存器(特殊功能寄存器)聯(lián)系起 來的,下面對其做出詳細解釋sfr:聲明變量SFR聲明一個變量,它的聲明與其它的C變量聲明基本相同,唯一的區(qū)別,SFR在聲明

9、的同時為其指定特殊功能寄存器作為存儲地址,而不同于C變量聲明的整型,字符型等等由編譯器自動分配存儲空間。如reg52.h頭文件,第一條聲明就是 sfr P0 = 0x80;此處聲明一個變量P0,并指定其存儲地址為特殊功能寄存器 0x80;,在加入reg52.h 頭文件后。編寫應用程序時P0就可以直接使用而無需定義,對 P0的操作就是, 對內(nèi)部特殊功能寄存器(0x80對應用MCU的P0 口)的操作,可進行讀寫操作。 如果將第一條聲明改為sfr K0 = 0x80;那么,如果要把單片機的P0 口全部拉 低,貝U不能寫P0=0x00;而應保存后再在應用程序中寫成 K0=0x00;否則編譯器會 提示“

10、 P0為未定義標識符”使用方法:sfr variable = address 為變量分配一個特殊功能寄存器。1等號右邊,只能是十進制,十六進制整型的數(shù)據(jù)常量,不允許帶操作符的表 達式經(jīng)典的8051內(nèi)核支持的SFR地址從0x80H0xFF飛利浦80C51MX系列 0x180H0x1FF2 SFR不能聲明于任何函數(shù)內(nèi)部,包括 main函數(shù)。只能聲明于函數(shù)外。3用SFR聲明一個變量后,不能用取地址運算符 &獲取其地址,編譯無法通過,編譯器會提示非法操作。4有一點須特別注意,51內(nèi)核0x800xff,為特殊功能寄存器地址區(qū)間,但并 不是所有的地址都有定義,如果說你所用的MCU芯片上對于某個地址

11、沒有定義, 那么用sfr在定義變量的時候,不要把變量的地址分配到未定義的特殊功能寄存 器上,雖然編譯時能通過,用 KEIL仿真時貌似是沒有問題,但下載到芯片里運 行時,是會出問題的。比如說,向一個未定義的特殊功能寄存器執(zhí)行讀操作,讀 出來的就是一個未知的數(shù)。(讀者可自行測試,先把串口通信調(diào)通,然后做一個 簡單的人機交互。讀出一個數(shù)后,再發(fā)給計算機,用串口調(diào)試助手或是串口監(jiān)控 查看。這用方法在仿真的時候很有用。)所以具體那些特殊功能寄存器能夠用, 就要查看你使用的芯片手冊。5若遇到增強性的單片機,只要知道其擴展的特殊功能寄存器的地址,用SFR疋 就可以很方便進行編程。sbit: 聲明變量sbit

12、同樣是聲明一個變量,和SFR使用方法類似,但是SBIT是用來聲明一 個位變量,因為,在51系列的應用中,非常有必要對 SFR的單個位進行存取, 而通過bit數(shù)據(jù)類型,使其具備位尋址功能。女口,在reg52.h中有如下聲明sfr IE = 0xA8;sbit EA= IEA7;sbit ET2= IEA5; /8052 onlysbit ES= IEA4;sbit ET1= IEA3;sbit EX1= IEA2;sbit ETO= IEA1;sbit EXO= IEA0;所以,對EA的操作即是對IE最高位的操作。但如果想讓 SP DPL DPH PCON TMOC TLO TL1 THO TH

13、1SBUF這些特殊功能寄存器具備位尋址,采用上述如IE類似的定義,是不行的,雖然修改后,在編譯的時候不會出現(xiàn)錯誤,但只要用到你定義的位變量名時就會 出錯。原因是,只有特殊功能寄存器的地址是8的倍數(shù)(十六進制以0或8結(jié)尾) 才能進行位尋址。打開reg52.h頭文件可以看到,所有用sbit聲明了的特殊功能寄存器的地址均是 以0或8結(jié)尾如硬要達到上述要求,可用帶參的宏定義來完成。此處不做詳細說明(意義并不 大)。下面對sbit的使用做詳細介紹:隨著8051的應用,非常有必要對特殊功能寄存器的單個 bit位進行存取,C51編 譯器通過sbit數(shù)據(jù)類型,提供了對特殊功能寄存器的位操作。以下是sbit的三

14、種應用形式:一, sbit n ame = sfr-n ameAbit-positi on;sfrPSW =0xD0;sfrIE =0xA8;sbitOV= PSWA2;sbitCY=PSWA7;sbitEA= IEA7;二, sbit n ame= sft-addressAbit-positi on;sbit OV =0xD0A2;sbit CY =0xD0A7;sbit EA =0xA8A7;三, sbit n ame= sbit-address;sbit OV =0xD2;sbit CY =0xD7;sbit EA =0xAF;現(xiàn)對上述三種形式的聲明做必要的說明第一種形式 sbit na

15、me = sfr-nameAbit-position;如 sbit OV= PSWA2; 當中的這個特殊功能寄存器必須在此之前已經(jīng)用sfr定義,否則編譯會出錯。bit-position 范圍從 07;第二種形式sbit name= sft-addressAbit-position 如 sbit OV =0xD0A2;與第一種形式不同之外在于,此處直接使用 PSW的地址.第一種形式須先定義 PSW第三種形式.sbit name= sbit-address如sbit OV =0xD2是直接用的OV的地址OV的地址計算方式,是 OV所在的寄存器地址加上 OV的bit-position、,I 、+ :

16、注意:不是所有的SFR都可位尋址。只有特殊功能寄存器的地址是 8的 倍數(shù)(十六進制以0或8結(jié)尾)才能進行位尋址,并且sbit聲明的變量名,雖可 以是任意取,但是最好不要以下劃線開頭,因為以下劃線開頭的都保留給了 C51 的頭文件做保留字。sfr16:聲明變量許多8051的派生型單片機,用兩個連續(xù)地址的特殊功能寄存器,來存儲 一個16bit的值。例如,8052就用了 0xCC和0xCD來保存定時/計數(shù)寄存器2的 高字節(jié)和低字節(jié)。編譯器提供 sfr16這種數(shù)據(jù)類型,來保存兩個字節(jié)的數(shù)據(jù)。虛 擬出一個16bit的寄存器。如下:sfr16 T2 = 0xCC存儲方面為小端存儲方式,低字節(jié)在前,高字節(jié)在

17、后。定義時,只寫低字 節(jié)地址,如上,則定義T2為一個16位的特殊功能寄存器。T2L= 0CCh, T2H=0CDh使用方法:sfr variable = low_address1等號右邊,只寫兩個特殊功能寄存器的低地址,且只能是十進制,十六進制 的整型數(shù)據(jù)常量,不允許帶操作符的表達式2 SFR不能聲明于任何函數(shù)內(nèi)部,包括 main函數(shù)。只能聲明于函數(shù)外。3用SFR聲明一個變量后,不能用取地址運算符 &獲取其地址, 編譯無法 通過,編譯器會提示非法操作。4當你向一個sfr16寫入數(shù)據(jù)的時候,KEIL CX51編譯器生成的代碼,是 先寫高字節(jié),后寫低字節(jié),(可通過返匯編窗口查看)在有些情況

18、下,這并非我 們所想要的操作順序。使用時,須注意。5當你所要寫入sfr16的數(shù)據(jù),當是高字節(jié)先寫還是低字節(jié)先寫非常重要 的時候,就只能用sfr這個關(guān)鍵字來定義,并且任意時刻只保存一個字節(jié),這樣 操作才能保證寫入正確。/ /C51常用頭文件在KEIL中,對于單片機所使用的頭文件,除了reg51 reg52以外,還有一些從各芯片制商的官網(wǎng)下載與reg51,reg52功能類似的頭文件,需了解透外,還要對 各類型單片機均可通用且相當有用的的頭文件,做相應的了解。因為,內(nèi)部所包含的函數(shù)與宏定義,可以及大的方便我們編寫應用程序。1字符函數(shù) ctype.h1 exter n bit isalpha(char

19、);功能:檢查參數(shù)字符是否為英文字母,是則返回12 extern bit isal nu m(char)功能:檢查字符是否為英文字母或數(shù)字字符,是則返回13 exter n bit isc ntrl(char)功能:檢查參數(shù)值是否在OxOOOx1f之間或等于0x7f,是則返回14 exter n bit isdigit(char)功能:檢查參數(shù)是否為數(shù)字字符,是則返回15 exter n bit isgraph(char)功能:檢查參數(shù)值是否為可打印字符,是則返回1,可打印字符為 0x210x7e6 exter n bit ispri nt(char)功能:除了與isgraph相同之外,還接受

20、空格符 0x207 exter n bit isp un ct(char)功能:不做介紹。8 extern bit islower(char)功能:檢查參數(shù)字符的值是否為小寫英文字母,是則返回19 exter n bit isupper(char)功能:檢查參數(shù)字符的值是否為大寫英文字母,是則返回110 exter n bit isspace(char)功能:檢查字符是否為下列之一,空格,制表符,回車,換行,垂直制表符和送紙。如果為真則返回111 exter n bit isxdigit(char)功能:檢查參數(shù)字符是否為16進制數(shù)字字符,是則返回112 extern char toi nt(

21、char)功能:將ASCII字符09 af(大小寫無關(guān))轉(zhuǎn)換成對應的16進制數(shù)字,返回值00H0FH13 exter n char tolower(char)功能:將大寫字符轉(zhuǎn)換成小寫形式,如字符變量不在AZ之間,則不作轉(zhuǎn)換而直接返回該字符14 extern char toupper(char)功能:將小寫字符轉(zhuǎn)換成大寫形式,如字符變量不在az之間,則不作轉(zhuǎn)換而直接返回該字符15 define toascii(c) (c)&0x7f)功能:該宏將任何整形數(shù)值縮小到有效的ASCII范圍之內(nèi),它將變量和0x7f相與從而去掉第7位以上的所有數(shù)位16 #define tolower(c) (c

22、- A' +' a')功能:該宏將字符與常數(shù)0x20逐位相或17 #define toupper(c) (c)- a' +' A')功能:該宏將字符與常數(shù)0xdf逐位相與2數(shù)學函數(shù)math.hextern intabs (intval);extern char cabs (charval);extern long labs (longval);extern float fabs (floatval);功能:返回絕對值。上面四個函數(shù),除了形參和返回值不一樣之外, 其它功能完全相同。exter n float exp (float val);exte

23、r n float log (float val);exter n float log10 (float val); 功能:exp 返回evallog 返回val的自然對數(shù)log10返回 以10為底,val的對數(shù)extern float sqrt (float val);功能:返回val的正平方根extern int ran d()();exter n void sran d()(i nt n);功能:rand()返回一個0到32767之間的偽隨機數(shù),srand用來將隨 機數(shù)發(fā)生器初始化成一個已知的(期望)值。Keil uVision3中的math.h庫中,不包含此函數(shù)。exter n flo

24、at sin(float val);exter n float cos (float val);exter n float tan (float val);功能: 返回val的正弦,余弦,正切值。val為弧度 fabs(var) <=65535 extern float asin (float val);extern float acos (float val);extern float atan (float val);exter n float ata n2 (float y, float x);功能:asin返回val的反正弦值。acos返回val的反余弦值。atan返回val的反

25、正切值。asin atan acos的值域均為-n /2+ n /2atan2返回x/y,的反正切值,其值域為-n + nextern float sinh (float val);extern float cosh (float val);extern float tanh (float val);功能:cosh返回var的雙曲余弦值,sinh返回var的雙曲正弦值, tanh返回var的雙曲正切值。exter n float ceil (float val);功能:向上取整,返回一個大于val的最小整數(shù)。exter n float floor (float val);功能:向下取整,返回一

26、個小于val的最大整數(shù)。exter n float pow (float x, float y);功能:計算計算xy的值。當(x=0,yv=0 )或(x<0.y不是整數(shù))時會發(fā)生錯 誤。exter n void fpsave(struct FPBUF *p)exter n void fprestore(struct FPBUF *p)功能:fpsave保存浮點了程序的狀態(tài),fprestore恢復浮點子程序的原始狀態(tài), 當中斷程序中需要執(zhí)行浮點運算時,這兩個函數(shù)是很有用的。注:Keil uVision3中的math.h庫中,不包含此函數(shù)。3絕對地址訪問 absacc.h#define CB

27、YTE (unsigned char volatile code *) 0)#define DBYTE (unsigned char volatile data *) 0)#defi ne PBYTE (un sig ned char volatile pdata *) 0)#defi ne XBYTE (un sig ned char volatile xdata *) 0)功能:CBYTE尋址CODE 區(qū)DBYTE尋址DATA 區(qū)PBYTE尋址XDATA (低 256)區(qū)XBYTE尋址XDATA 區(qū)例:如下指令在對外部存儲器區(qū)域訪問地址 0x1000xvar=XBYTE0x1000; XBYTE0x1000=20;#define CWORD (unsigned int volatile code *) 0)#define DWORD (unsigned int volatile

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論