实验一 8051 简单编程与调试
实验目的
通过简单小程序的输入和调试,熟悉并掌握 Keil 的使用。学会 Proteus 与 Keil 的整合调试。
实验基本要求
建立三个项目,分别输入存储块清零、二进制 BCD 码及二进制 ASCII 码转换的汇编源程序,并进行
仿真调试。画出实验程序的流程框图。
实验步骤
采用 Keil Cx51 开发 8051 单片机应用程序一般需要经过下面几个步骤:
1、 在Vision2 集成开发环境中创建一个新项目(Project),并为该项目选定合适的单片机 CPU 器件。
在菜单栏中选择“Project” →“New Project”,弹出“Create New Project”对话框,选择目标路径,
在“文件名”栏中输入项目名后,单击“保存(S)”按钮,弹出“Selecte Device for Target”对话窗口。在
此对话窗口的“Data base”栏中,单击“Atmel”前面的“+”号,或者直接双击“Atmel”,在其子类中选
择“AT89C51”,确定 CPU 类型。如图所示。
点击“确定”按钮后,弹出如下的对话框
1
如果是进行汇编语言编程选择“否”。
2、 利用Vision2 的文件编辑器编写 C 语言(或汇编语言)源程序文件,并将文件添加到项目中去。
一个项目可以包含多个文件,除源程序文件外还可以有库文件或文本说明文件。
在Vision2 的菜单栏中选择“File”→“New”命令,新建文档,然后在菜单栏中选择“File” →“Save”
命令,保存此文档,这时会弹出“Save As”对话窗口,在“文件名(N)”一栏中,为此文本命名,注意
要填写扩展名“.asm”。单击“保存(S)”按钮,这样在编写汇编代码时,Keil 会自动识别汇编语言的关键
字,并以不同的颜色显示,以减少输入代码时出现的语法错误。程序编写完后,再次保存。
在 Keil 中“Project Workspace”子窗口中,单击“Target 1”前面的“+”号,展开此目录。在“Source
Group 1”文件夹上单击鼠标右键,在右键菜单中选择 “Add File to ‘Group Source 1’”,弹出“Add File to
Group”对话窗口,在此对话窗口的“文件类型”栏中,选择“Asm Source File”,并找到刚才编写的.asm
文件,双击此文件,将其添加到 Source Group 中,此时“Project Workspace”子窗口如图所示。
2
3、 通过Vision2 的各种选项,配置 Cx51 编译器、Ax51 宏汇编器、BL51/.Lx51 连接定位器以及 Debug
调试器。
在“Project Workspace”窗口中的“Target 1”文件夹上单击鼠标右键,在弹出的右键菜单中选择“Option
for Target”选项,这时会弹出“Options for Target”对话窗口,在此对话窗口中选择“Output”选项卡,选
中“Create HEX File”选项,如图所示。
4、 利用Vision2 的构造(Buid)功能对项目中的源程序文件进行编译连接,生成绝对代码和可选的
HEX 文件,如果出现编译连接错误则返回到第 2 步,修改源程序中的错误后重新构造整个项目。
在 Keil 的菜单栏中选择“Project”→“Build Target”命令,编译汇编源文件。如果编译成功,则在“Output
Window”子窗口中会显示如图所示的信息;如果编译不成功,双击“Output Window”窗口中的错误信息,
则会在编辑窗口中指示错误语句。
5、 将没有错误的绝对代码装入Vision2 调试器进行仿真调试,调试成功后将 HEX 文件写入到单片
机应用系统的 EPROM 中。
3
在 Keil 的菜单栏中,选择“Debug”→“Start/Stop Debug Session”选项,进入程序调试环境,如图所
示。按“F11”键,单步运行程序。在“Project Workspace”窗口中,可以查看累加器、通用寄存器及特殊
功能寄存器的变化。在“Memory”窗口中,可以看到每执行一条语句后存储空间的变化。在“Address”
栏中,输入“D: 30H”,查看 AT89C51 的片内直接寻址空间。
程序调试完毕后,再次在菜单栏中选择“Debug”→“Start/Stop Debug Session”选项,退出调试环境。
在 Proteus 中调试程序
打开 Proteus
ISIS 编辑环境,在菜单栏中选择“File”→“Load Design”弹出“Load ISIS Design File”
对话窗口,选择要打开的 Proteus 的.DSN 设计文件。在本实验中,设计文件为本实验子目录下的 Basic.DSN
单击鼠标右键选中 AT89C51 并单击鼠标左键,打开“Edit Component”对话窗口,在此窗口中的“Program
4
File”栏中,选择先前用 Keil 生成的.HEX 文件,如图所示。
单击 Proteus ISIS 界面左下角的
按钮,进入程序调试状态,并在“Debug”菜单中打开“8051 CPU
Registers”、“8051 CPU Internal (IDATA) Memory”及“8051 CPU SFR Memory”三个观察窗口,按“F11”
键,单步运行程序。在程序运行过程中,可以在这三个窗口中看到各寄存器及存储单元的动态变化。
Proteus 与 Keil 整合调试及电路仿真
在 Proteus 的“Debug”菜单中选择“Use Remote Debug Monitor”选项,如图所示。
选择 Keil 的“Project”→“Options for Target ‘Target 1’”,在弹出的对话框中,单击 Debug 选项卡,单
击右上部的下三角按钮选择“Proteus VSM Monitor-51 Driver”如图所示。
5
单击“Setting”进入对话框填写如图所示的 IP 地址和端口号。
在 Keil 中,在菜单栏中选择“Debug”→“Start/Stop Debug Session”选项,Keil 系统进入调试状态。
同时 Proteus 也进入调试状态。这时可以调整这两个软件窗口的大小,使它们同时出现在桌面上,这样就
可以同时观察这两个软件运行的情况了。
在 Proteus 的调试状态下,在“Debug”菜单中打开“8051 CPU Registers”、“8051 CPU Internal(IDATA)
Memory”、“8051 CPU SFR Memory”三个观察窗口,在单步运行程序的过程中,可以在这三个窗口中看到
各寄存器以及存储单元的动态变化。
6
实验内容 1
Porteus 模型为 BASIC.DSN 如下图所示。
一、 存储块置全“1”源代码:
汇编语言源程序:
00H
30H
R1,#START
ORG
START EQU
MOV
MOV R7,20H
MOV
LOOP: MOV
INC
DJNZ R7,LOOP
SJMP
END
R1
$
A,#0FFH
@R1,A
;起始地址
;Rn中设置32字节计数值
;指向下一个地址
;计数值减1,不为零继续
在下划线处填入适当指令。
输入源程序,编译无误后,用单步执行的方法,观察各个相应存储单元和寄存器中内容的变化。
解释 START EQU
30H。
二、 二进制 BCD 码转换源代码:
汇编语言源程序:
RESULT
EQU
ORG
LJMP
START:
30H
00H
START
MOV SP,#40H
A,#123
BINTOBAC
$
MOV
LCALL
SJMP
;堆栈指针指向40H
7
BINTOBAC:
MOV B,#64H
DIV
AB
;除以100得百位数
RESULT,A
A,B
B,#10
AB
RESULT+1,A
RESULT+2,B ;余数为个位数
;余数除以10得十位数
MOV
MOV
MOV
DIV
MOV
MOV
RET
END
在下划线处填入适当指令。
用单步执行的方法,观察子程序调用过程中堆栈指针的变化。
三、 二进制 ASCII 码转换源代码:
汇编语言源程序:
EQU
RESULT
ORG
START:
30H
00H
A,#1AH
MOV
CALL BINTOHEX
LJMP
$
BINTOHEX:
DPTR ,#ASCIITAB
B,A
MOV
MOV
SWAP A
ANL A,#0FH
MOVC A, @A+DPTR
MOV
MOV
ANL
MOVC A,@A+DPTR
MOV
RESULT+1,A
RET
RESULT, A
A,B
A,#0FH
;调用BINTOHEX子程序
;表的首址ASCIITAB送DPTR
;暂存A
;取A的高四位
;查ASCII表
;恢复A
;取低四位
;查ASCII表
ASCIITAB:
DB
END
'0123456789ABCDEF'
;定义数字对应的ASCII表
在下划线处填入适当指令。
单步运行程序观察查表指令的执行过程。
把 LJMP $这条指令注释掉,然后全速运行该程序,然后让其停止观察程序执行到哪里?
实验内容 2
输入、汇编、调试下列四个程序,通过信息窗口观察并回答问题。
8