第1章 51单片机基础 1
1.1 51单片机的发展和常见型号 1
1.1.1 51单片机的发展历史 1
1.1.2 常见的51单片机 3
1.2 51单片机的内核结构介绍 4
1.2.1 中央处理器 5
1.2.2 存储器 7
1.2.3 外部引脚 10
1.2.4 时钟模块 12
1.3 51单片机的工作方式 13
1.3.1 复位工作方式 13
1.3.2 程序执行方式 14
1.3.3 低功耗工作方式 14
1.3.4 其他工作 15
1.4 本章总结 15
第2章 51单片机的应用系统设计和软件开发环境 16
2.1 51单片机应用系统的结构 16
2.2 51单片机最小应用系统 17
2.2.1 最小应用系统的构成 17
2.2.2 时钟源 17
2.2.3 复位电路 18
2.2.4 供电系统 19
2.3 51单片机的Keil μ Vision软件开发环境 25
2.3.1 Keil μ Vision的界面 25
2.3.2 Keil μ Vision的菜单详解 26
2.3.3 使用Keil μ Vision 32
2.4 本章总结 34
第3章 51单片机的C51语言基础 35
3.1 C51语言的数据、运算符和表达式 36
3.1.1 数据和数据类型 36
3.1.2 常量和变量 37
3.1.3 存储器和寄存器变量 38
3.1.4 算术运算、赋值、逻辑运算 40
3.1.5 位操作 42
3.1.6 自增减、复合和逗号运算 43
3.1.7 运算符的优先级 44
3.2 C51语言的结构 45
3.2.1 顺序结构 45
3.2.2 选择结构 45
3.2.3 循环结构 48
3.2.4 其他结构语句 51
3.3 C51语言的函数 51
3.3.1 C51语言的函数的分类 51
3.3.2 函数的定义 52
3.3.3 函数的调用 54
3.3.4 内部函数和外部函数 56
3.3.5 变量类型以及存储方式 56
3.4 C51语言的数组和指针 59
3.4.1 数组 59
3.4.2 指针 62
3.4.3 数组和指针 63
3.4.4 字符串和指针 65
3.4.5 数组、指针和函数的联系 66
3.4.6 指针数组和指向指针的指针 67
3.5 C51语言的自构造类型 68
3.5.1 结构体 68
3.5.2 联合体(共用体) 71
3.5.3 枚举 73
3.6 本章小结 74
第4章 51单片机的并行I/O端口及其应用 75
4.1 数据地址端口P0和P2 75
4.2 普通I/O端口P1 77
4.3 复用端口P3 77
4.4 数据—地址总线扩展方法 78
4.5 应用案例4.1 ——流水灯的实现 80
4.5.1 51单片机通过并行端口输出电平 80
4.5.2 发光二极管(LED)基础 81
4.5.3 流水灯的硬件电路 82
4.5.4 流水灯的应用代码 82
4.6 应用案例4.2 ——按键指示灯的实现 84
4.6.1 51单片机通过并行端口读入电平 84
4.6.2 独立按键基础 85
4.6.3 按键指示灯的硬件电路 86
4.6.4 按键指示灯的应用代码 86
4.7 本章总结 87
第5章 51单片机的中断系统和外部中断 88
5.1 51单片机的中断系统 88
5.1.1 51单片机的中断源 89
5.1.2 51单片机的中断引脚 89
5.1.3 51单片机的中断相关控制寄存器 89
5.1.4 中断向量地址和中断标志位 91
5.2 51单片机的中断处理过程 93
5.3 51单片机的中断服务程序设计 94
5.4 51单片机的外部中断 95
5.4.1 外部中断的控制 95
5.4.2 外部中断的检测和响应 96
5.4.3 多个外部中断信号的处理 96
5.5 应用案例——外部中断计数系统的实现 99
5.5.1 51单片机使用外部中断 99
5.5.2 单位数码管基础 100
5.5.3 三极管基础 103
5.5.4 外部中断计数系统的电路 105
5.5.5 外部中断计数系统的应用代码 105
5.6 一个低电平触发外部中断的实验 107
5.6.1 实验的电路和应用代码 107
5.6.2 实验的运行结果分析 109
5.7 本章总结 109
第6章 51单片机的定时计数器 111
6.1 51单片机定时计数器的组成 111
6.2 51单片机定时计数器的寄存器 112
6.2.1 工作方式控制寄存器TMOD 112
6.2.2 控制寄存器TCON 113
6.2.3 数据寄存器TH0、TL0、和TH1、TL1 113
6.3 51单片机定时计数器的工作方式 114
6.3.1 工作方式0 114
6.3.2 工作方式1 114
6.3.3 工作方式2 115
6.3.4 工作方式3 115
6.3.5 定时计数器的中断 116
6.4 51单片机定时计数器的使用 116
6.4.1 使用定时功能 116
6.4.2 使用计数功能 118
6.4.3 使用门控信号 120
6.4.4 定时计数器值的读取 121
6.5 51单片机定时计数器的特殊应用 121
6.6 应用案例6.1 ——PWM波形发生器的实现 122
6.6.1 PWM波形基础 122
6.6.2 PWM波形发生器的应用代码 123
6.6.3 脉冲宽度可调的PWM波形发生器 124
6.7 应用案例6.2 ——呼吸灯的实现 126
6.7.1 呼吸灯效果实现原理 126
6.7.2 RCL电路原理 126
6.7.3 呼吸灯的电路 127
6.7.4 呼吸灯的应用代码 128
6.8 中断服务子程序带来的时间误差分析 130
6.9 本章总结 136
第7章 51单片机的串行通信模块 137
7.1 51单片机串行通信的一些术语 137
7.2 51单片机串行通信模块的组成 138
7.3 51单片机串行通信模块的寄存器 138
7.3.1 串行通信模块控制寄存器(SCON) 138
7.3.2 串行通信模块数据寄存器(SBUF) 139
7.3.3 电源管理寄存器(PCON) 139
7.4 51单片机串行通信模块的工作方式和使用 140
7.4.1 工作方式0 140
7.4.2 工作方式1 143
7.4.3 工作方式2、3 145
7.4.4 串行通信模块的中断 146
7.5 串行通信模块的特殊应用 146
7.6 应用案例7.1 ——51单片机和PC通信系统的实现 147
7.6.1 RS-232接口标准和MAX232芯片基础 147
7.6.2 51单片机和PC通信系统的电路 149
7.6 3 51单片机和PC通信的应用代码 150
7.6.4 PC的串口调试工具 151
7.7 应用案例7.2 ——多点数据采集系统的实现 152
7.7.1 多点数据采集系统的电路结构 152
7.7.2 多点数据采集系统的应用代码 152
7.8 C51语言的输入和输出函数 155
7.8.1 putchar函数的使用方法 156
7.8.2 printf函数的使用方法 157
7.8.3 sprintf函数的使用方法 160
7.9 使用普通I/O引脚模拟串行通信模块 162
7.9.1 I/O引脚模拟串行通信模块的算法 162
7.9.2 I/O引脚模拟串行通信模块的C51语言代码 163
7.10 串行通信模块的波特率自适应 166
7.10.1 串行通信模块的波特率自适应算法 166
7.10.2 串行通信模块波特率自适应的C51语言代码 167
7.11 串行通信模块的“高速”通信 169
7.11.1 波特率固定的“高速”通信 169
7.11.2 波特率可变的“高速”通信应用 170
7.12 串行通信模块的波特率误差 171
7.13 本章总结 173
第8章 51单片机的人机交互接口 174
8.1 数码管基础和应用 175
8.1.1 多位数码管介绍 175
8 1.2 多位数码管驱动芯片MAX7219 179
8.2 1602液晶模块基础和应用 185
8.2.1 1602液晶模块基础 186
8.2.2 1602液晶模块的电路 189
8.2.3 1602液晶模块的操作步骤和驱动函数 189
8.3 拨码开关基础和应用 191
8.3.1 拨码开关基础 192
8.3.2 拨码开关的电路 192
8.3.3 拨码开关的操作步骤 193
8.3.4 拨码开关的应用实例 193
8.4 行列扫描键盘基础和应用 195
8.4.1 行列扫描键盘基础 195
8.4.2 行列扫描键盘的电路 196
8.4.3 行列扫描键盘的操作步骤和驱动函数 196
8.5 蜂鸣器基础和应用 197
8.5.1 蜂鸣器的基础 197
8.5.2 蜂鸣器的电路 198
8.5.3 蜂鸣器的操作步骤和驱动函数 199
8.6 应用案例8.1 ——简易频率计的实现 199
8.6.1 51单片机的频率测量算法 200
8.6.2 简易频率计的电路结构 200
8.6.3 简易频率计的应用代码 201
8.7 应用案例8.2 ——数字输入模块的实现 204
8.7.1 数字输入模块的工作原理 204
8.7.2 数字输入模块的电路结构 204
8.7.3 数字输入模块的应用代码 205
8.8 应用案例8.3 ——简易电子琴的实现 209
8.8.1 乐音的基础知识 209
8.8.2 简易电子琴的电路结构 210
8.8.3 简易电子琴的应用代码 211
8.9 本章总结 215
第9章 51单片机的通信接口 216
9.1 51单片机通信接口基础 216
9.1.1 串行通信和并行通信 217
9.1.2 有线通信和无线通信 217
9.2 51单片机应用系统的通信模型和通信协议设计 218
9.2.1 51单片机应用系统的通信模型 218
9.2.2 51单片机应用系统的通信协议设计 219
9.3 51单片机应用系统的常用外部通信接口 219
9.3.1 SPI总线接口 219
9.3.2 I2C总线接口 221
9.3.3 1-wire总线接口 230
9.4 51单片机的并行通信接口 234
9.4.1 双口RAM IDT7132基础 234
9.4.2 双单片机使用双口RAM进行数据通信 236
9.5 51单片机的串行通信接口 238
9.5.1 RS-422通信协议 238
9.5.2 RS-485通信协议 240
9.5.3 光电隔离器 242
9.6 本章总结 243
第10章 51单片机的A/D和D/A通道 244
10.1 51单片机的A/D采集通道基础 244
10.1.1 A/D变换的过程 245
10.1.2 A/D变换的应用电路构成 247
10.1.3 A/D变换的保持电路 247
10.1.4 A/D芯片的分类 248
10.1.5 A/D芯片的选择 248
10.1.6 A/D芯片对电源的需求 249
10.2 8位并行8通道A/D芯片ADC0809 249
10.2.1 ADC0809基础 249
10.2.2 ADC0809的电路 251
10.2.3 ADC0809的操作步骤和驱动函数 252
10.3 51单片机的D/A输出通道基础 256
10.3.1 D/A转换的过程 257
10.3.2 D/A模块的分类 258
10.3.3 D/A芯片的选择 258
10.3.4 A/D芯片对电源的需求 259
10.4 八位串行单通道D/A芯片MAX517 259
10.4.1 MAX517应用基础 259
10.4.2 MAX517的电路 260
10.4.3 MAX517的操作步骤和驱动函数 261
10.5 应用案例10.1 ——自动换挡电压表的实现 262
10.5.1 电压表的挡程和自动换挡原理 262
10.5.2 单片机应用系统中的信号放大 262
10.5.3 自动换挡电压表的电路结构 264
10.5.4 自动换挡电压表的应用代码 265
10.6 应用案例10.2 ——简易波形发生器的实现 270
10.6.1 简易波形发生器设计基础 270
10.6.2 简易波形发生器的电路设计 271
10 6.3 简易波形发生器的应用代码 271
10.7 本章总结 277
第11章 51单片机的温度和时间采集模块 278
11.1 在51单片机应用系统中获取温度 279
11.2 DS18B20温度传感器 280
11.2.1 DS18B20基础 280
11.2.2 DS18B20的电路 282
11.2.3 DS18B20的操作步骤和驱动函数 284
11.3 51单片机的时间采集通道 285
11.4 并行总线接口时钟模块DS12C887 286
11.4.1 DS12C887基础 286
11.4.2 DS12C887的电路 289
11.4.3 DS12C887的操作步骤和驱动函数 290
11.5 应用案例11.1 ——多点温度采集系统的实现 293
11 5.1 多点温度采集系统的设计 293
11.5.2 多点温度采集系统的电路结构 293
11.5.3 多点温度采集系统的应用代码 294
11.6 应用案例11.2 ——简单数字时钟的实现 302
11 6.1 简单数字时钟的设计 302
11.6.2 简单数字时钟的电路结构 302
11.6.3 简单数字时钟的应用代码 303
11.7 本章总结 304
附录 51单片机的C51语言使用技巧 305
0.1 C51语言程序设计技巧 305
0.1.1 养成好的编程习惯 305
0.1.2 宏定义 307
0.1.3 条件编译 309
0.1.4 具体指针的应用 311
0.1.5 一些关键字的使用 313
0.2 C51语言常用库函数介绍 315
0.2.1 C51语言的库函数基础 315
0.2.2 库文件和头文件分类 316
0.2.3 C51语言的库函数分类介绍 317
0.3 在Keil μ Vision中编写用户自己的库函数 321
0.3.1 用户库函数的建立步骤 321
0.3.2 用户库函数的引用步骤 322
0.3.3 一个用户库函数的应用实例 322
0.4 C51语言的编译常见报警错误以及解决办法 323
0.4.1 变量未被使用警告(Warning 280) 324
0.4.2 函数未被声明警告(Warning C206) 324
0.4.3 头文件无法打开错误(Error C318) 325
0.4.4 函数名称重复定义错误(ErrorC237) 326
0.4.5 函数未被调用警告 326
0.4.6 函数未定义警告(warning C206) 327
0.4.7 内存空间溢出错误 327
0.4.8 函数重入警告 328
0.4.9 常见编译器错误列表 328