AVR单片机嵌入式系统原理与应用实践一书勘误修正表.docx
《AVR单片机嵌入式系统原理与应用实践一书勘误修正表.docx》由会员分享,可在线阅读,更多相关《AVR单片机嵌入式系统原理与应用实践一书勘误修正表.docx(22页珍藏版)》请在冰豆网上搜索。
AVR单片机嵌入式系统原理与应用实践一书勘误修正表
《AVR单片机嵌入式系统原理与应用实践》一书勘误修正表
(08/7/20共119处)
目录
1。
*第2页,第1行
错误:
2.2.3 ATmage16的外部引脚与封装
正确:
2.2.3 ATmega16的外部引脚与封装
第一章
1。
*第6页,第15行
错误:
(1)单片嵌入式系统......
正确:
(1)单片机嵌入式系统......
2。
*第9页,倒7行
错误:
单片机是单片嵌入式系统的......
正确:
单片机是单片机嵌入式系统的......
3。
**第14页,第10行
错误:
工作电压范围宽(2.6~6.0v)
正确:
工作电压范围宽(1.8~6.0v)
4。
**第15页,续表1-2,ATtiny85 / 系统时钟
错误:
0~1
正确:
0~20
第二章
1。
*第27页,倒2行
错误:
2.2.3 ATmage16的外部引脚与封装
正确:
2.2.3 ATmega16的外部引脚与封装
2。
*第28页,图2-3(a)18号引脚名称
错误:
(CO1B)PD4
正确:
(OC1B)PD4
3。
*第28页,图2-3(b)14号引脚名称
错误:
(CO1A)PD5
正确:
(OC1A)PD5
4。
*第28页,图2-3(b)
17号引脚名称Vcc印刷模糊
5。
**第30页,图2-4
下右部PD0~PD7引线中左数3、4根上多2个连接点
6。
**第31页 图2-5
错误:
R29 $001B Y...
R30 $001D Z...
正确:
R29 $001D Y...
R30 $001E Z...
7。
*第35页,倒6行
错误:
(512~64K)X16位
正确:
,(512~128K)X16位
8。
*第35页,倒2行
错误:
$000开始
正确:
$0000开始
9。
**第40页,倒2行
错误:
必须将该其地址加上.....
正确:
必须将该寄存器在I/O空间地址加上.....
10。
*第45页,第11行
错误:
同时决大部分....
正确:
同时绝大部分....
11。
*P47,第4行
错误:
由一组溶丝位SUT、CKSEL...
正确:
由一组熔丝位SUT、CKSEL...
12。
*P53,倒6行
错误:
配置溶丝位...
正确:
配置熔丝位...
第三章
1。
***P63,第7行
错误:
LDD R16,Y + 31
正确:
LDD R16,Y + $31
2。
*P69,倒11行
错误:
AND Rd,Rr 0≤d≤31,0≤d≤31
正确:
AND Rd,Rr 0≤d≤31,0≤r≤31
3。
*P76,第7行:
错误:
指令“BRBS 0,K”。
正确:
指令“BRBC 0,K”。
4。
**第82页,倒4行
错误:
ST X,Rr
正确:
ST X+,Rr
5。
*第85页,倒16行
错误:
因此,PAMPZ寄存器...
正确:
因此,RAMPZ寄存器...
6。
*第85页,倒3行
错误:
LPM Rd,Z+
正确:
ELPM Rd,Z+
7。
*第91页,倒11行
错误:
SHE
正确:
SEH
8。
*第92页,第7行
错误:
转到$000。
正确:
转到$0000。
第四章
1。
*第111页,第8行
错误:
...,而且仿真与时序有关,...
正确:
...,而仿真与时序有关,...
2。
*第113页,第10行
错误:
debug - ware
正确:
debugWIRE
3。
*第116页,第4行
错误:
...,并对数学和浮点运算。
正确:
...,并可进行数学和浮点运算。
4。
*第123页,第18行
错误:
...使用DS1802....
正确:
...使用DS18B20....
第五章
1。
***第139页,图5-9
错误:
图5-9中下部的Memory窗口查看的是程序存储器中内容,与140页第9行的说明不符
正确:
应选择查看数据存储器内容,地址为高端空间。
正确图如下:
2。
*第150页,151页上的图5-18,5-19,5-20(旧版BASCOM-AVR中的BUG)
错误:
3个图中的EEPROM 为1024
错误:
图5-19中的 Fusebit H 0:
CKOPT 0
正确:
3个图中的EEPROM 为512
正确:
图5-19中的 Fusebit H 1:
CKOPT 1
正确图如下:
3。
**第154页,倒6行
错误:
程序实例:
demo_5_2.asm
正确:
程序实例:
demo_5_3.asm
第六章
1。
**P165,图6-2。
图中下面的文字说明第一行
错误:
方向:
输入
正确:
方向:
输出
2。
**第165页,表6-1的3、4行
正确:
DDRXn PORTXn PUD I/O方式 内部上拉电阻 引脚状态说明
0 0 X 输入 无效 三态(高阻)
0 1/0 0 输入 有效/无效 有效时外部引脚拉低输出电流(uA)
0 X 1 输入 无效 三态(高阻)
1 0 X 输出 无效 推挽0输出,吸收电流(20mA)
1 1 X 输出 无效 推挽1输出,输出电流(20mA)
3。
***第166页,第3行
错误:
...取决于DDRXn设置。
正确:
...取决于PORTXn设置。
4。
*第167页,图6-4
错误:
图中PORTXn的D触发器一个控制信号---WRx
正确:
图中PORTXn的D触发器一个控制信号---WPx
5。
**P169,第4行和第7行,2处
错误:
地址空间为I/O空间的0X00~0X31
正确:
地址空间为I/O空间的0X00~0X1F
6。
***P170,第8行
错误:
与0b00001000相“与”,
正确:
与0b00001000相“或”,
7。
**173页,图6-7
错误:
控制初值 = &B11111110 (有3处使用了&B)
正确:
控制初值 = 0b11111110
8。
*第179页,表6-3
错误:
表中第2行的段名 h g f e d c b a
正确:
表中第2行的段名 p g f e d c b a
9。
*第192页,倒16行
错误:
内部REM....
正确:
内部RAM....
第七章
1。
*206页,倒数第九行
错误:
(即AVR标志寄存器SREG....
正确:
(即AVR状态寄存器SREG....
2。
*第226页,第3-4、7-8行
错误:
4行程序代码排版不规则
正确:
pop temp
out sreg,temp ;中断现场恢复
reti ;中断返回
led_7:
;7段码表
.db 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07
.db 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
3。
**第231页,图7-4
错误:
图7-4中芯片U2引脚名称标的不正规。
正确:
见下图
第八章
1。
*236页,第5行
错误:
作为C/T0的...
正确:
作为T/C0的...
2。
*236页,倒18行
错误:
或下降沿(CS0[2:
0]=8)时,...
正确:
或下降沿(CS0[2:
0]=6)时,...
3。
**第239页,第9行:
错误:
或改变OC2的输出逻辑电平。
正确:
或改变OC0的输出逻辑电平。
4。
*241页,表8-2,8-3名称
错误:
....(WGM=0、2)....
....(WGM = 3)....
正确:
....(WGM0=0、2)....
....(WGM0= 3)....
5。
*243页,第6行
错误:
2)比较匹配清0计数器CTC模式(WGM2[1:
0]=2)
正确:
2)比较匹配清0计数器CTC模式(WGM0[1:
0]=2)
6。
*P247 图8-13中TCNTn中第二个描述
错误:
TOR
正确:
TOP.
7。
*第259页,第5行
错误:
(在一个PWN周期中,...)
正确:
(在一个PWM周期中,...)
8。
**P263页,图8-19
错误:
图中有2处明显错误,(Atmel的数据手册上也是错误的)
正确:
见下图:
9。
*第266页,倒8行
错误:
,但应确认触发信号比.....
正确:
,但所确认的触发信号比.....
10。
**269页,图8-21的名称
错误:
图8-21 采用T/C0的PWM功能产生正弦波
正确:
图8-21 仅使用T/C1实现音乐播放器电路图
第九章
1。
*278页,倒15行
错误:
...数字键“2”来将,
正确:
...数字键“2”来讲,
2。
*296页,倒数第3行
错误:
read_keyboaed()
正确:
read_keyboard()
3。
*300页,17行
错误:
该行语句的注解与程序重叠印刷
正确:
将注解(//.....)右移4个空格
第十章
1。
*303页,倒数第10行
错误:
变ADC...
正确:
变ACD...
2。
***306页,8-11行的程序注释
错误:
if (ACSR.5)
PORTB.2 = 0; // AIN0 < AIN1
else
PORTB.2 = 1; // AIN0 > AIN1,低电压报警
正确:
if (ACSR.5)
PORTB.2 = 0; // AIN0 > AIN1,低电压报警
else
PORTB.2 = 1; // AIN0 < AIN1
3。
*307页,12行
错误:
非线形误差
正确:
非线性误差
4。
**308页,图10-3
错误:
图左上方的ADC多路选择两个内部控制信号名称错误:
AEFS1、AEFS0
正确:
见下图,应为REFS1、REFS0
5。
*309页,倒11行
错误:
REFS1、REFS2用于选择...
正确:
REFS1、REFS0用于选择...
6。
*316页,倒5行
错误:
flash unsigned char position[6]={......}
正确:
flash unsigned char position[4]={......}
7。
*318页,倒4行
错误:
以保证换算的正确型
正确:
以保证换算的正确性
第十一章
1。
***327页,倒3行
错误:
TIFR |= 0x02;
正确:
TIFR = 0x80;
2。
*332页,第6行
错误:
128000/125HZ=1024倍
正确:
128000/125 = 1024倍
3。
*P333 第14行
错误:
禁止T/CI输入捕捉和溢出中断
正确:
禁止T/C1输入捕捉和溢出中断
4。
***342页,按键扫描函数代码
原代码不理想,请改成如下:
unsigned char read_key(void)
{
static unsigned char key_state = 0,key_old;
unsigned char key_press,key_return = key_no;
key_press = key_input & key_mask; // 读按键I/O电平
switch (key_state)
{
case key_state_0:
// 按键初始态
if (key_press !
= key_mask)
{
key_old = key_press; // 记录原电平
key_state = key_state_1; // 键被按下,状态转换到键确认态
}
break;
case key_state_1:
// 按键确认态
if (key_press == key_old) // 与原电平比较(消抖处理)
{
if (key_press == 0b01000000) key_return = key_k1;
else if (key_press == 0b10000000) key_return = key_k2;
key_state = key_state_2; // 状态转换到键释放态
}
else
key_state = key_state_0; // 按键已抬起,转换到按键初始态
break;
case key_state_2:
if (key_press == key_mask) key_state = key_state_0; //按键已释放,转换到按键初始态
break;
}
return key_return;
}
第十二章
1。
*P351,第9行
错误:
不仅是其低层的...
正确:
不仅是其底层的...
2。
**P354,表12-3,倒数3、4行
错误:
H X L ↓ X 移位寄存器内容打入8位锁存器中
H X L ↑ X 8位锁存器内容保持不变
正确:
H X L ↑ X 移位寄存器内容打入8位锁存器中
H X L ↓ X 8位锁存器内容保持不变
3。
*P354,第6行
错误:
...控制线上的上升打入到锁存器中的。
正确:
...控制线上的上升沿打入到锁存器中的。
4。
*P355,倒9行
错误:
利用74HC164
正确:
利用74HC165
5。
*P355,倒8行
错误:
采用74HC164
正确:
采用74HC165
6。
*P356,图12-5标题
错误:
采用74HC164
正确:
采用74HC165
第十三章
1。
*370页,第1行
错误:
位6---UMSEn
正确:
位6---UMSEL
2。
*370页,表13-3名称栏(有2处)
错误:
UPM2
正确:
UPM0
3。
*377页,倒1行
错误:
while(!
(UCSRA&(1< 正确:
while(!
(UCSRA&(1<4。
*381页,第6、7、8行(3处)
错误:
RCX
正确:
RXC
5。
*381页,倒4行
错误:
总是设置DOR标志位为"0".
正确:
总是设置PE标志位为"0".
6。
*387页,倒9行
错误:
逻辑0、“1”之间的...
正确:
逻辑0、1之间的...
7。
*P388,第9行
错误:
都是在硬件低层...
正确:
都是在硬件底层...
8。
**P389,第5行
错误:
逻辑“1”电平规定为-15 ~ 5V
正确:
逻辑“1”电平规定为-15 ~ -5V
9。
*P389,第7行
错误:
三极管等分离器件
正确:
三极管等分立器件
10。
*P391,第9行。
错误:
基本的通信低层...
正确:
基本的通信底层...
11。
*P391,第14行。
错误:
(发送与接受)
正确:
(发送与接收)
12。
*P393,倒8行。
错误:
低层的
正确:
底层的
13。
**394页,第8行
错误:
( < 5% )
正确:
( < ±0.5% )
14。
*P394,倒3行
错误:
尤其是低层...
正确:
尤其是底层...
第十四章
1。
*P407,第1行
错误:
对编写SPI、I2(...(印刷不清楚)
正确:
对编写SPI、I2C...
2。
*P409,13行
错误:
正确受到
正确:
正确收到
3。
**第418页,下部的通信协议小字部分
错误:
1 切换卡通信方式 后面的序号为:
1.5、1.6、1.7、1.8
正确:
序号应为:
1.1、1.2、1.3、1.4
4。
*P419,倒4行
错误:
正确受到...
正确:
正确收到...
第十五章
1。
*P430,表15-2,引脚栏中
错误:
MOSI(PB7) SCK(PB5)
正确:
MOSI(PB5) SCK(PB7)
2。
*P432,第9、10行
错误:
SPCR(一处为寄存器定义图后面的名字)
正确:
SPSR
3。
*P433,倒10行
错误:
输入的SCL......
正确:
输入的SCK......
4。
*P434,第2行
错误:
产生任何的控制信号所需要从....
正确:
产生任何的控制信号,所需要从....
5。
***P443-P444,原代码里面有几处笔误,以及一个BUG,请改成如下:
#define SIZE 100
unsigned char SPI_rx_buff[SIZE];
unsigned char SPI_tx_buff[SIZE];
unsigned char rx_wr_index,rx_rd_index,rx_counter,rx_buffer_overflow;
unsigned char tx_wr_index,tx_rd_index,tx_counter;
unsigned char SPI_free;
interrupt [SPI_STC] void spi_isr(void) // SPI 完成中断服务
{
SPI_rx_buff[rx_wr_index] = SPDR; // 从SPI口读出收到的字节放入接收缓冲区
if (tx_counter) // 如果发送缓冲区中有待发的数据
{
SPDR = SPI_tx_buff[tx_rd_index]; // 发送1字节数据,
--tx_counter; // 待发送数据个数减1
if (++tx_rd_index == SIZE) tx_rd_index = 0; // 调整发送缓冲区队列指针
}
else SPI_free = 1; // 无待发送数据,置SPI空闲
if (++rx_wr_index == SIZE) rx_wr_index = 0; // 调整接收缓冲区队列指针
if (++rx_counter == SIZE)
{
rx_counter = 0;
rx_buffer_overfl