蓝桥杯 模板Template Part1:模块化编程&工程模板
● 改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改
一、流程图
二、工程结构
蓝桥杯考场编程以实用快捷为目的,并不是为了后期工程移植,所以省去了各种.h
头文件,除了ds1302.h
,iic.h
,onewire.h
三个官方提供的底层驱动,其他的各种用户自己写的头文件都融合成一个main.h
头文件。使工程结构更加简洁,避免了外部变量声明不到的尴尬。
51结构比较简单,正点原子建立32工程的结构并不适合51。
在名为蓝桥杯
的总工程文件夹里新建如下文件夹:
●Project
文件夹,用来存放编译过程产生的文件和最终的工程文件和二进制文件(hex文件)。
●Source
文件夹,用来存放主源程序(即主C文件)和各种C文件;
●Library
文件夹,用来存放头文件&库文件。
三、变量命名规则
●局部变量普通标识符命名即可。
●全局变量建议加前缀,unsigned char
型的加uc_
,uc_Key_Value
;unsigned int
型的加ui_
,ui_SEG_flag
;unsigned long
型的加ul_
,ul_ms
;字符串数组前再加p
表示指针,如puc_SEG_Buf[9]
。
四、基础知识
1、编译预处理
●编译预处理即在C编译程序对C源程序进行编译前,由编译预处理程序对这些编译预处理命令行进行处理的过程。
●分为:宏定义,文件包含和条件编译。
●宏定义
○宏定义命令行的常见形式:宏名即标识符。
#define 宏名 被替换文本
#define 宏名 //仅说明标识符被定义
●文件包含
○文件包含:指在一个文件中,去包含另一个文件的全部内容。
○形式:
#include "文件名"
或
#include<文件名>
在预编译时,预编译程序将用指定文件中的内容来替换此命令行。
关于keil中的文件包含可参考《keil中#include后的尖括号与引号的区别》
●条件编译
○对程序中的内容选择性地编译。便于程序的调试和移植,避免重复编译。
○常见形式:当标识符没有由#define
定义过,则编译程序段。
#ifndef 标识符
#define 标识符
程序段
#endif
2、变量的定义和说明
●定义(definition):创建变量,为变量分配确定的存储单元。
●说明or声明(declaration):只是说明变量的性质,并不分配内存。
3、extern
●在同一编译单位内用extern
说明符扩展全局变量的作用域
当全局变量定义在后,引用在前时,应该在引用处用extern
对此全局变量进行说明,以便通知编译程序:该变量是一个已经在外部(后边)定义了的全局变量,已经分配了存储单元,不需要再为它另外开辟存储单元。使变量的作用域扩展到从extern
说明处。
全局变量的说明与全局变量的定义的不同:变量的定义(开辟存储单元)只能出现一次,在定义全局变量时,不可使用extern
说明符;而对全局变量的说明,则可以多次出现在需要的地方,此时需要用extern
进行说明。
●在不同编译单位内用extern
说明符扩展全局变量的作用域
模块化编程中,通常创建多个源文件(C文件),每个源文件可以单独进行编译,进行语法检查,若无错误即生成目标文件(.obj),然后用系统提供的连接程序把多个目标文件连接成一个可执行文件(.exe)。每个可进行单独编译的源文件称为编译单位。
在一个文件中定义所有的全局变量,而在其他用到这些全局变量的文件中用extern
对这些变量进行说明,声明这些变量已经在其他编译单位中定义,通知编译程序不必再为他们开辟存储单元。
五、操作流程
1、程序构架&模块分类
对要写的程序进行框架的搭建,自上而下进行编程。先确定整个程序可以划分为哪几个模块,再分别实现每个模块的功能,每个模块多外只提供一个接口即可,便于程序的移植和调试。
一个嵌入式系统通常包含两类模块:
●硬件驱动模块:一种特定的硬件对应一个模块。
●软件功能模块:对应某个功能的实现,没有特定的硬件
对应。(比如一些通信协议的驱动)
蓝桥杯考场编程以实用快捷为目的,并不是为了后期工程移植,所以省去了各种.h
头文件,除了ds1302.h
,iic.h
,onewire.h
三个官方提供的底层驱动,其他的各种用户自己写的头文件都融合成一个main.h
头文件。使工程结构更加简洁,避免了外部变量声明不到的尴尬。
51结构比较简单,正点原子建立32工程的结构并不适合51。
在名为蓝桥杯
的总工程文件夹里新建如下文件夹:
●Project
文件夹,用来存放编译过程产生的文件和最终的工程文件和二进制文件(hex文件)。
●Source
文件夹,用来存放主源程序(即主C文件)和各种C文件;
●Library
文件夹,用来存放头文件&库文件。
2、新建工程
按照通常方法新建工程即可,注意工程目录要选到Project
文件夹,如下图所示。
刚建完工程的Project
文件夹如下图所示。
3、新建文件
直接点击New
可以新建text文本文档,点击保存,命名为main.c
注意后缀。保存路径为main文件夹。
如此,可以分别建立Init.c
文件,Key16.c
文件,SEG.c
文件。
4、管理工程项目(C文件)
虽然在 3、新建文件 中已经新建了一些c文件和头文件并保存在总工程文件夹蓝桥杯
中,但实际上只是在物理路径上存放在了工程文件夹中,实际上并没有在工程中。
在下图的左侧工程管理栏中也可以看出。
4、管理工程项目就是将前边建的文件包含到工程中。
①项目目标(Project Targets)管理
单击 Manage Project Items
,在Project Items
一栏下, 在Project Targets
下面双击Target 1
可以改变目标文件名字,将其改为蓝桥杯
。
②分组管理
同样双击Groups
栏下的Source Group 1
将其改为Source
。在Groups
栏下点击Groups
栏右侧新建按钮可新建Group,再新建一个Group命名如为Library
。
③组内文件的添加
在main
Group的条件下,在Files
栏下点击Add Files…
按钮,添加对应的文件到相应的Group下。如下图所示。
此处的工程项目管理是添加相应的文件到工程。
再看此时的左侧工程管理栏,C文件已经在工程中被添加到相应的模块文件夹中了。
5、路径包含的设置(头文件)
在《keil中#include后的尖括号与引号的区别》里解释了两个概念:当前目录和标准系统目录。
显然对于keil来说新建工程时自动生成的Project
文件夹才是keil承认的当前目录。而并非是用户自己建立的大工程文件夹蓝桥杯
。
如果使用双引号进行文件包含,IDE会先在当前目录中查找文件,再去标准系统目录查找。在此建议,使用尖括号来进行文件包含,使IDE在编译时直接在标准系统目录中查找文件,以节约时间,而且可以通过路径包含的设置将任意目录设置为标准系统目录,使头文件的存放更加灵活,适合模块化编程。
通过菜单选项进行设置标准系统目录,来指定用尖括号时的查找路径。在keil中的具体操作就是在(Project
->)Options for Target''
->C51
可用于设置当前项目的C51编译器控制命令。在Include Paths
一栏用于设定包含文件的目录路径。
单击下图红框中按钮,进行标准系统目录包含路径的添加。只需要将用到的所有用户自己写的头文件的存放路径添加到即可。
单击下图红框中按钮,新建一个路径。
单击下图红框中按钮,对新建的路径添加具体路径。
选择到头文件所在的文件夹即可,因为添加的是路径,所以此处操作进行的是选择文件夹,并不是选择头文件。头文件只有在程序中被包含被调用时才会添加到工程。
添加完头文件路径后,进行编译,如下图,工程中依旧没由头文件。
整个工程是用C文件搭建起来的,头文件只有被包含被调用时,才会被添加到工程。