第1章ATmega16单片机硬件结构和运行原理 1
1.1 AVR单片机概述 1
1.2 ATmega16的结构与主要特点 2
1.3 ATmega16的主要性能 3
1.4 ATmega16 MCU内核 6
1.5 ATmega16的存储器组织 8
1.5.1可实现在线/在应用自我编程的闪存FLASH 8
1.5.2数据存储器SRAM 9
1.5.3 EEPROM数据存储器 9
1.5.4 I/O寄存器 9
1.6系统时钟及其选择 11
1.6.1时钟系统及其分配 12
1.6.2源时钟信号 13
1.6.3外部晶振 13
1.6.4外部低频晶体振荡器 15
1.6.5外部RC振荡器 15
1.6.6可标定的内部RC振荡器 16
1.6.7外部时钟源 17
1.6.8定时器/计数器振荡器(异步时钟) 18
1.7电源管理和休眠模式 18
1.7.1概述 18
1.7.2休眠模式的实现 19
1.7.3如何将功耗最小化 21
1.8复位系统 22
1.8.1复位源 24
1.8.2 MCU控制及状态寄存器MCUCSR 25
1.8.3内部参考电压源 26
1.8.4看门狗定时器 26
1.9中断系统 30
1.9.1中断源及其管理 30
1.9.2中断向量 32
1.9.3中断控制寄存器 37
1.9.4中断响应过程 40
1.10定时器/计数器 41
1.10.1定时器/计数器的预分频器 41
1.10.2 8位定时器/计数器0—T/C0 44
1.10.3 16位定时器/计数器1—T/C1 55
1.10.4 8位定时器/计数器2-T/C2 73
1.11 ATmega16/8535的I/O端口 85
1.11.1概述 85
1.11.2 I/O内部结构及工作原理 86
1.11.3各端口寄存器 87
1.11.4 I/O特殊功能寄存器SFIOR 89
1.11.5端口第二功能 90
1.12同步串行接口SPI 95
1.12.1内部结构和运行原理 95
1.12.2 SPI相关寄存器 98
1.12.3—SS引脚功能 99
1.12.4 SPI数据传送模式 100
1.13通用同步/异步串行接口USART 101
1.13.1概述 101
1.13.2串行时钟的产生 103
1.13.3数据帧格式 106
1.13.4 USART的初始化 107
1.13.5数据帧的发送过程 107
1.13.6异步串行数据的位接收时序 108
1.13.7数据帧接收过程 110
1.13.8多机通信的实现方法 111
1.13.9 USART寄存器 112
1.14两线串行总线接口TWI(I2C) 118
1.14.1两线串行总线接口定义 118
1.14.2 TWI模块概述 119
1.14.3 TWI寄存器 121
1.14.4 TWI总线的使用 124
1.14.5多主机系统和总线仲裁 132
1.15模拟比较器 133
1.16模数转换器 136
1.16.1 ADC工作过程 138
1.16.2启动ADC 138
1.16.3预分频与转换时间 139
1.16.4差分增益通道 140
1.16.5 ADC输入通道和参考电源的选择 141
1.16.6 ADC噪声抑制器 142
1.16.7 ADC自动触发功能 144
1.16.8 ADC转换结果数据模式 145
1.16.9有关的I/O寄存器 146
1.17 E2 PROM的读写操作 150
1.17.1 E2 ROM的读/写访问 150
1.17.2相关的寄存器 150
第2章AVR单片机指令系统 153
2.1 AVR单片机汇编器编程规定 153
2.1.1伪指令 153
2.1.2表达式 155
2.2操作数及指令所涉及的对象 157
2.2.1状态寄存器SREG 157
2.2.2执行指令对标志位的影响 158
2.2.3操作数寄存器和操作数 158
2.2.4堆栈 159
2.3寻址方式 159
2.4算术和逻辑运算指令 162
2.4.1加法指令 163
2.4.2减法指令 165
2.4.3取反指令 166
2.4.4取补指令 166
2.4.5比较指令 167
2.4.6逻辑与指令 167
2.4.7逻辑或指令 168
2.4.8逻辑异或指令 169
2.4.9乘法指令 169
2.5转移指令 170
2.5.1无条件转移指令 172
2.5.2条件转移指令 172
2.6数据传输指令 179
2.6.1直接寻址数据传输指令 180
2.6.2间接寻址传输指令 181
2.6.3 Z指针寄存器程序空间取常数寻址 183
2.6.4程序存储器空间写数据寻址 183
2.6.5 I/O口数据传送 184
2.6.6堆栈操作指令 184
2.7位操作及其他指令 185
2.7.1移位指令 186
2.7.2位操作指令 187
2.7.3修改标志位指令 187
2.7.4 I/O寄存器操作指令 189
2.7.5其他指令 189
第3章 定点运算和定点数制转换 190
3.1软件DAA的实现方法 190
3.1.1实现加法DAA功能子程序ADDAA和LSDAA的设计方法 191
3.1.2实现减法DAA功能子程序SUDAA的设计方法 192
3.1.3实现右移DAA功能子程序RSDAA的设计方法 192
3.2定点运算子程序 192
3.2.1多字节压缩BCD码加法子程序ADBCD4和ADBCD 193
3.2.2多字节压缩BCD码减法子程序SUBCD4和SUBCD 193
3.2.3乘法子程序MUL16 194
3.2.4快速乘法子程序MUL16F 195
3.2.5带舍入功能的乘法子程序MUL165 195
3.2.6整数除法子程序DIV16 196
3.2.7普适型32位除以16位除法子程序DIV16a 196
3.2.8将最后余数舍入处理的除法子程序DIV165 198
3.2.9商为规格化浮点数的除法子程序DIV16F 198
3.2.10整数除法子程序DIV24和DIV40 199
3.2.11整数开平方子程序INTSQR 200
3.2.12乘除运算的补充参考子程序 202
3.3定点数制转换子程序 203
第4章AVR实用程序 211
4.1查表(子)程序 211
4.1.1线性内插计算子程序CHETA 211
4.1.2功能数据表格项目浏览、查找、修改程序 218
4.2 EEPROM读/写子程序 227
4.2.1 EEPROM读出子程序REEP 227
4.2.2查询写入EEPROM子程序WEEP 227
4.2.3以中断方式写入EEPROM程序 228
4.3输入输出子程序 230
4.3.1时钟日历芯片OKI MSM 62 × 42 ×的读/写子程序 230
4.3.2显示保护程序DSPRV 233
4.3.3键处理程序DEALKY 235
4.3.4计算键值——LED显示管理子程序DSPA和DSPY 238
4.3.5键入数字序列左移处理子程序LSDD8 244
4.3.6双键浏览、修改数据子程序KYIN2 246
4.3.7触摸屏键值算法子程序 250
4.3.8中文液晶显示模块OCMJ5 × 10的应用 252
4.3.9通用宽行打印机检测及打印子程序LPRNT 261
4.3.10步进电机控制程序 264
4.4精确定时及日历时钟走时程序 271
4.4.1 MCU主频4 MHz用TCNT1精确定时程序 272
4.4.2 MCU主频8 MHz用TCNT1精确定时程序 273
4.4.3 MCU主频4 MHz用TCNT0精确定时程序 275
4.4.4以外部时钟(32 768 Hz)用T/C2定时直接产生秒号程序 276
4.4.5精确定时产生0.1 s信号程序 277
4.4.6精确定时产生1 s信号程序 278
4.4.7时钟日历走时子程序ACLK(软时钟) 280
4.5通信程序 285
4.5.1异步串行口中断接收和发送ASCII码字串程序 285
4.5.2用外部中断配合查询接收串行ASCII码字串程序 290
4.5.3以定时器和输出口配合用中断方式发送ASCII码字串程序 295
4.5.4以定时器和输入口配合用中断方式接收ASCII码字串程序 299
4.5.5主从多机通信程序 304
4.5.6智能型RS-232与RS-485标准转换程序 310
4.5.7串行通信红外接口技术和通信程序 312
4.5.8高速同步串行口通信程序 319
4.5.9模拟串行口配合74164驱动LED静态显示程序 323
4.5.10具有中断定时告警功能的实时钟芯片DS1305应用程序 325
4.6脉宽调制(PWM)输出 332
4.6.1 T/C0比较匹配清零计数器CTC模式(WGM0[1:0]=2) 333
4.6.2 T/C0快速PWM模式(WGM0[1:0]=3) 334
4.6.3 T/C0相位可调PWM模式(WGM0[1:0]=1) 335
4.6.4 T/C1比较匹配清零计数器CTC模式 336
4.6.5 T/C1快速PWM模式 337
4.6.6 T/C1相位可调PWM输出程序 339
4.6.7 T/C1相位频率可调PWM输出程序 341
4.6.8 T/C2脉宽调制输出程序的设计方法(本小节示范程序不列入清单) 344
4.7模数转换 345
4.7.1 A/D转换和自运行的PWM输出综合程序 345
4.7.2利用模拟比较器进行A/D转换程序 350
4.8可靠性程序 352
4.8.1滑动平均子程序SLPAV 352
4.8.2带外部SRAM(不断电)的ATmega8515系统断电保护程序 356
4.8.3 ATmega16L/8535L工作于掉电模式下小系统的断电保护程序 365
4.8.4循环冗余检测原理以及实现方法 370
4.9码制转换 387
4.9.1 ASCII码数据综合处理子程序 387
4.9.2格雷(Gray)码与二进制数相互转换子程序 396
4.10 AVR综合性实用程序 397
4.10.1 AVR频率计程序设计 398
4.10.2时基资源共享式综合测量系统 401
4.10.3 DALLAS 18B20多点测温程序 407
4.11嵌入式系统软件设计方法 415
4.12嵌入式系统常用优化设计方法 418
第5章AVR浮点程序库 424
5.1 AVR浮点程序库的特点 424
5.1.1 AVR浮点程序库的设计特点 424
5.1.2 AVR浮点程序库的优点 425
5.1.3 IEEE浮点数格式 427
5.1.4浮点数的规格化 430
5.1.5对阶 430
5.2基本运算子程序的设计方法 430
5.2.1支持基本运算的辅助子程序 430
5.2.2浮点数比较大小子程序FPCP的设计方法 431
5.2.3浮点加法子程序FPAD的设计方法 433
5.2.4浮点减法子程序FPSU的设计方法 433
5.2.5浮点乘法子程序FPMU的设计方法 436
5.2.6快速浮点乘法子程序FPMUF的设计方法 439
5.2.7浮点除法子程序FPDI的设计方法 441
5.2.8浮点数模拟手算开平方子程序FPSQ的设计方法 443
5.2.9浮点数牛顿迭代开平方子程序FSQR的设计方法 446
5.2.10基本运算子程序的演示程序 448
5.3函数计算子程序的设计方法 450
5.3.1函数计算子程序的设计总则 450
5.3.2函数计算子程序的辅助子程序 450
5.3.3用荷纳法计算多项式值子程序FPLN1和FPLN2 455
5.3.4对数函数LNX及其衍生函数子程序的设计方法 457
5.3.5指数函数EXP及其衍生函数子程序的设计方法 461
5.3.6正弦函数sin x及其衍生函数子程序的设计方法 464
5.3.7反正弦函数ASINX及其衍生函数子程序的设计方法 467
5.3.8函数计算子程序的演示程序 472
5.3.9阶乘子程序NP的设计方法 473
5.3.10浮点数制转换 474
5.4浮点程序应用实例 483
5.4.1拟合直线程序 483
5.4.2模数转换器AD7701的应用 487
第6章 在线测试功能和编程功能 490
6.1 ATmega16的JTAG接口与在线调试系统 490
6.1.1 JTAG接口简介 490
6.1.2 JTAG在线仿真调试 495
6.1.3 JTAG程序下载功能 495
6.1.4 JTAG边界扫描功能 496
6.1.5 ATmega16的边界扫描顺序 499
6.2引导加载支持的自我编程功能 503
6.2.1引导加载技术的实现 504
6.2.2相关I/O寄存器 508
6.2.3程序存储器Flash的自编程 511
6.2.4一个简单的引导加载汇编程序 514
6.3 ATmega16存储器编程 516
6.3.1 ATmega16的锁定位、熔丝位、标识位和校正位 516
6.3.2并行编程模式 518
6.3.3 SPI串行编程模式 524
6.3.4 JTAG串行编程模式 526