51單片機數據類型
從數據存儲類型來說,8051系列有片內、片外程序存儲器,片內、片外數據存儲器,片內程序存儲器還分直接尋址區和間接尋址類型,分別對應code、data、xdata、idata以及根據51系列特點而設定的pdata類型,使用不同的存儲器,將使程序執行效率不同,在編寫C51程序時,最好指定變量的存儲類型,這樣將有利于提高程序執行效率。
在51系列中data,idata,xdata,pdata的區別:
1、data:固定指前面0x00-0x7f的128個RAM,可以用acc直接讀寫的,速度最快,生成的代碼也最小。
2、idata:固定指前面0x00-0xff的256個RAM,其中前128和data的128完全相同,只是因為訪問的方式不同。idata是用類似C中的指針方式訪問的。匯編中的語句為:moxACC,@Rx.(不重要的補充:c中idata做指針式的訪問效果很好)
3、 xdata:外部擴展RAM,一般指外部0x0000-0xffff空間,用DPTR訪問。
4、 pdata:外部擴展RAM的低256個字節,地址出現在A0-A7的上時讀寫,用movxACC,@Rx讀寫。這個比較特殊,而且C51好象有對此BUG,建議少用。但也有他的優點,具體用法屬于中級問題,這里不提。
當然現在有些51單片本身內部就有擴展的RAM區域,故在允許使用內部擴展RAM的時候 使用xdata 和pdata并不影響P2和P0口。
單片機C語言unsigned char code table[] code 是什么作用?
code的作用是告訴單片機,我定義的數據要放在ROM(程序存儲區)里面,寫入后就不能再更改,其實是相當與匯編里面的尋址MOVX(好像是),因為C語言中沒辦法詳細描述存入的是ROM還是RAM(寄存器),所以在軟件中添加了這一個語句起到代替匯編指令的作用,對應的還有data是存入RAM的意思。
程序可以簡單的分為code(程序)區,和data (數據)區,code區在運行的時候是不可以更改的,data區放全局變量和臨時變量,是要不斷的改變的,cpu從code區讀取指令,對data區的數據進行運算處理,因此code區存儲在什么介質上并不重要,象以前的計算機程序存儲在卡片上,code區也可以放在rom里面,也可以放在ram里面,也可以放在flash里面(但是運行速度要慢很多,主要讀flash比讀ram要費時間),因此一般的做法是要將程序放到flash里面,然后load到 ram里面運行的;DATA區就沒有什么選擇了,肯定要放在RAM里面,放到rom里面改動不了。
bdata如何使用它呢?
若程序需要8個或者更多的bit變量,如果你想一次性給8個變量賦值的話就不方便了,(舉個例子說說它的方便之處,想更深入的了解請在應用中自己琢磨)又不可以定義bit數組,只有一個方法
char bdata MODE;
sbit MODE_7 = MODE^7;
sbit MODE_6 = MODE^6;
sbit MODE_5 = MODE^5;
sbit MODE_4 = MODE^4;
sbit MODE_3 = MODE^3;
sbit MODE_2 = MODE^2;
sbit MODE_1 = MODE^1;
sbit MODE_0 = MODE^0;
8個bit變量MODE_n 就定義好了
這是定義語句,Keilc 的特殊數據類型。記住一定要是sbit
不能 bit MODE_0 = MODE^0;
賦值語句要是這么些C語言就視為異或運算
空間名稱地址范圍說明:
1、DATAD: 00H~7FH片內RAM直接尋址區。
2、BDATAD: 20H~2FH片內RAM位尋址區。
3、IDATAI: 00H~FFH片內RAM間接尋址區。
4、XDATAX: 0000H~FFFFH64KB常規片外RAM數據區。
5、HDATAX: 0000H~FFFFFFH16MB擴展片外RAM數據區。
6、CODEC: 0000H~FFFFH64K常規片內外ROM代碼區。
7、HCONST(ECODE)C: 0000H~FFFFFFH16MB擴展片外ROM常數區(對Dallas390可用作代碼區)。
8、BANK0~BANK31B0: 0000H~FFFFH::B31:0000H~FFFFH分組代碼區,最大可擴展32X64KB ROM。
8051單片機的存儲器結構
MCS-51單片機在物理結構上有四個存儲空間:
1、片內程序存儲器
2、片外程序存儲器
3、片內數據存儲器
4、片外數據存儲器
但在邏輯上,即從用戶的角度上,8051單片機有三個存儲空間:
1、片內外統一編址的64K的程序存儲器地址空間(MOVC)
2、256B的片內數據存儲器的地址空間(MOV)
3、以及64K片外數據存儲器的地址空間(MOVX
程序內存ROM
尋址范圍:0000H ~ FFFFH 容量64KB
EA = 1,尋址內部ROM;EA = 0,尋址外部ROM
地址長度:16位
作用: 存放程序及程序運行時所需的常數。
七個具有特殊含義的單元是:
0000H —— 系統復位,PC指向此處;
0003H —— 外部中斷0入口
000BH —— T0溢出中斷入口
0013H —— 外中斷1入口
001BH —— T1溢出中斷入口
0023H —— 串口中斷入口
002BH —— T2溢出中斷入口
內部數據存儲器RAM
物理上分為兩大區:00H ~ 7FH即128B內RAM 和 SFR區。
作用:作數據緩沖器用。
下圖是8051單片機存儲器的空間結構圖
程序存儲器
一個微處理器能夠聰明地執行某種任務,除了它們強大的硬件外,還需要它們運行的軟件,其實微處理器并不聰明,它們只是完全按照人們預先編寫的程序而執行之。那么設計人員編寫的程序就存放在微處理器的程序存儲器中,俗稱只讀程序存儲器(ROM)。程序相當于給微處理器處理問題的一系列命令。其實程序和數據一樣,都是由機器碼組成的代碼串。只是程序代碼則存放于程序存儲器中。
MCS-51具有64kB程序存儲器尋址空間,它是用于存放用戶程序、數據和表格等信息。對于內部無ROM的8031單片機,它的程序存儲器必須外接,空間地址為64kB,此時單片機的端必須接地。強制CPU從外部程序存儲器讀取程序。對于內部有ROM的8051等單片機,正常運行時,則需接高電平,使CPU先從內部的程序存儲中讀取程序,當PC值超過內部ROM的容量時,才會轉向外部的程序存儲器讀取程序。
當=1時,程序從片內ROM開始執行,當PC值超過片內ROM容量時會自動轉向外部ROM空間。 當=0時,程序從外部存儲器開始執行,例如前面提到的片內無ROM的8031單片機,在實際應用中就要把8031的引腳接為低電平。
8051片內有4kB的程序存儲單元,其地址為0000H—0FFFH,單片機啟動復位后,程序計數器的內容為0000H,所以系統將從0000H單元開始執行程序。但在程序存儲中有些特殊的單元,這在使用中應加以注意:
其中一組特殊是0000H—0002H單元,系統復位后,PC為0000H,單片機從0000H單元開始執行程序,如果程序不是從0000H單元開始,則應在這三個單元中存放一條無條件轉移指令,讓CPU直接去執行用戶指定的程序。
另一組特殊單元是0003H—002AH,這40個單元各有用途,它們被均勻地分為五段,它們的定義如下:
0003H—000AH 外部中斷0中斷地址區。
000BH—0012H 定時/計數器0中斷地址區。
0013H—001AH 外部中斷1中斷地址區。
001BH—0022H 定時/計數器1中斷地址區。
0023H—002AH 串行中斷地址區。
可見以上的40個單元是專門用于存放中斷處理程序的地址單元,中斷響應后,按中斷的類型,自動轉到各自的中斷區去執行程序。從上面可以看出,每個中斷服務程序只有8個字節單元,用8個字節來存放一個中斷服務程序顯然是不可能的。因此以上地址單元不能用于存放程序的其他內容,只能存放中斷服務程序。但是通常情況下,我們是在中斷響應的地址區安放一條無條件轉移指令,指向程序存儲器的其它真正存放中斷服務程序的空間去執行,這樣中斷響應后,CPU讀到這條轉移指令,便轉向其他地方去繼續執行中斷服務程序。
下圖是ROM的地址分配圖:
從上圖中大家可以看到,0000H-0002H,只有三個存儲單元,3個存儲單元在我們的程序存放時是存放不了實際意義的程序的,通常我們在實際編寫程序時是在這里安排一條ORG指令,通過ORG指令跳轉到從0033H開始的用戶ROM區域,再來安排我們的程序語言。從0033開始的用戶ROM區域用戶可以通過ORG指令任意安排,但在應用中應注意,不要超過了實際的存儲空間,不然程序就會找不到。
數據存儲器
數據存儲器也稱為隨機存取數據存儲器。數據存儲器分為內部數據存儲和外部數據存儲。MCS-51內部RAM有128或256個字節的用戶數據存儲(不同的型號有分別),片外最多可擴展64KB的RAM,構成兩個地址空間,訪問片內RAM用“MOV”指令,訪問片外RAM用“MOVX”指令。它們是用于存放執行的中間結果和過程數據的。MCS-51的數據存儲器均可讀寫,部分單元還可以位尋址。
MCS-51單片機的內部數據存儲器在物理上和邏輯上都分為兩個地址空間,即: 數據存儲器空間(低128單元); 特殊功能寄存器空間(高128單元);
這兩個空間是相連的,從用戶角度而言,低128單元才是真正的數據存儲器。下面我們就來詳細的與大家講解一下:
低128單元:
片內數據存儲器為8位地址,所以最大可尋址的范圍為256個單元地址,對片外數據存儲器采用間接尋址方式,R0、R1和DPTR都可以做為間接尋址寄存器,R0、R1是8位的寄存器,即R0、R1的尋址范圍最大為256個單元,而DPTR是16位地址指針,尋址范圍就可達到64KB。也就是說在尋址片外數據存儲器時,尋址范圍超過了256B,就不能用R0、R1做為間接尋址寄存器,而必須用DPTR寄存器做為間接尋址寄存器。
從上圖中我們可以看到,8051單片機片內RAM共有256個單元(00H-FFH),這256個單元共分為兩部分。其一是地址從00H—7FH單元(共128個字節)為用戶數據RAM。從80H—FFH地址單元(也是128個字節)為特殊寄存器(SFR)單元。從圖1中可清楚地看出它們的結構分布。
1、通用寄存器區(00H-1FH)
在00H—1FH共32個單元中被均勻地分為四塊,每塊包含八個8位寄存器,均以R0—R7來命名,我們常稱這些寄存器為通用寄存器。這四塊中的寄存器都稱為R0—R7,那么在程序中怎么區分和使用它們呢?聰明的INTEL工程師們又安排了一個寄存器——程序狀態字寄存器(PSW)來管理它們,CPU只要定義這個寄存的PSW的D3和D4位(RS0和RS1),即可選中這四組通用寄存器。對應的編碼關系如下表所示。惹程序中并不需要用4組,那么其余的可用做一般的數據緩沖器,CPU在復位后,選中第0組工作寄存器。
2、位尋址區(20H-2FH)
片內RAM的20H—2FH單元為位尋址區,既可作為一般單元用字節尋址,也可對它們的位進行尋址。位尋址區共有16個字節,128個位,位地址為00H—7FH。位地址分配如下表所示:
CPU能直接尋址這些位,執行例如置“1”、清“0”、求“反”、轉移,傳送和邏輯等操作。我們常稱MCS-51具有布爾處理功能,布爾處理的存儲空間指的就是這些為尋址區。
3、用戶RAM區(30H-7FH)
在片內RAM低128單元中,通用寄存器占去32個單元,位尋址區占去16個單元,剩下的80個單元就是供用戶使用的一般RAM區了,地址單元為30H-7FH。對這部份區域的使用不作任何規定和限制,但應說明的是,堆棧一般開辟在這個區域。
評論
查看更多