实验3 多分支程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验3 多分支程序
一、实验目的
1.了解程序的多分支结构。
2.了解多分支结构程序的编程方法。
3.学会程序的调试。
二、实验内容
在多分支结构的程序中,能够按调用号执行相应的功能。
三、实验说明
多分支结构是程序中常见的结构,若给出调用号来调用子程序,一般用查表方法,查到子程序的地址,转到相应子程序,完成指定操作。
基本实验要求:根据A里面的值给相应的片内RAM单元赋值,A的值范围为0~3,要给对应的30H~33H赋相应A的值。
四、硬件设计
利用以下元件:A T89C51、CAP、CAP-ELEC、CRYSTAL、RES。设计出如下的硬件电路。晶振频率为12MHz。
五、参考程序框图
多分支参考程序框图
六、程序调试
编写好程序后,进行调试。
1)keil中调试
选择‘debug’中‘start/stop debug session’,开始调试,按‘F1’,单步运行。在‘project workspace’中查看累加器、通用寄存器及特殊功能寄存器的变化;在‘memory’窗口中,可以看到每执行一条语句后存储空间的变化。在‘address’窗口中,输入‘D:地址’,查看A T89C51的片内直接寻址空间,并单步执行,看到随着程序的执行,相应的地址单元内容发生变化。
2)Proteus中调试
右击‘A T89C51’并左单击,打开‘Edit Component’窗口,在‘program file’中选择keil中生成的.hex文件。然后在左下角‘’按钮,进入程序调试状态,并在‘debug’中打开‘8051 CPU Registers’、‘8051 CPU (IDA TA)Memory’及‘8051 CPU SFR Memory’三个观察窗口,按‘F11’键,单步运行,并观察三个窗口相应值的变化。
3)按‘思考’中内容,重复以上内容,观察变化。
七、参考代码
ORG 00H
START:
MOV A,#0 ;设置地址偏移量
ACALL FUNCENTER
MOV A,#1 ;设置地址偏移量
ACALL FUNCENTER
MOV A,#2 ;设置地址偏移量
ACALL FUNCENTER
MOV A,#3 ;设置地址偏移量
ACALL FUNCENTER
LJMP $
FUNCENTER:
ADD A,ACC ;AJMP为二字节指令,地址偏移量*2
MOV DPTR,#FUNCTAB ;设置基址
JMP @A+DPTR ;跳转到目标地址
FUNCTAB:
AJMP FUNC0
AJMP FUNC1
AJMP FUNC2
AJMP FUNC3
FUNC0: MOV 30H,#0
RET
FUNC1: MOV 31H,#1
RET
FUNC2: MOV 32H,#2
RET
FUNC3: MOV 33H,#3
RET
END
八、思考
1)请分别采用不同的跳转指令(AJMP 、LJMP )及不同调用指令(ACALL 、LCALL )并调试,同时指出这些指令的区别。
2)设变量x 的值存放在内部RAM 的50H 单元中,求y 并存于40H ,尝试编程并调试正确。
101010100
10100x x y x x x x +<⎧⎪=≤≤⎨⎪+>⎩