基于Proteus的51系列单片机设计与仿真(第4版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1 Keil C51的使用

单片机的源程序是在哪里进行编写的?又是在哪里将其调试并生成.HEX文件的?其实这些工作在单片机的一些编译软件中就可以完成。单片机程序的编译调试软件比较多,如51汇编集成开发环境、伟福仿真软件、Keil单片机开发系统等。

Keil C51是当前使用最广泛的基于80C51单片机内核的软件开发平台之一,它是由德国Keil Software公司推出的。μVision5是Keil Software公司推出的关于51系列单片机的开发工具。μVision5集成开发环境IDE是一个基于Windows的软件开发平台,集编辑、编译、仿真于一体,支持汇编语言和 C 语言的程序设计。一般来说,Keil C51 和 μVision5 均是指μVision5集成开发环境。

可以从相关网站下载Keil C51并安装。安装完成后,双击桌面上的快捷图标,或者在“开始” 菜单中选择 “Keil μVision5”,即可启动μVision5集成开发环境,如图1-1所示。

图1-1 启动μVision5集成开发环境

1.1.1 创建项目

Keil μVision5中有一个项目管理器,它包含了程序的环境变量、和编辑有关的全部信息,为单片机程序的管理带来了很大的方便。

说明

创建新项目的操作步骤

(1) 启动μVision5,创建一个项目文件,并从元器件数据库中选择一款合适的CPU。

(2) 创建一个新的源程序文件,并把这个源程序文件添加到项目中。

(3) 设置工具选项,使之适合目标硬件。

(4) 编译项目,并生成一个可供PROM编程的.HEX文件。

1.启动μVision5并创建一个项目文件

μVision5是一个标准的Windows应用程序,直接在桌面上双击图标就可启动它。在μVision5中执行菜单命令 “Project” → “New Project”,弹出 “Create New Project” 对话框,在此可以输入项目名称。建议为每个项目创建一个独立的文件夹。

输入新建项目名称后,单击 “确定” 按钮,弹出如图1-2 所示的 “Select Device for Target'Target 1'” 对话框。在此对话框中,根据需要选择合适的单片机型号。执行菜单命令“P roject”→ “Select Device for Target” 也会弹出图1-2所示的对话框。

图1-2 “Select Device for Target'Target 1'” 对话框

在图1-2中,左侧的下拉栏中列出了各厂商名及其产品,右侧 “Description” 栏中则是对选中单片机的说明。如果知道单片机芯片的具体型号,也可在左侧的 “Search” 中直接输入其型号,如 “AT89C51”,即可选择该单片机型号为目标器件。选择了目标器件后,单击“OK” 按钮,将弹出如图1-3所示的对话框,询问用户是否将标准的8051启动代码复制到项目文件夹并将该文件添加到项目中。在此单击 “否” 按钮,项目窗口中将不添加启动代码;如果单击 “是” 按钮,项目窗口中将添加启动代码。二者的区别如图1-4所示。

图1-3 询问是否添加启动代码对话框

图1-4 是否添加启动代码的区别

STARTUP.A51文件是大部分8051CPU及其派生产品的启动程序,其中的操作包括清除数据存储器内容、初始化硬件及可重入堆栈指针。一些8051派生的CPU需要初始化代码以使配置符合硬件上的设计要求。例如,NXP 的8x51RD+片内Xdata RAM需要通过在启动程序中的设置才能使用。应按照目标器件的要求来创建相应的STARTUP.A51文件,或者直接将它从安装路径的\C51\LIB文件夹中复制到项目文件中,并根据需要进行更改。

2.创建新的源程序文件

单击 “New” 图标或执行菜单命令 “File” → “NEW”,即可创建一个源程序文件。该命令会打开一个空的编辑器窗口,在此可以输入源代码,如图1-5所示。源代码可以用汇编语言或单片机C语言进行编写。源代码输入完成后,执行菜单命令 “File” → “Save as…” 或“Save”,即可对源程序进行保存。在保存时,源程序文件名只能由字符、字母或数字组成,并且一定要带扩展名 (使用汇编语言编写的源程序文件的扩展名为.A51或.ASM,使用单片机C语言编写的源程序文件的扩展名为.C)。源程序文件保存好后,源程序窗口中的关键字呈彩色高亮显示。

源程序文件创建好后,可以把这个文件添加到项目中。在μVision5中,添加的方法有多种。如图1-6所示,在 “Source Group 1” 上单击鼠标右键,在弹出的菜单中选择 “Add Existing Files to Group'Source Group 1'”,然后在弹出的 “Add Files to Group'Source Group 1'”对话框中选择刚才创建的源程序文件即可将其添加到项目中。

3.为目标设定工具选项

单击图标或执行菜单命令 “P roject” → “Options for Target'Target 1'”,将会出现“Options for Target'Target 1'” 对话框,如图1-7所示。在此对话框的 “Target” 选项卡中可以对目标器件及所选器件片内部件进行参数设定。表1-1描述了 “Target” 选项卡的选项说明。

标准的80C51 的程序存储器空间为 64KB,当程序存储器空间超过 64KB 时,可在“Target” 选项卡中对 “Code Banking” 栏进行设置。Code Banking为地址复用,可以扩展现有的CPU程序存储器寻址空间。选中 “Code Banking” 栏后,用户根据需求在 “Banks” 中选择合适的块数。在Keil C51中,用户最多能使用32块64KB的程序存储空间,即2MB的空间。

图1-5 源程序编辑窗口

图1-6 在项目中添加源程序文件

图1-7 “Options for Target'Target 1'” 对话框 (“Target” 选项卡)

表1-1 “Target” 选项卡的选项说明

4.编译项目并创建HEX文件

在 “Target” 选项卡中设置好参数后,即可对源程序进行编译。单击图标或执行菜单命令 “Project” → “Build Target”,可以编译源程序并生成应用程序。当所编译的源程序有语法错误时,μVision5将会在 “Build Output” 窗口中显示错误和警告信息,如图1-8所示。双击某一条信息,光标将停留在μVision5文本编辑窗口中出现该错误或警告的源程序位置上。

图1-8 错误和警告信息

若成功创建并编译了应用程序,就可以开始调试。程序调试好后,要求创建一个HEX文件,生成的.HEX文件可以下载到EPROM编程器或模拟器中。

若要创建HEX文件,必须将 “Options for Target'Target 1'” 对话框 “Output” 选项卡中的 “Create HEX File” 选项选中,如图1-9所示。

图1-9 选中 “Create HEX File” 选项

1.1.2 仿真设置

使用μVision5调试器可对源程序进行仿真测试,μVision5提供了两种仿真模式,这两种模式可以在 “Option for Target'Target 1'” 对话框的 “Debug” 选项卡中选择,如图1-10所示。

图1-10 仿真设置

☺Use Simulator:软件仿真模式,将μVision5仿真器配置成纯软件产品,能够仿真8051系列产品的绝大多数功能而不需要任何硬件目标板,如串行口、外部I/O和定时器等,这些外围部件设置是在从元器件数据库选择CPU时选定的。

☺Use:硬件仿真模式,如TKS Debugger,用户可以直接把这个环境与仿真程序或Keil监控程序相连。

1.CPU仿真

μVision5仿真器可以模拟16MB的存储器,该存储器被映射为读、写或代码执行访问区域。除了映射存储器,仿真器还支持各种80C51派生产品的集成外围器件。在 “Debug” 选项卡中,可以选择和显示片内外围部件,也可以通过设置其内容来改变各种外设的值。

2.启动调试

源程序编译好后,选择相应的仿真模式,即可进行源程序的调试。单击图标或执行菜单命令 “Debug” → “Star/Stop Debug Session”,即可启动 μVision5 的调试模式,如图1-11所示。

图1-11 μVision5的调试模式

3.断点的设定

在编辑源程序的过程中,或者在源程序尚未编译时,用户可以设置执行断点。在μVision5中,可用下述方法来定义断点。

☺在文本编辑窗口或反汇编窗口中选定所在行,然后单击 “File Toolbar” 按钮或图标

☺在文本编辑窗口或反汇编窗口单击鼠标右键,弹出快捷菜单,进行断点设置。

☺执行菜单命令 “Debug” → “Breakpoint”,打开 “Breakpoint” 对话框,在此对话框中可以查看、定义或更改断点的设置。

☺在 “Command” 窗口中可以使用 BreakSet、BreakKill、BreakList、BreakEnable 和BreakDisable等命令。

4.目标程序的执行

可以利用下述方法执行目标程序。

☺执行菜单命令 “Debug” → “Run”,或者直接单击图标执行菜单命令 “Debug” → “Run”,或者直接单击图标☺在文本编辑窗口或反汇编窗口单击鼠标右键,在弹出的快捷菜单上选择 “Run till Cursor line” 命令。

☺在 “Command” 窗口中可以使用Go、Ostep、Pstep、Tsetp命令。

1.1.3 Keil程序调试与分析

前面讲述了如何在Keil中建立、编译、连接项目,并获得目标代码,但是做到这一步仅代表源程序没有语法错误,而源程序中存在的其他错误,必须通过调试才能发现并解决。事实上,除了极简单的源程序外,绝大多数的源程序都要经过反复调试才能得到正确的结果,因此,调试是软件开发中的一个重要环节。

1.寄存器和存储器窗口分析

进入调试状态后,执行菜单命令 “Debug” → “Run”,或者单击图标,全速运行源程序;执行菜单命令 “Debug” → “Step”,或者单击图标,单步运行源程序。在源程序运行过程中,项目工作区 (Project Workspace) 的 “Registers” 选项卡中将显示相关寄存器当前的内容。若在调试状态下未显示此窗口,可执行菜单命令 “View” → “Project Window” 将其打开。

在源程序运行过程中,可以通过存储器窗口 (Memory Window) 来查看存储区中的数据。在存储器窗口的上部,有供用户输入存储器类型的起始地址的 “Address” 栏,用于设置关注对象所在的存储区域和起始地址,如 “D:0x30”。其中,前缀表示存储区域,冒号后为要观察的存储单元的起始地址。常用的存储区前缀有 “d” 或 “D” (表示内部RAM的直接寻址区)、“i” 或 “I” (表示内部RAM的间接寻址区)、“x” 或 “X” (表示外部RAM区)、“c” 或 “C” (表示ROM区)。由于P0端口属于特殊功能寄存器 (SFR),片内RAM字节地址为80H,所以在存储器窗口的 “Address” 栏中输入 “d:80h” 时,可以看到P0端口的当前运行状态为FE,如图1-12所示。

图1-12 存储器窗口

2.延时子程序的调试与分析

在源程序编辑状态下,执行菜单命令 “Project” → “Options for Target'Target 1'”,或者在工具栏中单击图标,在弹出的对话框中选择 “Target” 选项卡,在 “Xtal(MHz)” 栏中输入12,即设置单片机的晶振频率为12MHz。然后在工具栏中单击图标,再次对源程序进行编译。

执行菜单命令 “Debug” → “Start/Stop Debug Session”,或者在工具栏中单击图标,进入调试状态。在调试状态下,单击图标,使光标首次指向 “LCALL DELAY” 所在行后,项目工作区 “Registers” 选项卡中 “Sys” 项的sec值为0.00000400,表示进入首次运行到 “LCALL DELAY” 所在行时花费了0.00000400s,如图1-13所示。

图1-13 光标首次指向 “LCALL DELAY” 所在行

再次单击图标,光标指向 “RL A” 所在行,“Sys” 项的sec 值为0.79846900,如图1-14所示。因此,DELAY的延时时间为二者之差,即0.79846500s,也就是说延时约为0.8s。

3.P0端口运行模拟分析

执行菜单命令 “Debug” → “Start/Stop Debug Session”,或者在工具栏中单击图标,进入调试状态。

执行菜单命令 “P eripherals” → “I/O P orts” → “P ort 0”,弹出 “P arallel P ort 0” 窗口。“Parallel Port 0” 窗口的初始状态如图1-15 (a) 所示,表示P0端口的初始值为0xFF,即FFH。单击图标或多次单击图标后,“P arallel P ort 0” 窗口的状态将会发生变化,如图1-15 (b) 所示,表示P0端口当前为0xFB,即FBH。

图1-14 光标首次指向 “RL A”

图1-15 P0端口状态