Keil C51标准C编译器是众多单片机应用开发的优秀软件之一,它集编辑、编译、仿真于一体,支持汇编、PLM语言和C语言的程序设计,界面友好,易学易用。本任务通过P1端口输入、P0端口输出实验为例,简单介绍Keil C51软件的基本使用方法和调试与分析。
1)启动Keil C51软件 双击桌面KeilμVision4快捷图标,弹出图2-1所示的画面。之后,进入μVision4集成开发环境,如图2-2所示。
图2-1 启动Keil时的画面
图2-2 μVision4集成开发环境
2)创建一个新的工程项目 在图2-2所示的界面中,执行菜单命令“Project”→“Close Project”,关闭已打开的项目。执行菜单命令“Project”→“NewμVision Project”,弹出“Create New Project”对话框,在此对话框中选择保存路径,并输入项目名,如图2-3所示。
图2-3 “Create New Project”对话框
输入项目名后,单击“保存”按钮,弹出“Select Device for Target′Target1′...”选择目标芯片对话框。由于KeilμVision4中没有STC单片机型号,但是可以将STC单片机当做Intel公司的8052/87C52/87C54/87C58,或者Atmel公司的AT89C/5152/55/55WD等,或者NXP公司的P87C52/P87C54/P87C58/P87C51RD+就可以了,在图2-4中将其当做Atmel公司的AT89C51RC。
图2-4 “Select Device for Target′Target1′...”对话框
选择目标芯片后,单击“OK”按钮,弹出如图2-5所示的对话框,询问用户是否将标准的8051启动代码复制到项目文件夹并将该文件添加到项目中。在此,单击“否”按钮,项目窗口中将不添加启动代码;单击“是”按钮,项目窗口中将添加启动代码。这二者的区别如图2-6所示。
图2-5 询问是否添加启动代码对话框
图2-6 是否添加启动代码的区别
3)新建C51源程序文件 创建新的项目后,执行菜单命令“File”→“New”,或者在工具栏中单击 图标,将打开一个空的文本编辑窗口。在此窗口输入以下源程序代码:
源程序输入好后,执行菜单命令“File”→“Save”,将弹出保存对话框。在此对话中输入保存的文件名称,保存时后缀名为.c。在项目窗口的“Target1”→“SourceGroup 1”上单击鼠标右键,在弹出的菜单中选择“Add Files to Group‘Source Group 1’...”,然后选择刚才所保存的源程序代码文件,并单击“Add”按钮,即可将其添加到项目中,如图2-7所示。
图2-7 在项目中添加源程序文件
4)编译文件 添加源程序文件后,执行菜单命令“Project”→“Build target”,或者在工具栏中单击 图标,进行源程序的编译。编译完成后,μVision4将会在输出窗口(Output Window)的编译页(Build)中显示相关信息。如果编译的程序有语法错误,双击错误信息,光标将会保留在μVision4文本编辑窗口中出现该错误或警告的源程序位置上。修改好源程序代码后,再次执行菜单命令“Project”→“Build target”,或者在工具栏中单击 图标,对源程序重新进行编译。
5)HEX文件的生成 写入51系列单片机中的文件一般为.HEX文件,要得到.HEX文件,在Keil中需进行相关设置。执行菜单命令“Project”→“Options for Target‘Target 1’”,或者在工具栏中单击 图标,然后在弹出的“Options for Target‘Target1’”对话框中选择“Output”选项卡,选中“Create HEX File”选项即可,如图2-8所示。
设置好后,再次进行编译,如果源程序文件没有语法错误或警告提示,将会在编译输出窗口(BuildOutput)中显示已创建一个以.HEX为后缀名的目标文件,如图2-9所示。
图2-8 选中生成.HEX文件选项
图2-9 提示已生成.HEX目标文件
1)寄存器和存储器窗口分析 执行菜单命令“Debug”→“Start/Stop Debug Session”,或者在工具栏中单击 图标,即可进入调试状态。执行菜单命令“Debug”→“Run”,或者单击 图标,全速运行源程序。
源程序运行过程中,可以通过存储器窗口(MemoryWindow)来查看存储区中的数据。若在调试状态下没有此窗口时,可执行菜单命令“View”→“MemoryWindow”,或者单击 图标将其打开。在存储器窗口的上部,有供用户输入存储器类型的起始地址的文本输入栏,用于设置关注对象所在的存储区域和起始地址,如“D:0x30”。其中,前缀表示存储区域,冒号后为要观察的存储单元的起始地址。常用的存储区前缀有d或D(表示内部RAM的直接寻址区)、i或I(表示内部RAM的间接寻址区)、x或X(表示外部RAM区)、c或C(表示ROM区)。由于P0端口属于SFR(特殊功能寄存器),片内RAM字节地址为80H,所以在存储器窗口的上部输入“D:0x80”时,可查看P0端口的当前运行状态,如图2-10所示。
2)delay()延时函数的调试与分析 在源程序编辑状态下,执行菜单命令“Project”→“Options for Target‘Target 1’”,或者在工具栏中单击 图标,再在弹出的对话框中选择“Target”选项卡,在“Xtal(MHz):”栏中输入12,即设置单片机的晶振频率为12MHz,然后在工具栏中单击 图标,对源程序再次进行编译。
图2-10 存储器窗口
在源程序中,分别在delayms函数的起始与结束行前双击鼠标,即设置了两个断点。执行菜单命令“Debug”→“Start/Stop Debug Session”,或者在工具栏中单击 图标,进入调试状态。刚进入调试状态时,项目工作区(Projectworkspace)“Registers”选项卡的“Sys”项中sec值为0.00039700,如图2-11(a)所示,表示进入调试时花费了0.00039700s。单击 和 图标后,“Sys”项的sec值为0.00186800,如图2-11(b)所示。因此,此函数的延时时间为二者之差,即0.00147100s。
图2-11 项目工作区
3)P0、P1、P3端口运行模拟分析 在工具栏中单击 图标,退出delay()函数的调试状态,重新回到源程序编辑状态,单击 图标全部取消已设置的断点。
执行菜单命令“Debug”→“Start/Stop Debug Session”,或者在工具栏中单击 图标,进入调试状态。
执行菜单命令“Peripherals”→“I/O Ports”→“Port 0”,将弹出Parallel Port 0窗口。依此操作还可以弹出Parallel Port 1和Parallel Port 3窗口。在Parallel Port 1窗口中改变P1.0的状态,可以观察到Parallel Port 0和Parallel Port 3窗口的状态也将发生相应改变。