《(6.7)--3.2.3 C51变量的特有数据类型.ppt》由会员分享,可在线阅读,更多相关《(6.7)--3.2.3 C51变量的特有数据类型.ppt(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、单片机单片机的的C51C51基础知识基础知识第三章第三章第第 节节3.2.3 C513.2.3 C51变量的变量的特有特有数据类型数据类型2 2C51特有的数据类型特有的数据类型C51特有的数据类型特有的数据类型bit型、sfr型和sbit型1、bit型变量型变量 51单片机中有许多可以按位(bit)进行读写操作的存储单元,都可存放0或1两个位型常量。相对应的变量为位型变量或位型变量或bit型型变量变量位型变量的一般定义形式,即 类型说明符类型说明符变量名变量名=0或或1;类型说明符为bit,可缺省的变量初值只能取值0或1。bitbit型变量型变量例如:bit door=0;定义了一个叫doo
2、r的位变量且初值为0。2 2、sfrsfr型变量型变量 80C51单片机内部有2121个特殊功能寄存器(个特殊功能寄存器(SFRSFR),),除了DPTR为16位寄存器外,其余都是8位寄存器,每个SFR都有特定的字节地址,部分SFR中还有独立的位地址。SFR型变量的一般定义形式为:类型说明符类型说明符 变量名变量名=8=8位地址常量位地址常量;sfrsfr sfr_name=sfr_name=字节地址字节地址常数常数;sfr16 sfr16 sfr_name=sfr_name=字节地址字节地址常数常数;式中,类型说明符有两种:用于8位SFR变量定义的是sfr,sfrsfr型变量型变量16位SF
3、R变量定义的是sfrl6,其中8位地址常量是指有意义的SFR字节地址,例如:例如:sfr P1=0 x90;/sfr P1=0 x90;/定义定义P1P1口口地址地址为为0 x900 x90 sfr PSW=0 xd0;/sfr PSW=0 xd0;/定义定义PSWPSW地址地址为为0 xd0 0 xd0 sfr16 DPTR=0 x82;/sfr16 DPTR=0 x82;/定义定义1616位位SFR SFR DPTRDPTR地址地址为为0 x820 x82注意:注意:C语言中十六进制整数是数值前加语言中十六进制整数是数值前加0 x或或0X前缀前缀3、sbit型变量如前所述,sbit是用于定
4、义SFR中具有位地址变量的类型说明符,变量定义可以有以下3种不同的用法:第1种:sbit位变量名位地址;位变量名位地址;将SFR的绝对位地址定义为位变量名第2种:sbit位变量名可位寻址的位变量名可位寻址的SFR字节地址字节地址相对位置相对位置 将SFR的相对位地址定义为位变量名第3种:sbit位变量名可位寻址变量位变量名可位寻址变量相对位置相对位置 将SFR的相对位位置定义位变量名“相对位置相对位置”是指相对于已定义过是指相对于已定义过SFR名称或可位寻址字节地址的位置,其名称或可位寻址字节地址的位置,其中中0表示最低位,以此类推。表示最低位,以此类推。sbit型变量sbit型型CYACF0
5、RS1RS0OVF1PCYACF0RS1RS0OVF1PCYACF0RS1RS0OVF1PCYCYACACF0F0RS1RS1RS0RS0OVOVF1F1P PD07D7HD6HD5HD4HD3HD2HD1HD0HD0HD0HPSWPSWD06D05D04D03D02D01D00绝对位地址绝对位地址相对位地址相对位地址字节地址位地址表达形式:绝对位地址、相对位地址关键词sbit用于定义SFR位地址位地址变量变量sbit型变量 1)将SFR的绝对位地址绝对位地址定义为位变量名sbit bit_name=位地址常数;例如,sbit CY=0 xD7;3)将SFR的相对位位置相对位位置定义位变量名
6、sbit bit_name=sfr_name 位位置;例如,sbit CY=PSW7;2)将SFR的相对位地址相对位地址定义为位变量名sbit bit_name=sfr字节地址 位位置;例如,sbit CY=0 xD07;sbit型型CY的三种定义形式:sbit型变量还需要注意几点:虽然bit和sbit定义的都是位型变量,但两者有很大区别:bit型变量的位地址是由编译器为其随机分配的位地址是由编译器为其随机分配的(定义时不能用户指定),位地址范围在片内RAM的可位寻址区(bdata区)中;sbit型变量的位地址位地址则由则由用户用户指定指定,位地址范围是在可位寻址的SFR单元内(利用bdata
7、限定变量存储类型后可将位地址范围扩大到bdata区)。sbit型变量sfr型变量和sbit型变量都必须定义为全局变量必须定义为全局变量,即必须在所有必须在所有C51函函数之前进行定义数之前进行定义,否则就会编译出错。例如,如下用法是错误的错误的:main()sfr P1=0 x90;/在函数中定义P1sbit p1_0=P10;/在函数中定义p1_0正确的用法正确的用法应该是:sfr P1=0 x90;/在所有函数之前定义P1sbit p1_0=P10;/在所有函数之前定义p1_0main().C51的特有数据类型C51编译器在头文件“REG51.H”中定义了全部sfr/sfr16和和部分sb
8、it变量。用一条预处理命令#include 把这个头文件包含到C51程序中,无需重新定义即可直接使用它们的名称。C51的特有数据类型例如:程序实现了单片机P1.0引脚上发光二极管的闪烁:sfr P1=0 x90;/定义P1sbit p1_0=P10;/定义p1_0main(void)/主函数while(1)p1_0=!p1_0;/p1_0交替取反 在程序中如果使用了头文件reg51.h后,原先定义原先定义P1P1变量的变量的语句(语句(sfr P1=0 x90;sfr P1=0 x90;)便可省略)便可省略。但由于头文件reg51.h中并未对P0P3寄存器中的位单元(如P1.0)进行sbit定
9、义,因此程序中还需重新定义如p1_0的sbit型变量如果如果使用了头文件使用了头文件reg51.hreg51.h后,后,原先定义原先定义P1P1变量的语变量的语句(句(sfr P1=0 x90;sfr P1=0 x90;)便可省略)便可省略。但由于头文件。但由于头文件reg51.hreg51.h中并未对中并未对P0P0P3P3寄存器中的位单元(如寄存器中的位单元(如P1.0P1.0)进行)进行sbitsbit定义,因此程序中还需重新定义如定义,因此程序中还需重新定义如p1_0p1_0的的sbitsbit型变量型变量。重写重写的实例的实例1 1程序如下程序如下:#include#include/
10、头文件头文件sbit p1_0=P10;sbit p1_0=P10;/定义位变量定义位变量p1_0p1_0mainmain()()/主函数主函数 while(1)p1_0=!p1_0;while(1)p1_0=!p1_0;/p1_0/p1_0交替取反交替取反 C51C51的特有数据类型的特有数据类型重写的程序如下:#include/51头文件sbit p1_0=P10;/定义位变量p1_0main()/主函数 while(1)p1_0=!p1_0;/p1_0交替取反 C51C51的特有数据类型的特有数据类型数据类型数据类型总结总结 C51常用的数据类型第3章 单片机的C51基础知识还需要说明一点:bit和unsigned char数据类型都可以直接支持单片机机器直接支持单片机机器指令指令,因此代码效率最高,编程时应尽量选用尽量选用bit和和unsignedchar这两种变量这两种变量。signed char虽然只占有一个字节,但CPU需要进行额外的操作来测试代码的符号位,会降低代码效率。使用浮点型变量时,编译系统将调用相应的库函数来保证运算精度,将明显增加运算时间和程序代码长度,因此,不是十分必要时应尽量尽量避免使用避免使用float数据类型数据类型。关于关于C51C51特有的数据类型就讲特有的数据类型就讲到到这里,这里,同学们同学们再见再见