1.3 编译环境
常用的MCS-51系统单片机的编程语言有两种,汇编语言和C语言。汇编语言执行效率高,不过可读性和可移植性并不强。尤其是复杂一些的系统,使用汇编语言开发,程序通常难以读懂。而由于C语言的简洁及其应用于单片机系统开发时的便利性、可读性和易于移植,因此得到了广泛的应用。C语言还可以嵌入汇编,来编写需要高时效实现的代码。使用C语言还可以有效缩短开发周期。
本书的编程语言也选择了C语言。C编译器选择了“Keil μVision2”。它支持众多不同公司的MCS-51架构的芯片,是一个集编辑、编译和仿真于一体的集成开发环境。界面友好、仿真功能强大。本节将对它做详细的介绍。
1.3.1 “Keil μVision2”主界面介绍
在“Windows”下运行“Keil μVision2”后,程序启动后的界面如图1-9所示。
图1-9 “Keil μVision2”界面
1.菜单栏
“Keil µVision2”的菜单栏共有11个选项,如图1-10所示。
图1-10 菜单栏
● “File”(文件)菜单:类同于许多窗口软件的功能,对文件的一般操作,比如新建、打开、存储、打印等。值得注意的是此菜单中有一个选项“Device Database”,用于维护“μVision2”器件数据库,在此可以增加和修改“8051”芯片资料,便于在建立项目时选择已定的“8051”芯片。
● “Edit”(编辑)菜单:对文档的一般操作,比如剪切、粘贴、查找等。值得注意的是书签选项。“Toggle Bookmark”命令设定一个书签后,用快捷键“F2”或组合键“Shift+F2”就可以在不同书签前后跳转了,方便文档的编辑。选择“Clear All Bookmarks”清除全部已定义的书签。
● “View”(视图)菜单:用于控制“μVision2”的界面显示,使用此菜单的选项可以显示或隐藏一些工具栏和窗口。比如浏览窗口、反汇编窗口、符号变量窗口等。
● “Project”(项目)菜单:对项目的特定操作,比如项目的建立、关闭、维护等。值得注意的是“Options…”命令,改变目标、组或文件的工具选项。此命令用得比较多,在后面的使用中将会谈到。
● “Debug”(调试)菜单:与常见的程序调试菜单很相似,此菜单的命令用于软件仿真环境下的调试,提供了断点、单步、跟踪等操作指令。
● “Flash”(烧写)菜单:用于将程序下载到芯片中,要有针对专门芯片的烧写驱动程序才可以使用此菜单。
● “Peripherals”(外围部件)菜单:外围模块菜单命令,用于控制芯片的复位和片内功能模块的控制。此命令很少使用。
● “Tools”(工具)菜单:主要用于支持第三方调试系统。此命令很少使用。
● “SVCS”(软件版本控制系统)菜单:配置和运行软件版本控制系统。此命令很少使用。
● “Window”(视窗)菜单:用于设置窗口的排列方式。
● “Help”(帮助)菜单:用于软件的帮助信息和版本说明。
2.工具栏
工具栏如图1-11所示,工具栏中包括了常用的操作,下面对一些不同于传统的按钮进行介绍。
图1-11 工具栏
● 此按钮对应菜单命令“Edit→Toggle Bookmark”,用于在光标的当前行创建书签。
● 此按钮对应菜单命令“Edit→Goto Next Bookmark”,移动光标到下一个书签处。
● 此按钮对应菜单命令“Edit→Goto Previous Bookmark”,移动光标到上一个书签处。
● 此按钮对应菜单命令“Edit→Clear All Bookmark”,清除所有定义的书签。
● 此按钮对应菜单命令“Edit→Find in Files”,在项目打开的多个文件中查找。
● 此按钮对应菜单命令“Edit→Find”,在当前窗口的文件中查找。
● 此按钮对应菜单命令“View→Source Browser”,用于显示或隐藏编辑窗口。
● 此按钮对应菜单命令“Debug→Start/Stop Debug Session”,启动或停止调试模式。
● 此按钮对应菜单命令“View→Project Window”,用于显示或隐藏项目窗口。
● 此按钮对应菜单命令“View→Output Window”,用于显示或隐藏输出窗口。
● 此按钮对应菜单命令“Debug→Insert/Remove Break Point”,在光标所在行建立或删除断点。
● 此按钮对应菜单命令“Debug→Kill All Break Point”,清除已建立的断点。
● 此按钮对应菜单命令“Debug→Enable/Disable Break Point”,允许或禁止当前断点。
● 此按钮对应菜单命令“Debug→Disable All Break Point”,禁止所有断点。
3.编译工具栏
编译工具栏如图1-12所示。该工具栏用于应用程序的生成和文件的编译操作。
图1-12 编译工具栏
● 此按钮对应菜单命令“Project→Translate”,编译当前打开的文件。
● 此按钮对应菜单命令“Project→Build Target”,编译项目中修改过的文件并生成应用程序。
● 此按钮对应菜单命令“Project→Rebuild Target”,编译项目中所有的文件并生成应用程序。
● 此按钮对应菜单命令“Project→Stop Target”,停止正在编译的任务。
● 此按钮对应菜单命令“Flash→Download”,把应用程序烧写入芯片,不常使用。
● 此按钮对应菜单命令“Project→Option for Target”,改变目标、组或文件的工具选项。
4.编辑窗口
在编辑窗口中,用户可以输入或修改源代码,这也是编程的工作区间,“Keil μVision2”的编辑器支持程序行自动对齐和语法高亮度显示。
5.状态栏
状态栏位于事件窗口的最下方,如图1-13所示,显示当前命令执行的状况、光标所在的行列位置、数字键盘锁定、插入状态和覆盖状态。
图1-13 状态栏
6.项目窗口
项目窗口有三个选项页,分别是“Files”、“Regs”、“Books”。
● “Files”页如图1-14所示,显示当前项目的组织结构,每个源文件所引用的头文件,双击文件名可以在编辑窗口打开相应的文件。
图1-14 项目窗口的“Files”页
● “Regs”页如图1-15所示,显示单片机在当前状态下各个主要寄存器的值,对刚刚改变完状态的寄存器,会以高亮的形式显示。
图1-15 项目窗口的“Regs”页
● “Books”页如图1-16所示,显示帮助文档,双击可以打开相应的帮助文档。
图1-16 项目窗口的“Books”页
7.输出窗口
输出窗口也有三个选项页,分别是“Build”、“Command”和“Find in Files”。
“Build”页如图1-17 所示,用于显示编译时的输出信息。在窗口中双击输出的“Warning”或“Error”信息,可以直接跳转到相应的有警告或语法错误的语句。
图1-17 输出窗口的“Build”页
“Command”页如图1-18 所示,为用户提供调试命令交互环境,在输入命令前应使“Keil μVision2”为调试模式,其他相关的命令读者可以阅读帮助文档。
图1-18 输出窗口的“Command”页
“Find in Files”页如图1-19所示,显示在多个文件中搜索的结果,双击搜索结果只可以跳转至相应的位置。
图1-19 输出窗口的“Find in Files”页
1.3.2 创建项目
“Keil µVision2”中的项目文件是一个特殊结构的文件,它的扩展名为“Uv2”,包含应用开发系统相关所有文件的组织关系。一个项目怎样建立,将在后面章节里(第3章最小系统的建立)进行详细介绍。
1.3.3 编译与连接
项目建立好后,就可以对项目中的文件进行编译创建目标文件。方法很简单,单击按钮,编译当前打开的单个文件;单击按钮,编译项目中修改过的文件;单击按钮,编译项目中所有的文件。编译完成后会在项目的当前位置生成一个“Output”的文件夹,并把相应的目标文件(obj)和连接生成的十六进制文件(.hex)放在此文件中。
在进行编译和连接前,需要根据开发的硬件环境在“Keil μVision2”中进行配置,当然一些配置在创建项目时就设置好了,此时也可以调整。执行菜单命令“Project→Options for Target”,就会打开“Options for Target”对话框,如图1-20所示。其中有多个选项页,“Device”、“Target”、“Output”、“C51”这4个选项页最为常用,下面分别对其进行详细介绍。其他的选项页不经常使用,读者可以参见“Keil μVision2”提供的文档进行学习。
图1-20 “Device”选项页
1.“Device”选项页
“Device”选项页如图1-20所示。主要是修改目标使用的单片机型号。比如本书的项目就是选择了华邦的芯片。一般大厂家的51芯片这里都有提供,如果没有,可以在“File→Device Database”中维护“μVision2”器件数据库,以增加51芯片资料。
2.“Target”选项页
“Target”选项页如图1-21所示。主要用于设置51芯片的存储器环境。
图1-21 “Target”选项页
各个选项的功能如下。
● “Xtal”:该选项用于设定单片机振荡频率,多数情况下,它的值和晶振频率相同。
● “Use On-chip ROM”:选中该选项,使用片内ROM。
● “Use On-chip XRAM”:选中该选项,使用片内RAM。此选项会针对不同的芯片有所不同,有的芯片没有扩展的RAM,就没有此项,因为项目的芯片“W78E516B”具有片内辅助RAM,所以有此选项。
● “Memory Model”:指定C51编译器的存储模式。默认“SMALL”是很好的选择。
● “Code Rom Size”:片内程序存储器的大小。
● “Operatiing”:选择是否需要RX51操作系统环境。该项目使用另外的一种操作系统在后面会讲到。
● “Off-chip Code memory”:根据系统硬件的连接情况设置片外ROM的起始地址和大小。最多可以设置3段不连续的外部程序存储空间。
● “Off-chip Xdata memory”:根据系统硬件的连接情况设置片外RAM的起始地址和大小。最多可以设置3段不连续的外部数据存储空间。
● “Code Banking”:代码分体设置。很少使用,可以参见相关技术文档。
这里将C51编译器的存储模式“Memory Model”设置为“SMALL”模式,存储类型为“data”。这也是编译器的默认设置。编译器的存储模式有“SMALL”、“COMPACT”、“LARGE”三种。对于存储类型,也可选择“data”、“bdata”、“idata”、“pdata”、“xdata”或“code”。具体如表1-9和表1-10所示。一般选择默认设置即可。
表1-9 存储模式
表1-10 存储类型
3.“Output”选项页
“Output”选项页如图1-22所示。定义工具链的输出文件。各个主要选项的功能如下。
图1-22 “Output”选项页
● “Select Folder for Objects”:设定编译生成的文件的输出路径。
● “Name of Executable”:设定编译生成的文件的名字。
● “Create Executable”:选中该选项后,生成编程器生成HEX格式的文件。这就是16进制文件了,用烧写器给芯片写入的程序就是这个文件。
● “Run User Program”:生成“HEX”格式的文件后,调用外部的程序,可以调用两个程序。比如调用专用的烧写程序来写芯片。
4.C51选项页
如图1-23所示。用来设置C51编译器专用的工具选项,使用这些选项可以改进代码的质量。各个主要选项的功能如下。
图1-23 C51选项页
● “Define”:相当于在项目文件中输入“#define XXX”。
● “Undefine”:仅在“Group”和“File Option”对话框中有效,用于消除项目或组中设定的“#define XXX”。
● “Code Optimization Level”:设定C51的优化程度,一般情况下保持默认值即可。
● “Code Optimization Emphasis”:代码优化的侧重方向。选择“Favor size”,优化注重代码的大小;“Favor speed”:优化注重代码的执行速度。
● “Global Register Coloring”:全局寄存器优化变量。
● “Don't use absolute register accesses”:禁止绝对寄存器(R0~R7)寻址,这将增加代码的长度,但可以使代码与选择的寄存器无关。
● “Warnings”:用于设定C51的警告等级。
● “Bits to round float”:设定浮点数比较前保留的位数。
● “Interrupt vectors at address”:中断向量的基地址。
● “Keep variables in order”:让编译器按照源程序声明变量的先后次序来分配内存。
● “Enable ANSI integer promotion rules”:允许“ANSI”整数扩展。
● “Include Paths”:包含文件的路径。
● “Misc Controls”:允许输入特殊的C51指示符。
● “Compiler control string”用于显示C51编译器限制字符串。
1.3.4 程序调试
整个项目完成后,就可以进行调试工作。、、选择其中一个按钮,完成对文件或整个项目文件的编译,单击按钮,进入程序调试状态,如图1-24所示。在调试模式里,可以设置断点,单步执行,观察变量等操作。
图1-24 程序调试窗口