[h1]关于Keil开发环境[/h1]
Keil是由美国Keil Software公司研发的嵌入式开发工具,它支持使用汇编语言和C语言开发单片机嵌入式程序。Keil提供了不同的工具包用于支持不同指令架构的单片机,本课程主要学习51单片机嵌入式开发。
Keil开发工具没有发布中文版,但绝大多数嵌入式开发工程师都在使用Keil开发工具,它内置了C\C++编译器、汇编编译器、软件仿真和硬件仿真。软件仿真在程序运行调试状态下,可以查看模拟单片机的寄存器、存储器、I/O口状态,也可以查看程序在单片机内部执行过程中内存的状态。有了软件仿真调试功能,开发者在没有单片机的情况下,也可以开发单片机程序,并查看程序运行结果。硬件仿真可以接入外部仿真器仿真实际运行的单片机。

[h1]搭建Keil开发环境[/h1]
[h2]安装Keil开发工具[/h2]
搜索Keil官网,进入Keil官网网站,在Keil官网我们主要下载MDK-Arm和C51两个安装包,C51用于51系列单片机开发,MDK-Arm用于ARM指令架构的系列单片机开发。

分别下载C51和MDK-Arm到本地,先安装C51开发工具,C51安装完成后,再安装MDK-Arm(安装路径选择C51的安装路径)。
[h2]安装STC51系列单片机仿真包[/h2]
Keil安装完成后,并不支持STC51系列单片机的仿真调试,需要单独安装STC51系列单片机仿真包。进入STC(宏晶科技)官网,下载STC-ISP安装包,STC-ISP是宏晶公司提供的单片机下载烧录软件,是针对STC系列单片机而设计的,可下载程序到STC89、12C2052和12C5410等系列的STC单片机ROM内。

下载后解压缩包,运行stc-isp程序,选择“Keil仿真设置”标签页,单击“添加STC仿真器驱动到Keil中”按钮,在弹出的目录选择对话框选择keil的安装目录,单击确定即可完成STC仿真器驱动的安装。

[h1]单片机仿真实验[/h1]
[h2]实验目的[/h2]
使用keil创建单片机开发项目,添加C文件到项目,编写C代码控制单片机I/O口输出低电平,掌握代码的仿真调试,查看单片机I/O电平变化。
[h2]实验相关知识[/h2]
[h3]TTL电平[/h3]
实验用单片机为STC89C52RC,实验涉及到单片机I/O口的TTL电平检测。TTL电平信号规定+5V等价于逻辑“1”,0V等价于逻辑“0”,使用Keil进行仿真调试时,若I/O口某位输出“0”,则为低电平,输出“1”则为高电平。
[h3]单片机I/O口[/h3]
单片机I/O口用于单片机与外部设备的连接并控制外部设备。STC89C52RC有4个8位的双向I/O口,即可用于外部设备输入数据到单片机,也可以用于单片机向外部设备输出数据或控制指令。

上图的P0、P1、P2、P3为单片机的I/O口,每个I/O可以进行位控制,按位进行操作,每个位的初始逻辑状态为1(高电平),使用程序可以改变每个I/O为的逻辑状态,从而控制对应的外部设备。例如通过程序将P1.0位置为0(低电平)。
[h2]实验步骤[/h2]
[h3]创建单片机开发项目[/h3]
启动keil开发工具,展开“Project”菜单,选择“New µVision Project ……”命令,在弹出的“Create New Project”对话框内,选择项目保存位置,输入项目名称。

在弹出的“Select Device for target”对话框内,选择列表框内的“STC MCU Database”项,在单片机类型列表框内选择“STC89C52RC”单片机,然后单击“OK”按钮。

[h2]添加C文件到项目[/h2]
单片机项目创建成功后,需要添加C文件到项目,项目工作窗口如下图所示。

选择项目文件窗口“Source Group 1”节点,单击鼠标右键,在弹出的菜单中选择“ADD New Item to Group ‘Source Group 1’……”命令,如下图所示。

在弹出的“Add New Item to Group ‘Source Group 1’”对话框内,在文件类型列表框选择C文件类型,在Name输入域输入C文件名称,这里输入的是“controllio.c”,输入完成后,单击“Add”按钮。如下图所示。

C文件“controllio.c”已添加到项目节点“Source Group 1”节。

在“controllio.c”编辑窗口,输入下面的C代码:
#include<reg51.h>
sbit led1 = P1^0;
void main()
{
led1=0;
}
reg51.h是通用80C51和80C31单片机的头文件。头文件有两个keil定义的关键字sbit和sfr,sbit用来定义位变量,sfr用来定义地址变量。
sbit的用法:
sbit X = A^n
其中X是位变量,A是一个可进行位寻址的变量,n表示变量A的第n位,注意这里的^不是C语言的异或操作符,是keil定义的一个特殊符号,用于确定可进行位寻址变量的第几位。例如代码:
sbit led1 = P1^0;
sbit定义了led1变量,该变量指向P1口的第0位,若执行语句led1=0; 则P1口的第0位被置为低电平。
sfr的用法:
sfr X = 0x80
其中X是地址变量,0x80是一个地址。例如代码:
sfr P0 = 0x80;
sfr定义了P0变量,该变量指向0x80地址,该地址为单片机P0口的地址。
[h3]C程序仿真调试[/h3]
Keil提供了仿真调试功能,即使在没有单片机硬件的情况下,我们也可以判断C程序在单片机内是否运行正常,并跟踪和调试C程序完整的执行过程。
[h3]设置仿真[/h3]
在进行仿真调试之前,需要查看Keil是否已设置了仿真调试,展开Project菜单,选择“Options for Targets”命令,在弹出的对话框中,选择“Debug”标签页,确定“Use Simulator”被选中。

[h3]仿真调试过程[/h3]
展开“Debug”菜单,选择“Insert/Remove Breakpoint”命令,或者用鼠标双击语句左侧的灰色区域设置断点,如下图所示。

展开“Debug”菜单,选择“Start/Stop Debug Session”命令,或按下Ctrl+F5键,或单击工具条上的启动调试图标,都可以启动程序的仿真调试。
程序启动后,执行到断点后暂停运行,仿真调试窗口如下图所示。

通过寄存器窗口可以查看程序执行过程中寄存器状态的变化,关于单片机的寄存器,在后面的实验中会陆续讲解。汇编指令窗口显示了程序编译后的汇编指令,通过该窗口可以查看汇编指令。在代码窗口可以查看代码,也可以继续执行程序,或单步执行,或执行代码行,或执行到光标所在行。
本实验重点查看仿真单片机的I/O口状态,展开“peripherals”菜单,选择“I/O-Ports”菜单项,再弹出的子菜单中选择“Port 1”项。

Keil弹出P1口状态对话框,如下图所示。

从图中可以看到,当前P1口0~7位逻辑状态都为1,继续执行程序,再次查看P1口状态。

P1口第0位的逻辑状态已经发生了变化,其逻辑状态为0。
[h1]实验小结[/h1]
通过这次实验,掌握Keil编写单片机程序的过程,以及如何仿真调试单片机程序。实际上,在没有硬件单片机的情况下,应用Keil仿真调试工具,完全可以监控程序在仿真单片机中的运行状态。
本次实验主要完成单片机I/O口单个位的控制。下次实验应用EDA仿真工具proteus,设计单片机第一个应用,通过单片机I/O口控制发光二极管。