实验部分
实验一 Keil集成开发环境练习和编程调试
实验名称:Keil集成开发环境练习和编程调试 学时安排:2学时 实验类别:综合性 实验要求:必做
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 一、实验目的和任务
1 熟悉Keil C51 集成开发环境的使用方法;
2 熟悉Keil C51 集成开发环境仿真条件下调试功能的使用。 二、实验原理介绍
Keil 集成开发环境为我们提供了强大的学习、调试和开发工具。我们可以利用这套工具在计算机上直接进行汇编语言的编辑、连接和调试。
在程序调试时,可以通过查看相关寄存器和存储器内容来判断程序的执行是否正确,通过修改相关寄存器和存储器的内容来改变程序,再执行,来修改和验证程序。 三、实验设备介绍
1 IBM PC 机一台 四、实验内容和步骤
1 编写程序,完成内存中两个字节内容的交换。
① 建立工程文件。双击桌面的Keil快捷图标,进入Keil集成开发环境。点击工具栏的Project选项,在弹出的下拉菜单中选择New Project命令,建立一个新μVision2工程,为工程命名(如MyProject-1.uv2);并选择将要使用的器件的型号(Philips公司P80/87C52X2 CPU)。
②编写程序,加入到刚才建立工程文件中。
在File下采用New命令以建立新文件,单击File→Save as,在弹出对话框的“文件名”栏编辑框中输入欲使用的文件名和正确扩展名(如Test1.asm),然后单击“保存”按钮;这样事先保存空白待编辑文件的好处是:Keil能自动识别关键字并标注不同颜色,提高编程效率。
在Project Workspace窗口内,选中Source Group1后点击鼠标右键,在弹出菜单中选择Add files to Group “Source Group1”(向工程中添加源程序文件)命令,选择刚创建的文件,单击Add命令即可把源程序文件添加到项目中。之后就可以编写程序内容,并注意及时保存文件。参考程序如下:
ORG
0000H MAIN
LJMP
ORG 0100H
;SP= ;R0= ;R1= ;(40H)= MOV R0,#30H MOV R1,#40H
MAIN: MOV SP,#60H
MOV @R0,#55H MOV @R1,#0AAH MOV A,@R1 XCH A,@R0 XCH A,@R1 NOP SJMP
;(30H)= ;A= ;A= (30H)= ;A= (40H)= $ ;该程序完成了 和 两字节的内容交换。
END
③汇编和连接:选择Project下的Rebuild all target files 对工程文件进行汇编和连接:如果出
错,系统会提示出错并指出出错地方和出错类型,请按照提示返回程序进行修改,直到系统提示没有错误,表明程序没有语法错误,可以进行动态调试了。
④动态调试的参数设置:选择Project下的Options for target ‘Target1’进行动态调试的参数设置,点击debug,再点击 Use Simulator,最后点击完成。
⑤对程序进行动态调试,查看相关寄存器、内存和外部存储器的内容。 将每行程序执行后的结果写到该行程序的注释部分。 重要提示:
常用工具条命令有开始/暂停动态调试
,单步执行
或
,执行到光标处
等。
查看存储器内容的方法:在存储区地址写上要查看的初始地址即可。比如:
D:0000H可查看内存RAM,X:0000H可查看外部RAM数据, C:0000H可查看ROM程序。 采用堆栈法也可以完成两字节内容的交换。(用下述程序替代上述虚线框中黑体字程序) MOV @R0,#33H ; (30H)=
MOV @R1,#44H MOV A,@R0 PUSH ACC PUSH ACC NOP POP POP
ACC ACC
; SP= A= ; (30H)= ; SP= A= ; (40H)= MOV @R0,A MOV @R1,A
MOV A,@R1
; (40H)= ; A=
; SP= (61H)= ; A= ; SP= (62H)=
2 编写一个数据填充和数据块搬移程序。
仿照实验内容和步骤1的过程,建立、编辑、汇编、连接和动态调试程序,查看和验证数据区的内容是否正确。参考程序如下:
3 编写一个多字节的算术运算程序。(视时间选做)
仿照实验内容和步骤1的过程,建立、编辑、汇编、连接和动态调试程序,将运行结果写到程序的注释部分。 ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV SP,#60H MOV R1,#12H MOV R0,#34H MOV R2,#21H MOV R3,#0EFH ;下面是加法运算 MOV A,R0
ORG 0000H LJMP MAIN ORG 0100H MOV R0,#30H MOV R2,#16 MOV @R0,#'*' INC
R0
; R0指向30H单元 ; R2作循环计数器 ; 填充当前单元 ; 指针下移一个单元
; 未填完16个单元,返回 继续填充
MAIN: NEXT1:
DJNZ R2,NEXT1 MOV R1,#30H
;以下程序将30H开始的16个字节内容送到0100H开始的外部存储器中
MOV DPTR,#0100H ;
MOV R3,#10H ; 此处R3取值的理由是: MOV A,@R1 MOVX @DPTR,A INC INC
R1 DPTR
NEXT2:
DJNZ R3,NEXT2 SJMP $ END
;R1R0= ;R3R2=