目前單片機種類繁多,而51 單片機作為最基礎的一款8位單片機,其資源最少,同時也是最容易學習的一款單片機,學習51單片機的作業原理及其存盤結構是十分有必要的,
單片機執行程式的程序,其實就是在執行我們撰寫的程式的程序(逐條執行指令),該執行程序可以看成是:取指令--------分析指令-------執行指令,
取指令:根據 PC(程式計數器)的值從程式存盤器中取出指令(撰寫的程式即為指令),送到指令暫存器,(送到哪里去???)
分析指令:將指令暫存器中的指令操作碼取出后進行譯碼,分析其指令性質,分析完成便找出運算元的地址,
執行指令:即對分析完成后得到運算元的地址,對該地址的資料進行更新,
計算機執行程式的程序實際上是逐條指令重復以上三個程序,直到遇到停機或回圈等待指令,
舉例:
開機后,PC 計數器 初始值為 0000H,接著單片機在時序電路下自動進入執行程式程序,回圈對程式區進行取指令,執行指令操作,
對于匯編陳述句: MOV A , #0E0H
該陳述句的功能表示將運算元 E0H 送到 累加器 A 上,(74H 表示 的指令是將一個數送到 A 累加器去)此時 程式計數器 0000H 位置上存放了 74H , 0001H 上存放了 E0H ,
執行該陳述句的次序為:
1、取指階段:PC 上 地址 0000H 上的內容送到地址暫存器去,即將74H 通過資料總線送到了指令暫存器去, 此時 PC == 0000H,
2、譯碼階段:由于本次進入指令暫存器的是 74H 故 譯碼后單片機知道該指令是將一個運算元送到A累加器中, 此時 PC == 0001H,
3、執行階段:分析完指令后,將運算元 E0H 從 PC 的0001H 處取出,送到CPU,由于前面有了指令 74H ,所以 資料總線不會講 E0H送到指令暫存器,而是將運算元送入累加器中, 此時 PC == 0002H,
4、以此一直回圈,直到系統停機,(附圖說明)

51 單片機的存盤結構
四個存盤空間:
1、片內程式存盤器(片內ROM)
2、片外程式存盤器(片外ROM)
3、片內資料存盤器(片內RAM)
4、片外資料存盤器(片外RAM)
在邏輯上(即從用戶的角度上)MCS-51單片機有三個存盤空間
1、片內外統一編址的64K的程式存盤器(ROM)地址空間 (MOVC)
2、256B的片內資料存盤器(片內RAM)的地址空間 (MOV)
3、以及64K片外資料存盤器(片外RAM)的地址空間 (MOVX)
片內RAM 結構圖:

從 00H到7FH之間的地址為8位地址,最大可尋址 的范圍是 256 個單元地址,52系列的單片機衍生到 FFH ,
00H~~~~1FH : 共32個位元組,分成四個暫存器區,每區有暫存器 R0~R7,對此區域,可以使用 R0~R7 來操作,
20H~~~~2FH: 共16位元組,是位尋址區,共有128個 “位”
30H~~~~3FH: 只進行位元組尋址
80H~~~~FFH : 共有128個地址,其中離散的分布著21個特殊功能暫存器,必須直接尋址才能讀寫,
片外RAM:
片外RAM的地址范圍是0000H到FFFFH,容量是64KB,對片外RAM讀寫,必須使用MOVX指令,對片外RAM采用間接尋址方式,R0,R1和DPTR都可以作為間接尋址暫存器,R0,R1是8位暫存器,即R0,R1,的心智范圍最大為256個單元,而DPTR是16位地址指標,尋址范圍到64KB,
ROM
ROM 的地址是 0000H 到 FFFFH ,容量為64KB,地址長度是16位,作用是存放程式及程式運行時所需的常數,其中 0000~0FFFH,即4K,在片內,其他在片外,
EA = 1,尋址內部ROM,EA = 0,尋址外部ROM,對ROM讀出,必須使用 MOVC指令,
針對訪問存盤結構內不同區域時在C語言上使用的關鍵詞
由于 8051系統有片內、片外存盤器,片內程式存盤器還分直接尋址和間接尋址型別,比如code,data,xdata,idata,pdata,等關鍵詞分別對應著單片機內不同的存盤器,使用不同的存盤器,程式的執行效率也將不同,所以在撰寫程式的時候,最好指定變數的存盤型別,有利于提高程式的執行效率,關鍵詞的區別及含義如下:
data : 固定指前面 0x00~0x7f ,的128個RAM,可以用 ACC 直接讀寫的,速度最快,生成的代碼也最小,
idata:固定指前面 0x00 ~ 0xff 的256 個RAM,其中前128和data 的128完全相同,只是因為訪問的方式不同,idata是用類似于指標的方式訪問的,匯編的陳述句為 :MOX ACC,@Rx
xdata:外部擴展RAM,一般指外部0x0000~0xffff空間,用DPTR訪問,
pdata : 外部擴展的低256個位元組,地址出現在A0~A7上時讀寫,用 MOVX ACC,@Rn 讀寫,
code :定義的資料放在ROM 里面,寫入后不可以再修改,
bdata:若程式需要8個或者更多的bit 變數,如果你想一次性給8個變數賦值的話就不方便了,舉個例子:
char bdata MODE;
sbit MODE_7 = MODE^7;
.
.
.
sbit MODE_0 = MODE^0;
8個 bit 變數 MODE_N 就定義好了,

程式可以簡單地分為code 和data 區域,code 去在運行的時候不可以再更改,data 區存放全域變數和臨時變數,是要不斷更改的,CPU從code區讀取指令,對data區的資料進行運算處理,因此code存盤在什么介質上并不重要,可以存放在 ROM 里面 也可以存放在RAM里面 甚至 FLASH 里面, 一般做法是將程式放到 FLASH 中,再加載到RAM里面運行,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/107601.html
標籤:其他
上一篇:spring的簡易實作(一)
