第1章 C51程序设计基础
由此可见,在C51程序设计过程中,在满足数据要求的情况 下,应尽可能使用unsigned char变量和bit变量。signed char变 量虽然也只占用一个字节,但需要进行额外的操作来测试代 码的符号位,因此会降低代码执行效率。
14
江 阴 职 业 技 术 学 院 电 子 工 程 系
五、常量和变量
江 阴 职 业 技 术 学 院 电 子 工 程 系
第1章 C51 程序设计基础
江 阴 职 业 技 术 学 院 电 子 工 程 系
主要内容
一、C51概述 二、数据类型 三、常量和变量 四、运算符和表达式 五、C程序的基本结构 六、函数
2
江 阴 职 业 技 术 学 院 电 子 工 程 系
一、C51概述
常量是在程序运行过程中不能改 变值的量,常量的数据类型有整型、 浮点型、字符型、字符串型和位标量。
常量可用在不必改变值的场合,如固 定的数据表,字库等。
15
江 阴 职 业 技 术 学 院 电 子 工 程 系
常量的定义方式有几种:
#difine False 0x0; //用预定义语句可以定义常量 #difine True 0x1; //这里定义False为0,True为1 在程序中用到False编译时自动用0替换,同理True替换为1 unsigned int code a=100; //这一句用code把a定义在程序 存储器中并赋值 const unsigned int c=100; //用const定义c为无符号int常量 并赋值
8
江 阴 职 业 技 术 学 院 电 子 工 程 系
数据类型 unsigned char signed char unsigned int signed int unsigned long signed long
长
度
值
域
单字节 单字节 双字节 双字节 四字节 四字节
0~255 -128~+127 0~65535 -32768~+32767 0~4294967295 -2147483648~+2147483647
(3)sbit 位变量名=字节地址^位位置 sbit P1_1 = 0x90 ^ 1;
13
江 阴 职 业 技 术 学 院 电 子 工 程 系
变量数据类型的选择
在C51程序设计中,变量数据类型的定义极其重要,因为在 所有数据类型中只有bit和unsigned char两种数据类型可以直接 支持机器指令,对于其他的数据类型C51编译器都要进行一系 列复杂的变量数据和变量类型的处理,而这种处理将会对应 很长一段机器指令,最终会使程序变得复杂、庞大,运行速 度降低。
用 位标量声明 位标量声明
途
说
明
声明一个位标量或位类型的函数 声明一个可位寻址变量 声明一个特殊功能寄存器 声明一个16位的特殊功能寄存器 直接寻址的内部数据存储器 可位寻址的内部数据存储器
特殊功能寄存器声明 特殊功能寄存器声明 存储器类型说明 存储器类型说明
idata
pdata xdata code interrupt reentrant using
(一)C语言的特点
C语言简洁、紧凑,方便、灵活。一共只有32个关键字 运算符丰富,共有34种。 数据结构类型丰富(struct、union、enum 等)。 具有结构化的控制语句(if、for、switch、while 等)。 语法限制不太严格,程序设计自由度大。 生成目标代码质量高,程序执行效率高。 与汇编语言相比,用C语言写的程序可移植性好 C语言允许直接访问物理地址,能进行位(bit)操作,能 实现汇编语言的大部分功能,可以直接对硬件进行操作。 因此有人把它称为中级语言。
例1-1 流水灯
#include "REG51.H" main() {
int i,w;
TMOD=0x10; while(1) { w=0x01; // 灯的位置初值为01h // 置定时器1为方式1
for(i=0;i<8;i++)
{ P1=~w; w<<=1; delay(); // 循环点亮灯 // 点亮灯的位置移动 // 调用1 s延时
指针型本身就是一个变量,在这个变量中存放的指 向另一个数据的地址。这个指针变量要占据一定的 内存单元,对不同的处理器长度也不尽相同,在 C51中它的长度一般为1~3个字节。指针变量也具 有类型。
2. bit位标量
bit位标量是C51编译器的一种扩充数据类型,利用 它可定义一个位标量,但不能定义位指针,也不能 定义位数组。它的值是一个二进制位,不是0就是1, 类似一些高级语言中的Boolean类型中的True和 False。
}
} } 7
江 阴 职 业 技 术 学 院 电 子 工 程 系
二、数据类型
C语言的标识符和关键字 在C51编译器中,只支持标识符的前32位为有效标识, 故用户标识符不宜过长。 关键字则是编程语言保留的特殊标识符,它们具有固 定名称和含义,在程序编写中不允许标识符与关键字 相同。在KEIL uVision2中的关键字除了有ANSI C标 准的32个关键字外还根据51单片机的特点扩展了相关 的关键字。 表4-1,表中列出了KEIL uVision2 C51编译器所支 持的数据类型。
中断服务程序的现场保护和恢复,中断向量表的填写,是直接 与单片机相关的,都由C编译器代办;
提供常用的标准函数库,以供用户直接使用;
头文件中定义宏、说明复杂数据类型和函数原型,有利于程 序的移植和支持单片机的系列化产品的开发;
有严格的句法检查,错误很少,可容易地在高级语言的水平上 5 迅速地被排掉;
11
江 阴 职 业 技 术 学 院 电 子 工 程 系
3、 sfr特殊功能寄存器
sfr也是一种扩充数据类型,点用一个内存单元,值域为 0~255。利用它可以访问51单片机内部的所有特殊功能寄 存器。 如用sfr P1 = 0x90这一句定P1为P1端口在片内的寄存器, 在后面的语句中我们用以用P1 = 255(对P1端口的所有引 脚置高电平)之类的语句来操作特殊功能寄存器。 sfr关键子后面是一个要定义的名字,可任意选取,但要符 合标识符的命名规则,最好有一定的含义,如P1口可以用 P1。等号后面必须是常数(特殊寄存器直接地址),不允 许有带运算符的表达式,而且该常数必须在特殊功能寄存 器的地址范围之内(80H-FFH),具体可查看教材8051 内部RAM地址表。
19
江 阴 职 业 技 术 学 院 电 子 工 程 系
SMALL存储模式
所有缺省变量参数均装入内部RAM(与使用显 式的data关键字来定义结果相同)。使用该模比较少,遇到函数嵌套调用和函数
递归调用时必须小心,该模式适用于较小的程序。
20
江 阴 职 业 技 术 学 院 电 子 工 程 系
12
江 阴 职 业 技 术 学 院 电 子 工 程 系
4、sbit
sbit是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中 的可寻址位或特殊功能寄存器中的可寻址位。
如要访问P1.1,定义方法有三: (1)sbit 位变量名=位地址 sbit P1_1 = Ox91; //把位的绝对地址赋给位变量。 同sfr一样sbit的位地址必须位于80H-FFH之间。 (2)Sbit 位变量名=特殊功能寄存器名^位位置 sfr P1 = 0x90; sbit P1_1 = P1 ^ 1; 当可寻址位位于特殊功能寄存器中时可采用这种方法
18
江 阴 职 业 技 术 学 院 电 子 工 程 系
存储器类型
说
明
data bdata idata pdata xdata code
直接访问内部数据存储器(128字节),访问速度最快 可位寻址内部数据存储器(16字节),允许位与字节混合访问 间接访问内部数据存储器(256字节),允许访问全部内部地址 分页访问外部数据存储器(256字节),用MOVX @Ri指令访问 外部数据存储器(64KB),用MOVX @DPTR指令访问 程序存储器(64KB),用MOVC @A+DPTR指令访问
LARGE存储模式
所有缺省变量可放在多达64 K字节的外部
以上两句它们的值都保存在程序存储器中,而程序存储器 在运行中是不允许被修改的,所以如果在这两句后面用了 类似a=110,a++这样的赋值语句,编译时将会出错。
16
江 阴 职 业 技 术 学 院 电 子 工 程 系
变量
变量就是一种在程序执行过程中其值能不断变化的量。变量必须 先定义后使用 标准C 定义一个变量的格式如下: [存储种类] 数据类型 变量名表 如auto int a;//存储种类分:auto,static,register,extern C 51定义一个变量的格式如下: [存储种类] 数据类型 [存储器类型] 变量名表 可选 必选 可选 必选 存储器类型的说明就是指定该变量在C51硬件系统中所使用的存 储区域,并在编译时准确的定位。
存储器类型说明
存储器类型说明 存储器类型说明 存储器类型说明 中断函数说明 再入函数说明 寄存器组定义
间接寻址的内部数据存储器
分页寻址的外部数据存储器 外部数据存储器 程序存储器 定义一个中断函数 定义一个再入函数 定义芯片的工作寄存器
10
江 阴 职 业 技 术 学 院 电 子 工 程 系
1.* 指针型
float *
bit sfr sfr16 sbit
四字节 1~3字节
位 单字节 双字节 位
±1.175494E-38~±3.402823E+38 对象的地址
0或1 0~255 0~65535 0或1