第1章 C51程序设计基础

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
17


江 阴 职 业 技 术 学 院 电 子 工 程 系
注意:



AT89C51芯片中RAM只有低128位,位于80H到FFH的 高128位则在52芯片中才有用,并和特殊寄存器地址重 叠。(见下表) 如果省略存储器类型,系统则会按编译模式 SMALL,COMPACT或LARGE所规定的默认存储器类型去 指定变量的存储区域。无论什么存储模式都可以声明 变量在任何的8051存储区范围,然而把最常用的命令 如循环计数器和队列索引放在内部数据区可以显著的 提高系统性能。 变量的存储种类与存储器类型是完全无关的。
LARGE存储模式
所有缺省变量可放在多达64 K字节的外部
常量是在程序运行过程中不能改 变值的量,常量的数据类型有整型、 浮点型、字符型、字符串型和位标量。
常量可用在不必改变值的场合,如固 定的数据表,字库等。
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常量 并赋值
由此可见,在C51程序设计过程中,在满足数据要求的情况 下,应尽可能使用unsigned char变量和bit变量。signed char变 量虽然也只占用一个字节,但需要进行额外的操作来测试代 码的符号位,因此会降低代码执行效率。
14
江 阴 职 业 技 术 学 院 电 子 工 程 系
五、常量和变量
指针型本身就是一个变量,在这个变量中存放的指 向另一个数据的地址。这个指针变量要占据一定的 内存单元,对不同的处理器长度也不尽相同,在 C51中它的长度一般为1~3个字节。指针变量也具 有类型。
2. bit位标量
bit位标量是C51编译器的一种扩充数据类型,利用 它可定义一个位标量,但不能定义位指针,也不能 定义位数组。它的值是一个二进制位,不是0就是1, 类似一些高级语言中的Boolean类型中的True和 False。
中断服务程序的现场保护和恢复,中断向量表的填写,是直接 与单片机相关的,都由C编译器代办;
提供常用的标准函数库,以供用户直接使用;
头文件中定义宏、说明复杂数据类型和函数原型,有利于程 序的移植和支持单片机的系列化产品的开发;
有严格的句法检查,错误很少,可容易地在高级语言的水平上 5 迅速地被排掉;
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; 当可寻址位位于特殊功能寄存器中时可采用这种方法
用 位标量声明 位标量声明



声明一个位标量或位类型的函数 声明一个可位寻址变量 声明一个特殊功能寄存器 声明一个16位的特殊功能寄存器 直接寻址的内部数据存储器 可位寻址的内部数据存储器
特殊功能寄存器声明 特殊功能寄存器声明 存储器类型说明 存储器类型说明
idata
pdata xdata code interrupt reentrant using
}
} } 7
江 阴 职 业 技 术 学 院 电 子 工 程 系
二、数据类型



C语言的标识符和关键字 在C51编译器中,只支持标识符的前32位为有效标识, 故用户标识符不宜过长。 关键字则是编程语言保留的特殊标识符,它们具有固 定名称和含义,在程序编写中不允许标识符与关键字 相同。在KEIL uVision2中的关键字除了有ANSI C标 准的32个关键字外还根据51单片机的特点扩展了相关 的关键字。 表4-1,表中列出了KEIL uVision2 C51编译器所支 持的数据类型。
19
江 阴 职 业 技 术 学 院 电 子 工 程 系
SMALL存储模式
所有缺省变量参数均装入内部RAM(与使用显 式的data关键字来定义结果相同)。使用该模式的
优点是访问速度快,缺点是空间有限,而且分配
给堆栈的空间比较少,遇到函数嵌套调用和函数
递归调用时必须小心,该模式适用于较小的程序。
20
江 阴 职 业 技 术 学 院 电 子 工 程 系
3
江 阴 职 业 技 术 学 院 电 子 工 程 系
(二)C51和汇编比较 (1) 下面结合8051介绍单片机C语言的优越性: 不懂得单片机的指令集,也能够编写完美的单片机程序; 无须懂得单片机的具体硬件,也能够编出符合硬件实际 的专业水平的程序; 不同函数的数据实行覆盖,有效利用片上有限的RAM空 间;
11
江 阴 职 业 技 术 学 院 电 子 工 程 系
3、 sfr特殊功能寄存器



sfr也是一种扩充数据类型,点用一个内存单元,值域为 0~255。利用它可以访问51单片机内部的所有特殊功能寄 存器。 如用sfr P1 = 0x90这一句定P1为P1端口在片内的寄存器, 在后面的语句中我们用以用P1 = 255(对P1端口的所有引 脚置高电平)之类的语句来操作特殊功能寄存器。 sfr关键子后面是一个要定义的名字,可任意选取,但要符 合标识符的命名规则,最好有一定的含义,如P1口可以用 P1。等号后面必须是常数(特殊寄存器直接地址),不允 许有带运算符的表达式,而且该常数必须在特殊功能寄存 器的地址范围之内(80H-FFH),具体可查看教材8051 内部RAM地址表。
存储器类型说明
存储器类型说明 存储器类型说明 存储器类型说明 中断函数说明 再入函数说明 寄存器组定义
间接寻址的内部数据存储器
分页寻址的外部数据存储器 外部数据存储器 程序存储器 定义一个中断函数 定义一个再入函数 定义芯片的工作寄存器
10
江 阴 职 业 技 术 学 院 电 子 工 程 系
1.* 指针型
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
例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延时
江 阴 职 业 技 术 学 院 电 子 工 程 系
第1章 C51 程序设计基础
江 阴 职 业 技 术 学 院 电 子 工 程 系
主要内容
一、C51概述 二、数据类型 三、常量和变量 四、运算符和表达式 五、C程序的基本结构 六、函数
2
江 阴 职 业 技 术 学 院 电 子 工 程 系
一、C51概述
以上两句它们的值都保存在程序存储器中,而程序存储器 在运行中是不允许被修改的,所以如果在这两句后面用了 类似a=110,a++这样的赋值语句,编译时将会出错。
16
江 阴 职 业 技 术 学 院 电 子 工 程 系
变量

变量就是一种在程序执行过程中其值能不断变化的量。变量必须 先定义后使用 标准C 定义一个变量的格式如下: [存储种类] 数据类型 变量名表 如auto int a;//存储种类分:auto,static,register,extern C 51定义一个变量的格式如下: [存储种类] 数据类型 [存储器类型] 变量名表 可选 必选 可选 必选 存储器类型的说明就是指定该变量在C51硬件系统中所使用的存 储区域,并在编译时准确的定位。
程序具有坚固性:数据被破坏是导致程序运行异常的 重要因素。C语言对数据进行了许多专业性的处理,避 免了运行中间非异步的破坏;
C语言提供复杂的数据类型(数组、结构、联合、枚 举、指针等),极大地增强了程序处理能力和灵活性;
4
江 阴 职 业 (二)C51和汇编比较(2) 技 术 提供auto、static、const等存储类型和专门针对8051单片 学 机的data、idata、pdata、xdata、code等存储类型,自动为 院 变量合理地分配地址; 电 子 工 提供small、compact、large等编译模式,以适应片上存储 程 器的大小; 系
COMPACT存储模式
所有缺省变量均位于外部RAM区的一页(与使用 显式的pdata关键字来定义结果相同),最多能够
定义256字节变量。使用该模式的优点是变量定义
空间比SMALL模式大,但运行速度比SMALL模 式慢。使用本模式时,程序通过@R0和@R1来访 问变量。
21
江 阴 职 业 技 术 学 院 电 子 工 程 系
江 阴 职 业 技 术 学 院 电 子 工 程 系
(三)KEIL C 上机步骤
(1)按照以前的方式建立项目。 (2)建立源文件,文件后缀为(*.c) (3)C51文件必须包含相关头文件。 (4)主程序中必须有一个while(1)无限 循环体。 (5)程序设计必须规范化。
6
江 阴 职 业 技 术 学 院 电 子 工 程 系
float *
bit sfr sfr16 sbit
四字节 1~3字节
位 单字节 双字节 位
±1.175494E-38~±3.402823E+38 对象的地址
0或1 0~255 0~65535 0或1
9
江 阴 职 业 技 术 学 院 电 子 工 程 系
关键字 bit sbit Sfr Sfr16 data bdata
(一)C语言的特点



C语言简洁、紧凑,方便、灵活。一共只有32个关键字 运算符丰富,共有34种。 数据结构类型丰富(struct、union、enum 等)。 具有结构化的控制语句(if、for、switch、while 等)。 语法限制不太严格,程序设计自由度大。 生成目标代码质量高,程序执行效率高。 与汇编语言相比,用C语言写的程序可移植性好 C语言允许直接访问物理地址,能进行位(bit)操作,能 实现汇编语言的大部分功能,可以直接对硬件进行操作。 因此有人把它称为中级语言。
18
江 阴 职 业 技 术 学 院 电 子 工 程 系
存储器类型


源自文库
data bdata idata pdata xdata code
直接访问内部数据存储器(128字节),访问速度最快 可位寻址内部数据存储器(16字节),允许位与字节混合访问 间接访问内部数据存储器(256字节),允许访问全部内部地址 分页访问外部数据存储器(256字节),用MOVX @Ri指令访问 外部数据存储器(64KB),用MOVX @DPTR指令访问 程序存储器(64KB),用MOVC @A+DPTR指令访问
(3)sbit 位变量名=字节地址^位位置 sbit P1_1 = 0x90 ^ 1;
13
江 阴 职 业 技 术 学 院 电 子 工 程 系
变量数据类型的选择
在C51程序设计中,变量数据类型的定义极其重要,因为在 所有数据类型中只有bit和unsigned char两种数据类型可以直接 支持机器指令,对于其他的数据类型C51编译器都要进行一系 列复杂的变量数据和变量类型的处理,而这种处理将会对应 很长一段机器指令,最终会使程序变得复杂、庞大,运行速 度降低。
相关文档
最新文档