




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第三單元 片內存儲器與數據傳送指令本單元學習要點1. 89C52單片機中的存儲器結構和種類?主要作用?2. 數據傳送中的來源與目的存儲器,哪些是合法的數據傳送指令?3. 位傳送指令的特點。4. 數據傳送指令的尋址方式。3.1 片內存儲器組織結構3.1.1 存儲器類型在圖1-2所示的89C52內部的基本結構中,有兩塊存儲器:RAM和快閃存儲器(FLASH)。RAM是Random-access Memory的縮寫,意為隨機讀寫存儲器,說白了,就是順便什么時候都可以對其進行讀或寫操作,但RAM中的內容在掉電(關機)后就不復存在,也即開機后RAM中的內容是隨機的,因而這一類存儲器又被稱為易失性存儲器,
2、這類存儲器主要用于存儲數據。與此相對的是ROM(Read Only Memory,只讀存儲器),這類存儲器只能采用特殊的方法或特殊的工具才能把數據寫進去,如采用燒錄器等裝置。一般說來,單片機本身不能對片內的ROM進行寫入。又由于ROM是非易失性的存儲器,即在關閉電源之后已寫入的數據不會丟失,所以,在單片機中ROM經常作為程序存儲器。常見的ROM種類有4種:PROM(Programmable Read-Only Memory 可編程序的只讀存儲器):這是一種最先出現的ROM,它只能寫入一次,不允許修改或再次寫入。這一類ROM目前仍在應用,主要用于已成熟的較大批量生產的產品中的單片機。EPROM(
3、Erasable Programmable Read Only Memory,可擦可編程只讀存儲器):這是一種可以多次寫入、用紫外線擦除的ROM,主要用于小批量生產的單片機應用系統或研發單片機應用產品時采用。早年INTEL公司生產的87C51片內就是采用EPROM。自從EEPROM(Electrically Erasable Programmable Read Only Memory,電可擦可編程只讀存儲器)和FLASH MEMORY(快速存儲器或閃存)出現后,EPROM就漸漸消逝了。EEPROM:類似EPROM,但它不用紫外線擦除,而只要用電就可擦除。但其寫入和擦除的速度較慢。目前仍然有應用
4、。FLASH MEMORY:與EEPROM類似,但其讀寫的速度要快得多,密度(集成度)也要高,自從它出現后迅速取代EPROM和EEPROM在單片機中廣泛應用。AT89C52片內就是采用8 KB(千字節)的FLASH MEMORY作為程序存儲器。3.1.2 存儲器組織80C52的存儲器組織有幾個不同的存儲空間,如圖3-1所示。每個存儲空間都是具有連續的字節地址空間,其地址都是從0開始至最大存儲范圍的字節地址,即他們的地址是全部重疊的。他們之間是利用指令的尋址方式不同而區別開來。FFFFH0000H(XCODE)外部程序存儲器FFFFH0000H(XDATA)外部數據存儲器FFH特殊寄存器7FH(
5、SFR)7FH片內RAM00HFFH片內RAM7FH(IDATA)1FFFH片內ROM0000H(ICODE)片內存儲器圖3-1 80C52的存儲器組織右邊的虛線框內89C52的程序存儲器區,左邊的虛線框內89C52的數據存儲器區。而點劃線框內是89C52片內的存儲器,點劃線框外是片外的存儲器。1程序存儲器(CODE)區89C52的程序存儲器區又分為片內和片外兩個區。AT89C52的片內程序存儲器區(ICODE)是快閃存儲器,可以多次擦寫,特別適合于開發程序量不大的新產品或學習用。AT89C52的片內快閃存儲器有8K字節。AT89C52的片外程序存儲器區(XCODE)有16位尋址空間(即16位
6、地址線),可達64K。代碼段是只讀的,當要對外接存儲器件如EPROM進行尋址時,單片機會產生一個信號。但這并不意味著片外程序存儲器區一定要用一個EPROM。目前一般使用EEPROM作為外接存儲器,可以被外圍器件或8051進行改寫,這使系統更新更加容易,新的軟件可以下載到EEPROM中,而不用拆下它,然后裝入一個新的EEPROM。另外,帶電池的SRAMs也可用來代替EPROM,他可以像EEPROM一樣進行程序的更新,并且沒有像EEPROM那樣讀寫次數的限制,但是當電源耗盡時,存儲在SRAMs中的程序也隨之丟失。使用SRAMs來代替EPROM時允許快速下載新程序到目標系統中,這避免了編程/調試/擦
7、寫這樣一個循環過程,不再需要使用昂貴的在線仿真器。本書配套的實驗板就是采用SRAMs作為系統的程序存儲器,在調試完成后再把調試好的代碼(程序)寫入片內閃存中。2數據存儲器(DATA)區89C52的數據存儲器(DATA)區包括片內前128字節的內部RAM和外部64K字節的RAM(XDATA)兩部分。片內前128字節主要是作為數據段稱為DATA區,指令用一個或兩個周期來訪問數據段訪問DATA區,比訪問XDATA區要快,因為它采用直接尋址方式,而訪問XDATA須采用間接尋址,必須先初始化DPTR。通常我們把使用比較頻繁的變量或局部變量存儲在DATA段中,但是必須節省使用DATA段,因為它的空間畢竟有
8、限。在數據段中也可通過R0和R1采用間接尋址訪問,R0和R1被作為數據區的指針,將要讀或寫的字節的地址放入R0或R1中,根據源操作數和目的操作數的不同執行指令需要一個或兩個周期。7CH工作寄存器0組工作寄存器2組工作寄存器3組工作寄存器1組00H08H01H02H03H04H05H06H07H21H09H0BH0CH0DH0EH0FH10H0AH18H12H13H14H15H16H17H19H1BH1CH1DH1EH1FH20H1AH11H31H28H23H24H25H26H27H29H2BH2CH2DH2EH2FH30H2AH22H7DH7EH7FH(DATA)片內數據存儲器R1R2R3R4
9、R5R6R7R0R1R2R3R4R5R6R7R0R1R2R3R4R5R6R7R0R1R2R3R4R5R6R7R0可位尋址區片內前128字節的DATA區又可以分為圖3-2所示的幾個區域。其中:工作寄存器組:地址從00H1FH,每8個單元為1組,共有4個組。00H07H為第零組(0組),08H0FH為第一組(1組),18H1FH為第三組(3組)。單片機復位時默認第零組為當前工作寄存器組,即讀、寫R0時是從00H單元進行讀、寫操作,讀、寫R1時是從01H單元進行讀、寫操作,讀、寫R7時是從07H單元進行讀、寫操作。通過PSW(程序狀態寄存器)中的RS0、RS1位可以設置當前工作寄存器組。表3-1給出
10、了當前工作寄存器組與RS0、RS1的關系。比如,執行了以下兩條指令:SETB RS0 ; 置位RS0SETB RS1 ; 置位RS1則把第三組設置為當前工作寄存器組,如果這時執行MOV R7, #3AH ; 送立即數3AH到R7則把立即數3AH寫入到1FH單元中。可位尋址區:地址從20H2FH共16個單元中的每一位都可以直接尋址,即可以對這些單元中的某一位進行讀、寫操作而不會影響該單元中的其他位,也可以把這些單元中的某一位作為標志,用指令對其進行判斷。這些位都有自己的位地址,如圖3-3所示。指令:SETB 00H ; 置位20H單元的第0位是把位地址00H(字節地址20H單元的第0位)置為1。
11、而CLR 77H ; 清除2EH單元的第7位則是把位地址77H(字節地址20H單元的第7位)清除為0。0DH0CH0BH07H02H03H01H00H06H05H04H0AH09H08H0EH0FH17H1FH77H7FH71H7CH1EH13H21H20H23H2DH2EH2FH22H1DH1CH1BH12H11H10H16H15H14H1AH19H18H7DH7BH72H73H70H76H75H74H7AH79H78H7EH字節地址位地址圖3-3 可位尋址區圖3-2 片內數據存儲器 表3-1 當前工作寄存器組與RS1、RS0的關系當前工作寄存器組RS1RS00組(00H07H)000組(0
12、8H0FH)010組(10H17H)100組(18H1FH)113特殊功能寄存器中斷系統和外部功能控制寄存器位于從地址80H開始的內部RAM中。這些寄存器被稱做特殊功能寄存器(Special Function Registers,簡稱SFR),其中很多寄存器都可位尋址(可通過名字進行引用)。例如,要對中斷使能寄存器中的EA位進行尋址,可使用EA、或IE.7、或0AFH來訪問。SFRs控制定時/計數器、串行口、中斷源及中斷優先級等,這些寄存器的尋址方式和DATA中的其它字節和位一樣。SFR的分布如圖3-4所示。字節地址字節地址SFR名稱復位后的值(x表示不確定)灰色背景表示位可尋址圖3-4 SF
13、R的分布4IDATA 區8052有附加的128字節的內部RAM,位于從80H開始的地址空間中,被稱為IDATA。因為IDATA 區的地址和SFRs 的地址是重疊的,通過區分所訪問的存儲區來解決地址重疊問題。SFRs只能通過直接尋址來訪問,而IDATA區只能通過間接尋址來訪問。例如:MOV 82H, #0FH; 寫入立即數#0FH到DPL與MOV DPL, #0FH; 寫入立即數#0FH到DPL作用完全一樣,都是寫入立即數#0FH到DPL。而MOV R0, #82H; 寫入立即數#82H到R0MOV R0, #0FH; 寫入立即數#0FH到83H是寫入立即數#0FH到IDATA中的82H單元。5
14、XDATA 區89C52的最后一個存儲空間為64K,和片外CODE 區一樣采用16位地址尋址,稱作外部數據區,簡稱XDATA區。這個區通常包括一些RAM,如SRAM,或一些需要通過總線接口的外圍器件。對XDATA的讀寫操作需要至少兩個指令周期,只能使用DPTR、R0或R1間接尋址。如MOV DPTR, #Addr; 寫入地址立即數#Addr到DPTRMOVX DPTR, A; 把累加器A中的數據寫入DPTR所指向的XDATA單元或MOV P2, #HIGH_Addr; 寫入地址高位立即數#Addr到P2MOV R1, #LOW_Addr; 寫入地址低位立即數#Addr到R1MOVX R1, A
15、; 把A中的數據寫入P2和R1所指向的XDATA單元 這兩組指令都是完成把A中的數據寫入XDATA單元。而MOV DPTR, #Addr; 寫入地址立即數#Addr到DPTRMOVX A, DPTR; 把DPTR所指向的XDATA單元中的數據讀到A或MOV P2, #HIGH_Addr; 寫入地址高位立即數#Addr到P2MOV R1, #LOW_Addr; 寫入地址低位立即數#Addr到R1MOVX A, R1; 把P2和R1所指向的XDATA單元中的數據讀到A 則把XDATA單元中的數據讀到A中。3.2 數據傳送指令數據傳送指令是單片機編程中用的最多的指令。前面介紹了89C52的存儲器分布
16、,自然地就應該有這些存儲器(區)之間的數據傳送指令,但是,由于89C52的存儲器區之間地址有重疊,因而必須用不同的尋址方式和操作數來區別所傳送數據的“來源”和“目的”。這部分內容對初學者來說是最難記憶的。為了方便讀者快速、準確地掌握8051的數據傳送指令,一方面給出表3-2和圖3-5來說明傳送指令與數據的“來源”和“目的”之間的關系,并在下面加以詳細地說明,另一方面,在下一小節給出了數據傳送的實驗,務必請讀者按照示例和本章的習題要求盡量多做實驗。表3-2 傳送指令及其與數據的“來源”和“目的”之間的關系 目的源立即地址(SFR和低128字節RAM)工作寄存器(Rn)累加器片外數據存儲器(XDA
17、TA)片內高128字節RAM(IDATA)立即數(#data)MOV direct,#dataMOV DPTR,#datal6MOV Rn,#dataMOV A,#dataMOV Ri,#data程序存儲器(CODE)MOVC A,A+DPTRMOVC A,A+PC立即地址(SFR和低128字節RAM)MOV direct2,direct1MOV Rn,directMOV A,directMOV Ri,direct工作寄存器(Rn)MOV direct,RnMOV A, Rn累加器MOV direct,AMOV Rn,AMOVX Ri,AMOVX DPTR,AMOV Ri,A 片外數據存儲器(
18、XDATA)MOVX A,DPTR MOVX A,Ri片內高128字節RAM(IDATA)MOV direct, RiMOV A,Ri 寄存器C1直接數據Data累加器A寄存器間接R1,R0寄存器DPTR立即數#Data寄存器間接SP寄存器R7R0直接數據Data116圖3-5 傳送指令與數據的“來源”和“目的”之間的關系有關傳送指令說明如下1. 位傳送指令MOV C,bit和MOV bit,C沒有在表中列出。這兩條指令是把一位數據在C(進位位、位于程序狀態寄存器PSW的第7位,作為布爾操作的累加器)中與直接位地址(即所有位可尋址的存儲器中的位)之間進行操作。如MOV C, 00H; 把00H
19、(字節地址20H中的第0位)中的內容送C MOV P3.2, C; 把C中的內容送P3.2(P3口的第2位)MOV TR0, C; 把C中的內容送TR0(定時/計數器T0的啟動位)都是位傳送指令。位地址都可以看成直接地址,但它們之間不能直接傳送數據,只能通過C來傳送,如MOV P3.2, 00H是非法的,要實現00H到P3.2的數據傳送,只能MOV C, 00H; 把00H(字節地址20H中的第0位)中的內容送C MOV P3.2, C; 把C中的內容送P3.2(P3口的第2位)而MOV P3.2, #01H也是非法的,位數據傳送指令中沒有立即數作為源地址的指令,只能SETB P3.2, ;
20、把 P3.2(P3口的第2位)置位CLR P3.2, ; 把 P3.2(P3口的第2位)清零位可尋址存儲器中的位可用兩種方式來尋址:MOV 22H.5, C; 把C中的內容送字節地址22H中的第5位MOV 15H, C; 把C中的內容送字節地址22H中的第5位位可尋址SFR中的位既可用上述兩種方式來尋址:MOV P3.2, C; 把C中的內容送P3.2(P3口的第2位)MOV 0B0H.2, C; 把C中的內容送P3.2(P3口的第2位)也可用該位所特有的名稱來尋址:MOV PSW.6, C; 把C中的內容送PSW.6(通用標志F0)MOV 0D0H.6, C; 把C中的內容送PSW.6(通用
21、標志F0)MOV F0, C; 把C中的內容送PSW.6(通用標志F0)都是把C中的數據送到PSW.6(通用標志F0)。2. 片內RAM高128字節是IDATA,地址從80HFFH,與特殊寄存器(SFR)的地址完全重疊,對他們的訪問完全由尋址方式來區別(在上一小節介紹IDATA已舉例說明)。IDATA采用Ri(i0,1)來間址,而SFR既可用其名稱來尋址,也可用其地址作為立即地址來尋址。3. 片內RAM低128字節(DATA)實際上也是IDATA,其地址從00H7FH。但這些存儲器單元既可以立即地址尋址,也能用Ri間接尋址。而處于該區域的工作寄存器還可作為寄存器尋址。表中有唯一的一條16位數傳
22、送指令:MOV DPTR,#datal6。該指令用于對數據指針DPTR賦值。4. 立即數和XCODE只能作為源操作數(即數據源地址)。5. XCODE只能作為源操作數向累加器A傳送數據,有兩條指令:MOVC A,A+DPTR; 把A和DPTR的和所指向的XCODE單元中的數讀到AMOVC A,A+PC; 把A和PC(程序計數器)的和所指向的XCODE; 單元中的數讀到A注意指令中采用“MOVC”作為助記符,說明是從程序存儲器(CODE)中讀取數據。而從XDATA中讀取數據的指令為:MOVX A,DPTR ; 把DPTR所指向的XDATA單元中的數讀到AMOVX A,Ri; 把P2(高8位地址)
23、和Ri(低8位地址)所指向的; XDATA單元中的數讀到A指令中采用“MOVX”作為助記符,說明是從外部數據存儲器(XDATA)中讀取數據。同樣,寫到XDATA的指令為MOVX DPTR,A ; 把A中的數寫到DPTR所指向的XDATA單元MOVX Ri,A; 把A中的數寫到P2(高8位地址)和Ri(低8位地址)所指; 向的XDATA單元只有XDATA只能與累加器互相傳送數據。6. 立即數、立即地址和累加器(ACC)作為數據源地址,是“O型供血者”,他們有最多的接收數據的目的地。而外部數據存儲器(XDATA)最“內向”,它只與ACC互傳數據。7. ACC又是最大的數據接收者,這就意味著ACC處
24、于單片機核心部位,編程是用得最多的地方。8. 除ACC外,工作寄存器是交換數據最為方便、最為頻繁的存儲器。它們具有的尋址方式最多:MOV R6, #0FH; 寫入立即數#0FH到R6(06H單元)與MOV 06H, #0FH; 寫入立即數#0FH到R6(06H單元)與MOV R0, #06H; 寫入立即數#06H到R0MOV R0, #0FH; 寫入立即數#0FH到R0所指向的單元(06H)都是把數據寫到06H單元。3.3 數據傳送指令說明1. 寄存器內容送累加器格式:MOV A,Rn11101rrrE8HEFH代碼:操作:(A)(Rn),n=07說明:Rn在內部數據存貯器中的地址由當前的工作
25、寄存器區選擇位RS1、RS0確定,可以是00H07H、08H0FH、1017或18H1FH。以后指令中對Rn不再重復說明。2. 累加器內容送寄存器格式:MOV Rn,A11101rrrF8HFFH代碼:操作:(Rn)(A), n=07說明:目的操作數采用寄存器尋址方式。3. 內部RAM內容送累加器格式:MOV A, Ri1110011rF6HE7H代碼: 操作:(A)(Ri), i=0,1說明:Ri在內部數據存貯器中的地址由當前工作寄存器區選擇位RS1、RS0確定,分別為01H,02H,08H,09H,10H,11H和18H,19H。以后的指令中對Ri不再重復解釋。該指令可以訪問整個內部RAM
26、空間(0255單元)。4. 累加器內容送內部RAM格式:MOV Ri ,A1111011i代碼:F6HE7H 操作: (Ri)(A), i=0,15. 立即數送累加器01110100格式:MOV A,data代碼:74H 立即數操作:(A)data說明:代碼的第二字節為立即數,它與指令的操作碼一起放在程序存貯器中,執行該指令時,與操作碼一起取到CPU中。6. 內部RAM或專用寄存器內容送累加器11100101格式:MOV A,direct代碼:E5H 直接地址操作:(A)(direct)說明:代碼的第二字節為直接地址,可以指向專用寄存器及內部RAM(0127單元)。它與指令一起放在程序存貯器中
27、,執行該指令時,與操作碼一起取到CPU,經地址譯碼訪問指定單元。以后指令中對直接地址direct不再作解釋。. 累加器內容送內部RAM或專用寄存器格式:MOV direct,A11110101代碼:F5H 直接地址操作:(direct)(A)8. 立即數送寄存器格式:MOV Rn, #data01111rrr代碼:78H7FH立即數操作:(Rn) # data,n=079. 立即數送內部格式:MOV Ri, # data1110011i代碼: 76H77H立即數操作:(Ri) # data,i=0,110. 立即數送內部RAM或專用寄存器格式:MOV direct,#data11100101代
28、碼: 75H直接地址立即數操作:(direct) # data說明:這是一條3字節指令,代碼的第二字節為直接地址,第3字節為立即數,在執行該指令時,它們與指令的操作碼一起從程序存貯器取入CPU。11. 寄存器內容送內部RAM或專用寄存器格式:MOV direct,Rn10001rrr代碼: 88H8FH直接地址操作:(direct)(Rn),n=0712. 內部RAM或專用寄存器內容送寄存器10101rrr格式:MOV:Rn, direct代碼: A8HAFH直接地址操作:(Rn)(direct),n=0713. 內部RAM內容送內部RAM或專用寄存器1000011i格式:MOV direct
29、, Rn代碼: 86H87H 直接地址操作:(direct)(Rn),i=0,114. 內部RAM或專用寄存器內容送內部RAM格式:MOV Ri, direct直接地址1000011i代碼: A6HA7H操作:(Ri)(direct),i=0,115. 內部RAM和專用寄存器之間的直接傳送格式:MOV direct, direct直接地址(源)10000101代碼: 85H直接地址(目的)操作:(direct)(direct),n=07說明:這是一條3字節指令,代碼的第二、三字節分別為源操作數和目的絕對地址。指令的功能很強,它能實現內部RAM之間、專用寄存器之間或專用寄存器與內部RAM之間的直
30、接數據傳送。而執行時間為2個機器周期。16. 16位立即數送數據指針格式:MOV DPTR, data16立即數高位10010000代碼: 90H立即數低位操作:(DPH)data 15 data 8(DPH)data 7 data 0說明:這是整個指令系統中唯一的一條16位數據的傳送指令,用來設置地址指針。17. 外部數據存貯器內容送累加器1110011i格式:MOVX A, Ri代碼: E2HE3H操作:(A)(Ri),i=0,1說明:指令執行時,在P3.7引腳上出現有效信號,用作外部數據存貯器的讀選通信號。P0口上分時輸出由Ri指定的8位地址信息及輸入該單元的內容。18. 累加器內容送外
31、部數據存貯器格式:MOVX Ri ,A1111001i代碼: F2HF3H操作:(Ri)(A),i=0,1說明:指令執行時,在P3.6引腳上出現有效信號,用作外部數據存貯器的寫選通信號。P0口上分時輸出由Ri指定的8位地址信息及輸出到該單元的數據。以上兩條與外部數據存貯器傳送數據的指令可以訪問256字節的存貯空間。19. 累加器內容送外部數據存貯器格式:MOVX DPTR, A11110000代碼: F0H操作:(DPTR)(A)說明:指令執行時,P3.6經腳上輸出有效信號,用作外部數據存貯器的寫選通信號。DPTR所包含的16位地址信息由P0(低8位)和P2(高8位)輸出,累加器的內容由P0輸
32、出,P0口作分時復用的總線。20. 外部數據存貯器內容送累加器格式:MOVX A , DPTR 11100000代碼: E0H說明:指令執行時,P3.7引腳上輸出有效信號,有作外部數據存貯器的讀選通信號。DPTR所包含的16位地址信息由P0(低8位)和(高8位)輸出,選中單元的數據由P0輸入到累加器,P0口作分時復用的總線。以上兩條與外部數據存貯器間的數據傳送指令可以訪問64KB字節的存貯空間。21. 數據存貯器內容送累加器10010011格式:MOVC A,ADPT代碼: 93H 說明:指令首先執行16位無符號數的加法操作,獲得基址與變址之和,低8位相加產生進位時,直接加到高位,并不影響標志
33、。22. 程序存貯器內容送累加器格式:MOVC A,APC10000011代碼: 83H 說明:指令首先將PC修正到下一條指令的地址上,然后執行16位無符號數的加法操作,獲得基址與變址之和,低8位相加產生進位時,直接加到高位,并不影響標志。以上兩條MOVC是64KB存貯空間內的查表指令,實現程序存貯器到累加器的代碼或常數傳送,每次傳送一個字節。源操作數采用基址加變址尋址方法,基址寄存器分別為16位的DPTR或程序計數器PC,變址寄存器為累加器。23. 寄存器內容與累加器內容交換11001rrr格式:XCH A,Rn代碼: C8HCFH操作:(A) (Rn),n=0724. 內部RAM內容與累加
34、器內容交換1100011i格式:XCH A,Ri代碼: C6HC7H操作:(A) (Ri), i=0,125. 內部RAM或專用寄存器內容與累加器內容交換11000101格式:XCH A,direct代碼: C5H直接地址操作:(A) (direct) 26. 內部RAM低4位內容與累加器低4位內容交換格式:XCHD A,Ri1101011i代碼: C6HD7H操作:(A30) (Ri30),i=0,1 27. 累加器低4位與高4位交換11000100格式:SWAP A代碼: C4H操作:(A30) (A74) 28. 棧頂內容送內部RAM或專用寄存器格式:POP direct直接地址1101
35、0000代碼: D0H 操作:(direct) (SP) (SP) (SP)1說明:POP為堆棧操作指令,由棧針SP所尋址的內部RAM單元的內容傳送到指令中直接尋址的一個單元中去。然后,棧針減1。一般而言,執行此指令不影響標志,若目標操作數為PSW,則有可能使一些標志改變。這也是通過指令強行修改標志的一種方法。29. 內部RAM或專用寄存器內容送棧頂11000000格式:PUSH direct代碼: C0H直接地址操作:(SP) (SP)1 (SP) direct說明:PUSH也是堆棧操作指令,它把指令中直接尋址的一個字節壓入到當前棧針加1的單元中去。指令不影響標志。3.4 若干數據傳送實驗下
36、面通過幾個數據傳送實驗來熟悉和掌握數據傳送指令及其應用。實驗3-1:外部數據塊搬移(256字節)把處于程序存儲器(XCODE)中從Data_TAB開始的256個字節數據傳送到外部數據存儲器從B000H開始的256個單元中去。ORG 8000H; 實驗板開始執行的第一條指令所處的地址LJMP MAIN; 跳轉到主程序ORG 8030H; 主程序開始的地址;避開中斷入口地址MAIN:MOV DPTR, #Data_TAB; 使DPTR指向XCODE中的Data_TAB開始的256個字節數據MOV P2, #0B0H; 使P2口指向XDATA中的目的地址高8位MOV R0, #00H; 使R0口指向
37、XDATA中的目的地址低8位起始地址MOVEDATA:MOV A, #00H; 清除累加器,以便下一條指令能準確指向XCODE中的數據MOVC A, A+DPTR; 從XCODE中讀取數據,請注意指令形式MOVX R0, A; 把數據寫到XDATA中INC DPTR; 修改源數據指針INC R0; 修改目的數據指針CJNE R0, #00H, MOVEDATA; 沒有送完256個數據,跳轉到MOVEDATA繼續送數HALT:LJMP HALT; 送完256個數據,在此死循環,實際程序中應為后續操作;+以下為XCODE中的數據表+; 用以分隔程序,使程序清晰易懂Data_TAB: ; 常數或數據
38、表格前用標號表示其起始地址DB 0, 1, 2, 3, 4, 5, 6, 7; 立即數可以用十進制數表示,也可以用十六進制數表示, 后者有后綴“H”DB 8, 9, 0AH, 0BH, 0CH, 0DH, 0EH, 0FH; 十六進制數中最高位數為AF時,前面要補數字“0”DB 10H, 11H, 12H, 13H, 14H, 15H, 16H, 17H; 十六進制數中最高位數為AF時,前面要補數字“0”DB 18H, 19H, 1AH, 1BH, 1CH, 1DH, 1EH, 1FH; 每行起始用偽指令“DB”定義數據,“DB”表示數據字節DB 0F8H, 0F9H, 0FAH, 0FBH,
39、 0FCH, 0FDH, 0FEH, 0FFH; 每個數據字節之間用英文逗號分隔;+ +表格結束+; 用以分隔程序,使程序清晰易懂END; 程序結束,編譯程序不理會END以后的內容該實驗的目的是重溫開發環境的使用、匯編程序的格式和熟悉、掌握XCODE、XDATA和累加器之間轉送數據指令。實驗3-2:外部數據塊搬移(65280>數據字節數>256)把處于外部數據存儲器從Data_BLOCK開始的NUMB(65280>NUMB>256)個字節數據傳送到串口數據緩沖器(SBUF)中去。ORG 8000H; 實驗板開始執行的第一條指令所處的地址LJMP MAIN; 跳轉到主程序
40、ORG 8030H; 主程序開始的地址;避開中斷入口地址MAIN:MOV DPTR, #Data_BLOCK; 使DPTR指向XDATA中的Data_BLOCK開始數據塊MOV R0, #NUMB_LOW; #NUMB_LOW為#NUMB的低位字節放到作為低位字節計數器的R0中MOV R1, #NUMB_HIGH+1; #NUMB_HIGH為#NUMB的高位字節加1放到作為高位字節計數器的R1中MOVEDATA:MOVX A, DPTR; 從XDATA中讀取數據,請注意指令形式MOV SBUF, A; 把數據寫到SBUF中INC DPTR; 修改源數據指針DJNZ R0, MOVEDATA;
41、沒有送完NUMB個數據,跳轉到MOVEDATA繼續送數DJNZ R1, MOVEDATA; HALT:LJMP HALT; 送完NUMB個數據,在此死循環,實際程序中應為后續操作;=; 用以分隔程序,使程序清晰易懂END; 程序結束,編譯程序不理會END以后的內容請自行給定地址(Data_BLOCK)和數據字節數(NUMB)并完成該實驗。注意充分利用集成開發環境中的各項工具和窗口觀察每條指令運行的結果。注意:實驗板中Data_BLOCK地址應該在B000H以上,8000HAFFFH和FFF0HFFFFH的部分數據存儲器被實驗版的監控程序和用戶程序占用。實驗3-3:外部數據塊搬移(65536&g
42、t;數據字節數>1)把處于外部數據存儲器(XDATA)中從Data_TAB1開始的NUMB個字節數據傳送到外部數據存儲器從Data_TAB2開始的NUMB個單元中去。ORG 8000H; 實驗板開始執行的第一條指令所處的地址LJMP MAIN; 跳轉到主程序ORG 8030H; 主程序開始的地址;避開中斷入口地址MAIN:MOV DPTR, # Data_TAB1; 使DPTR指向XDATA中的Data_TAB1開始的數據塊MOV R0, # Data_TAB2_LOW; # Data_TAB2的低位字節放到R0中MOV P2, # Data_TAB2_HIGH; # Data_TAB2
43、的高位字節放到P2中MOV R2, #0; R2作為送數個數計數器的低位字節計數器MOV R3, #0; R3作為送數個數計數器的高位字節計數器MOVEDATA:MOVX A, DPTR; 從XDATA中的Data_TAB1開始的數據塊讀取數據MOVX R0, A; 把數據寫到XDATA中的Data_TAB2開始的數據塊中INC DPTR; 修改源地址指針INC R0; 修改目的地址指針低位字節CJNE R0, #0, MOVEDATA1; 目的地址指針低位字節是否有進位INC P2; 目的地址指針低位字節有進位,高位字節加1MOVEDATA1:INC R2; 修改已傳送數據個數計數指針低位字
44、節CJNE R2, #0, MOVEDATA2; 已傳送數據個數計數指針低位字節是否有進位INC P3; 已傳送數據個數計數指針低位字節有進位,高位字節加1MOVEDATA2:CJNE R2, #NUMB_LOW, MOVEDATA; 比較已傳送數據個數計數指針低位字節,不等則繼續送數CJNE R3, #NUMB_HIGH, MOVEDATA; 低位字節相等,比較高位字節,不等則繼續送數HALT:LJMP HALT; 送完數據塊搬移,在此死循環,實際程序中應為后續操作;=; 用以分隔程序,使程序清晰易懂END; 程序結束,編譯程序不理會END以后的內容注意:實驗板中Data_TAB2地址應該在
45、B000H以上,8000HAFFFH和FFF0HFFFFH的部分數據存儲器被實驗版的監控程序和用戶程序占用。實驗3-4:清除外部數據存儲器(0000H7FFFH)清除外部數據存儲器(XDATA)中從9000H到FEFFH的所有單元。ORG 8000H; 實驗板開始執行的第一條指令所處的地址LJMP MAIN; 跳轉到主程序ORG 8030H; 主程序開始的地址;避開中斷入口地址MAIN:MOV DPTR, #9000H; 使DPTR指向XDATA中的起始地址9000HMOV A, #0; 清除累加器CLR_RAM:MOVX DPTR, A; 清除DPTR所指向的XDATA單元(即寫入數據00H
46、)INC DPTR; 修改地址指針MOV R0, DPH; 把地址指針的高位字節送到R0中進行判斷CJNE R0, #0FFH, CLR_RAM; 完成清除XDATA?HALT:LJMP HALT; 完成清除XDATA,在此死循環,實際程序中應為后續操作;=; 用以分隔程序,使程序清晰易懂END; 程序結束,編譯程序不理會END以后的內容實驗3-5:清除片內數據存儲器(DATA+IDATA)清除片內數據存儲器(DATA+IDATA),即片內從00H至FFH所有單元。(由于實驗板的監控程序暫用了IDATA中高十幾個字節的地址,直接在實驗板上調試該實驗程序會導致死機,請采用軟件調試方式做該實驗。)ORG 8000H; 實驗板開始執行的第一條指令所處的地址LJMP MAIN; 跳轉到主程序ORG 8030H; 主程序開始的地址;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司財務外幣管理制度
- 咨詢顧問薪資管理制度
- 圓通員工宿舍管理制度
- 地鐵內部日常管理制度
- 醫療客服績效管理制度
- 廠里廚房安全管理制度
- 城鎮供水服務管理制度
- 公司會議紀律管理制度
- 醫院收費交款管理制度
- 公司文明如廁管理制度
- 武進經濟發展集團筆試
- ISO56002-2019創新管理體系管理手冊及程序文件
- 全員消防安全責任制
- 近五年廣東中考英語真題及答案
- 小學六年級數學奧數題100題附答案(完整版)
- 創業基礎智慧樹知到期末考試答案章節答案2024年山東大學
- 2024版工程項目結算協議書范本
- 動火作業安全管理協議書
- 電費代繳授權委托書模板
- 屆畢業論文答辯(論文副標題)答辯指導老師放校徽成品模板
- 舊樓外墻保溫合同
評論
0/150
提交評論