實驗一 數據傳送
一、實驗目的
1.進一步熟悉仿真器的使用方法。
2.練習設計簡單的程序。
3.掌握8051片內RAM和片外RAM的數據傳送方法,從而了解這兩部分存貯器的特點。
二、實驗內容
將8051內部RAM 40H~4FH置初值00H~0FH,然后將40H~4FH內容傳送到外部RAM的4800H~480FH,再將4800H~480FH傳回內部RAM的50H~5FH。設置斷點B1、B2、B3每運行到斷點時檢查相應的CPU現場和存貯單元的內容。
三、實驗準備
1、認真閱讀本實驗指導。
2、讀懂下面的程序:
#include<reg51.h>
#include<absacc.h>
char data *p40 ,*p50 ;
char xdata *p4800;
char i, j, k;
void main( )
{
p40=0x40;
p50=0x50;
p4800=0x4800;
for(i=0;i<16;i++)
{
*p40=i;
p40=p40+1;
}
//B1
p40=0x40;
for(j=0;j<16;j++)
{
*p4800=*p40;
p40=p40+1;
p4800=p4800+1;
}
// B2
p4800=0x4800;
for(k=0;k<16;k++)
{
*p50=*p4800;
p50=p50+1;
p4800=p4800+1;
} }
//B3
3、畫出如下要測的數據表格:
0.png (9.53 KB, 下載次數: 50)
下載附件
2018-11-16 03:26 上傳
四、實驗步驟
1、向機器輸入程序。
2、運行程序至第一個斷點B1,檢查40H~0FH單元內容及指針p40的內容。
3、運行程序至第二個斷點B2,檢查4800H~480FH單元內容及指針p40,p4800的內容。
4、運行程序至第三個斷點B3,檢查50H~5FH單元內容及累加器及指針p50的內容。
五、實驗報告要求
1、寫出C語言源程序和對應的匯編語言指令及注解的程序清單。
126: ?C_STARTUP: LJMP STARTUP1
127:
128: RSEG ?C_C51STARTUP
129:
130: STARTUP1:
131:
132: IF IDATALEN <> 0
C:0x0000 020889 LJMP STARTUP1(C:0889)
6: void main( )
7: {
8: p40=0x40;
C:0x0800 750A40 MOV p40(0x0A),#0x40
9: p50=0x50;
C:0x0803 750B00 MOV p50(0x0B),#0x00
C:0x0806 750C00 MOV 0x0C,#0x00
C:0x0809 750D50 MOV 0x0D,#0x50
10: p4800=0x4800;
C:0x080C 750848 MOV p4800(0x08),#0x48
C:0x080F 750900 MOV 0x09,#0x00
11: for(i=0;i<16;i++)
C:0x0812 E4 CLR A
C:0x0813 F50E MOV i(0x0E),A
12: {
13: *p40=i;
C:0x0815 A80A MOV R0,p40(0x0A)
C:0x0817 A60E MOV @R0,i(0x0E)
14: p40=p40+1;
C:0x0819 050A INC p40(0x0A)
15: }
16: //B1
C:0x081B 050E INC i(0x0E)
C:0x081D E50E MOV A,i(0x0E)
C:0x081F B410F3 CJNE A,#k(0x10),C:0815
17: p40=0x40;
C:0x0822 750A40 MOV p40(0x0A),#0x40
18: for(j=0;j<16;j++)
C:0x0825 E4 CLR A
C:0x0826 F50F MOV j(0x0F),A
19: {
20: *p4800=*p40;
C:0x0828 A80A MOV R0,p40(0x0A)
C:0x082A E6 MOV A,@R0
C:0x082B 850982 MOV DPL(0x82),0x09
C:0x082E 850883 MOV DPH(0x83),p4800(0x08)
C:0x0831 F0 MOVX @DPTR,A
21: p40=p40+1;
C:0x0832 050A INC p40(0x0A)
22: p4800=p4800+1;
C:0x0834 0509 INC 0x09
C:0x0836 E509 MOV A,0x09
C:0x0838 7002 JNZ C:083C
C:0x083A 0508 INC p4800(0x08)
23: }
24:
25: // B2
C:0x083C 050F INC j(0x0F)
C:0x083E E50F MOV A,j(0x0F)
C:0x0840 B410E5 CJNE A,#k(0x10),C:0828
26: p4800=0x4800;
C:0x0843 750848 MOV p4800(0x08),#0x48
C:0x0846 750900 MOV 0x09,#0x00
27: for(k=0;k<16;k++)
C:0x0849 E4 CLR A
C:0x084A F510 MOV k(0x10),A
28: {
29: *p50=*p4800;
C:0x084C 850982 MOV DPL(0x82),0x09
C:0x084F 850883 MOV DPH(0x83),p4800(0x08)
C:0x0852 E0 MOVX A,@DPTR
C:0x0853 AB0B MOV R3,p50(0x0B)
C:0x0855 AA0C MOV R2,0x0C
C:0x0857 A90D MOV R1,0x0D
C:0x0859 120877 LCALL C?CSTPTR(C:0877)
30: p50=p50+1;
C:0x085C 7401 MOV A,#0x01
C:0x085E 250D ADD A,0x0D
C:0x0860 F50D MOV 0x0D,A
C:0x0862 E4 CLR A
C:0x0863 350C ADDC A,0x0C
C:0x0865 F50C MOV 0x0C,A
31: p4800=p4800+1;
C:0x0867 0509 INC 0x09
C:0x0869 E509 MOV A,0x09
C:0x086B 7002 JNZ C:086F
C:0x086D 0508 INC p4800(0x08)
32: } }
C:0x086F 0510 INC k(0x10)
C:0x0871 E510 MOV A,k(0x10)
C:0x0873 B410D6 CJNE A,#k(0x10),C:084C
C:0x0876 22 RET
C?CSTPTR:
C:0x0877 BB0106 CJNE R3,#0x01,C:0880
C:0x087A 8982 MOV DPL(0x82),R1
C:0x087C 8A83 MOV DPH(0x83),R2
C:0x087E F0 MOVX @DPTR,A
C:0x087F 22 RET
C:0x0880 5002 JNC C:0884
C:0x0882 F7 MOV @R1,A
C:0x0883 22 RET
C:0x0884 BBFE01 CJNE R3,#0xFE,C:0888
C:0x0887 F3 MOVX @R1,A
C:0x0888 22 RET
133: MOV R0,#IDATALEN - 1
C:0x0889 787F MOV R0,#0x7F
134: CLR A
C:0x088B E4 CLR A
135: IDATALOOP: MOV @R0,A
C:0x088C F6 MOV @R0,A
136: DJNZ R0,IDATALOOP
C:0x088D D8FD DJNZ R0,IDATALOOP(C:088C)
185: MOV SP,#?STACK-1
186:
187: ; This code is required if you use L51_BANK.A51 with Banking Mode 4
188: ;<h> Code Banking
189: ; <q> Select Bank 0 for L51_BANK.A51 Mode 4
190: #if 0
191: ; <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4.
192: EXTRN CODE (?B_SWITCH0)
193: CALL ?B_SWITCH0 ; init bank mechanism to code bank 0
194: #endif
195: ;</h>
C:0x088F 758110 MOV SP(0x81),#k(0x10)
196: LJMP ?C_START
C:0x0892 020800 LJMP main(C:0800)
2、將測得的數據填入表格,并和理論分析的結果相比較。
答:通過實驗結果可以發現本次實驗的理論分析結果與實際實驗結果相同
3、說明8031CPU對內部存貯器和外部擴展RAM存貯器各有哪些尋址方式?
答:8031CPU對內部存貯器可用立即尋址、直接尋址、寄存器尋址、寄存器間接尋址,對外部擴展RAM存貯器只有寄存器間接尋址。
4、如果要讀外部程序存儲器0x4800中的內容,該如何訪問?
答:訪問片外數據存儲區比訪問片內數據存儲區慢,因為訪問片外數據存儲區要通過數據指針加載地址來間接尋址訪問的。C51提供兩種不同的數據存儲類型xdata和pdata來訪問片外數據存儲區。所以要讀外部程序存儲器0x4800中的內容只要將數據存儲類型定義成xdata就可以訪問了。
5.實驗心得。
通過第一次的實驗,我學會了對keil的基本利用,我們首先要新建一個工程,然后選擇型號,再新建一個File,將自己的程序寫進去,然后點擊保存,要注意的是保存成xxx.c的格式,然后鼠標右鍵點擊右側的Targe1,選擇第一項在,在output一欄生成hxe文件,最后將文件添加到工程中去,點擊運行,觀察程序是否有錯誤,通過debug,在view一欄找到disassembly windows可以翻譯成匯編語言,在memory windows和watch&call stack windows這里可以找到本次實驗的結果。這是對keil最簡單的運用了,還有更多的需要去學習,繼續努力.
完整的Word格式文檔51黑下載地址:
666.docx
(26.37 KB, 下載次數: 12)
2018-11-15 21:36 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|