单片机实验一

1、实验内容一
1.1、问题一:
编写以下实验题的程序,进行单步执行,观察相应专用寄存器、RAM空间(包括工作寄存器区、位寻址区、用户RAM区)数据的变化情况以及程序存储器的指令代码。
1.2、问题一的代码

ORG     0000H
AJMP   START
ORG     0100H
START:MOV  A,#66H
MOV    R0, #22H
MOV    @R0,#5
MOV    A,  20H  
XCHD   A, @R0
ORL     22H, #30H 
SWAP    A
ORL     A, #30H  
MOV    2FH, A
SETB     7FH
SJMP    $
END

1.3、问题一的结果和现象:
单步运行的结果:
程序跳过第一句伪代码,直接运行第二句代码,即短转移指令,运行对应地址所存的代码。
第三句代码说明START函数的首地址为0100H,进行单步运行运行第四句以累加器为目的操作数的指令代码,累加器ACC被赋值#66H。
单步运行第五句以寄存器Rn为目的操作数的指令后,寄存器R0被赋值#22H。
继续单步运行运行第六句以间接地址为目的操作数的指令后,片内RAM的22H地址被赋值05H。
再单步运行第七句以累加器为目的操作数的指令,将地址20H里的数值赋值给累加器A,即累加器被赋值0。
接着单步运行第八句交换指令,累加器与工作寄存器R0所指存储单元中的低半字节内容互换,即累加器被赋值05H,地址22H的内容被置零。
单句运行第九句逻辑或指令,直接地址单元22H中的内容和累加器A中的内容执行逻辑或操作,结果存在直接单元22H中,即将00H与30H相加赋值给22H。
单句运行第十句交换指令,将累加器的内容高低半字节互换,即将累加器的高板子节赋值5,低半字节赋值0。
单句运行第十一句逻辑或指令,即,可知累加器被赋值70H,有累加器中有奇数个1,则P=1。
单句运行第十二句以直接地址作为目的操作数的指令,将累加器的值送到2FH单元中。
单句运行第十三句置位指令,即将2FH最高位置1,即,即2FH的值被赋值为F0H。
单句运行第十四句相对转移指令,即死循环。
2、实验内容二
2.1、问题二:
设30H和32H开头分别存放两个16位无符号二进制数(低8位在低地址30H、32H,高8位在高地址31H、33H),完成两个数相加的程序,并将结果放入34H开头的单元。将1122H和3344H分别送入RAM单元,观察结果和CY标志;再分别将8899H和AABBH放入RAM单元,再观察结果和CY标志。
2.2、问题二的代码:
计算1122H和3344H相加的代码如下:

ORG 0000H
AJMP START
START:MOV 30H,#22H
MOV 31H,#11H
MOV 32H,#44H
MOV 33H,#33H
MOV A , 30H
ADD A , 32H
MOV 34H , A
MOV A , 31H
ADD A , 33H
MOV 35H , A

计算8899H和AABBH相加的代码如下:

ORG 0000H
AJMP HSUM
HSUM:MOV 30H,#99H
MOV 31H,#88H
MOV 32H,#0BBH
MOV 33H,#0AAH
MOV A , 30H
ADD A , 32H
MOV 34H , A
MOV A , 31H
ADD A , 33H
MOV 35H , A

2.3、问题二的实验结果和现象:
计算1122H和3344H相加的实验结果,地址34H存放低8位66H,地址35H存放高8位44H,Cy没有进位。
计算8899H和AABBH相加的实验结果,地址34H存放低8位54H,地址35H存放高8位32H,Cy有进位。
3、实验内容三
3.1、问题三:
将30H单元内的2个BCD数相乘,乘积转换为BCD数,并把乘积送入31H单元。
3.2、问题三的代码:

ORG 0000H
AJMP START
ORG 0100H
START:MOV 30H, #99H
MOV A ,30H
MOV B , #10H
DIV AB
MUL AB
MOV B , #0AH
DIV AB
SWAP A
ADDC A , B
END

3.3、问题三的实验结果和现象:
累加器和地址31H存放成绩结果十进制结果81,现象如图。
4、实验内容四
4.1、问题四:
验证堆栈操作的步骤:

(A)=50H,(B)=60H
PUSH ACC
①(SP)←(SP)+1,
②ACC中的内容压入SP指向的单元。
POP B
① SP指向的单元内容弹出到B
②(SP)←(SP)-1。

4.2、问题四的代码:

ORG 0000H
AJMP START
ORG 0200H
START:MOV A,#50H
MOV B , #60H
PUSH ACC
POP B
END

4.3、问题四的实验结果和现象:
进行单步运行,运行完PUSH语句后,SP加1,实际情况是SP先加1,堆栈再放入数据;运行完POP语句后,B的值被赋值为50H,SP减1,实际情况是堆栈数据先出栈,SP再减1.现象如图:
执行完PUSH语句:
这里写图片描述
这里写图片描述
执行完POP语句:
这里写图片描述
这里写图片描述
5、实验内容五
5.1、问题五:
实现将30H内无符号数扩大6倍,设扩大6倍的值不超过255。
5.2、问题五的代码:

ORG 0000H
AJMP START
ORG 0200H
START:MOV 30H,#12H
MOV A , 30H
RL A
MOV 31H , A
RL A
ADDC A , 31H
END

5.3、问题五的实验结果和现象:
实验结果为累加器和30H存放12H放大6倍的结果6CH,现象如图:
这里写图片描述
这里写图片描述
6、实验内容六
6.1、问题六:
完成0~9的平方值查表程序,要求分别利用DPTR和PC作为变址寄存器,并比较两者的异同。
6.2、问题六的代码:
运用DPTR作为变址寄存器代码如下:

ORG 0000H
AJMP START
ORG 0100H
START:MOV 30H,#02H
MOV A , 30H
MOV DPTR , #TAB
MOVC A,@A+DPTR
MOV 30H , A
ORG  0200H
TAB: DB 0,1,4,9,16,25,36,49,64,81
END

运用PC作为变址寄存器代码如下:

ORG 0000H
AJMP START
ORG 0100H
START:MOV 30H,#02H
MOV A , 30H
MOV DPTR , #TAB
ADD A,#02H
MOVC A,@A+PC
MOV 30H , A
TAB: DB 0,1,4,9,16,25,36,49,64,81
END

6.3、问题六的实验结果和现象:
利用DPTR和PC作为变址寄存器,以PC为基址时,不用设置PC的值,只需根据A的内容,就可以查出表格中的数据。但表格只能放在该条查表指令后面的256个单元中,并且需要根据查表语句和表之间的代码的所占字节数对A进行相加。而以DPTR为基址时,表格的大小和位置可以在64KB的ROM中任意安排,并且表格可被任意程序块所共享。
实验结果为累加器存放2的平方数4。
运用PC作为变址寄存器现象如图:
这里写图片描述
这里写图片描述
运用DPTR作为变址寄存器现象如图:
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/chao_shine/article/details/78882647