第14章 实践项目开发——智能温控系统14.1
本章首先介绍实际项目开发中的一些技巧和规范性的内容把一些实际开发中经常使用的零散知识点逐一的讲解然后做一个温控器的小项目模拟一个空调产品的程序控制功能把项目开发的整个流程都走一遍学习一下真正的项目流程。本章内容非常重要是否把本章内容消化理解是检验是否能够真正独立开发产品的重要的一步。实际上复杂的内容只是简单内容的堆叠相信只要耐心认真反复学习实践肯定可以越过龙门步入电子工程师的行列。14.1复合数据类型-在前边学数据类型的时候主要是字符型、整型、浮点型等基本类型而学数组的时候数组的定义要求数组元素必须是相同的数据类型。在实际应用中有时候还需要把不同类型的数据组成一个有机的整体来处理这些组合在一个整体中的数据之间还有一定的联系比如一个学生的姓名、性别、年龄、考试成绩等这就引入了复合数据类型。复合数据类型主要包含结构体数据类型、共用体数据类型和枚举体数据类型。14.1.1结构体数据类型Kingst51开发板上的LED显示有三部分LED小灯、数码管和LED点阵。LED小灯是1个字节控制数码管是6个字节控制LED点阵是8个字节控制。它们都受P0口输出控制控制方式有相似性可以统一进行动态扫描刷新这三者又属于独立的LED功能显示要改变其显示内容需要单独分别赋值。三者需要允许一起处理也允许独立操作。如果分别进行变量定义一是操作容易出错二是比较零散可读性不强。于是就可以使用结构体来将这一组彼此相关的数据做一个封装既组成了一个整体易读不易错又可以独立单独处理其中某一个元素这就是结构体数据类型。结构体是一种构造而成的数据类型使用之前需要先定义它。声明结构体变量的一般格式如下struct 结构体名{类型1 变量名1;类型2 变量名2;……类型n 变量名n;} 结构体变量名1, 结构体变量名2, ... 结构体变量名n;这种声明方式是在声明结构体类型的同时又用它定义了结构体变量此时的结构体名是可以省略的但如果省略后就不能在别处再次定义这样的结构体变量了。这种方式把类型定义和变量定义混在了一起降低了程序的灵活性和可读性因此并不建议采用这种方式而是推荐用以下这种方式struct 结构体名{类型1 变量名1类型2 变量名2……类型n 变量名n};struct 结构体名 结构体变量名1, 结构体变量名2, ... 结构体变量名n;为了方便理解首先定义一个变量unsigned char keyBuff然后将LED小灯、LED数码管和LED点阵构建一个结构体类型。struct sLedBuff { //LED显示缓冲区结构uint8 array[8]; //点阵缓冲区uint8 number[6]; //数码管缓冲区uint8 single; //独立LED缓冲区};struct sLedBuff ledBuff;struct是结构体类型关键字sLedBuff 是这个结构体名字。一旦结构体构建完成sLedBuff 起到的作用和unsigned char类似是表达变量类型的。ledBuff和keyBuff类似即定义了一个sLedBuff 类型的结构体变量。如果要给结构体变量的成员赋值的话写法是ledBuff.single 0xFF;ledBuff.array[0] 0xFF;一个指针变量如果指向了一个结构体变量的时候称之为结构指针变量。结构指针变量是指向的结构体变量的首地址通过结构体指针也可以访问到这个结构变量。结构指针变量声明的一般形式如下struct sLedBuff *pledBuff;这里要特别注意的是使用结构体指针对结构体成员的访问和使用结构体变量名对结构体成员的访问其表达式有所不同。结构体指针对结构体成员的访问表达式为pledBuff -single 0xFF; 或者是(*pledBuff).single 0xFF;很明显前者更简洁所以推荐使用前者。14.1.2共用体数据类型共用体也称之为联合体共用体定义和结构体十分类似使用以下形式union 共用体名{数据类型1 成员名1数据类型2 成员名2……数据类型n 成员名n};union 共用体名 共用体变量;共用体表示的是几个变量共用一个内存位置也就是成员1、成员2……成员n都用一个内存位置。共用体成员的访问方式和结构体是一样的成员访问的方式是共用体名.成员名使用指针来访问的方式是共用体名-成员名。从程序安全性和可移植性角度考虑除非用户非常了解所使用的开发环境的实现细节否则使用共用体存在代码上的隐患所以现在诸多以安全为首要诉求的C语言编程规范禁止使用共用体。因此共用体不推荐使用也不再赘述。14.1.3枚举数据类型在实际问题中有些变量的取值被限定在一个有限的范围内。例如一个星期从周一到周日有7天一年从1月到12月有12个月蜂鸣器有响和不响两种状态等等。如果把这些变量定义成整型或者字符型不是很合适因为这些变量都有自己的范围。C语言提供了一种称为“枚举”的类型在枚举类型的定义中列举出所有可能的值并可以为每一个值取一个形象化的名字它的这一特性可以提高程序代码的可读性。枚举的说明形式如下enum 枚举名{标识符1[整型常数],标识符2[整型常数],……标识符n[整型常数]};enum 枚举名 枚举变量;枚举的说明形式中如果没有被初始化那么“整型常数”是可以被省略的如果是默认值的话从第一个标识符顺序赋值0、1、2……但是当枚举中任何一个成员被赋值后它后边的成员按照依次加1的规则确定数值。比如本章的温控器系统正常工作时一共有三种状态分别为正常工作状态设置继电器动作状态和设置报警器状态三种可以定义一个枚举类型根据枚举的定义E_NORMAL值为0E_SET_ACT值为1E_SET_ALARM值为2具体应用后续有例程。enum eStaSystem { //系统运行状态枚举E_NORMAL, E_SET_ACT, E_SET_ALARM};枚举的使用有几点要注意1、枚举中每个成员结束符是逗号而不是分号最后一个成员可以省略逗号。2、枚举成员的初始化值可以是负数但是后边的成员依然依次加1。3、枚举变量只能取枚举结构中的某个标识符常量不可以在范围之外。