目录 1
第1章 C51程序设计概述 1
1.1 C51程序特点 1
1.2 Keil C51 2
1.2.1 安装Keil C51软件 2
1.2.2 使用Keil C51软件 4
1.2.3 第1个程序“Hello C51” 7
1.3 C51编程规范以及本书约定 7
1.3.1 注释 8
1.3.2 命名 8
1.3.3 风格 9
1.3.4 本书约定 9
第2章 C51程序设计基础 11
2.1 C51的标识符 11
2.1.1 C51的标识符 11
2.1.2 C51的关键字 12
2.1.3 与ANSI C的差异 14
2.2 数据类型 15
2.2.1 变量与常量 16
2.2.2 整型(int) 16
2.2.3 浮点型(float) 18
2.2.4 字符型(char) 18
2.2.5 指针型(*) 20
2.2.6 无值型(void) 20
2.3 数据类型转换 21
2.4 变量的作用域 21
2.4.1 块结构 21
2.4.2 自动型变量 21
2.4.3 外部型变量 22
2.4.4 静态型变量 23
2.6.1 运算符 24
2.6 运算符 24
2.5 C51的分隔符 24
2.4.5 寄存器型变量 24
2.6.2 运算符的优先级 31
2.7 表达式 32
2.7.1 算术表达式 32
2.7.2 赋值表达式 32
2.7.3 逗号运算符与逗号表达式 33
2.7.4 关系表达式 34
2.7.5 逻辑表达式 34
第3章 C51语句 36
3.1 说明语句 36
3.2 表达式语句 36
3.3 复合语句 37
3.4 条件语句 37
3.5 开关与跳转语句 41
3.5.1 开关语句 41
3.5.2 跳转语句 43
3.6 循环语句 45
3.6.1 for循环 45
3.6.2 while循环 47
3.6.3 do-while循环 49
3.7 函数调用语句 50
3.8 空语句 51
3.9 C51语句的流程与控制 51
3.9.1 顺序结构(sequence) 51
3.9.2 选择结构(selection) 52
3.9.3 循环结构(repetition) 52
3.9.4 限制使用GOTO语句 53
3.9.5 逐步求精的设计方法 55
第4章 C51函数 57
4.1 函数的定义 57
4.1.1 函数参数和堆栈 58
4.1.2 用寄存器传递参数 58
4.2 main函数 59
4.3 函数的调用和返回 60
4.3.1 函数的简单调用 60
4.3.2 函数参数传递 60
4.3.3 函数的递归调用 64
4.3.4 重入函数 65
4.4 函数作用范围 66
4.5 函数的变量作用域 66
4.6 C51中断函数 67
4.6.1 中断函数的定义 67
4.6.2 内部中断函数的使用 68
4.6.3 外部中断函数的使用 69
4.6.4 扩展外部中断函数的使用 69
4.6.5 使用中断函数要注意的问题 71
4.7 C51库函数 71
4.9.1 时钟模块 72
4.9 Keil C51常用功能模块使用说明 72
4.8 实时任务函数 72
4.9.2 通信模块 75
4.9.3 键盘扫描模块 78
第5章 C51数据结构 80
5.1 C51结构 80
5.1.1 结构说明和结构变量定义 80
5.1.2 结构变量的使用 81
5.1.3 结构变量的初始化 82
5.2 数组 84
5.2.1 一维数组 84
5.2.2 一维数组初始化 87
5.2.3 一维字符串数组 89
5.2.4 二维数组 90
5.2.5 结构数组 94
5.3 联合与枚举 94
5.3.1 联合(union) 94
5.3.2 枚举(enum) 96
5.4 类型说明 98
5.5 指针 99
5.5.1 指针和地址 100
5.5.2 地址运算 104
5.5.3 指向数组元素的指针 104
5.5.4 指向二维数组的指针 105
5.5.5 指向一个由n个元素所组成的数组指针 106
5.5.6 数组与指针的关系 107
5.5.7 字符指针 109
5.5.8 指针数组 110
5.5.9 避免使用浮点指针 111
第6章 C51存储结构 113
6.1 8051存储单元与C51存储类型 113
6.1.1 8051存储单元 113
6.1.2 特殊功能寄存器 117
6.1.3 存储器模式 117
6.2 动态存储分配 119
6.3 位操作与字段结构 122
6.4 绝对地址定位 123
6.5 基于C51存储器的指针 126
6.5.1 通用指针 126
6.5.2 指定存储器指针 127
6.5.3 绝对指针 127
6.5.4 指针转化 129
6.6 结构的内存分配 131
6.6.1 直接由结构定义一个结构指针变量实现内存分配 131
6.6.2 用typedef定义新结构类型 132
6.7 Keil C51程序开机执行代码 132
第7章 预处理 133
7.1 预处理命令 133
7.1.1 文件包含指令 134
7.1.2 宏定义指令#define 134
7.1.3 #if、#else、#endif指令 136
7.1.5 const修饰符 137
7.1.4 #undef指令 137
7.2 C51编译的控制参数 138
7.3 C51头文件 140
7.3.1 C51常用的头文件 140
7.3.2 REG51.H 141
第8章 C51编译 143
8.1 Keil的编译环境μVision3 143
8.1.1 μVision3窗口与菜单 145
8.1.2 编译检查工具PC-Lint 152
8.1.3 开发工具选项 152
8.1.4 调试工具选项 157
8.2 编译过程 158
8.2.1 A51宏汇编器 159
8.2.2 映像文件 160
8.2.5 OH51目标代码到HEX文件的转换器 161
8.3 Keil C51编译器的控制指令 161
8.2.4 OC51分段目标文件转换器 161
8.2.3 LIB51库管理器 161
8.3.1 源文件控制类 162
8.3.2 目标文件(Object)控制类 162
8.3.3 列表文件(listing)控制类 162
8.4 代码优化 162
8.4.1 代码优化 162
8.4.2 对8051的特殊优化 163
8.4.3 代码生成选项 163
8.5 混合编译 163
8.5.1 项目目标和文件组 163
8.5.2 浏览项目窗口中的文件和文件组的属性 164
8.5.3 用户上电初始化程序STARTUP.A51简介 164
8.5.4 与汇编语言的接口 167
8.5.5 和PL/M-5 1的接口 173
8.6.2 资源浏览器 174
8.6.1 多个文件中查找 174
8.6 μVision3其他功能 174
8.7 出错信息 175
第9章 Keil C51的调试与仿真 176
9.1 μVision3调试器的几项功能 176
9.1.1 执行代码 176
9.1.2 完备的分析器 177
9.1.3 代码覆盖分析 177
9.2.1 简单断点 178
9.2 断点 178
9.2.2 复杂断点 179
9.2.3 观察断点 179
9.3 仿真 180
9.3.1 A/D仿真 180
9.3.2 D/A仿真 182
9.3.3 FLASH/EEPROM仿真 183
9.3.4 中断仿真 187
9.3.6 I/O端口输入/输出仿真 188
9.3.5 可编程计数器阵列PCA/CAPCOM仿真 188
9.3.7 低功耗模式仿真 189
9.3.8 串行口的输入/输出仿真 189
9.3.9 定时器/计数器仿真 190
9.3.10 看门狗仿真 191
9.4 μVision3调试命令 192
9.4.1 存储器命令 192
9.4.2 程序命令 192
9.4.3 断点命令 193
9.4.4 通用命令 193
9.5 RTX-51实时操作系统 193
9.5.1 概述 194
9.5.2 RTX-51 Tiny 的例程TRAFFIC.C 198
第10章 高级编程技术 208
10.1 定制文件 208
10.1.1 STARTUP.A51 208
10.1.2 INIT.A51 209
10.1.3 XBANKING.A51 210
10.1.4 基本的I/O函数 211
10.1.5 存储区分配函数 211
10.2 优化器 212
10.2.1 8051特定优化 212
10.2.2 生成代码选项 212
10.3 段名转换 213
10.3.1 数据目标 213
10.3.2 程序目标 214
10.4 8051派生系列 215
10.4.1 模拟器件微转换器B2系列 215
10.4.2 Atmel 89x8252和变种 215
10.4.3 Dallas 80C320、420、520和530 216
10.4.4 Dallas 80C390、80C400、5240和变种 216
10.4.8 高速运算 217
10.4.9 库函数 217
10.4.6 Infineon C517、C517A、C509和变种 217
10.4.7 数据指针 217
10.4.5 算术累加器 217
10.4.10 Philips 8xC750、8xC751和8xC752 218
10.4.11 Philips 80C51MX结构 218
10.4.12 Philips和Atmel WM双DPTR 218
第11章 C51资源文件 220
11.1 固有程序 220
11.1.1 库文件 220
11.1.2 标准类型 221
11.1.3 绝对存储区访问宏 221
11.2 程序分类 223
11.2.1 缓冲区操作 223
11.2.2 字符转换和分类 224
11.2.3 数据转换 224
11.2.4 数学程序 225
11.2.6 流输入和输出程序 226
11.2.5 存储区分配程序 226
11.2.7 字符串操作程序 227
11.2.8 可变长度参数列表程序 228
11.2.9 其他程序 229
11.3 包含文件 229
11.3.1 8051特殊功能寄存器包含文件 229
11.3.2 80C517.H 229
11.4 参考 231
第12章 使用Keil C51编程实例 288
12.1 键盘扫描程序 288
12.1.1 实例概述 288
12.1.2 程序框图及代码 288
12.1.3 用Keil C51编译与调试 294
12.2 P1口控制直流电动机实例 297
12.2.1 实例概述 298
12.2.2 程序框图及代码 298
12.2.3 用Keil C51编译与调试 300
12.3.1 实例概述 303
12.3.2 程序框图及代码 303
12.3 A/D转换实例 303
12.3.3 用Keil C51编译与调试 309
12.4 LCD显示实例 311
12.4.1 实例概述 311
12.4.2 程序框图及代码 312
12.4.3 用Keil C51编译与调试 322
12.5.2 程序框图及代码 325
12.5 主从机串口通信实例 325
12.5.1 实例概述 325
12.5.3 用Keil C51编译与调试 333
附录A 致命错误信息 336
附录B 语法和语义错误信息 339
附录C 警告信息 351
附录D L51连接定位器使用错误提示 354
附录E μVision3调试命令 362