51單片機bit、sbin、sfr、sfr_16區(qū)別分析概述_第1頁
51單片機bit、sbin、sfr、sfr_16區(qū)別分析概述_第2頁
51單片機bit、sbin、sfr、sfr_16區(qū)別分析概述_第3頁
51單片機bit、sbin、sfr、sfr_16區(qū)別分析概述_第4頁
51單片機bit、sbin、sfr、sfr_16區(qū)別分析概述_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、bit、sbit、sfr、sfr 16區(qū)別分析 以及#ifndef的使用2009-11-12 09:081bit和sbit都是C51擴展的變量類型。        bit和int char之類的差不多,只不過char=8位, bit=1位而已。都是變量,編譯器在編譯過程中分配地址。除非你指定,否則這個地址是隨機的。這個地址是整個可尋址空間,RAM+FLASH+擴展空間。bit只有0和1兩種值,意義有點像Windows下VC中的BOOL。        sb

2、it是對應(yīng)可位尋址空間的一個位,可位尋址區(qū):20H2FH。一旦用了sbit xxx = REGE6這樣的定義,這個sbit量就確定地址了。sbit大部分是用在寄存器中的,方便對寄存器的某位進行操作的。2bit位標量        bit位標量是C51編譯器的一種擴充數(shù)據(jù)類型,利用它可定義一個位標量,但不能定義位指針,也不能定義位數(shù)組。它的值是一個二進制位,不是0就是1,類似一些高級語言中的Boolean類型中的True和False。3sfr特殊功能寄存器      

3、 sfr也是一種擴充數(shù)據(jù)類型,點用一個內(nèi)存單元,值域為0255。利用它可以訪問51單片機內(nèi)部的所有特殊功能寄存器。如用sfr P1 = 0x90這一句定P1為P1端口在片內(nèi)的寄存器,在后面的語句中我們用以用P1 = 255(對P1端口的所有引腳置高電平)之類的語句來操作特殊功能寄存器。sfr P1 = 0x90; /定義P1 I/O 口,其地址90H        sfr 關(guān)鍵定后面是一個要定義的名字,可任意選取,但要符合標識符的命名規(guī)則,名字最好有一定的含義如P1 口可以用P1 為名,這樣程序會變的好讀好多.等號后面必須是

4、常數(shù),不允許有帶運算符的表達式,而且該常數(shù)必須在特殊功能寄存器的地址范圍之內(nèi)(80H-FFH),具體可查看附錄中的相關(guān)表.          sfr 是定義8 位的特殊功能寄存器而sfr16 則是用來定義16 位特殊功能寄存器,如8052 的T2 定時器,可以定義為:sfr16 T2 = 0xCC; /這里定義8052 定時器2,地址為T2L=CCH,T2H=CDH用sfr16 定義16 位特殊功能寄存器時,等號后面是它的低位地址,高位地址一定要位于物理低位地址之上.注意的是不能用于定時器0 和1 的定義

5、.sbit 可定義可位尋址對象.如訪問特殊功能寄存器中的某位.其實這樣應(yīng)用是經(jīng)常要用的如要訪問P1 口中的第2 個引腳P1.1.我們可以照以下的方法去定義:(1) sbit 位變量名=位地址sbit P1_1 = Ox91;這樣是把位的絕對地址賦給位變量.同sfr 一樣sbit 的位地址必須位于80H-FFH 之間.(2) sbit 位變量名=特殊功能寄存器名位位置sft P1 = 0x90;sbit P1_1 = P1 1; /先定義一個特殊功能寄存器名再指定位變量名所在的位置,當可尋址位位于特殊功能寄存器中時可采用這種方法(3) sbit 位變量名=字節(jié)地址位位置sbit P1_1 = 0

6、x90 1;這種方法其實和2 是一樣的,只是把特殊功能寄存器的位址直接用常數(shù)表示. 在C51存儲器類型中提供有一個bdata 的存儲器類型,這個是指可位尋址的數(shù)據(jù)存儲器,位于單片機的可位尋址區(qū)中,可以將要求可位錄址的數(shù)據(jù)定義為bdata,如:unsigned char bdata ib; /在可位錄址區(qū)定義ucsigned char 類型的變量ibint bdata ab2; /在可位尋址區(qū)定義數(shù)組ab2,這些也稱為可尋址位對象sbit ib7=ib7 /用關(guān)鍵字sbit 定義位變量來獨立訪問可尋址位對象的其中一位sbit ab12=ab112;操作符""后面的位位置的最大

7、值取決于指定的基址類型,char0-7,int0-15,long0-31.sfr 并標準C 語言的關(guān)鍵字,而是Keil 為能直接訪問80C51 中的SFR 而提供了一個新的關(guān)鍵詞,其用法是:sfrt 變量名=地址值。2)符號P1_0 來表示P1.0 引腳。在C 語言里,如果直接寫P1.0,C 編譯器并不能識別,而且P1.0 也不是一個合法的C語言變量名,所以得給它另起一個名字,這里起的名為P1_0,可是P1_0 是不是就是P1.0呢?你這么認為,C 編譯器可不這么認為,所以必須給它們建立聯(lián)系,這里使用了Keil C的關(guān)鍵字sbit 來定義,sbit 的用法有三種:第一種方法:sbit 位變量名

8、地址值第二種方法:sbit 位變量名SFR 名稱變量位地址值第三種方法:sbit 位變量名SFR 地址值變量位地址值如定義PSW 中的OV 可以用以下三種方法:sbit OV=0xd2 (1)說明:0xd2 是OV 的位地址值sbit OV=PSW2 (2)說明:其中PSW 必須先用sfr 定義好sbit OV=0xD02 (3)說明:0xD0 就是PSW 的地址值因此這里用sfr P1_0=P10;就是定義用符號P1_0 來表示P1.0 引腳,如果你愿意也可以起P10 一類的名字,只要下面程序中也隨之更改就行了。AT89C51的特殊功能寄存器表請看附錄二4sfr16 16位特殊功能寄存器&#

9、160;         sfr16占用兩個內(nèi)存單元,值域為065535。sfr16和sfr一樣用于操作特殊功能寄存器,所不同的是它用于操作占兩個字節(jié)的寄存器,好定時器T0和T1。5sbit可錄址位         sbit同位是C51中的一種擴充數(shù)據(jù)類型,利用它可以訪問芯片內(nèi)部的RAM中的可尋址位或特殊功能寄存器中的可尋址位。如先前我們定義了sfr P1 = 0x90; /因P1端口的寄存器是可位尋址的,所以我們可以定義sbit P1

10、_1 = P11;/P1_1為P1中的P1.1引腳/同樣我們可以用P1.1的地址去寫,如sbit P1_1 = 0x91;這樣我們在以后的程序語句中就可以用P1_1來對P1.1引腳進行讀寫操作了。通常這些可以直接使用系統(tǒng)提供的預(yù)處理文件,里面已定義好各特殊功能寄存器的簡單名字,直接引用可以省去一點時間,我自己是一直用的。當然您也可以自己寫自己的定義文件,用您認為好記的名字。data表明數(shù)據(jù)在片內(nèi)數(shù)據(jù)存儲區(qū);xdata表明數(shù)據(jù)在片外數(shù)據(jù)存儲區(qū);code表明數(shù)據(jù)在程序存儲區(qū);extern定義的數(shù)據(jù)是在另外一個模塊,當引用其它文件中的變量時要加上extern。extern的重要意義在于表明要定義的數(shù)

11、據(jù)已經(jīng)在其他地方定義過,此處只是引用,所以編譯器不會另外開辟內(nèi)存。OTP、ROM、FLASH、RAM、EEPROM指的是存儲器的類型,含義如下:OTP: One Time Programmable 一次性可編程 ROM: Read Only Memory 只讀存儲器 FLASH: 閃存 RAM: Random Access Memory 隨機存取存儲器 EEPROM:Electrically Erasable Programmable Read-Only Memory 電可擦可編程只讀存儲器 data、idata、xdata、pdata、code是定義不同數(shù)據(jù)的數(shù)據(jù)或地址空間的偽指令,含義如下

12、: data: 0x00-0x7f,片內(nèi)RAM直接尋址區(qū) idata: 0x00-0xff,片內(nèi)RAM間接尋址區(qū) xdata: 0x0000-0xffff,64KB片外RAM數(shù)據(jù)區(qū) pdata: 0x00-0xff(256字節(jié)/頁),分頁片外數(shù)據(jù)存儲區(qū) code: 0x0000-0xffff,64K片內(nèi)外ROM代碼區(qū)我們經(jīng)常會在.h頭文件中看到#ifndef,這是"if not defined"的簡寫,類型是宏定義條件編譯。定義如下:#ifndef x /先測試x是否被宏定義過#define x程序段1 /如果x沒有被宏定義過,定義x,并編譯程序段 1#else程

13、序段2 /如果x已經(jīng)定義過了則編譯程序段2的語句,“忽視”程序段 1。#endif/終止if作用:條件指示符#ifndef 的最主要目的是防止頭文件的重復(fù)包含和編譯。如果在h文件中定義了全局變量,一個c文件包含同一個h文件多次,如果不加#ifndef宏定義,會出現(xiàn)變量重復(fù)定義的錯誤;如果加了#ifndef,則不會出現(xiàn)這種錯。內(nèi)容:(1)#ifndef 標識1 /判斷"標識1"是否定義,如果被定義則返回假,如果沒有被定義則返回真。/*/語句1 #ifndef 標識1語句2 #define 標識1語句3 #endif語句4 語句5 該段代碼意思是:如果標識1沒有被定義,則重定義

14、標識1,即執(zhí)行語句2、語句3;如果標識1已經(jīng)被定義,則直接跳過語句2、語句3,直接執(zhí)行語句4、語句5、/*/備注:#ifndef 和 #endif 要一起使用,如果丟失#endif,可能會報錯。<標識>在理論上來說可以是自由命名的,但每個頭文件的這個“標識”都應(yīng)該是唯一的。標識的命名規(guī)則一般是頭文件名全大寫,前面加下劃線,并把文件名中的“.”也變成下劃線,如:stdio.h#ifndef _STDIO_H#define _STDIO_H.#endifStatic和extern的使用區(qū)別注意:全局變量和全局靜態(tài)變量的區(qū)別1)全局變量是不顯式用static修飾的全局變量,全局變量默認是

15、有外部鏈接性的,作用域是整個工程,在一個文件內(nèi)定義的全局變量,在另一個文件中,通過extern 全局變量名的聲明,就可以使用全局變量。2)全局靜態(tài)變量是顯式用static修飾的全局變量,作用域是聲明此變量所在的文件,其他的文件即使用extern聲明也不能使用。關(guān)于const的使用常類型是指使用類型修飾符const說明的類型,常類型的變量或?qū)ο蟮闹凳遣荒鼙桓碌?。(當然,我們可以偷梁換柱進行更新:)作用:(1)可以定義const常量,具有不可變性。 例如:const int Max=100; Max+會產(chǎn)生錯誤; (2)便于進行類型檢查,使編譯器對處理內(nèi)容有更多了解,消除了一

16、些隱患。例如: void f(const int i) . 編譯器就會知道i是一個常量,不允許修改; (3)可以避免意義模糊的數(shù)字出現(xiàn),同樣可以很方便地進行參數(shù)的調(diào)整和修改。 同宏定義一樣,可以做到不變則已,一變都變!如(1)中,如果想修改Max的內(nèi)容,只需要:const int Max=you want;即可! (4)可以保護被修飾的東西,防止意外的修改,增強程序的健壯性。 還是上面的例子,如果在函數(shù)體內(nèi)修改了i,編譯器就會報錯; 例如: void f(const int i) i=10;/error!  (5) 可以節(jié)省空間,避免不必要的內(nèi)存分配。

17、例如: #define PI 3.14159 /常量宏 const double Pi=3.14159; /此時并未將Pi放入RAM中 . double i=Pi; /此時為Pi分配內(nèi)存,以后不再分配! double I=PI; /編譯期間進行宏替換,分配內(nèi)存 double j=Pi; /沒有內(nèi)存分配 double J=PI; /再進行宏替換,又一次分配內(nèi)存! const定義常量從匯編的角度來看,只是給出了對應(yīng)的內(nèi)存地址,而不是像#define一樣給出的是立即數(shù),所以,const定義的常量在程序運行過程中只有一份拷

18、貝,而#define定義的常量在內(nèi)存中有若干份拷貝。 (6) 提高了效率。 編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內(nèi)存的操作,使得它的效率也很高。Typedef的定義與使用方法在計算機編程語言中用來為復(fù)雜的聲明定義簡單的別名,與宏定義有些差異。它本身是一種存儲類的關(guān)鍵字,與auto、extern、mutable、static、register等關(guān)鍵字不能出現(xiàn)在同一個表達式中。常用:(1) 使用typedef為現(xiàn)有類型創(chuàng)建同義字,定義易于記憶的類型名。例如:typedef unsigned char uchar;(2) typedef與結(jié)構(gòu)結(jié)合使用例如:typedefstructtagMyStructintiNum;longlLength;MyStruct;這語句實際上完成兩個操作:1) 定義一個新的結(jié)構(gòu)類型structtagMyStructintiNum;longlLength;分析:tagMyStruct稱為“tag”,即“標簽”,實際上是一個臨時名字,stru

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論