3.2 数据类型介绍与演练
3.2.1 数据类型介绍
PICC数据类型可分为基本类型、构造类型、指针类型和空类型4类,具体分类情况如图3-1所示。
图3-1 PICC数据类型
PICC编译器所支持的数据类型如表3-3所示。
表3-3 PICC编译器所支持的数据类型
1.char字符类型
char类型的长度是一个字节,通常用于定义处理字符数据的变量或常量。分为无符号字符类型(unsigned char)和有符号字符类型(signed char),默认值为signed char类型。unsigned char类型用字节中所有的位来表示数值,所以表达的数值范围为0~255。signed char类型用字节中最高位字节表示数据的符号,“0”表示正数,“1”表示负数,负数用补码表示。所能表示的数值范围为-128~+127。unsigned char通常用于处理ASCII字符或处理小于或等于255的整型数。
2.int整型
int整型长度为两个字节,用于存放一个双字节数据。分为有符号整型数(signed int)和无符号整型数(unsigned int),默认值为signed int类型。signed int表示的数值范围为-32768~+32767,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数。unsigned int表示的数值范围是0~65535。
3.long长整型
long长整型长度为4个字节,用于存放一个4字节数据。分为有符号长整型(signed long)和无符号长整型(unsigned long),默认值为signed long类型。
4.float和double浮点型
PICC中描述浮点数是以IEEE-754标准格式来实现的。此标准下定义的浮点数为32位长,在单片机中要用4个字节存储。为了节约单片机的数据空间和程序空间,PICC专门提供了一种长度为24位的截短型浮点数,它损失了浮点数的一点精度,使浮点运算的效率得以提高。在程序中定义的float型标准浮点数的长度固定为24位,double型浮点数一般也为24位,但可以在程序编译选项中选择double型浮点数为32位,以提高计算的精度。
一般控制系统中关心的是单片机的运行效率,因此,在精度能够满足的前提下尽量选择24位的浮点数运算。
5.指针型
指针型本身就是一个变量,在这个变量中存放指向另一个数据的地址。这个指针变量要占据一定的内存单元。
6.bit位类型
bit位类型是PICC编译器的一种扩充数据类型,利用它可定义一个位变量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1。例如:
bit flag //定义位变量flag
3.2.2 数据类型演练
1.演练1——数据类型的长度
(1)实例说明
这个实例主要演练int和unsigned int用于延时的不同效果,说明它们的长度是不同的。具体如下:源程序中,先将变量i、j设为int整型数据,观察RD0脚外接灯的延时效果,再将程序中的变量i、j改为unsigned int整型数据,再观察RD0脚外接灯的延时效果。
(2)源程序
#include<pic.h> #define uchar unsigned char #define uint unsigned int __CONFIG(HS&WDTDIS&LVPDIS); /********延时程序********/ void Delay_ms(uint xms) { int i,j; for(i=0;i<xms;i++) { for(j=0;j<71;j++) ; } } void main() { TRISD=0x00; //RD口设置为输出 PORTD=0xff; for(;;) { RD0=!RD0; //将RD0取反 Delay_ms (1000); //将实际参数1000传递给形式参数i, } }
(3)实验演示
① 打开MPLAB IDE软件,建立工程项目,再建立一个名为ch3_1.c的源程序文件,输入上面源程序,对源程序进行编译,产生ch3_1.hex目标文件。
② 将DD-900mini实验板JP1的LED、VCC两插针短接,为LED灯供电。
③ 将PIC核心板RD0、VDD、GND通过4根杜邦线连到DD-900mini实验板P00(外接D0灯)、VCC、GND上。
④ 将PICKIT2连接到PIC核心板的电话接口,同时,用5V电源适配器为PIC核心板供电,将PICKIT2插接在PC的USB口上,DD-900mini实验板不用单独供电(由PIC核心板为其供电)。
⑤ 进行硬件仿真或将程序下载到PIC16F877A单片机中,观察实验效果。
该实验程序在所附光盘的ch3\ch3_1文件夹中。
主函数中,有一行是RD0=!RD0,在RD0前有一个“!”,“!”是C语言的一个运算符,表示取反,即对该符号后面的变量值取反,取反完毕后还要使用赋值符号,将取反后的值再赋给RD0,这样,如果原来RD0是低电平(LED亮),那么取反后,RD0就是高电平(LED灭);反之,如果RD0是高电平,取反后,RD0就是低电平,这条指令被反复执行,接在RD0上的灯就会不断“亮”、“灭”。这条指令会被反复执行的关键在于main中有一行无限循环语句:for(;;)。
实验中会发现,若将程序中的变量i、j改为unsigned int型数据,则灯的闪烁速度明显快一些,即延时时间变短了。尽管这个程序实际意义不大,但它可以帮助理解unsigned int和int数据类型的区别。
2.演练2——数据的溢出
(1)实例说明
这个实例主要演示无符号字符型数据和有符号整型数据的取值范围,实验时采用软件进行仿真。
(2)源程序
#include "pic.h" void main() { unsigned char a,b; int c,d; for(;;) { a=255; b=a+1; c=32767; d=c+1; } }
(3)软件仿真
① 打开MPLAB IDE软件,建立工程项目,再建立一个名为ch3_1.c的源程序文件,输入上面源程序。
② 选择“Project→Build Options→Project”项,进入“PCC Compiler”设置项,在“Global optimization level”下拉列表中选择“OFF”,如图3-2所示,这样,就可以将C优化级别设置为“0”,避免C编译器认为无意义而自动优化得不到所需要的结果。
③ 单击菜单“Debugger→Select Tool”,选择其中的“MPLAB SIM”,如图3-3所示。
④ 执行“Debugger→StopWatch”,弹出观察窗口。打开“Add Symbol”后面的下拉列表框,选中需要观察的变量名,然后单击“Add Symbol”按钮,使这一变量出现在观察窗口中,如图3-4所示。
图3-2 关闭优化
图3-3 进入软件仿真
图3-4 观察窗口
⑤ 增加变量后的观察窗口如图3-5所示。
图3-5 增加变量后的窗口
⑥ 按F8键单步执行程序,同时在变量窗口中观察变量,结果如图3-6所示。
图3-6 得到的结果
⑦ 从源程序中可以看出,变量a、b是unsigned char型字符数据,a的初值为255,转换成二进制为11111111,加1后变为100000000,由于字符型数据使用1个字节存储,因此,最前面的“1”丢失,变为00000000,转换成十进制为“0”,所以,b的值为“0”。
变量c、d是int整型数据,c的初值为32767,转换成二进制为0111111111111111(共2个字节),加1后变为1000000000000000,而这个数正是-32768,所以在二进制数中,d的值是-32768。
该实验程序在所附光盘的ch3\ch3_2文件夹中。