# 第五节:用 Keil2 软件关闭,新建,打开一个工程的操作流程
## 【5.1 本教程选择 Keil2 软件版本的原因】
Keil 软件目前有 Keil2,Keil4,Keil5 等版本。本教程之所以选用 Keil2 版本,是因为 Keil2 版本比较单纯,它本身内置了 C51 编译器,并且只适用于 51 单片机不能适用于 STM32 这类单片机。而 Keil4,Keil5 等版本不仅可以适用于 51 单片机的,还可以适用于 ARM 类的单片机,它们有 C51 编译器和 MDK-ARM 编译器两种选择,在同一个 Keil4 或者 Keil5 版本里,C51 和 MDK-ARM 两者往往只能二选一,MDK-ARM 编译器是针对 STM32 这类单片机,如果你电脑上用了 MDK-ARM 编译器想再切换到 C51 编译器就很麻烦了往往不兼容,为了电脑上既能用 C51 编译器,又能兼容 MDK-ARM 编译器,我的电脑上是同时安装了 C51 编译器的 Keil2 和 MDK-ARM 编译器的 Keil4, 一台电脑同时安装 Keil2 和 Keil4 不会冲突,能兼容的。
## 【5.2 如何在不用关闭 Keil2 软件的前提下又能关闭当前被打开的工程?】
要关闭当前工程,最简单的方法是直接点击 Keil2 软件右上角的 “X” 直接把 Keil2 软件也一起关了,这种方法不在讨论范围,现在要介绍的是如何在不关闭 Keil2 软件的前提下又能关闭当前被打开的工程。
![](https://img.kancloud.cn/b3/60/b360ff4de9002ee9e6a035bf16fd52b4_318x208.png)
图 5.2.1 启动 Keil2 软件
### 第一步:启动 Keil2 软件。
1. 双击桌面”Keil uVision2”的图标启动Keil2软件。
2. 双击桌面”Keil uVision2” 的图标启动 Keil2 软件。
![](https://img.kancloud.cn/74/9f/749f1b380ddf6eb9e6210f988f3b6b5b_468x243.png)
图 5.2.2 关闭被打开的已有工程
### 第二步:关闭被打开的已有工程。
启动 Keil2 软件后,假设发现此软件默认打开了一个之前已经存在的工程。关闭已有工程的操作是这样子的:点击上面”Project” 选项,在弹出的下拉菜单中选择 “Close Project” 即可。这时 Keil2 软件处于 “空” 的状态,没有打开任何工程了。
## 【5.3 Keil2 如何新建一个工程?】
![](https://img.kancloud.cn/02/b7/02b72ac06dab293c0e3c58a3bec499ad_308x223.png)
图 5.3.1 新建一个工程文件夹
### 第一步:新建一个工程文件夹。
在电脑 D 盘目录下新建一个文件夹,取名为 “stc89c52rc”。
补充说明:
* (1)文件夹的命名以及后面涉及到的工程文件名统统都不要用中文,请全部用英文,数字,或者下划线这些字符。即使 Keil 软件支持中文名,我建议也不要用中文名,因为在单片机这个行业,有一些单片机厂家提供的平台软件,某些版本是不支持中文名的,所以大家从一开始就养成这个习惯,以后可以避免遇到一些不必要的麻烦。
* (2)新建的文件夹请直接放在某盘的根目录下,而不要放到某个已有文件夹的目录下。一方面是因为已有的文件名目录往往带有中文单词,另外一方面是有一些单片机厂家的平台软件不支持嵌入层次太深的文件目录,所以大家从一开始就养成这个习惯,以后可以避免遇到一些不必要的麻烦。
### 第二步:启动 Keil2 软件。
双击桌面”Keil uVision2” 的图标启动 Keil2 软件。
### 第三步:关闭默认被打开的已有工程。
启动 Keil2 软件后,如果发现此软件默认打开了一个之前已经存在的工程,请先关闭此工程让 Keil2 软件处于 “空” 的状态,如果没有发现此软件默认打开已有工程,这一步可以忽略跳过。关闭已有工程的操作是这样子的:点击上面”Project” 选项,在弹出的下拉菜单中选择 “Close Project” 即可。这时 Keil2 软件处于 “空” 的状态,没有打开任何工程了。
![](https://img.kancloud.cn/ce/d3/ced35ec06b07935f70908d5636a3cbe4_382x239.png)
图 5.3.4.1 新建一个工程
![](https://img.kancloud.cn/ad/f1/adf131ac0a71656aad0c63d321d140c2_448x270.png)
图 5.3.4.2 选择新建工程保存的位置
![](https://img.kancloud.cn/65/e0/65e07255ff9b9f3ee56894259e046f59_632x427.jpeg)
图 5.3.4.3 为当前工程选择编译器所支持的单片机型号
![](https://img.kancloud.cn/63/ea/63ead786168f6a5e1698adfb6cf423b6_495x187.png)
图 5.3.4.4 不需要把默认启动文件添加进来
### 第四步:利用工具向导新建一个工程。
点击上面”Project” 选项,在弹出的下拉菜单中选择 “New Project...”,在弹出的对话框中,选择保存的目录是刚才第一步新建的文件夹 “stc89c52rc”,同时输入跟文件夹名称一样的工程文件名 “stc89c52rc”,然后单击 “保存” 按键(一个新工程模板就建成了),单击 “保存” 按键后此时会弹出一个选择单片机型号的对话框,单击”Atmel” 这个厂家前面的 “+” 号,在展开的下拉选项中选中 “AT89C52” 这个型号,然后点击 “确定”,此时会弹出一个英文询问框,大概意思是 “是否要复制 STARTUP.A51 这个文件到工程里?” 我们单击 “否” 即可。
补充说明:
* (1)以上新建的保存文件名应该跟我们第一步在 D 盘新建的文件夹名称一致,确保都是 “stc89c52rc”,因为有一些单片机厂家的平台软件是有这个要求的,所以大家养成这个习惯,以后可以避免遇到一些不必要的麻烦。
* (2)上面之所以选择 Atmel 厂家的 AT89C52 单片机,是因为本教程选用的单片机 STC89C52RC 跟 AT89C52 是兼容的。
* (3)在弹出的英文询问框,大致意思是 “是否要复制 STARTUP.A51 这个文件到工程里?”,那么 STARTUP.A51 这个文件有什么含义?STARTUP.A51 是一个启动程序文件,在单片机进入.c 程序执行 main 函数之前,先去执行这个启动程序,这个启动程序是专门用来初始化 RAM 和设置堆栈等,如果我们选 “否” 不添加这个启动程序,编译器也会自动加入一段我们不能更改的默认启动程序。如果选 “是”,那么这个文件就会出现在我们工程里,我们可以根据需要对它进行更改。但是大多数的情况下,我们都不会去更改此文件,所以无论你选 “是” 还是 “否”,只要你不更改 START.A51 文件,对我们来说都是一样的。因此我本人一般情况下都是选 “否”。
![](https://img.kancloud.cn/c2/61/c26140697064cde6c48a0a8d69dfccb5_336x216.png)
图 5.3.5.1 新建一个源文件
![](https://img.kancloud.cn/e5/57/e55726e56282afb1fd8af061a4cdf077_495x253.png)
图 5.3.5.2 保存当前新建的源文件
![](https://img.kancloud.cn/ff/7e/ff7e195c1d6df2cdb1ce08ca7bf9f0e3_452x274.png)
图 5.3.5.3 把当前源文件保存在指定的位置
### 第五步:新建一个.c 源文件。
点击上面”File” 选项,在弹出的下拉菜单中选择 “New...”,会看到弹出来一个名字为”Text1” 的文件。再一次点击上面”File” 选项,在弹出的下拉菜单中选择 “Save”,会弹出一个保存的对话框,此时还是选择保存在第一步新建的文件夹目录下,并且把 “Text1” 文件名更改为 “stc89c52rc.c”(注意后缀是.c 扩展名),单击 “保存”。
补充说明:
* (1)此时你如果打开 D 目录下 “stc89c52rc” 的文件夹,你会发现此文件夹有一个 “stc89c52rc.c” 的文件,这个文件就是在这一步被新建添加进来的,但是此文件 “stc89c52rc.c” 目前跟整个工程还没有关联,还需要在接下来的第六步那里进行关联操作。
* (2)上面新建添加的文件,它的文件名必须是带.c 这个扩展名,表示此文件是 C 文件格式,这一个很重要不要搞错了。往后我们所写的 C 语言程序代码就是写在此 C 格式的文件里。此文件也俗称 C 源文件。
![](https://img.kancloud.cn/f9/9c/f99ce7cec467f23f712625b0fe7d9529_475x425.png)
图 5.3.6.1 即将把源文件添加进工程里
![](https://img.kancloud.cn/24/a3/24a328a99bdf20c1374210874cfb1ec8_449x274.png)
图 5.3.6.2 选择需要添加进工程里的源文件
![](https://img.kancloud.cn/aa/54/aa544c9d7d93d1d656f3e593558fb3a0_342x229.png)
图 5.3.6.3 源文件添加成功
### 第六步:把刚才新建的.c 源文件添加到工程里,跟当前工程关联起来。
点击左边竖着的选项框里面的”Target 1” 前面的 “+” 号,在展开的下拉菜单下看到 “Source Group 1”。右键单击 “Source Group 1” 选项,在下拉菜单中选择 “Add Files to Group ‘Source Group 1’” 选项,弹出一个文件选择对话框,单击选中刚才新建的.c 源文件,然后单击一次 “Add” 按钮,此时虽然对话框没有关闭,但是已经悄悄地把.c 源文件添加到工程里了(这个地方 Keil 的用户体验设计得不够好,容易让人误解还没有把文件添加进来),这时再点击一次 “Close” 按钮先把此对话框关闭,然后发现左边的 “Source Group 1” 前面多了一个”+” 号,单击此”+” 号展开,发现下面的文件恰好是刚才新添加进去的.c 源文件 “stc89c52rc.c”。
补充说明:
* (1)在刚才的操作中,我本人觉得 Keil 软件有一个地方的用户体验做得不够好,容易引起误解。就是在弹出一个文件选择对话框时,先单击选中刚才新建的.c 源文件,此时单击一次 “Add” 按钮,已经相当于把.c 文件添加进工程了,但是此时 Keil 软件并没有自动关闭对话框,这样很容易让初学者误以为.c 源文件还没有被添加进去。
![](https://img.kancloud.cn/c5/0f/c50fb5260f19e71ba0202c59fa1585c3_677x488.png)
图 5.3.7 编辑 C 语言代码的区域
### 第七步:至此,可以正常的编辑 C 语言代码了。
双击打开左边 Target1 里面 Source Group1 下刚刚被添加进工程的 “stc89c52rc.c” 源文件,就可以在此 “stc89c52rc.c” 文件下输入 C 语言代码了,请把以下范例代码复制进去,然后再一次点击”File” 选项,在弹出的下拉菜单中选择 “Save” 保存。此时,新建一个工程的步骤已经完成。供复制的范例代码如下:
```c
#include "REG52.H"
void delay_long (unsigned int uiDelayLong); // 延时函数
sbit led_dr = P1^6;
void main ()
{
while (1)
{
led_dr = 1; //LED 亮
delay_long (100); // 延时 50000 个空指令的时间
led_dr = 0; //LED 灭
delay_long (100); // 延时 50000 个空指令的时间
}
}
void delay_long (unsigned int uiDelayLong) // 延时函数
{
unsigned int i;
unsigned int j;
for (i = 0; i < uiDelayLong; i++)
{
for (j = 0; j < 500; j++); // 内嵌循环的空指令数量
}
}
```
补充说明:
* (1)可能有些朋友不是用 Keil2 版本,如果他们是用 Keil4 的版本,当把代码复制到 Keil4 时,如果中文注释出现乱码怎么办?解决办法是这样的:点击 Keil4 软件的左上角 "Edit",在下拉菜单中选最后一项 “Configuration”, 在弹出的对话框中把 Encoding 的选项改成 “Chinese GB2312 (Simplified)”. 然后删除所有 C 代码,重新复制一次代码进去就恢复正常了。当然,我们用 Keil2 版本不会遇到这个问题,况且 Keil2 版本的 "Edit" 下拉菜单也没有 “Configuration” 这个选项,所以 Keil2 和 Keil4 还是有一些差别的。
## 【5.4 Keil2 如何打开一个现有的工程?】
### 第一步:启动 Keil2 软件。
双击桌面”Keil uVision2” 的图标启动 Keil2 软件。
### 第二步:关闭默认被打开的已有工程。
启动 Keil2 软件后,如果发现此软件默认打开了一个之前已经存在的工程,请先关闭此工程让 Keil2 软件处于 “空” 的状态,如果没有发现此软件默认打开已有工程,这一步可以忽略跳过。关闭已有工程的操作是这样子的:点击上面”Project” 选项,在弹出的下拉菜单中选择 “Close Project” 即可。这时 Keil2 软件处于 “空” 的状态,没有打开任何工程了。
![](https://img.kancloud.cn/a7/69/a769006e8f5ab3e1be4f8137900d05b9_463x223.png)
图 5.4.3.1 打开一个现有的工程
![](https://img.kancloud.cn/00/cd/00cd63fe9e8fca1d52872dab314b2770_450x265.png)
图 5.4.3.2 选择将要被打开的工程
### 第三步:打开一个现成的工程。
点击上面”Project” 选项,在弹出的下拉菜单中选择 “Open Project”,在弹出的文件对话框中,找到需要被打开工程文件夹(本例程是 D 盘下的 “stc89c52rc” 文件夹),在此文件夹目录下单击选中 “stc89c52rc.Uv2” 这个工程文件名,然后点击 “打开”,就可以打开一个现有的工程文件了。
- 首页
- 第一节:我的价值观
- 第二节:初学者的疑惑
- 第三节:单片机最重要的一个特性
- 第四节:平台软件和编译器软件的简介
- 第五节:用Keil2软件关闭,新建,打开一个工程的操作流程
- 第六节:把.c源代码编译成.hex机器码的操作流程
- 第七节:本节预留
- 第八节:把.hex机器码程序烧录到单片机的操作流程
- 第九节:本节预留
- 第十节:程序从哪里开始,要到哪里去?
- 第十一节:一个在单片机上练习C语言的模板程序
- 第十二节:变量的定义和赋值
- 【TODO】第十三节:赋值语句的覆盖性
- 【TODO】第十四节:二进制与字节单位,以及常用三种变量的取值范围
- 【TODO】第十五节:二进制与十六进制
- 【TODO】第十六节:十进制与十六进制
- 【TODO】第十七节:加法运算的5种常用组合
- 【TODO】第十八节:连加、自加、自加简写、自加1
- 【TODO】第十九节:加法运算的溢出
- 【TODO】第二十节:隐藏中间变量为何物?
- 【TODO】第二十一节:减法运算的5种常用组合。
- 【TODO】第二十二节:连减、自减、自减简写、自减1
- 【TODO】第二十三节:减法溢出与假想借位
- 【TODO】第二十四节:借用unsigned long类型的中间变量可以减少溢出现象
- 【TODO】第二十五节:乘法运算中的5种常用组合
- 【TODO】第二十六节:连乘、自乘、自乘简写,溢出
- 【TODO】第二十七节:整除求商
- 【TODO】第二十八节:整除求余
- 【TODO】第二十九节:“先余后商”和“先商后余”提取数据某位,哪家强?
- 【TODO】第三十节:逻辑运算符的“与”运算
- 【TODO】第三十一节:逻辑运算符的“或”运算
- 【TODO】第三十二节:逻辑运算符的“异或”运算
- 【TODO】第三十三节:逻辑运算符的“按位取反”和“非”运算
- 【TODO】第三十四节:移位运算的左移
- 【TODO】第三十五节:移位运算的右移
- 【TODO】第三十六节:括号的强制功能---改变运算优先级
- 【TODO】第三十七节:单字节变量赋值给多字节变量的疑惑
- 【TODO】第三十八节:第二种解决“运算过程中意外溢出”的便捷方法
- 【TODO】第三十九节:if判断语句以及常量变量的真假判断
- 【TODO】第四十节:关系符的等于“==”和不等于“!=”
- 【TODO】第四十一节:关系符的大于“>”和大于等于“>=”
- 【TODO】第四十二节:关系符的小于“<”和小于等于“<=”
- 【TODO】第四十三节:关系符中的关系符:与“&&”,或“||”
- 【TODO】第四十四节:小括号改变判断优先级
- 【TODO】第四十五节: 组合判断if...else if...else
- 【TODO】第四十六节: 一维数组
- 【TODO】第四十七节: 二维数组
- 【TODO】第四十八节: while循环语句
- 【TODO】第四十九节: 循环语句do while和for
- 【TODO】第五十节: 循环体内的continue和break语句
- 【TODO】第五十一节: for和while的循环嵌套
- 【TODO】第五十二节: 支撑程序框架的switch语句
- 【TODO】第五十三节: 使用函数的三要素和执行顺序
- 【TODO】第五十四节: 从全局变量和局部变量中感悟“栈”为何物
- 【TODO】第五十五节: 函数的作用和四种常见书写类型
- 【TODO】第五十六节: return在函数中的作用以及四个容易被忽略的功能
- 【TODO】第五十七节: static的重要作用
- 【TODO】第五十八节: const(./book/或code)在定义数据时的作用
- 【TODO】第五十九节: 全局“一键替换”功能的#define
- 【TODO】第六十节: 指针在变量(./book/或常量)中的基础知识
- 【TODO】第六十一节: 指针的中转站作用,地址自加法,地址偏移法
- 【TODO】第六十二节: 指针,大小端,化整为零,化零为整
- 【TODO】第六十三节: 指针“化整为零”和“化零为整”的“灵活”应用
- 【TODO】第六十四节: 指针让函数具备了多个相当于return的输出口
- 【TODO】第六十五节: 指针作为数组在函数中的入口作用
- 【TODO】第六十六节: 指针作为数组在函数中的出口作用
- 【TODO】第六十七节: 指针作为数组在函数中既“入口”又“出口”的作用
- 【TODO】第六十八节: 为函数接口指针“定向”的const关键词
- 【TODO】第六十九节: 宏函数sizeof(./book/)
- 【TODO】第七十节: “万能数组”的结构体
- 【TODO】第七十一节: 结构体的内存和赋值
- 【TODO】第七十二节: 结构体的指针
- 【TODO】第七十三节: 结构体数据的传输存储和还原
- 【TODO】第七十四节: 结构体指针在函数接口处的频繁应用
- 【TODO】第七十五节: 指针的名义(例:一维指针操作二维数组)
- 【TODO】第七十六节: 二维数组的指针
- 【TODO】第七十七节: 指针唯一的“单向输出”通道return
- 【TODO】第七十八节: typedef和#define和enum
- 【TODO】第七十九节: 各种变量常量的命名规范
- 【TODO】第八十节: 单片机IO口驱动LED
- 【TODO】第八十一节: 时间和速度的起源(指令周期和晶振频率)
- 【TODO】第八十二节: Delay“阻塞”延时控制LED闪烁
- 【TODO】第八十三节: 累计主循环的“非阻塞”延时控制LED闪烁
- 【TODO】第八十四节: 中断与中断函数
- 【TODO】第八十五节: 定时中断的寄存器配置
- 【TODO】第八十六节: 定时中断的“非阻塞”延时控制LED闪烁
- 【TODO】第八十七节: 一个定时中断产生N个软件定时器
- 【TODO】第八十八节: 两大核心框架理论(四区一线,switch外加定时中断)
- 【TODO】第八十九节: 跑马灯的三种境界
- 【TODO】第九十节: 多任务并行处理两路跑马灯
- 【TODO】第九十一节: 蜂鸣器的“非阻塞”驱动
- 【TODO】第九十二节: 独立按键的四大要素(自锁,消抖,非阻塞,清零式滤波)
- 【TODO】第九十三节: 独立按键鼠标式的单击与双击
- 【TODO】第九十四节: 两个独立按键构成的组合按键
- 【TODO】第九十五节: 两个独立按键的“电脑键盘式”组合按键
- 【TODO】第九十六节: 独立按键“一键两用”的短按与长按
- 【TODO】第九十七节: 独立按键按住不松手的连续均匀触发
- 【TODO】第九十八节: 独立按键按住不松手的“先加速后匀速”的触发
- 【TODO】第九十九节: “行列扫描式”矩阵按键的单个触发(原始版)
- 【TODO】第一百节: “行列扫描式”矩阵按键的单个触发(优化版)
- 【TODO】第一百零一节: 矩阵按键鼠标式的单击与双击
- 【TODO】第一百零二节: 两个“任意行输入”矩阵按键的“有序”组合触发
- 【TODO】第一百零三节: 两个“任意行输入”矩阵按键的“无序”组合触发
- 【TODO】第一百零四节: 矩阵按键“一键两用”的短按与长按
- 【TODO】第一百零五节: 矩阵按键按住不松手的连续均匀触发
- 【TODO】第一百零六节: 矩阵按键按住不松手的“先加速后匀速”触发
- 【TODO】第一百零七节: 开关感应器的识别与软件滤波
- 【TODO】第一百零八节: 按键控制跑马灯的启动和暂停和停止
- 【TODO】第一百零九节: 按键控制跑马灯的方向
- 【TODO】第一百一十节: 按键控制跑马灯的速度
- 第一百一十一节: 工业自动化设备的开关信号的运动控制
- 【TODO】第一百一十二节: 数码管显示的基础知识
- 【TODO】第一百一十三节: 动态扫描的数码管显示数字
- 【TODO】第一百一十四节: 动态扫描的数码管显示小数点
- 【TODO】第一百一十五节: 按键控制数码管的秒表
- 【TODO】第一百一十六节: 按键控制数码管的倒计时
- 【TODO】第一百一十七节: 按键切换数码管窗口来设置参数
- 【TODO】第一百一十八节: 按键让某位数码管闪烁跳动来设置参数
- 【TODO】第一百一十九节: 一个完整的人机界面的程序框架的脉络
- 【TODO】第一百二十节: 按键切换窗口切换局部来设置参数
- 【TODO】第一百二十一节: 可调参数的数码管倒计时
- 【TODO】第一百二十二节: 利用定时中断做的“时分秒”数显时钟
- 【TODO】第一百二十三节: 一种能省去一个lock自锁变量的按键驱动程序
- 【TODO】第一百二十四节: 数显仪表盘显示“速度、方向、计数器”的跑马灯
- 【TODO】第一百二十五节: “双线”的肢体接触通信
- 【TODO】第一百二十六节: “单线”的肢体接触通信
- 【TODO】第一百二十七节: 单片机串口接收数据的机制
- 【TODO】第一百二十八节: 接收“固定协议”的串口程序框架
- 【TODO】第一百二十九节: 接收带“动态密匙”与“累加和”校验数据的串口程序框架
- 【TODO】第一百三十节: 接收带“动态密匙”与“异或”校验数据的串口程序框架
- 【TODO】第一百三十一节: 灵活切换各种不同大小“接收内存”的串口程序框架
- 【TODO】第一百三十二节:“转发、透传、多种协议并存”的双缓存串口程序框架
- 【TODO】第一百三十三节:常用的三种串口发送函数
- 【TODO】第一百三十四节:“应用层半双工”双机串口通讯的程序框架