Ke实例教程(一) Keil工程文件的建立、设置与目标文件的获得 单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为CPU 可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工 编的方法了。机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编 软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级 语言开发,单片机的开发软件也在不断发展,Kei软件是目前最流行开发MCS-51系列单片 机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Ke即可看出。Kel提供了包括C 编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通 过一个集成开发环境( uVision)将这些部份组合在一起。运行Kei软件需要 Pentium或以 上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、wIN98、NT、WIN2000、 WINXP 等操作系统。掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如 果你使用C语言编程,那么Kei几乎就是你的不二之选(目前在国内你只能买到该软件、 而你买的仿真机也很可能只支持该软件),即使不使用C语言而仅用汇编语言编程,其方便 易用的集成环境、强大的软件仿真调试工具也会令你事半功倍 我们将通过一些实例来学习Kei软件的使用,在这一部份我们将学习如何输入源程序 建立工程、对工程进行详细的设置,以及如何将源程序变为目标代码。图1所示电路图使用 89C51单片机作为主芯片,这种单片机性属于MCS-51系列,其内部有4K的 FLASH ROM, 可以反复擦写,非常适于做实验。89C51的P1引脚上接8个发光二极管,P3.2~P34引脚上 接4个按钮开关,我们的第一个任务是让接在P1引脚上的发光二极管依次循环点亮 Kel工程的建立 首先启动Kei软件的集成开发环境,这里假设读者已正确安装了该软件,可以从桌面 上直接双击 uVision的图标以启动该软件。 AVison启动后,程序窗口的左边有一个工程管理窗口,该窗口有3个标签,分别是 Files、 Regs、和 Books,这三个标签页分别显示当前项目的文件结构、CPU的寄存器及部份特殊 功能寄存器的值(调试时才出现)和所选CPU的附加说明文件,如果是第一次启动Kei, 那么这三个标签页全是空的。 C51 1、源文件的建立 使用菜单“FNew”或者点击工具栏的新建文件按 钮,即可在项目窗口的右侧打开一个新的文本编缉窗口, 在该窗口中输入以下汇编语言源程序,例1: MOV A, #OFEH MAIN: MOV P1, A RL LCALL DELAY AJMP MAIN DELAY: MOV 7#255 MOVR6,#255 DJNZ R6.$ 图1简单的键盘、显示板
Keil 实例教程(一) Keil 工程文件的建立、设置与目标文件的获得 单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为 CPU 可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工 汇编的方法了。机器汇编是通过汇编软件将源程序变为机器码,用于 MCS-51 单片机的汇编 软件有早期的 A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级 语言开发,单片机的开发软件也在不断发展,Keil 软件是目前最流行开发 MCS-51 系列单片 机的软件,这从近年来各仿真机厂商纷纷宣布全面支持 Keil 即可看出。Keil 提供了包括 C 编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通 过一个集成开发环境(uVision)将这些部份组合在一起。运行 Keil 软件需要 Pentium 或以 上的 CPU,16MB或更多 RAM、20M 以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP 等操作系统。掌握这一软件的使用对于使用 51 系列单片机的爱好者来说是十分必要的,如 果你使用 C 语言编程,那么 Keil 几乎就是你的不二之选(目前在国内你只能买到该软件、 而你买的仿真机也很可能只支持该软件),即使不使用 C 语言而仅用汇编语言编程,其方便 易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。 我们将通过一些实例来学习 Keil 软件的使用,在这一部份我们将学习如何输入源程序, 建立工程、对工程进行详细的设置,以及如何将源程序变为目标代码。图 1 所示电路图使用 89C51 单片机作为主芯片,这种单片机性属于 MCS-51 系列,其内部有 4K 的 FLASH ROM, 可以反复擦写,非常适于做实验。89C51 的 P1 引脚上接 8 个发光二极管,P3.2~P3.4 引脚上 接 4 个按钮开关,我们的第一个任务是让接在 P1 引脚上的发光二极管依次循环点亮。 一、Keil 工程的建立 首先启动 Keil 软件的集成开发环境,这里假设读者已正确安装了该软件,可以从桌面 上直接双击 uVision 的图标以启动该软件。 UVison启动后,程序窗口的左边有一个工程管理窗口,该窗口有3个标签,分别是Files、 Regs、和 Books,这三个标签页分别显示当前项目的文件结构、CPU 的寄存器及部份特殊 功能寄存器的值(调试时才出现)和所选 CPU 的附加说明文件,如果是第一次启动 Keil, 那么这三个标签页全是空的。 1、源文件的建立 使用菜单“File->New”或者点击工具栏的新建文件按 钮,即可在项目窗口的右侧打开一个新的文本编缉窗口, 在该窗口中输入以下汇编语言源程序,例 1: MOV A,#0FEH MAIN: MOV P1,A RL A LCALL DELAY AJMP MAIN DELAY: MOV R7,#255 D1: MOV R6,#255 DJNZ R6,$ 图 1 简单的键盘、显示板
Ke实例教程(一) DJNZ R7DI RET END 保存该文件,注意必须加上扩展名(汇编语言源程序一般用asm或a5l为扩展名),这 里假定将文件保存为 examl asm。 需要说明的是,源文件就是一般的文本文件,不一定使用Kel软件编写,可以使用任意 文本编缉器编写,而且,Keil的编缉器对汉字的支持不好,建议使用 UltraEdit之类的编缉 软件进行源程序的输入 、建立工程文件 在项目开发中,并不是仅有一个源程序就行了,还要为这个项目选择CPU(Ke支持数 百种CPU,而这些CPU的特性并不完全相同),确定编译、汇编、连接的参数,指定调试 的方式,有一些项目还会有多个文件组成等,为管理和使用方便,Keil使用工程( Project 这一概念,将这些参数设置和所需的所有文件都加在一个工程中,只能对工程而不能对单 的源程序进行编译(汇编)和连接等操作,下面我们就一步一步地来建立工程。 点击“ Project> New Project.”菜单,出现一个对话框,要求给将要建立的工程起一个 名字,你可以在编缉框中输入一个名字 Select Device for Target"Tuet (设为exam1),不需要扩展名。点击“保 存”按钮,出现第二个对话框,如图2 所示这个对话框要求选择目标CPU即 Vendor:ktmn 你所用芯片的型号),Kei支持的CPU Device 89C51 Family: MCS-51 很多,我们选择 Atmel公司的89C51芯 bi 片。点击 ATMEL前面的“+”号,展开 Description 该层,点击其中的89C51,然后再点击 日Atme1 口87F51 C87F51RC 4 K Flash Memor 确定”按钮,回到主界面,此时,在 工程窗口的文件页中,出现了“ Target 8TF52 ,前面有“+”号,点击“+”号展开, 89c1051 可以看到下一层的“ Source Groupl”,这 89c4051 时的工程还是一个空的工程,里面什么 文件也没有,需要手动把刚才编写好的 只rc2 图2选择目标CPU 源程序加入,点击“ Source Groupl”使 其反白显示,然后,点击鼠标右键,出现一个下 拉菜单,如图3所示。选中其中的“ Add file to R Target 1 Groupˇ Source Groupl”,出现一个对话框,要求 寻找源文件,注意,该对话框下面的“文件类型” 默认为 C source filet(*c),也就是以C为扩展名 Options for Group Source 的文件,而我们的文件是以asm为扩展名的, Open file 所以在列表框中找不到exam1asm,要将文件类 i +Rebuild target 型改掉,点击对话框中“文件类型”后的下拉列 i, Build target 表,找到并选中“ Asm Source file(*as1,*asm), x Stop build 这样,在列表框中就可以找到 examl. asm文件 Add Files to Group Source 双击 examlasm文件,将文件加入项目,注 图3加入文件
Keil 实例教程(一) DJNZ R7,D1 RET END 保存该文件,注意必须加上扩展名(汇编语言源程序一般用 asm 或 a51 为扩展名),这 里假定将文件保存为 exam1.asm。 需要说明的是,源文件就是一般的文本文件,不一定使用 Keil 软件编写,可以使用任意 文本编缉器编写,而且,Keil 的编缉器对汉字的支持不好,建议使用 UltraEdit 之类的编缉 软件进行源程序的输入。 2、建立工程文件 在项目开发中,并不是仅有一个源程序就行了,还要为这个项目选择 CPU(Keil 支持数 百种 CPU,而这些 CPU 的特性并不完全相同),确定编译、汇编、连接的参数,指定调试 的方式,有一些项目还会有多个文件组成等,为管理和使用方便,Keil 使用工程(Project) 这一概念,将这些参数设置和所需的所有文件都加在一个工程中,只能对工程而不能对单一 的源程序进行编译(汇编)和连接等操作,下面我们就一步一步地来建立工程。 点击“Project->New Project… ”菜单,出现一个对话框,要求给将要建立的工程起一个 名字,你可以在编缉框中输入一个名字 (设为 exam1),不需要扩展名。点击“保 存”按钮,出现第二个对话框,如图 2 所示,这个对话框要求选择目标 CPU(即 你所用芯片的型号),Keil 支持的 CPU 很多,我们选择 Atmel 公司的 89C51 芯 片。点击 ATMEL 前面的“+”号,展开 该层,点击其中的 89C51,然后再点击 “确定”按钮,回到主界面,此时,在 工程窗口的文件页中,出现了“Target 1”,前面有“+”号,点击“+”号展开, 可以看到下一层的“Source Group1”,这 时的工程还是一个空的工程,里面什么 文件也没有,需要手动把刚才编写好的 源程序加入,点击“Source Group1”使 其反白显示,然后,点击鼠标右键,出现一个下 拉菜单,如图 3 所示。选中其中的“Add file to Group”Source Group1”,出现一个对话框,要求 寻找源文件,注意,该对话框下面的“文件类型” 默认为 C source file(*.c),也就是以 C 为扩展名 的文件,而我们的文件是以 asm 为扩展名的, 所以在列表框中找不到 exam1.asm,要将文件类 型改掉,点击对话框中“文件类型”后的下拉列 表,找到并选中“Asm Source File(*.a51,*.asm), 这样,在列表框中就可以找到 exam1.asm 文件 了。 双击 exam1.asm 文件,将文件加入项目,注 图 2 选择目标 CPU 图 3 加入文件
Ke实例教程(一) 意,在文件加入项目后,该对话框并不消 失,等待继续加入其它文件,但初学时常 会误认为操作没有成功而再次双击同一文 Fi1e’ean1,asm’ is already a member of 件,这时会出现如图4所示的对话框,提 bly language file 示你所选文件已在列表中,此时应点击“确 File will not be added to targe 定”,返回前一对话框,然后点击“ Close” □定 即可返回主界面,返回后,点击“ Source Group I”前的加号,会发现 examl. asm文 图4重复加入文件的错误 件已在其中。双击文件名,即打开该源程 二、工程的详细设置 工程建立好以后,还要对工程进行进一步的设置,以满足要求 首先点击左边 Project窗口的 Target 1,然后使用菜单“ Project->Option for target target” 即出现对工程设置的对话框,这个对话框可谓非常复杂,共有8个页面,要全部搞清可不容 易,好在绝大部份设置项取默认值就行了 设置对话框中的 Target页面,如 Options for Target'Target1 图5所示,Ⅺta后面的数值是晶振频 Target output Listing cs1 A51 BL51 Locate BL51 Mis 率值,默认值是所选目标CPU的最高 Atmel 89051 可用频率值,对于我们所选的 厂Use0n AT8C51而言是24M,该数值与最终m1man:yb4DNA 产生的目标代码无关,仅用于软件模 Code Ron Size: Large: 64K progra 拟调试时显示程序执行时间。正确设 Operating Non 置该数值可使显示时间与实际所用时 间一致,一般将其设置成与你的硬件 图5对目标进行设置 所用晶振频率相同,如果没必要了解程序执行的时间,也可以不设,这里设置为12 Memory Model用于设置RAM使用情况,有三个选择项, Small是所有变量都在单片 机的内部RAM中; Compact是可以使用一页外部扩展RAM,而 Larget则是可以使用全部 外部的扩展RAM。 Code model用于设置ROM空间的使用,同样也有三个选择项,即Smal 模式,只用低于2K的程序空间; Compact模式,单个函数的代码量不能超过2K,整个程序 可以使用64K程序空间; Larget模式,可用全部64K空间。 Use on- chip Rom选择项,确认 是否仅使用片内ROM(注意:选中该项并不会影响最终生成的目标代码量); Operating项 是操作系统选择,Keil提供了两种操作系统:Rⅸtimy和Rxfl,关于操作系统是另外-一个 很大的话题了,通常我们不使用任何操作系统,即使用该项的默认值:None(不使用任何 操作系统); Off Chip Code memory用以确定系统扩展ROM的地址范围, Off Chip xData memory组用于确定系统扩展RAM的地址范围,这些选择项必须根据所用硬件来决定,由 于该例是单片应用,未进行任何扩展,所以均不重新选择,按默认值设置。 设置对话框中的 Out Put页面,如图6所示,这里面也有多个选择项,其中 Creat hex file 用于生成可执行代码文件(可以用编程器写入单片机芯片的HEX格式文件,文件的扩展名 为HEX),默认情况下该项未被选中,如果要写片做硬件实验,就必须选中该项,这一点是 初学者易疏忽的,在此特别提醒注意。选中 Debug information将会产生调试信息,这些信 息用于调试,如果需要对程序进行调试,应当选中该项。 Browse information是产生浏览信 息,该信息可以用菜单view-> Browse来査看,这里取默认值。按钮“ Select Folder for objects
Keil 实例教程(一) 意,在文件加入项目后,该对话框并不消 失,等待继续加入其它文件,但初学时常 会误认为操作没有成功而再次双击同一文 件,这时会出现如图 4 所示的对话框,提 示你所选文件已在列表中,此时应点击“确 定”,返回前一对话框,然后点击“Close” 即可返回主界面,返回后,点击“Source Group 1”前的加号,会发现 exam1.asm 文 件已在其中。双击文件名,即打开该源程 序。 二、工程的详细设置 工程建立好以后,还要对工程进行进一步的设置,以满足要求。 首先点击左边 Project 窗口的 Target 1,然后使用菜单“Project->Option for target ‘target1’” 即出现对工程设置的对话框,这个对话框可谓非常复杂,共有 8 个页面,要全部搞清可不容 易,好在绝大部份设置项取默认值就行了。 设置对话框中的 Target 页面,如 图 5 所示,Xtal 后面的数值是晶振频 率值,默认值是所选目标 CPU 的最高 可用频率值,对于我们所选的 AT89C51 而言是 24M,该数值与最终 产生的目标代码无关,仅用于软件模 拟调试时显示程序执行时间。正确设 置该数值可使显示时间与实际所用时 间一致,一般将其设置成与你的硬件 所用晶振频率相同,如果没必要了解程序执行的时间,也可以不设,这里设置为 12。 Memory Model 用于设置 RAM 使用情况,有三个选择项,Small 是所有变量都在单片 机的内部 RAM 中;Compact 是可以使用一页外部扩展 RAM,而 Larget 则是可以使用全部 外部的扩展 RAM。Code Model 用于设置 ROM 空间的使用,同样也有三个选择项,即 Small 模式,只用低于 2K 的程序空间;Compact 模式,单个函数的代码量不能超过 2K,整个程序 可以使用 64K 程序空间;Larget 模式,可用全部 64K 空间。Use on-chip ROM 选择项,确认 是否仅使用片内 ROM(注意:选中该项并不会影响最终生成的目标代码量);Operating 项 是操作系统选择,Keil 提供了两种操作系统:Rtx tiny 和 Rtx full,关于操作系统是另外一个 很大的话题了,通常我们不使用任何操作系统,即使用该项的默认值:None(不使用任何 操作系统);Off Chip Code memory 用以确定系统扩展 ROM 的地址范围,Off Chip xData memory 组用于确定系统扩展 RAM 的地址范围,这些选择项必须根据所用硬件来决定,由 于该例是单片应用,未进行任何扩展,所以均不重新选择,按默认值设置。 设置对话框中的 OutPut 页面,如图 6 所示,这里面也有多个选择项,其中 Creat Hex file 用于生成可执行代码文件(可以用编程器写入单片机芯片的 HEX 格式文件,文件的扩展名 为.HEX),默认情况下该项未被选中,如果要写片做硬件实验,就必须选中该项,这一点是 初学者易疏忽的,在此特别提醒注意。选中 Debug information 将会产生调试信息,这些信 息用于调试,如果需要对程序进行调试,应当选中该项。Browse information 是产生浏览信 息,该信息可以用菜单 view->Browse 来查看,这里取默认值。按钮“ Select Folder for objects” 图 4 重复加入文件的错误 图 5 对目标进行设置
Ke实例教程(一) 是用来选择最终的目标文件所在的 tionsfor Target" 文件夹,默认是与工程文件在同 Target Output Listing cst A51 BL51 Locate BL51 Mise| Debug 个文件夹中。 Name of Executable用 于指定最终生成的目标文件的名 lect Folder for Objects. 延 ame of Execut abl 字,默认与工程的名字相同,这两 项一般不需要更改。 V Debug Informatio 厂 Browse Informati 工程设置对话框中的其它各页 M Create HEX F HEX HEX-80 面与C51编译选项、A51的汇编选 项、BL51连接器的连接选项等用法 图6对输出进行控制 有关,这里均取默认值,不作任何 修改。以下仅对一些有关页面中常用的选项作一个简单介绍。 ting标签页用于调整生成的列表文件选项。在汇编或编译完成后将产生(*lst)的列 表文件,在连接完成后也将产生(*m51)的列表文件,该页用于对列表文件的内容和形式 进行细致的调节,其中比较常用的选项是“ C Compile Listing”下的“ Assamble code”项, 选中该项可以在列表文件中生成C语言源程序所对应的汇编代码 C51标签页用于对Kei的C5l编译器的编译过程进行控制,其中比较常用的是“Code Optimization”组,如图7所示,该组中 Level是优化等级,Csl在对源程序进行编译时,可 以对代码多至9级优化,默认使用 第8级,一般不必修改,如果在编 Code Optimizatio 译中出现一些问题,可以降低优化 Common tail merging 级别试一试。上 mphasis是选择编 mphasis:Favor executi on speed 译优先方式,第一项是代码量优化 Global Register Coloring (最终生成的代码量小);第二项 Dont use absolute register accesses 是速度优先(最终生成的代码速度 快):第三项是缺省。默认的是速 图7代码生成控制 度优先,可根据需要更改 设置完成后按确认返回主界面,工程文件建立、设置完毕。 三、编译、连接 在设置好工程后,即可进行编译、连接。选择菜单 Project-> Build target,对当前工程进 行连接,如果当前文件已修改,软件会先对该文件进行编译,然后再连接以产生目标代码 如果选择 Rebuild All target files将会 对当前工程中的所有文件重新进行编 译然后再连接,确保最终生产的目标 图8有关编译、连接、项目设置的工具条 代码是最新的,而 Translate.项则仅 对该文件进行编译,不进行连接 以上操作也可以通过工具栏按钮直 xl Build target" Target1 assembling examl. asm. 接进行。图8是有关编译、设置的工具1 inking 栏按钮,从左到右分别是:编译、编译 creating hex file from"ezom1 连接、全部重建、停止编译和对工程进 examl-0 Error(s), 0 Warning(s 行设置。 编译过程中的信息将出现在输出窗 pBud/ CommandA Find in F° 口中的 Build页中,如果源程序中有语 图9正确编译、连接之后的结果
Keil 实例教程(一) 是用来选择最终的目标文件所在的 文件夹,默认是与工程文件在同一 个文件夹中。Name of Executable 用 于指定最终生成的目标文件的名 字,默认与工程的名字相同,这两 项一般不需要更改。 工程设置对话框中的其它各页 面与 C51 编译选项、A51 的汇编选 项、BL51 连接器的连接选项等用法 有关,这里均取默认值,不作任何 修改。以下仅对一些有关页面中常用的选项作一个简单介绍。 Listing 标签页用于调整生成的列表文件选项。在汇编或编译完成后将产生(*.lst)的列 表文件,在连接完成后也将产生(*.m51)的列表文件,该页用于对列表文件的内容和形式 进行细致的调节,其中比较常用的选项是“C Compile Listing”下的“Assamble Code”项, 选中该项可以在列表文件中生成 C 语言源程序所对应的汇编代码。 C51 标签页用于对 Keil 的 C51 编译器的编译过程进行控制,其中比较常用的是“Code Optimization”组,如图 7 所示,该组中 Level 是优化等级,C51 在对源程序进行编译时,可 以对代码多至 9 级优化,默认使用 第 8 级,一般不必修改,如果在编 译中出现一些问题,可以降低优化 级别试一试。Emphasis 是选择编 译优先方式,第一项是代码量优化 (最终生成的代码量小);第二项 是速度优先(最终生成的代码速度 快);第三项是缺省。默认的是速 度优先,可根据需要更改。 设置完成后按确认返回主界面,工程文件建立、设置完毕。 三、编译、连接 在设置好工程后,即可进行编译、连接。选择菜单 Project->Build target,对当前工程进 行连接,如果当前文件已修改,软件会先对该文件进行编译,然后再连接以产生目标代码; 如果选择 Rebuild All target files 将会 对当前工程中的所有文件重新进行编 译然后再连接,确保最终生产的目标 代码是最新的,而 Translate … .项则仅 对该文件进行编译,不进行连接。 以上操作也可以通过工具栏按钮直 接进行。图 8 是有关编译、设置的工具 栏按钮,从左到右分别是:编译、编译 连接、全部重建、停止编译和对工程进 行设置。 编译过程中的信息将出现在输出窗 口中的 Build 页中,如果源程序中有语 图 8 有关编译、连接、项目设置的工具条 图 7 代码生成控制 图 6 对输出进行控制 图 9 正确编译、连接之后的结果
Ke实例教程(一) 法错误,会有错误报告出现,双击该行,可以定位到出错的位置,对源程序反复修改之后, 最终会得到如图9所示的结果,提示获得了名为 exam l hex的文件,该文件即可被编程器读 入并写到芯片中,同时还产生了一些其它相关的文件,可被用于Keil的仿真与调试,这时 可以进入下一步调试的工作
Keil 实例教程(一) 法错误,会有错误报告出现,双击该行,可以定位到出错的位置,对源程序反复修改之后, 最终会得到如图 9 所示的结果,提示获得了名为 exam1.hex 的文件,该文件即可被编程器读 入并写到芯片中,同时还产生了一些其它相关的文件,可被用于 Keil 的仿真与调试,这时 可以进入下一步调试的工作