没有合适的资源?快使用搜索试试~ 我知道了~
C51程序设计(完整).doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 71 浏览量
2022-06-13
19:02:44
上传
评论
收藏 623KB DOC 举报
温馨提示
试读
42页
C51程序设计(完整)
资源推荐
资源详情
资源评论
第1章 C51 数据类型与运算
1.1 C51 数据类型
C51 的数据类型如下所示:
C51 编译器支持的数据类型、长度和值域如下表 1-1 所示。
与面向数学运算的计算机相比,51 单片机对变量类型或数据类型的选择更具有关键性
意义。如果在程序设计中使用大量而不必要的变量类型,这会导致 C 编译器调用库函数的
数量,以处理大量的变量类型和数据类型。所以必须特别慎重地进行变量和数据类型的选
择。
表 1-1 C51 的数据类型
数据类型 长度(bit) 长度(Byte) 值域范围
bit
unsigned char
signed char
unsigned int
signed int
unsigned long
signed long
1
8
8
16
16
32
32
—
1
1
2
2
4
4
0,1
0~255
-128~127
0~65535
-32768~32767
0~4 294 967 295
-2 147 483 648~2 147 483 647
数据类型
基本类型
位 型
( bit )
字 符 型
( char )
整 形
( int )
长 整 型
( long )
浮 点 型
( float )
双 精 度 浮 点 型
( double )
构造类型
数 组 类 型
( array )
结 构 体 类 型
( struct )
共用体型( union )
枚 举 型
( enum )
指针类型
空类型
1
float
double
一般指针
32
64
24
4
8
3
±1.176E-38 ~±3.40E + 38(6 位 数
字)
±1.176E-38~±3.40E+38(10 位数
字)
存储空间 0~65535
1.2 C51 数据存储类型
C51 编 译 器 还 可 以 通 过 将 变 量 、 常 量 定 义 成 不 同 的 存 储 类 型
(data,bdata,idata,pdata,xdata,code)的方法,将它们定义在不同的存储区中。
存储类型与 51 单片机实际存储空间的对应关系如表 1-2 所示。
表 1-2 C51 存储类型与 51 单片机实际存储空间的对应关系
存储类型 与存储空间的对应关系
data
bdata
idata
pdata
xdata
code
直接寻址片内数据存储区,访问速度快(128B)
可位寻址片内数据存储区,允许位与字节混合访问(16B)
间接寻址片内数据存储区,可访问片内全部 RAM 地址空间(256B)
分页寻址片外数据存储区(256B),由 MOVX @Ri 访问
寻址片外数据存储区(64KB),由 MOVX @DPTR 访问
寻址代码存储区(64KB),由 MOVC @DPTR 访问
当使用存储类型 data、bdata 定义常量和变量时,C51 编译器会将它们定位在片内数据
存储区中。片内 RAM 是存放临时性传递变量或使用频率较高变量的理想场所。访问片内数
据存储器(data、bdata、idata)比访问片外数据存储器(xdata、pdata)相对快一些,因此
可将经常使用的变量置于片内数据存储器,而将规模较大的或不常使用的数据置于片外数
据存储器中。
C51 存储类型及其大小和值域如表 1-3 所示。例如:
表 1-3 C51 存储类型及其大小和值域
存储类型 长度(bit) 长度(Byte) 值域范围
data
idata
pdata
xdata
code
8
8
8
16
16
1
1
1
2
2
0~255
0~255
0~255
0~65
535
0~65
535
char data var1; /*字符变量 var1 被定义为 data 存储类型,定位在片内 RAM 中*/
bit bdata flags; /*位变量 flags 被定义为 data 存储类型,定位在片内 RAM 中的位寻址区*
2
/
/*(20H~2FH)*/
float idata x,y,z; /*浮点变量 x,y,z 被定义为 idata 存储类型,定位在片内
RAM 中,并只能用间接寻址的方法进行访问*/
unsigned int pdata dimension; /*无符号整型变量 dimension 被定义为 pdata 存储类
型,定位在片外 RAM 中,并用 MOVX @Ri 访问*/
unsigned char xdata vector[10][4][4]; /*无符号字符三维数组变量 vector[10][4][4]
被 定 义 为 xdata 存储 类 型 , 定 位 在 片 外
RAM 中,占据 10×4×4=160 个字节空间*/
如果在变量定义时省略存储类型标志符,编译器会自动默认存储类型。默认的存储类
型进一步由 SMALL、COMPACT 和 LARGE 存储模式指令限制,见表 1-4 所示。
存储模式决定了变量的默认存储类型、参数传递区和无明确存储类型的说明。例如,
char var1 在 SMALL 存储模式下,var1 被定位在 data 存储区;在 COMPACT 模式下,var1 被
定位在表 1-4 存储模式及说明
存储模式 说明
SMALL
参数及局部变量放入可直接寻址的片内存储器(最大 128B,默认存储类型是 data),因此
访问十分方便。另外所有对象,包括栈,都必须嵌入片内 RAM。栈长很关键,因为实际栈长
依赖于不同函数的嵌套层数。
COMPA
CT
参数及局部变量放入分页片外存储区(最大 256B,默认存储类型是 pdata),通过寄存
器 R0 和 R1 间接寻址,栈空间位于片内数据存储区中。
LARGE
参数及局部变量放入片外数据存储区(最大 64KB,默认存储类型是 xdata),使用数据指
针 DPTR 来进行寻址。用此数据指针访问的效率较低,尤其是对两个或多个字节的变量,这种
数据类型的访问机制直接影响代码的长度,另一不方便之处在于这种数据指针不能对称操作。
pdata 存储区,在 LARGE 模式下,var1 被定位在 xdata 存储区中。
1.3 C51 定义 SFR(特殊功能寄存器)
51 单片机内有 21 个特殊功能寄存器(SFR),它们分布在片内 RAM 的高 128B 中,
对特殊功能寄存器只能用直接寻址方式访问。特殊功能寄存器中还有 11 个可位寻址的寄存
器。
在 C51 中,特殊功能寄存器及其可位寻址的位是通过关键字 sfr 和 sbit 来定义的,这种
方法与标准 C 不兼容,只能用于 C51。例如:
sfr PSW=0xD0; /*定义程序状态字 PSW 的饿地址为 D0H*/
sfr TMOD=0x89; /* 定 义 定 时 器/ 计数 器 方 式 控制寄存器 TMOD 的 地 址为
89H*/
sfr P1=0x90; /*定义 P1 口的地址为 90H*/
PSW 是可位寻址的 SFR,其中各位可用 sbit 定义。例如:
3
sbit CY=0Xd7; /*定义进位标志 CY 的地址为 D7H*
sbit AC=0xD0^6; /*定义辅助进位标志 AC 的地址为 D6H*/
sbit RS0=0XD0^3; /*定义 RS0 的地址为 D3H*/
注意:sfr 和 sbit 只能在函数外使用,一般放在程序的开头。
实际上大部分特殊功能寄存器及其可位寻址的位的定义在 reg51.h、reg52.h 等头文件中
已经给出,使用时只需在源文件中包含相应的头文件,即可使用 SFR 及其可位寻址的位;
而对于未定义的位,使用前必须先定义。例如:
#include<reg51.h>
sbit P10=P1^0;
sbit P12=P1^2;
main()
{
P10=1;
P12=0;
PSW=0x08;
……
}
1.4 C51 定义并行口
51 单片机的基本 I/O 只有 P0、P1、P2 和 P3 四个,除此之外,还可以在片外扩展 I/O 口
和其他功能芯片,它们与外部数据存储器统一编址,即 51 单片机把它们当做外部数据存储
器单元。
P0、P1、P2 和 P3 的定义在头文件 reg51.h 和 reg52.h 中,扩展的外部 RAM 单元和外部
I/O 需要用户自己定义。例如:
#include<absacc.h>
#define PA XBYTE[0xffec]
Main()
{
PA=0x3A; /*将数据 3AH 写入地址为 0xffec 的存储单元或 I/O 端口*/
}
以上程序用 C 的编译预处理命令#define 将 PA 定义为外部 I/O 口,地址为 0xffec,是单
字节量。其中 XBYTE 是一个指针,指向外部数据存储器的零地址单元,它是在头文件
absacc.h 中定义的。
1.5 C51 定义位变量
51 单片机 位运算器,C51 相应地设置了位数据类型。
4
1. 位变量的定义
位变量用关键字“bit”来定义,它的值是一个二进制位。例如:
bit lock; /*将 lock 定义为位变量*/
bit direction; /*将 direction 定义为位变量*/
2. 函数参数和返回值的类型
函数可以有 bit 类型参数,也可以有 bit 类型的返回值。例如:
bit func(bit b0,bit b1)
{
bit a;
……
Return a;
}
使用禁止中断宏命令#progma disable 或指定明确的寄存器切换(using n)的函数不能返
回位值。
3. 对位变量定义的限制
不能定义位变量的指针,如:
bit *bit_point;
不能定义位数组,如:
bit bit_array[5];
位变量说明中可以指定存储类型,位变量的存储类型只能是 bdata。
在程序设计时,对于可位寻址的对象,既可以字节寻址又可以位寻址的变量,则其存
储类型只能是 bdata。
使用时,先说明字节变量的数据类型和存储类型。例如:
int bdata a; /*整型变量 a 定位在片内数据存储区中的可位寻址区*/
char bdata b[4]; /*字符数组 b 定位在片内数据存储区中的可位寻址区*/
然后,使用 sbit 关键字定义其中可独立寻址的位变量。例如:
sbit a0=a^0; /*定义 a0 为 a 的第 0 位*/
sbit a12=a^12; /*定义 a12 为 a 的第 12 位*/
sbit b03=b[0]^3; /*定义 b03 为 b[0]的第 3 位*/
sbit b36=b[3]^6; /*定义 b36 为 b[3]的第 6 位*/
sbit 定义要求基址对象的存储类型为 bdata。
使用 sbit 类型位变量时,基址变量和其对应的位变量的说明必须在函数外部进行。
1.6 C51 运算符、表达式及其规则
5
剩余41页未读,继续阅读
资源评论
老帽爬新坡
- 粉丝: 79
- 资源: 2万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 珍藏多年的基于matlab实现潮流计算程序源代码集合,包含多个潮流计算程序.rar
- 使用FPGA实现串-并型乘法器
- 基于matlab实现针对基于双曲线定位的DV-Hop算法中误差误差出一种基于加权双曲线定位的DV-Hop改进算法.rar
- 基于matlab实现由遗传算法开发的整数规划,车辆调度问题.rar
- 电视家7.0(对电视配置要求高).apk
- 免费计算机毕业设计-基于JavaEE的医院病历管理系统设计与实现(包含论文+源码)
- 手机端 我的世界融合植物大战僵尸版.apk
- 植物大战僵尸 · 戴夫的老年生活 手机版.apk
- Runcraft · 我的世界跑酷游戏 手机端.apk
- pta题库答案c语言.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功