CX51变量和运算符
每写一个程序,总离不开数据的应用,在学习 c51 语言的过程中掌握理解数据类型也是 很关键的。先看表 3-1,表中列出了 KEIL uVision2 单片机c语言编译器所支持的数据类型。
在标准C语言中基本的数据类型为 char,int,short,long,float 和 double,而在C51编译器中int 和 short 相同,float 和 double 相同,这里就不列出说明了。下面来看看它们的具体定 义:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4AYoyKTj-1606314629759)(C:\Users\JamesBin\Desktop\51单片机系列教程\图片\20160921225959808.png)]
CX51存储类型
8051 系列单片机在物理上有四个存储空间:
1,片内程序存储空间;
2,片外程序存储空间;
3,片内数据存储空间;
4,片外数据存储空间。
先讲数据存储器。大家都知道8051单片机数据存储器可划分为两大区域:00H~7FH为片内低128字节RAM区;80H~FFH 为特殊功能寄存器区(SFR)。地址为00H~7FH的低128字节片内RAM区又可划分为三个区域:
A、通用寄存器区:地址(00H~1FH)通用寄存器区由4个寄存器组成:0组(00H07H),1组(08H0FH),2组(10H17H),3组(18H1FH),每个寄存器组含有8个通用寄存器:R0,R1,R2,R3,R4,R5,R6,R7,共有32个通用寄存器。
B、可位寻址区:8051系列单片机RAM的可位寻址区时字节地址位20H~2FH的16字节单元,共128位。
C、用户RAM区:8051系列单片机片内RAM的用户RAM区地址位30H~7FH。堆栈也可以设置在这里。
CX51变量与运算符
bit 、 sfr 、sfr16 和sbit是Keil C51中新增的变量类型。
- bit用来定义位变量,值只能是0或1。位变量位于8051单片机内部RAM位寻址区(20H~2FH),共为16字节,最多可定义128个位变量。
- sfr用于定义特殊功能寄存器变量。该变量存储在片内的特殊功能寄存器存储区中,用来对特殊功能寄存器进行读写操作。
- sfr16也用于定义特殊功能寄存器,所不同的是它用于操作占两个字节的特殊功能寄存器。
- sbit用于定义特殊功能寄存器位变量,用来对特殊功能寄存器的可位寻址位进行读写操作。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HujtINRC-1606314629761)(C:\Users\JamesBin\Desktop\51单片机系列教程\图片\20160921230003996.png)]
1、片内储存区
- data将变量存储在片内可直接寻址的数据存储器DATA区中。DATA区位于片内RAM的低128字节(Ox00~~0X7F)。
使用data存储模式,目标代码中对变量的访问速度最快,把经常使用的变量放在DATA区可提高程序运行速度。
若定义i为存储类型为data的无符号字符型数据,可声明为:若定义i为存储类型为data的无符号字符型数据,可声明为:unsigned char data i
-
bdata用于将变量定义在数据存储器可位寻址的BDATA区,允许位与字节混合访问。
BDATA区位于单片机内部RAM字节地址Ox20~Ox2F的16个字节中,每个字节8位,共计16x8=128个可寻址位。例如如下声明后可用位变量value0访问字节value的0位:
-
idata将变量存储在片内间接寻址的数据存储区IDATA区中。IDATA区使用指针来进行寻址和访问。
51内核单片机RAM仅有128个字节,因此无间接寻址数据存储器区,idata与jdata无区别。52内核单片机RAM有256个字节,当片内128字节的直接寻址数据存储区不够用时,可以使用128字节间接寻址数据存储区,访问速度较data慢一些。
2、片外储存区
-
xdata将变量存储在片外数据存储器中,采用16位地址,可以访问外部数据存储区64KB内的任何地址。
-
pdata将变量存储在片外数据存储器中的第一页(地址0OH~FFH)中,存储空间为256字节。对PDATA区寻址,只需要装入8位地址,而对XDATA区寻址要装入16位地址,因此对PDATA区的寻址要比对XDATA区寻址快。
pdata和xdata存储类型的变量由于需要访问外存,访问速度最慢,应尽量减少对变量的访问次数。这两种类型适合保存原始数据或最终结果,需要频繁访问的中间结果应尽量不用或少用。
3、程序存储器ROM
code将变量存储在程序存储器中,变量只能读不能写,因此适合存储常量或查表类的数组数据,不能用于存储程序运行过程中需要修改的变量。如果想改变变量值,只能在程序中修改后重新将程序烧写进ROM中。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vQ0A5Lnt-1606314629762)(C:\Users\JamesBin\Desktop\51单片机系列教程\图片\timg.jpg)]
C51的语法规定、程序结构及程序设计方法都与标准的C语言程序设计相同,但C51程序与标准的C程序在以下几个方面不一样:
-
C51中定义的库函数和标准C语言定义的库函数不同。标准的C语言定义的库函数是按通用微型计算机来定义的,而C51中的库函数是按51单片机相应情况来定义的;
-
C51中的数据类型与标准C的数据类型也有一定的区别,在C51中还增加了几种针对51单片机特有的数据类型;
-
C51变量的存储模式与标准C中变量的存储模式不一样,C51中变量的存储模式是与51单片机的存储器紧密相关;
-
C51与标准C的输入输出处理不一样,C51中的输入输出是通过51串行口来完成的,输入输出指令执行前必须要对串行口进行初始化;
-
C51与标准C在函数使用方面也有一定的区别,C51中有专门的中断函数。