c51特有的数据类型有哪些:专属编译环境的专用基础数据类型
当初初学51单片机编程,最困扰我的问题就是c51特有的数据类型有哪些,一直把标准C语言的通用类型和51编译器专属类型混为一谈,写出来的代码要么编译报错,要么运行逻辑错乱,折腾了好久都摸不透问题根源。
最开始天真的以为,C51只是C语言的简单改版,所有数据类型都和电脑上的标准C一模一样。写流水灯程序的时候,不管是引脚状态还是寄存器数值,全都用char、int来定义,看着代码格式没毛病,可烧录进开发板之后,灯光闪烁节奏混乱,按键触发完全失灵,反复检查循环逻辑和延时函数,始终找不到bug在哪。
根本问题不在代码逻辑。
折腾好久才搞明白,Keil C51编译器为了适配51单片机的硬件架构,拓展了四种独有的数据类型,是标准C语言完全不具备的,这也是普通C语言代码直接移植到51项目里会出错的核心原因。我之前所有的报错,都是因为乱用通用类型替代专属硬件类型导致的。
bit是我用的最多的一个C51独有类型,专门用来定义位变量,仅占用1个二进制位的存储空间,只能存储0和1两个数值。当初不懂这个特性,所有开关状态、引脚高低电平判断都用unsigned char定义,明明只需要一个位的信息,却占用了一整个字节的内存,不仅浪费了单片机有限的存储资源,还出现过多个位变量互相干扰、数值莫名偏移的问题,替换成bit类型之后,这类bug直接彻底消失。
sbit是专门用于单片机引脚定义的专属类型,也是新手必须掌握的核心类型。
做引脚控制项目时,都是用sbit精准绑定单片机的物理引脚,比如sbit LED=P1^0; 简单一行代码就能锁定对应硬件端口,这种直接对接硬件寄存器位的定义方式,是标准C语言的任何数据类型都做不到的。试过用普通变量替代sbit定义引脚,编译直接提示非法标识,那一刻才彻底分清通用类型和专属类型的区别。
剩下两个独有类型是sfr和sfr16,专门用来操作单片机的特殊功能寄存器。sfr适配8位寄存器,能够直接通过地址定义寄存器变量,精准操控单片机的定时器、中断、串口等功能模块;sfr16则是针对16位寄存器设计的,可以直接整合高低八位寄存器,不用分开赋值运算,极大简化了定时器、计数器的代码编写流程。之前强行用int类型定义寄存器参数,不仅无法匹配硬件地址,还会直接触发编译器报错,完全无法正常编译运行。
网上很多教程会把通用的char、int、float算成C51特有类型,其实那都是错的,这些都是标准C通用数据类型,不算51专属。真正属于C51独有的,只有bit、sbit、sfr、sfr16这四个,所有硬件相关的变量定义,都离不开这四种专属类型。
那天把所有变量全部替换成对应C51专属类型,重新编译烧录后,开发板的流水灯稳稳的按预设节奏闪烁,终于不用再反复改代码试错,随手合上了编辑器窗口。