版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、數(shù)據(jù)類型在標(biāo)準(zhǔn)C語言中,存在著如下六種基本數(shù)據(jù)類型:1、char:字符型;2、short = short int:短整型3、int:整型4、long = long int:長整型5、float:單精度浮點型6 double:雙精度浮點型而面向51單片機(jī)的Keil uVision4對此進(jìn)行了簡化,因此,可以理解為只存在如下四種基本數(shù)據(jù)類型:1、char:字符型2、int = short = short int: 整型3、Io ng = long int:長整型4、float = double:單精度浮點型其中,基本整型數(shù)據(jù)類型又可以通過signed關(guān)鍵詞擴(kuò)展為有符號的signedchar、sig
2、ned int、signed long類型,或通過 unsigned關(guān)鍵詞擴(kuò)展為無符號的 unsigned char、unsigned int、unsigned long類型;而對于不加關(guān)鍵詞擴(kuò)展的 char、int、long 本身,Keil uVision4則一律認(rèn)為是signed類型(和c語言一致,均是默認(rèn)為是有 符號數(shù)字類型)。應(yīng)對51單片機(jī)硬件的一些特點,Keil uVision4還擴(kuò)展了 bit、sbit、sfr、sfr16 等四種特殊基本數(shù)據(jù)類型,它們都是標(biāo)準(zhǔn)C中所沒有的。其中:1、bit:聲明一個普通的位變量。例如:"bit flag;"。2、 sbit:聲明
3、特殊功能寄存器中的某一位。例如,使用"sbit TI = SCONS;", 就聲明了 TI為特殊功能寄存器SCON的第0位。3、sfr:聲明一個8位寄存器為特殊功能寄存器。例如,將51單片機(jī)內(nèi)存地 址0x98處的存儲單元聲明為8位特殊功能寄存器SCON,可以使用"sfr SCON = 0x98;"語句。4、sfr16:聲明一個16位的寄存器為特殊功能寄存器。為了將 51單片機(jī)內(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ù)組擴(kuò)展,因此,不能定義bit、sbit、sfr、sfr16型指針和數(shù)組, 且由這四種類型定義時就像普通類型定義一樣,后邊需加分號。當(dāng)然,根據(jù)C語言標(biāo)準(zhǔn),無論是sbit、sfr、sfr16還是bit,變量必須在使用之前(至少在使用 之時)聲明:這一點是顯然的。對于初學(xué)者來說
5、,其實沒有必要深究 sbit、sfr、sfr16的用法,它們通常用在 51單片機(jī)的系統(tǒng)自帶頭文件中,一般情況下無需用戶關(guān)心。表1整理了 Keil uVision4支持的各種基本數(shù)據(jù)類型和屬性,希望讀者認(rèn)真理 解和領(lǐng)會。表1 Keil uVision4面向51單片機(jī)的基本數(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頭文件剖析我們平時寫單片機(jī)應(yīng)用程序的時候,所使用的頭文件大多都是用reg51.h或是用reg52h打開 reg52.h頭文件,會發(fā)現(xiàn)是由大量的sfr ,sbit的聲明組成,甚至于還有sfr16.其實這樣的聲明都是與單片機(jī)內(nèi)部功能寄存器(特殊功能寄存器)聯(lián)系起 來的,下面對其做出詳細(xì)解釋sfr:聲明變量SFR聲明一個變量,它的聲明與其它的C變量聲明基本相同,唯一的區(qū)別,SFR在聲明
9、的同時為其指定特殊功能寄存器作為存儲地址,而不同于C變量聲明的整型,字符型等等由編譯器自動分配存儲空間。如reg52.h頭文件,第一條聲明就是 sfr P0 = 0x80;此處聲明一個變量P0,并指定其存儲地址為特殊功能寄存器 0x80;,在加入reg52.h 頭文件后。編寫應(yīng)用程序時P0就可以直接使用而無需定義,對 P0的操作就是, 對內(nèi)部特殊功能寄存器(0x80對應(yīng)用MCU的P0 口)的操作,可進(jìn)行讀寫操作。 如果將第一條聲明改為sfr K0 = 0x80;那么,如果要把單片機(jī)的P0 口全部拉 低,貝U不能寫P0=0x00;而應(yīng)保存后再在應(yīng)用程序中寫成 K0=0x00;否則編譯器會 提示“
10、 P0為未定義標(biāo)識符”使用方法:sfr variable = address 為變量分配一個特殊功能寄存器。1等號右邊,只能是十進(jìn)制,十六進(jìn)制整型的數(shù)據(jù)常量,不允許帶操作符的表 達(dá)式經(jīng)典的8051內(nèi)核支持的SFR地址從0x80H0xFF飛利浦80C51MX系列 0x180H0x1FF2 SFR不能聲明于任何函數(shù)內(nèi)部,包括 main函數(shù)。只能聲明于函數(shù)外。3用SFR聲明一個變量后,不能用取地址運(yùn)算符 &獲取其地址,編譯無法通過,編譯器會提示非法操作。4有一點須特別注意,51內(nèi)核0x800xff,為特殊功能寄存器地址區(qū)間,但并 不是所有的地址都有定義,如果說你所用的MCU芯片上對于某個地址
11、沒有定義, 那么用sfr在定義變量的時候,不要把變量的地址分配到未定義的特殊功能寄存 器上,雖然編譯時能通過,用 KEIL仿真時貌似是沒有問題,但下載到芯片里運(yùn) 行時,是會出問題的。比如說,向一個未定義的特殊功能寄存器執(zhí)行讀操作,讀 出來的就是一個未知的數(shù)。(讀者可自行測試,先把串口通信調(diào)通,然后做一個 簡單的人機(jī)交互。讀出一個數(shù)后,再發(fā)給計算機(jī),用串口調(diào)試助手或是串口監(jiān)控 查看。這用方法在仿真的時候很有用。)所以具體那些特殊功能寄存器能夠用, 就要查看你使用的芯片手冊。5若遇到增強(qiáng)性的單片機(jī),只要知道其擴(kuò)展的特殊功能寄存器的地址,用SFR疋 就可以很方便進(jìn)行編程。sbit: 聲明變量sbit
12、同樣是聲明一個變量,和SFR使用方法類似,但是SBIT是用來聲明一 個位變量,因為,在51系列的應(yīng)用中,非常有必要對 SFR的單個位進(jìn)行存取, 而通過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ù)(十六進(jìn)制以0或8結(jié)尾) 才能進(jìn)行位尋址。打開reg52.h頭文件可以看到,所有用sbit聲明了的特殊功能寄存器的地址均是 以0或8結(jié)尾如硬要達(dá)到上述要求,可用帶參的宏定義來完成。此處不做詳細(xì)說明(意義并不 大)。下面對sbit的使用做詳細(xì)介紹:隨著8051的應(yīng)用,非常有必要對特殊功能寄存器的單個 bit位進(jìn)行存取,C51編 譯器通過sbit數(shù)據(jù)類型,提供了對特殊功能寄存器的位操作。以下是sbit的三
14、種應(yīng)用形式:一, 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; 當(dāng)中的這個特殊功能寄存器必須在此之前已經(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ù)(十六進(jìn)制以0或8結(jié)尾)才能進(jìn)行位尋址,并且sbit聲明的變量名,雖可 以是任意取,但是最好不要以下劃線開頭,因為以下劃線開頭的都保留給了 C51 的頭文件做保留字。sfr16:聲明變量許多8051的派生型單片機(jī),用兩個連續(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等號右邊,只寫兩個特殊功能寄存器的低地址,且只能是十進(jìn)制,十六進(jìn)制 的整型數(shù)據(jù)常量,不允許帶操作符的表達(dá)式2 SFR不能聲明于任何函數(shù)內(nèi)部,包括 main函數(shù)。只能聲明于函數(shù)外。3用SFR聲明一個變量后,不能用取地址運(yùn)算符 &獲取其地址, 編譯無法 通過,編譯器會提示非法操作。4當(dāng)你向一個sfr16寫入數(shù)據(jù)的時候,KEIL CX51編譯器生成的代碼,是 先寫高字節(jié),后寫低字節(jié),(可通過返匯編窗口查看)在有些情況
18、下,這并非我 們所想要的操作順序。使用時,須注意。5當(dāng)你所要寫入sfr16的數(shù)據(jù),當(dāng)是高字節(jié)先寫還是低字節(jié)先寫非常重要 的時候,就只能用sfr這個關(guān)鍵字來定義,并且任意時刻只保存一個字節(jié),這樣 操作才能保證寫入正確。/ /C51常用頭文件在KEIL中,對于單片機(jī)所使用的頭文件,除了reg51 reg52以外,還有一些從各芯片制商的官網(wǎng)下載與reg51,reg52功能類似的頭文件,需了解透外,還要對 各類型單片機(jī)均可通用且相當(dāng)有用的的頭文件,做相應(yīng)的了解。因為,內(nèi)部所包含的函數(shù)與宏定義,可以及大的方便我們編寫應(yīng)用程序。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進(jìn)制數(shù)字字符,是則返回112 extern char toi nt(
21、char)功能:將ASCII字符09 af(大小寫無關(guān))轉(zhuǎn)換成對應(yīng)的16進(jìn)制數(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ù)學(xué)函數(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之間的偽隨機(jī)數(shù),srand用來將隨 機(jī)數(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的值。當(dāng)(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恢復(fù)浮點子程序的原始狀態(tài), 當(dāng)中斷程序中需要執(zhí)行浮點運(yùn)算時,這兩個函數(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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 石河子大學(xué)《信息檢索與利用》2023-2024學(xué)年第一學(xué)期期末試卷
- 常見精神癥狀的護(hù)理
- 石河子大學(xué)《土木工程概論》2021-2022學(xué)年第一學(xué)期期末試卷
- 石河子大學(xué)《人力資源管理實訓(xùn)軟件》2021-2022學(xué)年第一學(xué)期期末試卷
- 石河子大學(xué)《當(dāng)代世界社會主義》2023-2024學(xué)年第一學(xué)期期末試卷
- 沈陽理工大學(xué)《先進(jìn)制造技術(shù)》2021-2022學(xué)年第一學(xué)期期末試卷
- 沈陽理工大學(xué)《汽車檢測與診斷技術(shù)》2021-2022學(xué)年第一學(xué)期期末試卷
- 沈陽理工大學(xué)《集成電路的應(yīng)用電路》2023-2024學(xué)年期末試卷
- 沈陽理工大學(xué)《工程制圖》2021-2022學(xué)年第一學(xué)期期末試卷
- 光伏組件維修合同范本
- 7.比較不同的土壤課件教科版科學(xué)四年級下冊
- 2024小學(xué)數(shù)學(xué)義務(wù)教育新課程標(biāo)準(zhǔn)(2022版)必考題庫附含答案
- 仿古亭施工方案
- 云南省八年級《信息技術(shù)》上冊教案:第2課 探究因特網(wǎng)
- 幼兒園大班數(shù)學(xué)《6的組成與分解》課件
- 消化內(nèi)鏡護(hù)士進(jìn)修匯報
- 07《車遲國斗法》-《西游記》故事精講精練
- 年產(chǎn)100萬瓶工業(yè)氣體、醫(yī)用氧氣充裝項目可研報告
- 單位反恐專項經(jīng)費(fèi)保障制度
- 前程無憂國企招聘筆試題庫
- 信息網(wǎng)絡(luò)傳播權(quán)的侵權(quán)認(rèn)定及其保護(hù)
評論
0/150
提交評論