1.1 Keil C51的使用
单片机的源程序是在哪里进行编写的?是在哪里将其调试并生成.HEX文件的?其实这些工作在单片机的一些编译软件中就可以完成。单片机程序的编译调试软件比较多,如51汇编集成开发环境、伟福仿真软件、Keil单片机开发系统等。
Keil C51是当前使用最广泛的基于80C51单片机内核的软件开发平台之一,由德国Keil Software公司推出。μVision4是Keil Software公司推出的关于51系列单片机的开发工具。μVision4集成开发环境IDE是一个基于Windows的软件开发平台,集编辑、编译、仿真于一体,支持汇编语言和C语言的程序设计。一般来说,Keil 51和μVision4指的是μVision4集成开发环境。
Keil C51可以从相关网站下载并安装。安装好后,双击桌面上的快捷图标,或者在“开始”菜单中选择“Keil μVision4”,即可启动Keil μVision4集成开发环境,如图1-1所示。
图1-1 启动Keil μVision4后画面
1. 创建项目
Keil μVision4中有一个项目管理器,它包含了程序的环境变量和编辑有关的全部信息,为单片机程序的管理带来了很大的方便。
〖创建新项目的操作步骤〗
(1)启动μVision4,创建一个项目文件,并从元器件数据库中选择一款合适的CPU。
(2)创建一个新的源程序文件,并把这个源程序文件添加到项目中。
(3)设置工具选项,使之适合目标硬件。
(4)编译项目,并生成一个可供PROM编程的.HEX文件。
1)启动μVision4并创建一个项目文件 μVision4是一个标准的Windows应用程序,直接在桌面上双击图标就可启动它。在μVision4中执行菜单命令“Project”→“New Project”,弹出“Create New Project”对话框,在此可以输入项目名称。建议每个项目使用一个独立的文件夹。
输入新建项目名后,单击“确定”按钮,弹出如图1-2所示的“Select Device for Target 'Target 1'”对话框。在此对话框中根据需要选择合适的单片机型号。执行菜单命令“Project”→“Select Device for Target”也会弹出图1-2所示的对话框。
图1-2 “Select Device for Target 'Target 1'”对话框
在图1-2中,左边“Data base”栏列出了各厂商名及其产品,右边“Description”栏是对该选中单片机的说明。选择了目标器件后,单击“OK”按钮,将弹出图1-3所示的对话框。在此对话框中,询问用户是否将标准的8051启动代码复制到项目文件夹并将该文件添加到项目中。在此单击“否”按钮,项目窗口中将不添加启动代码;单击“是”按钮,项目窗口中将添加启动代码。二者的区别如图1-4所示。
startup.a51文件是大部分8051CPU及其派生产品的启动程序,启动程序的操作包括清除数据存储器内容、初始化硬件及可重入堆栈指针。一些8051派生的CPU需要初始化代码以使配置符合硬件上的设计。例如,Philips的8051RD+片内xdata RAM需通过在启动程序中的设置才能使用。应按照目标硬件的要求来创建相应的startup.a51文件,或者直接将它从安装路径的\C51\LIB文件夹中复制到项目文件中,并根据需要进行更改。
图1-3 询问是否添加启动代码对话框
图1-4 是否添加启动代码的区别
2)创建新的源程序文件 单击图标或执行菜单命令“File”→“NEW”,就可以创建一个源程序文件。该命令会打开一个空的编辑器窗口,在编辑窗口中输入源代码,如图1-5所示。源代码可以用汇编语言或单片机C语言进行书写,源代码输入完成后,执行菜单命令“File”→“Save as…”或“Save”,即可对源程序进行保存。在保存时,文件名只能由字符、字母或数字组成,并且一定要带扩展名(使用汇编语言编写的源程序的扩展名为.A51或.ASM;使用单片机C语言编写的源程序的扩展名为.C)。源程序保存好后,源程序窗口中的关键字呈彩色高亮度显示。
图1-5 源程序编辑窗口
源程序文件创建好后,可以把这个文件添加到项目中。在μVision4中,添加的方法有多种。如图1-6所示,在“Source Group 1”上单击鼠标右键,在弹出的菜单中选择“Add Files to Group 'Source Group 1'”,在弹出的“Add Files to Group 'Source Group 1'”对话框中选择刚才创建的源程序文件即可将其添加到项目中。
图1-6 在项目中添加源程序文件
3)为目标设定工具选项 单击图标或执行菜单命令“Project”→“Options for Target”,将会出现“Options for Target 'Target 1'”对话框,如图1-7所示。在“Target”选项卡中可以对目标硬件及所选器件片内部件进行参数设定。表1-1描述了“Target”选项卡的选项说明。
表1-1 “Target”选项卡的选项说明
标准的80C51的程序存储器空间为64KB,若程序存储器空间超过64KB时,可在“Target”选项卡中对“Code Banking”栏进行设置。Code Banking为地址复用,可以扩展现有的CPU程序存储器寻址空间。复选“Code Banking”栏后,用户根据需求在“Banks”中选择合适的块数。在Keil C51中,用户最多能使用32块64KB的程序存储空间,即2MB的空间。
4)编译项目并创建HEX文件 在“Target”选项卡中设置好参数后,就可对源程序进行编译。单击图标或执行菜单命令“Project”→“Build Target”,可以编译源程序并生成应用。当所编译的程序有语法错误时,μVision4将会在“Build Output”窗口中显示错误和警告信息,如图1-8所示。双击某一条信息,光标将会停留在μVision4文本编辑窗口中出现该错误或警告的源程序位置上。
图1-7 “Options for Target 'Target 1'”对话框
图1-8 错误和警告信息
若成功创建并编译了应用程序,就可以开始调试。当程序调试好后,要求创建一个HEX文件,生成的.HEX文件可以下载到EPROM编程器或模拟器中。
若要创建HEX文件,必须将“Options for Target 'Target 1'”对话框中的“Output”选项卡下的“Create HEX File”复选框选中,如图1-9所示。
图1-9 选中“Create HEX File”
2. 仿真设置及窗口介绍
1)仿真设置 使用μVision4调试器可对源程序进行测试,μVision4提供了两种操作工作模式,这两种模式可以在“Option for Target 'Target 1'”对话框的“Debug”选项卡中选择,如图1-10所示。
图1-10 仿真设置
➢ Use Simulator:软件仿真模式,将μVision4调试器配置成纯软件产品,能够仿真8051系列产品的绝大多数功能而不需要任何硬件目标板,如串行口、外部I/O和定时器等,这些外围部件设置是在从元器件数据库选择CPU时选定的。
➢ Use:硬件仿真,如TKS Debugger,用户可以直接把这个环境与仿真程序或Keil监控程序相连。
(1)CPU仿真:μVision4仿真器可以模拟16MB的存储器,该存储器被映射为读、写或代码执行访问区域。除了将存储器映射外,仿真器还支持各种80C51派生产品的集成外围器件。在“Debug”选项卡中可以选择和显示片内外围部件,也可通过设置其内容来改变各种外设的值。
(2)启动调试:源程序编译好后,选择相应的仿真操作模式,可启动源程序的调试。单击图标或执行菜单命令“Debug”→“Star/Stop Debug Session”,即可启动μVision4的调试模式,如图1-11所示。
(3)断点的设定:在编辑源程序过程中,或者在程序尚未编译前,用户可以设置执行断点。μVision4中可用不同的方法来定义断点。
图1-11 调试界面
➢ 在文本编辑框中或反汇编窗口中选定所在行,然后单击“File Toolbar”按钮或单击图标。
➢ 在文本编辑窗口或反汇编窗口本地菜单上单击鼠标右键,打开快捷菜单进行断点设置。
➢ 执行菜单命令“Debug”→“Breakpoint”,打开“Breakpoint”对话框,在这个对话框中可以查看定义或更改断点的设置。
➢ 在“Command”窗口中可以使用BreakSet、BreakKill、BreakList、BreakEnable和BreakDisable等命令。
(4)目标程序的执行:目标程序的执行可使用以下方法操作:
➢ 执行菜单命令“Debug”→“Run”,或者直接单击图标。
➢ 在文本编辑窗口或反汇编窗口单击鼠标右键,在弹出的快捷菜单上选择“Run till Cursor line”命令。
➢ 在“Command”窗口中可以使用Go、Ostep、Pstep、Tsetp命令。
2)主要窗口介绍 在μVision4中有许多的工作窗口,这些窗口有些是在编译状态下有效,有些是在调试状态下有效,但多数窗口只在调试状态下有效。表1-2列出了μVision4中的主要工作窗口。
表1-2 1Vision4中的主要工作窗口
(1)反汇编窗口:在进行程序调试及分析时,经常会用到反汇编。反汇编窗口同时显示目标程序、编译的汇编程序和二进制文件,如图1-12所示。
在程序调试状态下,执行菜单命令“View”→“Disassembly Window”,即可打开反汇编窗口。当反汇编窗口作为当前活动窗口时,若单步执行指令,所有的程序将按照CPU指令(即汇编)来单步执行,而不是C语言的单步执行。
(2)CPU寄存器窗口:在程序调试状态下,执行菜单命令“View”→“Registers Window”,将打开CPU寄存器窗口,在此窗口中将显示CPU寄存器相关内容,如图1-13所示。
(3)存储器窗口:在程序调试状态下,执行菜单命令“View”→“Memory Window”→“Memory #1”,将打开存储器窗口。存储器窗口最多可以通过4个不同的页观察4个不同的存储区,每页都能显示存储器中的内容,如图1-14所示。
图1-12 反汇编窗口
图1-13 CPU寄存器窗口
图1-14 存储器窗口
在“Address”栏中输入地址值后,显示区域直接该地址的内容。若要更改地址中的内容,只需在该地址上双击鼠标左键,并输入新的内容即可。
(4)串行窗口:μVision4提供了4个专门用于串行调试输入和输出的窗口,被模拟仿真的CPU串行口数据输出将在该窗口进行显示,输入串行窗口中的字符将会被输入到模拟的CPU中。
在程序调试状态下,执行菜单命令“View”→“Serial Window”→“UART #1”,即可打开串行调试窗口。
3.Keil程序调试与分析
前面讲述了如何在Keil中建立、编译、连接项目,并获得目标代码,但是做到这一步仅代表源程序没有语法错误,至于源程序中存在的其他错误,必须通过调试才能发现并解决。事实上,除了极简单的程序外,绝大多数的程序都要通过反复调试才能得到正确的结果,因此,调试是软件开发中的一个重要环节。
1)寄存器和存储器窗口分析 进入调试状态后,执行菜单命令“Debug”→“Run”,或者单击图标,全部运行源程序。执行菜单命令“Debug”→“Step”,或者单击图标,单步运行源程序。源程序运行过程中,项目工作区(Project Workspace)“Registers”选项卡中显示相关寄存器当前的内容。若在调试状态下未显示此窗口,可执行菜单命令“View”→“Project Window”将其打开。
在源程序运行过程中,可以通过存储器窗口(Memory Window)来查看存储区中的数据。在存储器窗口的上部,有供用户输入存储器类型的起始地址的文本输入栏,用于设置关注对象所在的存储区域和起始地址,如“D:0x30”。其中,前缀表示存储区域,冒号后为要观察的存储单元的起始地址。常用的存储区前缀有“d”或“D”(表示内部RAM的直接寻址区)、“i”或“I”(表示内部RAM的间接寻址区)、“x”或“X”(表示外部RAM区)、“c”或“C”(表示ROM区)。由于P0端口属于SFR(特殊功能寄存器),片内RAM字节地址为80H,所以在存储器窗口的上部输入“d:80h”时,可查看P0端口的当前运行状态为FE,如图1-15所示。
2)延时子程序的调试与分析 在源程序编辑状态下,执行菜单命令“Project”→“Options for Target 'Target 1'”,或者在工具栏中单击图标,再在弹出的对话框中选择“Target”选项卡。在“Target”选项卡的“Xtal(MHz):”栏中输入12,即设置单片机的晶振频率为12MHz。然后在工具栏中单击图标,对源程序再次进行编译。
执行菜单命令“Debug”→“Start/Stop Debug Session”,或者在工具栏中单击图标,进入调试状态。在调试状态下,单击图标,使光标首次指向LCALL DELAY后,项目工作区“Registers”选项卡的Sys项中sec为0.00000400,如图1-16所示,表示进入首次运行到LCALL DELAY时花费了0.00000400s。再次单击图标,光标指向“RL A”,Sys项的sec为0.79846900,如图1-17所示。因此,DELAY的延时时间为二者之差,即0.79846500s,也就是说延时约为0.8s。
图1-15 存储器窗口
图1-16 光标首次指向LCALL DELAY
图1-17 光标首次指向“RL A”
3)P0端口运行模拟分析 执行菜单命令“Debug”→“Start/Stop Debug Session”,或者在工具栏中单击图标,进入调试状态。
执行菜单命令“Peripherals”→“I/O Ports”→“Port 0”,将弹出“Parallel Port 0”窗口。“Parallel Port 0”窗口的最初状态如图1-18(a)所示,表示P0端口的初始值为0xFF,即FFH。单击图标或多次单击图标后,“Parallel Port 0”窗口的状态将会发生变化,如图1-18(b)所示,表示P0端口当前为0xFB,即FBH。
图1-18 P0端口状态