# 这篇文章将会教你如何创建一个拥有个人风格的Keil5工程模板，同时也介绍一些Keil5的基本设置

## 第一步 当然是创建一个工程文件夹啦~

![image-20241207132953272](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072105761.png)

​	新建完文件夹后，命名一下即可。

## 第二步 细分编译器模式(可以略过)

​	对于AI8051U来说，可以支持8位模式(C51)和32位模式(C251)，既然是为了创建基础工程模板，我们可以再创建一个细分文件夹，如下可以区分不同的模式：

![image-20241207133612833](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072105345.png)

## 第三步 工程文件分类

​	想要获得一个简洁、规整的工程目录，这一步十分重要！！！

​	我个人习惯创建"Drivers"(驱动)、"Output"(输出)、"Project"(工程)、"User"(用户)这4类目，当然还会包含一个"keilclean.bat"和"readme.txt"文件。

- Drivers：用于存放各种驱动文件，如iic.c、spi.c、i8080.c
- Output：用于存放keil5编译时的链接文件和输出文件
- Project：用于区分和存放各种编译器的工程文件
- User：用于存放用户层的文件
- keilclean.bat：清除keil5的链接文件
- readme.txt：工程说明文件

![image-20241207135528362](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072105123.png)

## 第四步 进一步细分文件类目

​	在第三步进行了一级目录的细分，为了进一步划分文件的用图和类别，再进行二级细分。

### 	1、Drivers

​		该文件夹主要是用于存放各种驱动文件的，我对各种驱动文件再次做了划分："BSP"(基础驱动)、"COMM"(官方提供的一些支持文件)、"Hardware"(外设驱动)、"Library"(官方提供的库函数)、"Middlewares"(中间层驱动文件)、"SYS"(系统级底层文件)。

![image-20241207140453364](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072105465.png)

- BSP：存放芯片所支持的各种外设驱动文件，如iic、spi、i8080、pwm、uart等等

![image-20241207140820626](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072105417.png)

![image-20241207140859691](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072106768.png)

- COMM：存放官方提供一些驱动支持包，如usb.h、usb_cdc_32.lib

![image-20241207141020189](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072106586.png)

- Hardware：存放各种硬件外设的驱动文件

![image-20241207141105206](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072106736.png)

![image-20241207141117138](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072106311.png)

- Library：存放库函数支持包
- Middlewares：存放各种中间层驱动文件，如RTOS、Modbus等等
- SYS：存放系统级调用文件，如config、delay等等

![image-20241207141404810](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072106458.png)

### 	2、Output

​		该文件夹主要用于存放编译时的输出文件和链接文件，暂时只接触了Keil5，暂不做细分了

### 	3、Projects

​		该文件夹主要用于区别各种不同的编译器，如Keil5、SDCC、IAR等等，这里创建了一个"Keil5_C251"的文件夹，代表使用的是Keil5编译器。

![image-20241207142122012](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072106056.png)

### 	4、User

​		主要用于存放用户层的文件，如主函数、屏幕界面等等

## 第五步 新建Keil5工程

​	1、打开Keil5，可以看见是一个空白的界面（也可能是你上一次打开的工程，这个不用在意）
​	2、选择Project(工程)目录
​	3、新建一个工程

![image-20241207134120179](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072106447.png)

​	4、找到刚刚创建的工程文件夹，创建一个工程名，保存即可

![image-20241207142715156](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072106066.png)

​	5、更换芯片支持包为STC MCU，找到对应的芯片型号，这里是AI8051U-32bit

![image-20241207142845444](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072106268.png)

![image-20241207142919165](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072106796.png)

​	6、成功创建工程

![image-20241207144611493](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072106818.png)

​	注：其中工程名称是不能修改的了。
​		目标名称文件夹名称可以修改，也可以创建多个
​		自定义文件夹名称可以修改，也可以创建多个

## 第六步 优化细分工程内文件目录

​	可以参考第三步、第四步进行分类。这里点开一个类似箱子堆的图标。

![image-20241207143859266](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072106260.png)

​	1、刚打开是这样的，什么都没有，双击名称可以修改名称。

![image-20241207144707789](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072106185.png)

![image-20241207145126642](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072106526.png)

​	注：第一个类目，貌似可以在同一个工程内，创建多个项目，通过点击"Set as Current Target"进行切换。

​	2、第一个类目可以命名成一个项目名称，主要在第二类目中进行分类，最后点击OK即可，大概如下：

![image-20241207145842892](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072106689.png)

​	3、导入文件(创建文件在后面)

​	此时文件夹创建完成了，但是没有任何C文件和H文件

![image-20241207150022438](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072107632.png)

​	可以双击对应类目的文件夹进行导入文件

​	![image-20241207150127901](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072107358.png)

​	选择当前工程文件夹下，对应类目的文件夹，一定要确定是当前工程文件路径。(以后复制工程模板时，有可能是在模板工程路径下，然后就会发现莫名其妙的少了一些文件)

​	![image-20241207150239706](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072107760.png)

​	选择对应的文件，双击导入即可。

![image-20241207150650710](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072107634.png)

​	此时就可以看见目录中出现了main.c这个文件

​	![image-20241207151501808](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072107464.png)

​	4、创建文件

​	如果没有可以导入的文件怎么办？想创建一个文件重新写

​	右键一个文件夹，选择"Add New...."

![image-20241207151802125](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072107224.png)

​	选择需要创建的文件类型，命名后"Add"即可

![image-20241207152436424](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072107122.png)

​	可以看见出现我们刚刚创建的文件了，接下来就可以愉快的编程啦

![image-20241207152110615](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072107256.png)

​	###这里我直接导入已经写好的代码文件，最终效果如下：

![image-20241207153054566](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072107058.png)

## 第七步 工程设置

​	这一步打开"魔术棒"，对工程进行一些设置

![image-20241207153256712](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072107282.png)

### 	1、Target(可查看AI8051U手册第6章)

​	根据手册推荐，可以设置成这样

![image-20241207153424138](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072107031.png)

​	注：80251的指令模式有“Binary”和“Source”两种模式，Ai8051U系列目前只支持“Source”模式由于Ai8051U系列单片机在中断中的压栈和出栈都是4字节模式，建议“4Byte InterruptFrame Size”选项也打上钩

​	注：Memory Model是指存储器模式，80251有5种模式：

![image-20241207154158848](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072107363.png)

​	注：Code Rom Size是指代码大小模式，80251有5种模式：

![image-20241207154518926](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072107051.png)

### 	2、Output

​	设置如下：

![image-20241207155118671](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072107032.png)

​	修改输出文件的默认位置

​	![image-20241207155246095](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072107715.png)

​	选择一开始创建的"Output"文件夹，确认即可

![image-20241207155414455](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072107964.png)

### 	3、Listing

​	这里只需要同上修改输出路径即可，其他选项保持默认。

![image-20241207155751758](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072107517.png)

​	完成此步后，可以删除"xxx\Projects\Keil5_C251"路径下的"Listings"和"Objects"文件夹。

![image-20241207162011458](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072108563.png)

### 	4、User

​	无需修改

### 	5、C251(优化等级、警告等级、绝对路径)

​	这一步十分重要！！

![image-20241207160226656](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072108417.png)

​	代码优化等级，单片机内存足够时，选择等级0，即不优化，可以保证代码完整性，少出问题；如果代码确实写的很多很大，可以选择高等级，让编译器自动优化代码。

​	警告等级，默认选择等级2。选择等级0，将不会报警告，不建议。一般情况下，还是需要看警告进行代码优化的。

​	头文件路径，这个十分重要，作用是告诉编译器头文件在哪里，

![image-20241207160901559](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072108725.png)

![image-20241207161011523](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072108063.png)

​	依次添加第三步、第四步创建的驱动文件夹路径，这里的路径对编译器来说，都是绝对路径。

![image-20241207161356404](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072108743.png)

​	注：绝对路径是 【目标文件所在位置】 相对 【工程文件所在位置】的路径，在绝对路径下的文件(如头文件)，可以直接用

```c
#include "xxx.h"
```

​	例如，"config.h" 文件在SYS文件夹下，而且绝对路径中包含了SYS文件夹的路径，就可以直接引用

```c
#include "config.h"
```

​	但是，在Hardware文件夹下，有一个名为LED的文件夹，内有一个led.h文件

![image-20241207162916677](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072108901.png)

​	此时，由于没有包含LED这个文件夹的绝对路径，如果直接引用"led.h"文件，将会报错，提示无法打开"led.h"，此时只能重新打开魔术棒->C251->添加路径，那如果每写一个新的驱动文件，都要这样添加，会不会太麻烦了，全部放在同一个文件夹下，又太凌乱了，那怎么办呢？

​	相对路径：
​	我们知道"led.h"这个文件的路径在LED文件夹里，而LED文件夹又在Hardware文件夹里，既然编译器知道Hardware在哪里，那引用的时候告诉编译器就好了，那么就可以这样：

```c
#include "./Hardware/LED/led.h"
// 或者
#include "./LED/led.h"
```

​	其中"./"(或".\\")表示当前路径，而"../"(或"..\\")表示上一级路径，那么

```c
// 工程文件的路径是 C251_32bit\Projects\Keil5_C251
// led.h文件的路径是 C251_32bit\Drivers\Hardware\LED
#include "./LED/led.h"	// 对应工程文件文件，展开后即如下
// #include "../(上一级路径：Projects)../(上一级路径：C251_32bit)/Drivers/Hardware/LED/led.h"
```

![image-20241207164923887](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072108611.png)

​	了解完之后，相对于本次添加的绝对路径，今后创建新的文件夹/文件，即可使用这种方式进行引用：

```c
#include "./XXX/xxx.h"
// 例如，要引用如下iic.h文件
// 由于已经添加过BSP文件夹的绝对路径了，因此这样引用
#include "./IIC/iic.h"
```

![image-20241207165324754](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072108448.png)

### 6、A251、L251 Locate

​	这里保持默认，无需修改。

### 7、L251 Miso(忽略某项警告)

​	这里设置忽略57号警告，
*** WARNING L57: UNCALLED FUNCTION, IGNORED FOR OVERLAY PROCESS
​	这个警告是提示你，工程内有哪些函数从未被使用过
​	(告诉你哪些函数 占着茅坑不拉屎)

![image-20241207165750453](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072108313.png)

### 8、Debug(需要仿真时才设置)

​	使用仿真时，将会占用P30、P31口，这两个引脚的功能(一般是串口1)不能使用，否则仿真调试时会报错，如果需要使用串口1，可以将功能复用到其他引脚上。![image-20241207170520592](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072108300.png)

![image-20241207170706561](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072108764.png)

### 9、Utilities(需要仿真时才设置)

​	![image-20241207171007615](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072108908.png)

![image-20241207171210845](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072108923.png)

​	至此，一个工程模板就创建好啦。



## **##番外 Keil5的一些设置**

​	keil5 的设置在小扳手里面

![image-20241207171648038](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072108825.png)

### 一、Eidtor (编辑器)

![image-20241207171715664](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072108728.png)

​	我的个人设置是这样的。

​	其中比较有用的是：
​	1、Encoding(编码格式)：一般是GB2312或者UTF-8

​	2、显示空白符(空格是点，缩进符是箭头)
​	![image-20241207174401853](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072108050.png)

​	3、Tab缩进设置(ASM是汇编文件，Other是其他文件)

![image-20241207174559301](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072109137.png)

### 二、Colors & Fonts(颜色和字体)

​	这里可以设置背景颜色，字体颜色，字体大小等等

![image-20241207175932252](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072109982.png)

​	一般就是设置C/C++编辑器文件就好了，可以把 Number 设置为红色(默认绿色)

![image-20241207180419576](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072109029.png)

​	把字符串设置成其他颜色，我设置的是紫色(默认黑色)

![image-20241207180510456](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072109425.png)

​	注：也推荐使用UTF-8的编码格式+Consolas字体

![image-20241207180944724](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072110595.png)

​	这种字体可以一眼分辨数字0 和 字母O

![image-20241207181112850](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072110673.png)

​	由于我已经用GB2312编码格式写好了，基础文件，现在切换中文注释会乱码，大家可以根据自身情况选择。

### 三、User Keywords(用户关键词)

​	这里可以新建一些 关键词

![image-20241207174756986](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072110429.png)

​	当输入关键词时，会高亮显示，类似这样：

![image-20241207174904439](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072110431.png)

### 四、Text Completion

​	这个我称之为"一键输入"或"常用语"，在这里新建一个"常用语"名称，写入内容

![image-20241207181525439](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072111403.png)

​	![image-20241207181816351](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072111166.png)

​	效果如下：

![recording](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072111010.gif)

​	双击一下，就可以直接写入内容，常见的用法是创建一个函数注释头的"常用语"

![image-20241207182156103](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072111099.png)



## ##代码介绍

### 1、config

​	config.h 文件内可以进行一些常用配置的切换

​	提供了一个float与u8类型相互转换的函数，支持大小端模式选择(相当于密码)
​	实用案例：NRF24L01无线通讯时，float数据打包发送，接收端拆包显示

​	一个swap函数，用于交换两个变量的数值

![image-20241207183020056](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072111189.png)

### 2、Type_def

​	该文件提供了一下常用的宏定义，以及一些实用的宏函数(个人提供的比较有限，十分欢迎各位坛友分享扩列)

​	![image-20241207183438427](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072111845.png)

### 3、delay

​	包含一个毫秒级延迟函数和一个微秒级延时函数，以及一些由ISP生成的微秒级延迟函数。

![image-20241207183742148](https://gitee.com/RISVOL_X/Typroa_images/raw/master/images/202412072126277.png)