第一篇 开发基础 1
第1章 单片机简介 1
1.1 常用的单片机 1
1.2 PIC单片机 2
1.2.1 PIC单片机的种类 3
1.2.2 PIC16F877的功能特性 3
1.3 实践拓展:8位PIC单片机有哪些型号 4
第2章 PIC单片机的开发流程及开发环境 7
2.1 单片机的开发流程 7
2.2 软件开发平台的安装 8
2.2.1 MPLAB集成开发环境的安装 8
2.2.2 测试汇编语言开发环境 10
2.2.3 C语言编译器HI-TECH PICC的安装 11
2.3 硬件开发平台的安装 12
2.3.1 Proteus ISIS软件的安装与测试 12
2.3.2 ICD2+开发板的硬件开发平台的安装 14
2.3.3 基于ICD2的硬件开发平台的测试 16
2.4 单片机项目的建立 19
2.4.1 汇编语言项目的建立 19
2.4.2 C语言项目的建立 24
2.4.3 目标代码的生成与排错 26
2.5 程序的烧写和调试运行 27
2.5.1 基于ISIS的目标代码烧写和调试 27
2.5.2 基于ICD2的目标代码烧写和调试 28
2.5.3 基于Proteus VSM MPLAB Viewer的目标代码调试 30
2.6 实践拓展:ICD2无法正常工作怎么办 31
第二篇 结构与编程 33
第3章 PIC单片机最小系统 33
3.1 单片机系统的组成 33
3.2 PIC单片机最小系统的组成 34
3.2.1 电源电路 34
3.2.2 时钟电路 35
3.2.3 复位电路 37
3.2.4 在线编程调试接口 38
3.3 实践拓展:设计单片机电路板需要遵守哪些原则 39
第4章 PIC单片机的系统结构 40
4.1 PIC单片机的基本结构 40
4.1.1 基本功能模块 41
4.1.2 专用功能模块 45
4.2 PIC单片机的特点 46
4.3 实践拓展:如何选择合适的单片机 49
第5章 PIC单片机的汇编指令 51
5.1 PIC的RISC指令集 51
5.2 字节操作指令 53
5.3 位操作指令 61
5.4 立即数操作指令 62
5.5 转移控制类指令 64
5.6 特别功能指令 66
5.7 实践拓展:CISC与RISC有何不同 67
第6章 MPASM汇编语言及其程序设计 68
6.1 MPASM汇编语言 68
6.1.1 MPASM的语法 68
6.1.2 MPASM的伪指令 69
6.1.3 MPASM的运算符 76
6.1.4 MPASM的内置宏指令 78
6.2 寻址模式 81
6.2.1 文件寄存器直接寻址与BANK的使用 81
6.2.2 文件寄存器间接寻址 84
6.2.3 程序的直接跳转与PAGE的使用 86
6.2.4 程序的间接跳转 88
6.3 MPASM汇编常用子程序设计 90
6.3.1 判断分支程序 90
6.3.2 循环程序 91
6.3.3 延时子程序 92
6.3.4 查表子程序 94
6.4 汇编语言程序模板 97
6.5 实践拓展:如何编程可以减少程序的bug 98
第7章 通用端口的输出控制 99
7.1 PIC16F877的输出端口 99
7.1.1 输出端口的工作原理 100
7.1.2 输出端口的相关寄存器 100
7.1.3 端口的输出驱动能力 101
7.1.4 I/O口的设定方法 102
7.1.5 PORTA的用法 103
7.2 输出控制应用 104
7.2.1 实例:LED的实用控制程序设计 104
7.2.2 实例:单个七段数码管的静态控制与动态控制 111
7.3 实践拓展:如何提高系统的抗干扰能力 117
第8章 通用端口的输入测量 120
8.1 PIC16F877的输入端口 120
8.1.1 输入端口的工作原理 120
8.1.2 输入端口的相关寄存器 121
8.1.3 端口的“读—修改—写”问题 121
8.1.4 端口的高压静电保护 122
8.2 按键状态的识别 123
8.3 矩阵式键盘的读取 128
8.3.1 4×4矩阵式键盘的工作原理 128
8.3.2 实例:基于扫描法的矩阵式键盘读取 129
8.4 实践拓展:如何正确使用上拉电阻与下拉电阻 136
第9章 PIC单片机的C语言程序设计 138
9.1 实例:第一个单片机C语言程序 138
9.2 单片机C语言的数据类型 142
9.2.1 常量和变量 143
9.2.2 字符型数据 145
9.2.3 整型数据 147
9.2.4 浮点型数据 149
9.2.5 位型数据 150
9.2.6 变量的命名规则 151
9.2.7 变量赋初值 152
9.3 C语言的运算符 152
9.3.1 算术运算符 153
9.3.2 位运算符 154
9.3.3 赋值运算符 158
9.3.4 关系运算符 159
9.3.5 逻辑运算符 160
9.4 C语言的重要控制语句 161
9.4.1 选择结构 161
9.4.2 循环结构 165
9.5 数组 168
9.5.1 数组的定义与初始化 169
9.5.2 数组的使用 170
9.5.3 实例:用C语言控制数码管 171
9.6 函数 174
9.6.1 函数的声明和定义 175
9.6.2 局部变量和全局变量 177
9.6.3 数组作为函数的参数 178
9.6.4 实例:延时函数的设计 179
9.7 预处理命令与宏定义 181
9.7.1 不带参数的宏定义 181
9.7.2 带参数的宏定义 182
9.7.3 文件包含 183
9.7.4 条件编译 183
9.8 C语言编程规范 185
9.8.1 标识符命名 185
9.8.2 可读性 186
9.8.3 程序的排版 187
9.8.4 注释的书写方法 189
9.9 多文件项目管理 191
9.9.1 头文件的书写 191
9.9.2 源码文件的书写 192
9.9.3 模块文件添加到当前项目 193
9.10 实例:一位计数器的设计 193
9.11 实践拓展:PIC单片机C语言入门常见问题 195
第10章 基于C语言的I/O控制 197
10.1 输出端口的C语言编程 197
10.1.1 走马灯控制 197
10.1.2 多数码管的显示控制 198
10.2 输入端口的编程 203
10.2.1 单个按键状态的读取 203
10.2.2 两个按键状态的读取 205
10.3 矩阵式键盘的读取方法 207
10.3.1 基于扫描法的矩阵式键盘读取 207
10.3.2 矩阵式键盘的模块化编程 209
10.4 实例:简单的电子计算器设计 211
10.5 实践拓展:如何使用去偶电容 215
第三篇 模块功能 217
第11章 中断系统 217
11.1 单片机中断的处理过程 217
11.2 PIC中断系统的硬件结构 217
11.3 中断的响应和处理 219
11.4 INT中断 221
11.4.1 INT中断的相关寄存器 221
11.4.2 INT中断的硬件连接 222
11.4.3 INT中断的汇编语言编程 223
11.4.4 PICC中断服务程序的编写 224
11.5 实例:用INT中断控制LED 225
11.6 实践拓展:PIC单片机常见的中断问题有哪些 226
第12章 定时/计数器 228
12.1 计数与定时的基本概念 228
12.2 PIC16F877的定时/计数器 228
12.3 TIMER0的用法 229
12.3.1 TIMER0的系统结构及相关寄存器 229
12.3.2 TIMER0的硬件连接 231
12.3.3 TIMER0的软件编程 232
12.4 TIMER0的应用 237
12.4.1 实例:电子表设计 237
12.4.2 实例:脉冲宽度测量 241
12.4.3 实例:频率计设计 245
12.4.4 实例:方波发生器 247
12.5 看门狗 251
12.5.1 看门狗的系统结构 251
12.5.2 看门狗的硬件设置 252
12.5.3 看门狗的程序设计 252
12.5.4 看门狗的使用要点 257
12.6 实践拓展:如何校准PIC单片机内部RC振荡器 257
第13章 A/D转换器 259
13.1 PIC16F877片内A/D转换器的结构与基本用法 259
13.1.1 A/D转换器的系统结构 259
13.1.2 与A/D转换相关的寄存器 261
13.1.3 A/D转换器的硬件设计 262
13.1.4 A/D转换器的查询方式操作时序与编程 262
13.2 实例:多通道A/D转换编程 265
13.3 中断模式下的A/D转换 267
13.3.1 中断模式下A/D转换器涉及的寄存器 268
13.3.2 中断模式下A/D转换器编程 268
13.4 实例:电位器阻值测量 270
13.4.1 电位器阻值测量仪设计 271
13.4.2 A/D转换的软件滤波 274
13.4.3 上下限报警 278
13.4.4 休眠模式的A/D转换 281
13.5 A/D转换参数计算 283
13.5.1 转换精度 284
13.5.2 采样时间要求 284
13.5.3 转换时间要求 285
13.6 实践拓展:常见的A/D转换器件有哪些 285
第14章 通用同步/异步收发器USART 287
14.1 串行通信与并行通信的基本概念 287
14.1.1 通信协议 287
14.1.2 数据传送方式 288
14.1.3 波特率 289
14.1.4 串行通信的检错和纠错 289
14.2 PIC单片机的USART模块 289
14.2.1 USART的功能特点 289
14.2.2 USART发送器的系统结构 290
14.2.3 USART发送器的相关寄存器 292
14.2.4 实例:USART异步模式下发送数据 294
14.2.5 USART接收器的系统结构 297
14.2.6 USART接收器的相关寄存器 298
14.2.7 实例:USART异步模式下接收数据 300
14.2.8 实例:USART异步接收方式的出错分析 304
14.3 USART的外围硬件电路设计 306
14.4 高级串行通信协议的设计 308
14.4.1 实例:单向数据通信协议的设计 309
14.4.2 带应答的数据通信协议 314
14.5 实践拓展:什么是RS-485/EIA-485 314
第15章 SPI接口 316
15.1 SPI模块的功能及系统结构 316
15.2 主控发送模式 317
15.2.1 主控发送模式的工作流程 317
15.2.2 主控发送模式的相关寄存器 318
15.2.3 主控发送模式的硬件连接 319
15.2.4 实例:主控发送模式的程序设计 319
15.3 从动接收模式 321
15.3.1 从动接收模式的工作流程 322
15.3.2 从动接收模式的相关寄存器 322
15.3.3 从动接收模式的硬件连接 324
15.3.4 实例:从动接收模式的程序设计 325
15.4 主控接收与从动发送 328
15.4.1 主控接收模式的工作流程 328
15.4.2 主控接收模式的相关寄存器 329
15.4.3 从动发送模式的工作流程 331
15.4.4 主控接收和从动发送模式下的硬件连接 331
15.4.5 实例:双机通信的程序设计 332
15.5 25xxx系列EEPROM的读写 336
15.5.1 25C160的功能特点 336
15.5.2 25C160的系统结构与工作流程 337
15.5.3 25C160的硬件连接 339
15.5.4 实例:25C160的程序设计 340
15.6 实践拓展:常用SPI接口芯片有哪些 345
第16章 I2C接口 346
16.1 I2C的功能特点 346
16.1.1 I2C的电气连接 346
16.1.2 I2C协议简介 347
16.1.3 PIC16F877的I2C模块 349
16.2 I2C主模式数据发送 349
16.2.1 I2C主模式系统结构与数据发送流程 350
16.2.2 I2C主模式发送过程相关寄存器 352
16.2.3 I2C模块的硬件连接 353
16.2.4 实例:I2C的主模式数据发送程序设计 354
16.3 I2C主模式数据接收 357
16.3.1 I2C主模式数据接收流程 357
16.3.2 I2C主模式接收过程相关寄存器 359
16.3.3 实例:I2C的主模式数据接收程序设计 360
16.4 I2C主模式的复合数据帧 364
16.5 I2C接口EEPROM的读写实例 364
16.5.1 24C02C功能简介 364
16.5.2 24C02C的系统结构与读写帧格式 365
16.5.3 24C02C的硬件连接 366
16.5.4 实例:读写24C02C的程序设计 367
16.6 I2C从模式的数据接收和发送 373
16.6.1 I2C从模式系统结构和数据接收流程 373
16.6.2 I2C从模式相关寄存器 374
16.6.3 实例:I2C从模式数据接收 376
16.6.4 实例:I2C从模式数据发送 379
16.7 实践拓展:SPI、I2C、USART有何区别 381
第17章 CCP模块 382
17.1 CCP模块的基本概念 382
17.2 CCP1的捕捉模式 382
17.2.1 CCP1捕捉模式的系统结构和工作过程 383
17.2.2 CCP1捕捉模式下的相关寄存器 384
17.2.3 实例:基于捕捉功能的频率计设计 385
17.3 CCP1的比较模式 390
17.3.1 CCP1比较模式的系统结构和工作过程 390
17.3.2 CCP1比较模式下的相关寄存器 391
17.3.3 实例:基于比较功能的方波发生器设计 391
17.4 CCP1的PWM模式 394
17.4.1 CCP1的PWM模式的系统结构和工作过程 394
17.4.2 CCP1的PWM模式下的相关寄存器 394
17.4.3 PWM的周期与占空比 395
17.4.4 实例:基于PWM功能的方波发生器设计 396
17.4.5 实例:基于PWM功能的D/A转换器设计 399
17.5 CCP2模块 402
17.6 实践拓展:什么是SPWM 402
第四篇 综合实例 403
第18章 LED点阵显示屏及其应用 403
18.1 8×8LED显示屏显示原理及编程 403
18.2 改进的8×8LED显示屏原理及编程 406
18.3 16×16LED显示屏显示原理及编程 410
18.4 基于第三方软件的汉字字模生成 414
18.5 LED点阵显示屏的动态显示 416
18.6 基于硬件字库的汉字显示 420
18.7 实践拓展:字模Ⅲ软件有什么特色功能 425
第19章 液晶显示屏的使用 427
19.1 笔段式液晶显示屏原理及编程 427
19.1.1 VIM-332-DP的显示原理 427
19.1.2 VIM-332-DP的硬件连接 428
19.1.3 VIM-332-DP的软件编程 429
19.2 字符式液晶显示屏原理及编程 433
19.2.1 字符式液晶显示屏LM016L的特点 434
19.2.2 LM016L的系统结构与硬件连接 434
19.2.3 LM016L的指令集 436
19.2.4 LM016L的编程方法 437
19.2.5 LM016L的字符显示 437
19.2.6 LM016L的初始化 438
19.2.7 实例:基于LM016L的秒表显示设计 439
19.3 图形点阵式液晶显示屏原理及应用 445
19.3.1 HDG12864F-3的功能特点 445
19.3.2 HDG12864F-3的接口与硬件连接 446
19.3.3 HDG12864F-3的指令集 447
19.3.4 HDG12864F-3的编程方法 448
19.3.5 HDG12864F-3的数据显示 450
19.3.6 HDG12864F-3的初始化 450
19.3.7 HDG12864F-3的驱动程序设计 451
19.3.8 在图形点阵式液晶显示屏上显示图像和汉字 457
19.4 实践拓展:使用液晶显示屏时有哪些常见问题 462
第20章 多点温度监测系统 464
20.1 DS18B20的结构与功能特点 464
20.2 DS18B20的操作命令及其应用 465
20.2.1 复位操作 466
20.2.2 写位操作 467
20.2.3 写字节操作 467
20.2.4 读位操作 468
20.2.5 读字节操作 469
20.3 DS18B20的命令列表 469
20.4 实例:单点温度测量 470
20.5 多点温度采集相关命令及编程 481
20.5.1 搜索ROM命令 481
20.5.2 读ROM命令 485
20.5.3 匹配ROM命令 485
20.6 实例:多点温度监测报警系统 487
20.7 实践拓展:常用一线总线芯片有哪些 500
第21章 步进电机控制 501
21.1 步进电机的控制原理 501
21.2 步进电机的驱动系统 502
21.2.1 电机驱动芯片L298原理与应用 502
21.2.2 电机控制芯片L297原理与应用 505
21.3 实例:基于L297和L298的步进电机控制 508
21.4 实践拓展:步进电机使用中的常见问题有哪些 512
参考文献 514