keil C51入门教程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三章 C51语言
作者:彭保基 西安交通大学 电信学院 电子2002级 版本:V1.1 写作时间:2004年12月---2005年3月
本章主要介绍在Keil 的集成环境下用C 语言编程,并对C51语言与标准的C 语言的异同进行比较。由于篇幅有限并考虑到读者大部分已经学过标准的C 语言,不再对C 语言进行深入的讲解;如果读者想深入了解和掌握C 语言,则可查阅和参考其他相关资料。
第一节 C51简介
汇编语言是编写单片机程序的常用语言之一,很多老的单片机开发者使用汇编语言已经成为了一种习惯;汇编语言编写的程序所生成的代码效率很高,能直接操作硬件,指令的执行速度快。但其指令系统的固有格式受硬件结构的限制很大,且难于编写与调试,可移植性也差。随着单片机硬件性能的提高,其工作速度越来越快,因此在编写单片机应用系统程序时,更着重于程序本身的编写效率。与汇编语言相比,C 语言在功能、结构、可读性和可维护性上有明显的优势,因而易学易用;在开发大型软件时更能体现其高级语言的优势。因此,近些年来越来越多地人喜欢用C 语言来编写单片机的应用程序。
本章所说的C51语言就是标准C 语言的变种,是标准C 语言的扩展;关于两者的区别,将在下一节中详细的介绍。
第二节 C51与ANSI C 的比较
Keil C51编译器是一个完全支持ANSI 标准C 语言的编译器,除了少数关键的地方之外,Keil C51和标准ANSI C 语言是基本类似的;但由于51单片机的特殊性,Keil C51在标准C 语言基础上进行了扩展,使其能够更有效地利用单片机各种有限的资源。深入理解和掌握C51对标准C 语言的扩展,是学好C51语言的关键。
一、 Keil C51扩展关键字
关键字 用 途 说 明
bit 声明一个位标量或位类型的函数
sbit 位标量声明
声明一个可位寻址变量 Sfr 声明一个特殊功能寄存器 Sfr16 特殊功能寄存器声明
声明一个16位的特殊功能寄存器 data 直接寻址的内部数据存储器 bdata
可位寻址的内部数据存储器
idata 间接寻址的内部数据存储器 pdata 分页寻址的外部数据存储器
xdata 外部数据存储器 code 存储器类型说明 程序存储器
interrupt 中断函数说明 定义一个中断函数 reentrant 再入函数说明 定义一个再入函数 using 寄存器组定义
定义芯片的工作寄存器
_at_ 绝对定位
_task_ alien small compact large
存储模式
附表3- C51编译器的扩展关键字
二、 数据类型
Keil C51编译器支持下表列出的数据类型。
从表中可以看出,C51提供以下几种扩展数据类型: bit 位变量值为0或1
sbit 从字节中定义的位变量 0或1 sfr sfr 字节地址 0~255 sfr16 sfr 字地址 0~65535
三、 存储类型
Keil C51编译器提供对51单片机系统所有存储区的访问,变量可以在定义时包含存
储类型,每个变量可以明确地分配到指定的存储空间。与存储器有关的类型如下表所示:
存储类型长度
(bit)
值域范围值域范围与存储空间的对应关系例子
data8 0~255直接寻址片内低128 字节片内数据RAM char data x
等效于char x bdata8 32~47按位或字节寻址片内RAM 的20H~2FH 地址空间int bdata x idata8 0~255间接寻址片内数据RAM 的00H~FFH 地址空间 int idata x pdata8 0~255分页寻址256 字节片外RAM,对应MOVX @Ri int pdata x xdata16 0~65535寻址64K 字节片外RAM,对应MOVX @DPTR int xdata x code16 0~65535寻址64K 程序ROM,对应MOVC @DPTR int code x 访问内部数据存储器将比访问外部数据存储器快的多;由于这个原因,你应该把频繁使
用的变量放置在内部数据存储器中,把很少使用的变量放在外部数据存储器中;这通过使用SMALL模式将很容易就做到。通过定义变量时包括存储器类型,你可以定义此变量存储在
你想要的存储器中。
如果在变量的定义中没有包括存储器类型,编译器将自动选用默认或暗示的存储器类
型。暗示的存储器类型适用于所有的全局变量和静态变量。还有不能分配在寄存器中的函数
参数和局部变量默认的存储器类型由编译器的参数(SMALL COMPACT及LARGE)决定,
这些参数定义了编译时使用的存储模式。
四、存储模式
存储模式决定了没有指定的变量和函数的参数等的缺省存储区域。Keil C51支持3种
存储模式。
1. Small模式
所有变量都默认在8051的内部数据存储器中;这和用data 显式定义变量起到相同的作
用。在此模式下变量访问是非常快速的;然而,所有数据对象包括堆栈都必须放在内部RAM
中;堆栈空间面临溢出。因为堆栈所占用多少空间依赖于各个子程序的调用嵌套深度。
故此方式的优点是访问速度快,缺点是空间有限,只适用于小程序。
2. Compact模式
此模式中所有变量都默认在8051 的外部数据存储器的一页(256Bytes) 中,
具体哪一页可由P2口指定(在STARTUP.A51文件中说明),地址的高字节往往
通过Port 2 输出;其值必须由你在启动代码中设置,编译器不会为你设置。这
和用pdata 显式定义变量起到相同的作用。此模式最多只能提供256字节的变量,这种限制来自于间接寻址所使用的R0,R1 MOVX @R0/R1。
这种模式优点是空间较Small为宽裕速度较Small慢,较large要快,是一
种中间状态。
3. large模式
在大模式下所有的变量都默认在外部存储器中;这和用xdata 显式定义变量起到相同的
作用。数据指针DPTR 用来寻址,通过DPTR进行存储器的访问的效率很低;特别是在对一
个大于一个字节的变量进行操作时尤为明显。此数据访问类型比SMALL 和COMPACT模式
需要更多的代码
这种模式的优点是空间大,可存变量多,缺点是速度较慢。