C51语言针对8051单片机的硬件特点在C语言的基础上,扩展了4种数据类型,而且必须注意的是,扩展的这4种数据类型是不能够用指针来对它们进行存取的。接下来让我们一起了解这4种扩展数据类型吧。
1.位变量 bit
位变量 bit 就比较简单了,由于8051单片机能够进行位操作因此扩展了 bit 数据类型,顾名思义,bit就是用来定义位变量的,并且用 bit 数据类型定义的变量其值只能是 1(ture)或者 0 (false)。
<1>C51语言使用关键字“bit”来定义位变量 ,其一般格式为:
//一般格式:
bit bit_name;
//例如:
bit ov_flag; //将ov_flage定义为位变量
bit lock_pointer; //将lock_pointer定义为位变量
<2>C51语言的函数可以包含类型为“bit”的参数,也可将其作为返回值。
//例如:
bit fun(bit b0,bit b1) //位变量b0,b1作为函数fun的参数
{
......
return (b1); //位变量b1作为return函数的返回值
}
<3>位变量定义的限制,位变量不能用来定义指针和数组。
//例如:
bit *ptr; //错误,bit不能用来定义指针
bit array[]; //错误,bit不能用来定义数组array[]
2.特殊功能寄存器sfr
8051单片机的特殊功能寄存器分布在片内数据存储区的地址单元80H ~ FFH之间,“sfr”数据类型占用一个内存单元。利用它可以访问8051单片机内部的所有特殊功能寄存器。
定义语法:
sfr 特殊功能寄存器名字 = 特殊功能寄存器地址;
//例如:
sfr P1 = 0x90; //定义P1端口在片内的寄存器
//因此在后序程序中可以有
P1 = 0xff; //使P1的所有引脚输出高电平,来操作特殊功能寄存器
注意:
<1>“sfr”后面必须跟一个特殊功能寄存器名
<2>“=”后面的地址必须是常数,不允许带有运算符的表达式,这个常数值的范围必须在特殊功能寄存器地址范围内,位于0x80H ~ 0xFFH之间。
3.特殊功能寄存器sfr16
“sfr16”数据类型占用两个内存单元,可以理解为两个连续地址的sfr,和sfr一样,是用于操作特殊功能寄存器的。
定义语法:
sfr16 特殊功能寄存器名字 = 特殊功能寄存器地址;
//例如:
sfr16 DPTR = 0x82; //定义片内16位数据指针寄存器DPTR
注意:
0x82H为其低8位地址,而高8位为紧接着 0x82H的 0x83H。
4.特殊功能位sbit
“sbit”用来声明可位寻址的特殊功能寄存器和别的可位寻址的目标。这里说一个如何判断该特殊功能寄存器是否可位寻址的方法:
根据该特殊功能寄存器字节地址来判断,如果字节地址的低四位为0或8,那么该特殊功能寄存器可位寻址。
例如:
<1>中断允许寄存器IE,它的字节地址为A8H,那么IE可位寻址。
<2>I/O端口P0,它的字节地址位80H,那么P0可位寻址。
<3>定时器工作方式寄存器TMOD,它的字节地址为89H,那么TMOD不可位寻址。
好,下面介绍sbit的3种定义方法:
<1> sbit 位名 = 特殊功能寄存器 ^ 位置;
//例如:
sbit CY = PSW^7; //定义CY位为PSW.7,位地址为0xd7
sbit OV = PSW^2; //定义OV位为PSW.2,位地址为0xd2
注意:
符号“ ^ ”前面是特殊功能寄存器的名字,符号" ^ "后面的数字定义特殊功能寄存器可位寻址位在寄存器中的位置,取值必须是0 ~ 7。
<2> sbit 位名 = 字节地址 ^ 位置;
//例如:
sbit CY = 0xd0^7; //CY位地址为0xd7
sbit OV = 0xd0^2; //OV位地址为0xd2
<3> sbit 位名 = 位地址;
//例如:
sbit CY = 0xd7; //CY位地址为0xd7
sbit OV = 0xd2; //OV位地址为0xd2
值得注意
值得注意的是我们对于sbit数据类型的使用频率是比较高的,对于bit数据类型的使用频率较低,而sfr和sfr16这两种数据类型C51语言为了方便我们用户处理,把8051单片机(或8052单片机)常使用的特殊功能寄存器和其中的可寻址位进行了定义,放在了reg51.h(或reg52.h)的头文件中,使用时我们仅仅只需要使用#include将头文件包含到程序中即可使用特殊功能寄存器名和其中的可寻址位的名称了。当然可以在keil环境或者文本编辑器中打开这个头文件查看其内容,也可以根据需求进行相应的增减操作。
结束语
好的,对于这四种C51语言的扩展类型就介绍到这里,希望对大家能够有所帮助。最后,我也希望我自己能够一直坚持下去,向着美好的未来前进,加油!💪
本次励志:
Without a struggle, there can be no progress