单片机应用程序的编辑、编译一般都采用Keil集成开发环境实现,但程序的调试有多种方法,如软件仿真调试、硬件(在线)仿真调试与Proteus软件模拟调试等,如图2.1所示。
图2.1 单片机应用程序的编辑、编译与调试流程
Keil能够实现汇编语言源程序和C语言源程序的输入、编辑与编译,生成机器代码文件,还能够实现模拟调试及与目标电路板的在线调试。
1.下载Keil C251安装程序
登录Keil官网,如图2.2所示,单击C251选项,按提示输入相关信息,单击“确定”按钮下载Keil C251安装程序。
图2.2 C251下载界面
2.安装
(1)双击安装程序,如图2.3所示,在弹出“License Agreement”界面中勾选“I agree to all the terms of the preceding License Agreement”,单击“Next”按钮进入下一步。
(2)如图2.4所示,在弹出的“Welcome to Keil μVision”界面中单击“Next”按钮进入下一步。
图2.3 “License Agreement”界面
图2.4 “Welcome to Keil μVision”界面
(3)选择安装路径,默认的安装路径是C:\Keil_v5,如图2.5所示,单击“Next”按钮进入下一步。
图2.5 选择安装路径
(4)填写个人信息,如图2.6所示,单击“Next”按钮进入下一步。
(5)安装完成,如图2.7所示,单击“Finish”按钮结束安装。
图2.6 填写个人信息
图2.7 安装完成
3.添加型号和头文件到Keil C251中
使用Keil C251之前需要先安装STC单片机的型号、头文件与仿真驱动文件,安装步骤如下:
(1)打开STC-ISP在线编程软件(可从STC官方网站下载),然后在软件右边功能区的“Keil仿真设置”界面中单击“添加型号和头文件到Keil中添加STC仿真器驱动到Keil中”按钮,如图2.8所示。
图2.8 添加型号与头文件
(2)如图2.9所示,在弹出的界面中,将添加路径定位到Keil C251的安装目录(如C:/Keil_v5),单击“确定”按钮。
(3)安装成功后的界面如图2.10所示。
图2.9 选择添加路径
图2.10 安装成功后的界面
4.应用Keil C251进行应用程序的输入、编辑与编译并生成机器代码
1)新建项目文件夹
在项目目标处新建一个当前项目的文件夹,用于存放当前项目的相关文件,如H:/32位8051单片机原理与应用/STC32DEMO。
2)新建项目
(1)打开Keil C251软件,单击“Project”菜单中的“New μVision Project…”项,在弹出的界面中选择新建项目存储的目标路径,以及输入新建项目的名称,然后保存,如图2.11所示。
(2)选择目标芯片。如图2.12所示,在弹出的界面中单击下拉按钮,选择“STC MCU Database”,在STC库中选择“STC32G12K128 Series”芯片,然后单击“OK”按钮,完成“demo”项目的创建。
图2.11 选择新建项目目标路径与设置新建项目名称
图2.12 选择目标芯片
3)新建文件
(1)单击“File”菜单中的“New”项,弹出新建文件(Text1)界面,单击保存按钮,如图2.13所示。
图2.13 新建文件
(2)输入源程序文件名与文件类型。在文件保存界面中,输入文件名与文件类型,即demo.c,单击“保存”按钮,完成“demo.c”的创建,如图2.14所示。
图2.14 设置文件名与文件类型
注意: 如源程序文件是C语言文件,后缀名为c;如源程序文件是汇编语言文件,后缀名为asm。
(3)输入与编辑源程序文件(demo.c),单击“保存”按钮。demo.c清单如下:
4)将新建文件添加到当前项目中
鼠标右键单击“Source Group 1”并选择“Add Existing Files to Group 'Source Group 1'…”,如图2.15所示;在弹出的界面中选择“demo”(即demo.c),单击“Add”按钮,如图2.16所示,关闭添加文件界面。
图2.15 选择添加程序文件
图2.16 选择添加的程序文件
5)设置编译环境
单击工具栏中的 按钮,打开编译环境设置界面。
(1)设置项目1:在“Target”标签页中将“CPU Mode”项设为“Source(251 native)”,如图2.17所示。
(2)设置项目2:在“Target”标签页中将“Memory Model”项设为“XSmall:near vars,far const,ptr-4”,如图2.18所示。
图2.17 “Target”标签页(设置项目1)
图2.18 “Target”标签页(设置项目2)
(3)设置项目3:当程序大小不超过64KB时,在“Target”标签页中将“Code Rom Size”项设为“Large:variables in XDATA”,如图2.19所示;当程序大小超过64K字节时,在“Target”标签页中将“Code Rom Size”项设为“Huge:64K functions,16M progr”,此时需要保证单个函数及单个文件的代码大小必须在64KB以内,并且单个表格的数据量也必须在64KB以内,同时还需要设置“External Memory”,如图2.20所示。
图2.19“Target”标签页(当程序大小不超过64KB时)
图2.20“Target”标签页(当程序大小超过64KB时)
(4)设置项目4:若程序空间超过64KB,则在“Output”标签页中必须将“HEX Format”项设为“HEX-386”,只有当程序空间不超过64KB时,此项才可设为“HEX-80”,如图2.21所示。
(5)设置项目5:编译时创建hex文件。勾选“Create HEX File”选项,如图2.21所示。
6)编译程序文件
单击 按钮或 按钮,Keil C251进入编译过程,编译完成后,界面底部输出窗口(Build Output)显示编译输出信息,如图2.22所示。如有Warning或Error信息,在窗口中,双击该信息,可以直接调转至其在程序中对应的行,以便编程者对程序进行分析与纠错,纠错后再编译,直至显示“0Error(s)”,此时才算编译成功,实际应用中,最好是“0Error(s),0Warning(s)”。
图2.21“Output”标签页
图2.22 编译输出信息
5.应用Keil C251模拟调试(仿真)单片机应用程序
Keil C251不仅可编辑C语言源程序和汇编语言源程序,还可以软件模拟和硬件仿真的形式调试用户程序,以验证用户程序的正确性。在下文介绍仿真的过程中,我们主要学习两个方面的内容:一是程序的运行方式,二是如何查看与设置单片机内部资源的状态。
在编译环境设置界面的“Debug”标签页中设置仿真方式,如图2.23所示,系统默认设置是模拟仿真;硬件(在线)仿真需要采用STC-USB Link1工具,其连接方法如图2.24所示。
图2.23 “Debug”标签页(设置仿真方式)
图2.24 硬件(在线)仿真连接示意图
在此重点介绍模拟调试(仿真),其步骤如下。
1)进入调试界面
单击工具栏中的 按钮,进入Keil C251的调试界面,如图2.25所示。
(1)调试工具按钮:从左至右依次为Reset(复位)、Run(全速运行)、Stop(停止运行)、Step(跟踪运行)、Step Over(单步运行)、Step Out(执行跟踪并跳出当前函数)、Run to Cursor Line(执行至光标处)。单击其中任意工具按钮,系统就会执行该工具按钮对应的功能。
① (复位):使单片机的状态恢复到初始状态。
② (全速运行):系统从0000H开始运行程序,若无断点,则无障碍运行程序;若遇到断点,则程序在断点处停止,再单击此工具按钮,程序会从断点处继续运行。
提示:断点的设置与取消
双击需要设置断点的指令行,即可设置断点,此时在指令行的左边会出现一个红色方框;反之,双击需要取消断点的指令行,则取消该断点。断点主要用于分块调试程序,便于缩小程序故障范围。
图2.25 Keil C251的调试界面
③ (停止运行):从程序运行状态中退出。
④ (跟踪运行):每单击该按钮一次,系统执行一条指令,包括子程序(或子函数)中的每一条指令。运用该工具按钮,可逐条指令进行程序调试。
⑤ (单步运行):每单击该按钮一次,系统执行一条指令,但系统将调用子程序指令当作一整条指令执行。
⑥ (执行跟踪并跳出当前函数):当执行跟踪操作进入了某个子程序时,单击该按钮,可从子程序中跳出,回到调用该子程序指令的下一条指令处。
⑦ (执行至光标处):单击该按钮,程序从当前位置运行到光标处停下,其作用与断点类似。
(2)调试程序窗口:调试程序窗口中显示当前调试的源程序,在此可设置程序运行的目标处及设置断点;在跟踪运行或单步运行模式中,通过调试程序窗口可观察到每一步的运行位置。
(3)寄存器窗口:寄存器包括R0~R14寄存器(在软件界面上显示的为r0~r14)、累加器A、寄存器B、程序状态字寄存器PSW、数据指针寄存器DPTR及程序计数器PC等。在此窗口中可用鼠标左键双击要设置的寄存器,修改其数据。
(4)存储器窗口:存储器窗口用于显示当前程序内部数据存储器、外部(扩展)数据存储器与程序存储器的内容。在“Address”地址框中输入存储器类型与地址,存储器窗口即可显示与输入类型相同且起始地址为输入地址的存储单元的内容,通过移动垂直滑动条可查看其他地址单元的内容。在此可修改存储单元的内容。“c:存储器地址”表示显示的是程序存储区相应地址的内容,“x:存储器地址”表示显示的是扩展数据存储区(xdata)相应地址的内容,“e:存储器地址”表示显示的是数据存储区(edata)相应地址的内容。
在显示数据的区域单击鼠标右键,可以在弹出的快捷菜单中选择修改存储器内容的显示格式或修改指定存储单元的内容。
(5)反汇编窗口:反汇编窗口同时显示机器代码程序与汇编语言源程序(或显示C51源程序和相应的汇编语言源程序)。
(6)内部端口菜单:通过单击此菜单上的选项可打开内部I/O端口的控制窗口,可用于设置内部端口的初始状态及观察程序运行过程中内部端口的当前状态,包括Interrupt(中断)、I/O-Ports(并行I/O端口)、Serial(串行端口)、Timer(定时器)等内部端口的控制窗口。
2)调试用户程序
本示例程序用到P1口和P3口,P1口用于显示流水灯信息,P3口的P3.2用于改变流水灯移动的方向。选择Peripherals→I/O-Ports→P1菜单命令可调出P1口控制窗口,选择Peripherals→I/O-Ports→P3菜单命令可调出P3口控制窗口,如图2.26所示。每个控制窗口的主要内容分3行,第1、2行代表端口锁存器输出信息,第3行代表端口输入引脚信息。信息显示有2种形式:①为十六进制,②为二进制,“√”代表高电平,空白代表低电平。通过第1行可以设置端口(输出)的初始状态,通过第3行可以设置端口输入引脚的信息,可以在①框中输入十六进制信息,也可在②框中单击需要调整的二进制位。
图2.26 Keil C251的P1口和P3口控制窗口
单击全速运行按钮 ,此时P3.2输入高电平,观察P1口控制窗口中“√”的移动方向和移动间隔。
单击P3.2的输入引脚位,让P3.2输入电平为低电平,观察P1口控制窗口中“√”的移动方向和移动间隔。