单片机实验
微机实验:指令功能实验
实验目的
1、熟悉仿真器操作;
2、掌握51系列指令功能及其机器码的编译。
(一)数据传送和运算
实验内容:
两个16位无符号二进制数分别存放在片外RAM首址为2000H和2002H单元内,将它们相加后存放在片内RAM 30~31H单元。(高地址单元存高8位数,低地址单元存低8位数)。
参考程序:
ORG 1000H |
MOV DPTR, #2000H |
;被加数送R2R3 |
MOVX A, @DPTR |
;A=____ | |
MOV R2, A |
;R2=____ | |
INC DPTR |
;DPTR=____ | |
MOVX A, @DPTR |
| |
MOV R3, A |
;R3=____ | |
INC DPTR |
;求和,送R2R3 | |
MOVX A, @DPTR |
;A=____ | |
ADD A ,R2 |
;R2=____ | |
INC DPTR |
| |
MOVX A, @DPTR |
;A=____ | |
ADDC A, R3 |
;R3=____ | |
MOV 30H, R2 |
;和存30H、31H | |
MOV 31H, R3 |
;(30H)=__,(31H)=__ | |
NOP |
;实验断点 | |
END |
|
实验步骤:
1、复位。仿真器复位后,读初始值A、PSW、DPTR。
2、输入程序。 将源程序输入首址为1000H的存储单元。
3、设置初值。假设被加数为1234H,加数为5678H,分别送入片外RAM的2000H和2002H单元。
4、单步执行。每执行一步,观察A、R2、R3的数值变化。
5、连续执行。首先,重设初值,在结束处设置断点,然后全速运行。
6、上述程序模块最后一句NOP指令改为SJMP$(机器码80FE),再次执行单步和连续操作。
思考题:
1、8031对片内RAM和片外RAM各有哪些寻址方式?有哪些指令可以在片内RAM之间、片内外RAM之间实现数据传送?
2、调试程序模块时,为什么要在模块结束处设置断点或加SJMP$指令?
(二)从程序存储器取数
实验内容:将R0中的16进制数0~F改写为ASCⅡ码。
参考程序:
ORG 1020H |
| ||
|
|
MOV A, R0 |
;取16进制数 |
|
|
ADD A, #03H |
;修正A |
|
|
MOVC A ,@A+PC |
;查存储器中ASCⅡ表 |
|
|
MOV R0, A |
;ASCⅡ码存R0 |
|
|
SJMP $ |
;停 |
DB |
|
30H,31H,32H,33H, |
;ASCⅡ码表 |
|
|
34H,35H,36H,37H, |
|
|
|
38H,39H,41H,42H, |
|
|
|
43H,44H,45H,46H |
|
实验步骤:
1、输入程序。
2、R0单元输入任一数(0~F)。
3、用单步和连续运行程序,并检查结果。
4、计算相对转移指令的地址偏移量。
思考题:
1、有哪些指令可以读取程序存储器(EPROM)中的内容?
2、句中的修正量如何计算?
3、实验内容不变,但要求用MOVE A,@A+DPTR查表,试编写程序。
(三)子程序调用
实验内容:
已知整数n存于R0,求 ,k≤10,并存于R2R3。
参考程序:
ORG 2000H |
| ||
|
|
CLR A |
;R2、R3清零 |
|
|
MOV R2, A |
|
|
|
MOV R3, A |
|
|
ML: |
MOV A, R0 |
|
|
|
LCALL SQ |
;执行前,SP=___;PC=_ 执行后,SP=___;PC=__ |
|
|
ADD A,R3 |
;累加和,存R2R3 |
|
|
MOV R3,A |
|
|
|
CLR A |
|
|
|
ADDC A R2 |
|
|
|
MOV R2,A |
|
|
|
DJNZ R0,ML |
|
|
|
SJMP $ |
|
|
|
|
|
|
|
ORG |
|
|
SQ: |
ADD A,#01H |
;求(A)2 |
|
|
MOVC A,@A+PC |
|
|
|
RET |
;执行后,SP=___;PC=__ |
|
DB: |
01H,04H,09H,10H,19H |
;1~10平方表 |
|
|
24H,31H,40H,51H,64H |
|
实验步骤:
1、人工汇编上述程序,写出每条指令的首地址和机器码。
2、输入程序。
3、在R0输入某数(≤10)以后,单步执行,观察子程序调用和返回时堆栈的内容变化。然后连续执行至程序结束,观察R2、R3中结果。
思考题:
执行CALL和RET指令的过程中,堆栈内容如何变化?
(四)堆栈操作和跳转指令
实验内容:
将程序中存贮器中的字符串“ABC”和“12345”(字符串结束符00H)分别传送到片内RAM,首址为50H、60H的单元内。
参考程序:
ORG 1040H |
| ||
|
|
MOV SP,#20H |
;设置堆栈 |
|
|
MOV R1,#50H |
;R1指向片内RAM首址 |
|
|
LCALL SOT |
|
|
DB: |
“ABC”, 00H |
;字符串 |
|
|
MOV R1,#60H |
;R1指向片内RAM首址 |
|
|
LCALL SOT |
|
|
DB: |
“12345”,00H |
;字符串 |
|
|
SJMP $ |
|
|
|
|
|
|
|
ORG 1060H |
|
|
SOT: |
POP DPH |
;字符串首地址DPTR |
|
|
POP DPL |
|
|
SOT1: |
CLR A |
|
|
|
MOVC A,@A+DPTR |
;读字符串 |
|
|
MOV @R1,A |
;写入片内RAM |
|
|
INC DPTR |
;修正地址 |
|
|
INC R1 |
|
|
|
JZ SEND |
;字符串结束? |
|
|
SJMP SOT1 |
;否,转SOT1 |
|
SEND: |
JMP @A+DPTR |
;返回 |
实验步骤:
1、输入程序。
2、单步执行,观察堆栈指针SP、堆栈内容、DPTR、PC的变化情况。
思考题:
子程序SOT的结束处,为什么不用RET,而用JMP @A+DPTR?
全部0条评论
快来发表一下你的评论吧 !