1、资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。单片机习题参考答案第1章 概述 习题参考答案1嵌入式系统的基本含义是什么? 为什么说单片机是典型的嵌入式系统? 答: 即MCU的含义是: 在一块芯片上集成了中央处理单元( CPU) 、 存储器( RAM/ROM等) 、 定时器/计数器及多种输入输出( I/O) 接口的比较完整的数字处理系统。大部分嵌入式系统以MCU为核心进行设计。MCU从体系结构到指令系统都是按照嵌入式系统的应用特点专门设计的, 它能很好地满足应用系统的嵌入、 面向测控对象、 现场可靠运行等方面的要求。因此以MCU为核心的系统是应用最广的嵌入式系统。 简述嵌入式系统
2、的特点以及应用领域。答: 嵌入式系统属于计算机系统, 但不单独以通用计算机的面目出现;嵌入式系统开发需要专用工具和特殊方法;使用MCU设计嵌入式系统, 数据与程序空间采用不同存储介质;开发嵌入式系统涉及软件、 硬件及应用领域的知识;嵌入式系统的其它特点,比如紧张的资源, 较高稳定性要求, 低功耗, 低成本等。一般用于工业控制, 智能家电, 日常电子等领域。 3比较MCU与CPU的区别与联系。答: CPU是一个单独的PC处理器。而MCU, 则有微处理器, 存储器( RAM/ROM等) 、 定时器/计数器及多种输入输出( I/O) 接口的比较完整的数字处理系统。因此能够这么说, MCU是一个包含微
3、处理器的嵌入式系统, 而CPU紧紧是一个处理器而已。4举例说明嵌入式系统在日常生活中的应用。答: 日常数码产品: 手机, MP3, U盘, 相机等。日常工业类: 冰箱, 空调, 微波炉, 汽车等。5C语言的那些特性使得它成为嵌入式系统中使用频率最高的高级语言。答: 相比底端汇编, 更简单易学; 与高级语言如( C+, C#, java等) 相比, 执行效率高, 编译后的编码体积小, 而且支持好的编译器还支持嵌入汇编代码; 对位的操纵能力很强。6阅读光盘中【第01章(概述)阅读资料】中的”嵌入式C语言工程简明规范”, 用一页纸给出嵌入式C语言工程简明规范的要点。答: 此规范主要针对单片机编程语言
4、和08编译器而言, 包括命名、 注释、 编码规范性等内容。建议在一个工程或者一个项目中尽量遵循相同的代码规范, 而不是说你只能拥有一个代码规范。( 1) 命名规则: 命名清晰明了, 有明确含义, 使用完整单词或约定俗成的缩写。一般, 较短的单词可经过去掉元音字母形成缩写; 较长的单词可取单词的头几个字母形成缩写。即见名知意; 命名风格要自始至终保持一致; 命名中若使用特殊约定或缩写, 要有注释说明; 为了代码复用, 命名中应避免适用与具体项目相关的前缀; 应使用英语命名。( 2) 注释: 注释基本原则就是有助于对程序的阅读理解, 说明程序在做什么, 解释代码的目的、 功能和采用的方法。一般情况
5、源程序有效注释量在30左右。 注释语言必须准确、 易懂、 简洁。边写代码边注释, 修改代码同时修改相应的注释, 不再有用的注释要删除。 汇编和C中都用/, 取消; 不使用段注释 /* */ ( 调试时可用) 。使用文件注释必须说明文件名、 项目名称、 函数功能、 创立人、 创立日期、 版本信息等相关信息。修改文件代码时, 应在文件注释中记录修改日期、 修改人员, 并简要说明此次修改的目的。所有修改记录必须保持完整。 文件注释放在文件顶端, 用/*/格式包含。 注释文本每行缩进4个空格; 每个注释文本分项名称应对齐。 函数头部注释应包括函数名称、 函数功能、 入口参数、 出口参数等内容。如有必要
6、还可增加作者、 创立日期、 修改记录( 备注) 等相关项目。 函数头部注释放在每个函数的顶端, 用/*/的格式包含。其中函数名称应简写为FunctionName(), 不加入、 出口参数等信息。代码注释应与被注释的代码紧邻, 放在其上方或右方, 不可放在下面。如放于上方则需与其上面的代码用空行隔开。一般少量注释应该添加在被注释语句的行尾, 一个函数内的多个注释左对齐; 较多注释则应加在上方且注释行与被注释的语句左对齐。一般, 分支语句( 条件分支、 循环语句等) 必须编写注释。其程序块结束行的右方应加表明该程序块结束的标记end of , 特别在多重嵌套时。同一类型的标识符应集中定义, 并在定
7、义之前一行对其共性加以统一注释。对单个标识符的注释加在定义语句的行尾。 全局变量一定要有详细的注释, 包括其功能、 取值范围、 哪些函数或过程存取它以及存取时的注意事项等。 注释用/的格式。 ( 3) 编码规范性: 代码的每一级均往右缩进4个空格的位置; 不使用Tab键, 建议使用空格代替tab键, 这样代码打印不回造成错乱; 相对独立的程序块之间要加空行; 括号内侧( 即左括号后面和右括号前面) 不加空格, 多重括号间不加空格。如: SetName(GetFunc(); 函数形参之间应该有且只有一个空格( 形参逗号后面加空格) , 如: CallFunction(para1, para2,
8、para3), 而CallFunction(para1,para2,para3) 不符合要求; 操作符前后均加一个空格, 如: nSum = nNunm1 + nNum2 。而nSum=nNunm1+nNum2 则不符合要求; 单目操作符, 如!、 、 +、 -、 &( 地址运算符) 等, 后面不加空格, 如: i+ , pName = &name, bRes = !(x 10); if、 else if、 else、 for、 while语句无论其执行体是一条语句还是多条语句都必须加花括号, 且左右花括号各独占一行; Switch 语句必须包含default 分支; 一个函数不要超过80行代
9、码。第2章 Freescale S08微控制器 习题参考答案 1给出AW60 存储器映像的简要说明。答: 所谓存储器映像, 是指地址$0000 $FFFF这个64KB空间, 哪些地址被何种存储器所占用, 或者说AW60的RAM、 Flash、 I/O映像寄存器各使用$0000 $FFFF这个64KB空间中的哪些地址。简单地说, 就是$0000 $FFFF这个64KB空间是如何分配的。2AW60的引脚主要分为哪几类? 简要说明主要引脚的功能。答: ( 1) 电源类信号引脚( 2) 复位信号引脚( 3) 主要功能模块引脚。比如定时器, IRQ中断等。( 4) 其它, 比如背景调试BKGD引脚主要引
10、脚: AW60最小系统连接的I/O口, 以及各具体功能I/O口。3嵌入式系统中RAM和Flash作用分别是什么? 答: 一般来说RAM这个区域安排用户数据( 主要是全局变量) 和堆栈空间; Flash要用于存储程序、 常数、 中断向量等。 4给出AW60的硬件最小系统。答: AW60芯片的硬件最小系统包括电源及其滤波电路、 复位电路、 晶振电路及PLL滤 波电路、 写入器接口电路。5指出下列指令中的源操作数和目的操作数的寻址方式。(1) MOV #$80 , $80 (2) MOV $80,$A0(3) MOV $80 , X+ (4) MOV X+ , $80(5) LDA $80 , X答
11、: (1)立即寻址, 直接寻址 (2)直接寻址, 直接寻址(3)直接寻址, 无偏移量变址、 变址加1寻址方式 (4)无偏移量变址、 变址加1寻址方式, 直接寻址 (5)直接寻址, 无偏移量变址、 变址加1寻址方式6说明跳转指令BRA和JMP的差别。答: BRA是无条件相对转移指令, 转移范围是前127字节、 后128字节。而JMP则是绝对地址跳转指令。 7哪些指令影响堆栈指针? 如何影响? 答: PSH,PUL 。前者是向堆栈中放入, 指针减1, 向上移; 而PUL刚好相反, 指针加1, 向下移。8说明芯片初始化时堆栈指针的初始化方法。 答: SP是指向下一个栈地址的16位寄存器, 堆栈指针S
12、P采用递减的结构, 即进栈SP减1, 出栈时SP加1。初始化时, SP的初值为$00FF(前置符号$表示十六进制数)。栈指针复位指令(RSP)可将SP的低8位置为$FF, 而不影响高8位。 9写出主要汇编伪指令? 答: 变量定义(变量声明)数字常数与字符串常数定义常数赋值与文本替代符伪指令指令存储定位伪指令文件包含伪指令宏定义和宏调用伪指令定义存储区域伪指令具体细节请参照2.7.2节 10编写一段延时1000个指令周期的延时子程序。答: DL1000; MOV R7#248DJNZ R7$MOV R7#250DJNZ R74 RET第3章 第一个样例程序及工程组织 习题参考答案1什么叫通用I/
13、O口? 答: 所谓通用I/O, 也记为GPIO( General Purpose I/O) , 即基本的输入/输出, 有时也称并行I/O, 或普通I/O, 它是I/O的最基本形式。 2 什么叫上拉电阻与下拉电阻? 它们的作用是什么? 如何选择上拉电阻与下拉电阻的阻值? 哪些情况下使用上拉电阻? 哪些情况下使用下拉电阻? 答: 通俗地说, 若MCU的某个引脚经过一个电阻接到电源( Vcc) 上, 这个电阻被称为”上拉电阻”。与之相对应, 若MCU的某个引脚经过一个电阻接到地( GND) 上, 则相应的电阻被称为”下拉电阻”; 她们使得悬空的芯片引脚被上拉电阻或下拉电阻初始化为高电平或低电平 ;
14、根据实际情况, 上拉电阻与下拉电阻能够取值在1K10K之间, 其阻值大小与静态电流及系统功耗相关; 当某个引脚需要初始化成高电平时能够经过上拉电阻接电源, 当某个引脚要初始化低电平时能够经过下拉电阻接地。3什么是OC输出? 为什么OC输出的I/O口一定要上拉? 答:OC输出,即开漏输出, 即集电极开路。 只有接了上拉电阻, 才能输出高低电平, 否则只能输出低电平了。 4为什么在无操作系统的嵌入式系统软件主程序中使用无限循环? 答: 由于程序都是顺序执行的。如果不使用无限循环, 程序执行一遍代码, 就不能在接受其它的任务操作了。在嵌入式系统中, 这是致命的, 如果一个嵌入式产品每次只能使用一次或
15、只接受一次任务, 那是无法想象的。可是使用了无限循环, 就能够不停地监听任务, 并执行。 5找出样例子工程的机器码文件, 解释S19文件的含义。答: 源文件经编译、 连接后可获得目标码文件( .S19文件) , 它是Freescale MCU的机器码文件, 经过写入程序可将机器码下载到目标MCU内的Flash存储器, 也能够经过光盘中苏州大学嵌入式系统研发中心开发的独立写入软件SD-Programmer-S08读出写入到Flash的S19的内容, 观察实际写入到Flash的内容是否和S19的内容相同。该程序也能够擦写Flash。目标代码文件是以S记录格式表示的机器码文件。S记录格式是Frees
16、cale公司的十六进制目标代码文件, 它将目标程序和数据以ASCII码格式表示, 可直接显示和打印。目标文件由若干行S记录构成, 每行S记录能够用CR/LF/NUL结尾。一行S记录由五部分组成, 具体细节请参考书中3.4.4 。6举例给出CW环境C语言工程文件的组织结构图。答: 以下是控制小灯闪烁的CW环境C语言工程文件的组织结构图7分析Project.prm文件的功能。答: Project.prm文件主要实现了芯片的RAM和ROM的定义, 初始化RAM中的变量。初始化堆栈的大小。定义复位向量, 即应用程序的默认入口。还包含了启动代码, 是硬件复位后的函数入口。 8如何查看一个文件.LST文件
17、, 举例分析一个LST文件。答: 利用Freescale Codewarrior打开控制小灯闪烁工程文件, 经过edit-standard settings-target compiler for HC08-option-output-generate Listing File点击确定编译连接能够生成.LST文件。然后在该工程的bin文件夹中能够找.LST文件, 经过Freescale Codewarrior 打开main.lst文件。看下面的一段代码: 26:Light_Init(Light_Run_PORT,Light_Run,Light_OFF); /指示灯初始化004c a606 2
18、LDA #6004e 87 2 PSHA 004f 5f 1 CLRX 0050 4f 1 CLRA 0051 cd0000 6 JSR Light_Init0054 8a 3 PULH 26: Light_Init(Light_Run_PORT,Light_Run,Light_OFF)是C程序代码; 004c a606 004e 87 0050 4f 0051 cd0000 004f 5f 0054 8a 是该程序的机器代码; 其后面的对应的是汇编程序代码。 9如何能知道一段或一句C语言源程序的汇编代码与机器码, 举例之。答: 请参考第8题。10给出一个C语言控制三盏小灯的程序, 并调试,
19、功能自定。答: 请参考课本中3.5及随书光盘。11给出一个S08汇编语言控制三盏小灯的程序, 并调试, 功能自定。答: 请参考课本中3.6及随书光盘。12分析一个map文件, 简要说明map文件给了我们什么信息? 答: 打开工程后, 展开”工程设置文件夹”后, 再展开”Linker Files” 文件夹, 能够看到”Project.map”文件, 一般称之为工程的”映像文件”, 这个文件告诉我们, 源代码被编译连接后的机器码, 到底被下载到MCU内存储器中的什么地方, 在高级调试时, 可能需要用到这些知识。第4章 基于硬件构件的嵌入式系统开发方法 习题参考答案1简要阐述嵌入式硬件构件的基本思想
20、及优点。答: 嵌入式硬件构件是指将一个或多个硬件功能模块、 支撑电路及其功能描述封装成一个可重用的硬件实体, 并提供一系列规范的输入/输出接口。 优点: 结构清晰, 方便移植。2硬件构件如何分类? 给出各类硬件构件的定义及原理图设计要点。答: 根据所拥有接口类型的不同, 硬件构件分为核心构件、 中间构件和终端构件三种类型。核心构件只有提供接口, 没有需求接口。也就是说, 它只为其它硬件构件提供服务, 而不接受服务。在以单MCU为核心的嵌入式系统中, MCU的最小系统就是典型的核心构件。中间构件既有需求接口又有提供接口, 即它不但能够接受其它构件提供的服务, 而且也能够为其它构件提供服务。而终端
21、构件只有需求接口, 它只接受其它构件提供的服务。 设计核心构件时, 需考虑的问题是: ”核心构件能为其它构件提供哪些信号? ”核心构件设计的目标是: 凡是使用该MCU进行硬件系统设计时, 核心构件能够直接”组装”到系统中, 无须任何改动。为了实现这一目标, 在设计核心构件的实体时必须考虑细致、 周全, 包括稳定性、 扩展性等, 封装要完整。 设计中间构件时, 需考虑的问题是: ”中间构件需要接受哪些信号, 以及提供哪些信号? ”为直观起见, 设计中间构件时, 将构件的需求接口放置在构件实体的左侧, 提供接口放置在右侧。 设计终端构件时, 需考虑的问题是: ”终端构件需要什么信号才能工作? ”。
22、终端构件没有提供接口, 它仅有与上一级构件交互的需求接口, 因而接口标识均为斜体标注的接口注释。3为什么要将某些寄存器名和寄存器位在头文件中进行宏定义? 答: 对MCU内的模块寄存器名和端口名进行重定义, 在其它的代码里面都将使用宏名对模块寄存器和端口进行操作。这样, 当底层驱动程序移植到其它MCU时, 只要修改重定义语句就能够了。 4为什么在设计底层硬件驱动构件时, 不能使用全局变量? 答: 应用程序在使用底层构件时, 严格禁止经过全局变量来传递参数, 所有的数据传递都要经过函数的形式参数来接收。这样做不但使得接口简洁, 更加避免了全局变量可能引发的安全隐患。5给出设计底层硬件驱动构件的基本
23、原则, 并举例说明。答: 在对底层构件进行设计时, 最关键的工作是要对构件的共性和个性进行分析, 抽取出构件的属性和对外接口函数。尽量做到: 当一个底层构件应用到不同系统中时, 仅需修改构件的头文件, 对于构件的源程序文件则不必修改或改动很小。 例如, 串行通信模块SCI是大多数MCU都具有的内部模块。仔细分析各种MCU串行通信程序发现: 在查询方式下, 各种MCU都是根据状态寄存器中的两个标志位来判断是否接收到数据和数据是否发送完毕, 这就是SCI模块的共性。对于不同的MCU, 该状态寄存器的名称可能不同, 这两个标志位的位号也有可能不同。另外, 用以设置波特率、 通信格式、 是否校验、 是
24、否允许中断等参数的寄存器也不同, 这就是SCI模块的个性。分析出了共性和个性之后, 就能够抽取出SCI构件的属性和操作, 编制构件头文件和程序文件了。 6什么叫程序复用? 什么叫程序移植? 怎样才能方便重用与移植。答: 复用是指在一个系统中, 同一构件可被重复使用多次。移植是指将一个系统中使用到的构件应用到另外一个系统中; 在设计时最关键的工作是要对构件的共性和个性进行分析, 抽取出构件的属性和对外接口函数, 设计是充分考虑这几放面的因素, 才能方便重用和移植。7怎样方便驱动程序进行移植? 答: 首先对外接口函数设计要合理, 其次要对MCU内的模块寄存器名和端口名进行重定义, 在其它的代码里面
25、都将使用宏名对模块寄存器和端口进行操作。这样, 当底层驱动程序移植到其它MCU时, 只要修改重定义语句就能够了, 这就方便了驱动程序的移植。 8阐述利用硬件构件思想设计嵌入式应用系统时应该遵循的基本原则。答: 应当遵循以下基本规则: ( 1) 构件的头文件和源程序文件的主文件名一致, 且为构件名。( 2) 属性和操作的命名统一以构件名开头。这样做的好处是: 当使用底层构件组装软件系统时, 避免构件之间出现同名现象。同时, 名称要使人有”顾名思义”的效果。( 3) 对MCU内的模块寄存器名和端口名进行重定义, 在其它的代码里面都将使用宏名对模块寄存器和端口进行操作。这样, 当底层驱动程序移植到其
26、它MCU时, 只要修改重定义语句就能够了。( 4) 内部函数与外部函数要设计合理, 函数参数个数及类型要考虑全面。内部函数仅提供给同一构件中的其它内部函数或外部函数调用, 作用域仅限于定义该函数的文件。外部函数是对外接口函数, 供上层应用程序调用。在定义外部函数时, 应该对函数名、 函数功能、 入口参数、 函数返回值、 使用说明、 函数适用范围等进行详细描述, 以增强程序的可读性。上层应用程序不能直接对构件的属性进行读取或设置, 必须借助于该构件提供的接口操作函数来实现。( 5) 应用程序在使用底层构件时, 严格禁止经过全局变量来传递参数, 所有的数据传递都要经过函数的形式参数来接收。这样做不
27、但使得接口简洁, 更加避免了全局变量可能引发的安全隐患。第5章 串行通信接口SCI 习题参考答案1简要阐述异步串行通信涉及的主要基本概念。答: 串行通信至少涉及到以下几个基本概念: 第一, 每个字节之间是如何区分开的? 第二, 发送一位的持续时间是多少? 第三, 怎样知道传输是正确的? 第四, 能够传输多远? 这些问题属于串行通信的基本概念。2表征串行通信速度的物理量是什么? 串行通信的传输速度有限制吗? 答: 位长( Bit Length) , 也称为位的持续时间( Bit Duration) 。其倒数就是单位时间内传送的位数。人们把每秒内传送的位数叫做波特率( Baud Rate) 。波特
28、率的单位是: 位/秒, 记为bps。bps是英文bit per second的缩写, 习惯上这个缩写不用大写, 而用小写。一般情况下, 波特率的单位能够省略。一般使用的波特率有600、 900、 1200、 1800、 2400、 4800、 9600、 19200、 38400、 57600、 115200、 128000等。有限制。因为随着波特率的提高, 位长变小, 以至于很容易受到电磁源的干扰, 通信就不可靠了。当然, 还有通信距离问题, 距离小, 能够适当提高波特率, 但这样毕竟提高的幅度非常有限, 达不到大幅度提高的目的。3MCU与PC进行通信为什么要进行电平转换? 如何进行电平转换
29、? 答: 在MCU中, 若用RS-232总线进行串行通信, 则需外接电路实现电平转换。在发送端, 需要用驱动电路将TTL电平转换成RS-232电平; 在接收端, 需要用接收电路将RS-232电平转换为TTL电平。电平转换器不但能够由晶体管分立元件构成, 也能够直接使用集成电路。当前广泛使用MAX232芯片较多, 该芯片使用单一+5V电源供电实现电平转换。4给出SCI编程的通用模型。答: SCI具有初始化、 接收和发送三种基本操作。按照构件的思想, 可将它们封装成三个独立的功能函数, 初始化函数完成对SCI模块的工作属性的设定, 接收和发送功能函数则完成实际的通信任务。以SCI的初始化、 接收和
30、发送三种基本操作为例, 来说明实现构件化的全过程。( 1) SCI模块是最底层的构件, 它主要向上提供三种服务, 分别是SCI模块的初始化、 接收单个字节和发送单个字节, 向下则直接访问模块寄存器, 实现对硬件的直接操作。另外, 从现实使用角度出发, 它还需要封装接收N个字节和发送N个字节的子功能函数。( 2) SCI模块在软件上对应1个SCI.c程序源代码文件和1个SCI.h头文件, 当需要对它进行移植时, 大多数情况下只需简单拷贝这两个文件即可, 无需对源代码文件和头文件进行修改, 只有当实施不同芯片之间的移植时, 才需要修改头文件中与硬件相关的宏定义。( 3) 上层构件或软件在使用该构件
31、时, 严格禁止经过全局变量来传递参数, 所有的数据传递都直接经过函数的形式参数来接收。这样做不但使得接口简洁, 更加避免了全局变量可能引发的安全隐患。5简述中断的作用与处理过程。答: 中断是MCU实时地处理内部或外部事件的一种内部机制。当某种内部或外部事件发生时, 中断系统将迫使CPU暂停正在执行的程序, 转而去进行中断事件的处理, 中断处理完毕后, 又返回被中断的程序处, 继续执行下去。中断的处理过程一般为: 关中断( 在此中断处理完成前, 不处理其它中断) 、 保护现场、 执行中断服务程序、 恢复现场、 开中断等。6S08系列MCU都有哪些中断源? 答: S08系列MCU有26个中断源,
32、按优先级从高到低的顺序分别是: 复位中断( 1个) 、 SWI指令中断( 1个) 、 引脚中断( 1个) 、 低电压检测中断( 1个) 、 ICG中断( 1个) 、 定时器中断( 10个) 、 SPI中断( 1个) 、 SCI中断( 6个) 、 键盘输入中断( 1个) 、 ADC转换完成中断( 1个) 、 IIC中断( 1个) 和实时中断( 1个) 。26个中断源只有18个中断向量, 有的是几个中断源使用同一个中断向量。7S08系列MCU的中断执行过程分为哪几个步骤? 答: CPU每执行完一条指令, 若程序有开放某些中断及总中断( 使用CLI指令) , 则CPU按照优先级次序查询所有中断标志位
33、, 若某个中断已发生, 则响应该中断请求。中断响应过程是: ( 1) CPU内的寄存器PCL、 PCH、 X、 A、 CCR依次进栈( 注意H未被保护, 这是为了与HC05系列MCU兼容, 因此必要时, H应由用户中断服务程序保护) ; ( 2) 自动关总中断( 即相当于自动执行SEI指令) , 防止其它中断进入; ( 3) 从相应的中断向量地址取出中断向量( 即中断服务程序的入口地址) 送给PC; ( 4) 执行中断服务程序, 直到执行中断返回指令RTI。RTI指令从堆栈中依次弹出CCR、 A、 X、 PCH、 PCL, 使CPU返回原来中断处继续执行; ( 5) 若中断过程也允许响应新的中
34、断, 可在中断服务程序中用CLI指令开放中断。一般不建议这样做, 可用其它编程技巧处理相关问题。8给出AW60中断编程框架与基本步骤。答: 在CW环境下使用AW60芯片中断步骤是: 在main.c中, 依照”关总中断开模块中断开总中断”的顺序打开模块中断; 在isr.c文件中, 编写中断服务程序, 修改中断向量表; 按照这种思路, 编程的基本步骤能够概括为3步: ( 1) 新建( 或者复制) 一个isr.c文件, 并加入工程中。( 2) 定义中断向量表( 复制isr.c的应修改中断向量表) 。( 3) 定义ISR并在中断向量表中填入相应ISR的名称。如中断处理函数文件( isr.c) 之中的函
35、数interrupt void SCI1_Recv(void)的定义。9用一种高级语言实现PC方串行数据收发的通用程序( 要求: 从PC方发送数据A到MCU, MCU收到后, 判断是否是A, 若是, 回发给PC机, 在PC机显示”串行口正常”, 若不是, 则在PC机显示”通信有误”。) 参见随书光盘的习题参考解答程序。10在上一题测试的基础上编写通信程序, 实现如下功能: 经过PC机发送一个命令以控制接在PTA0PTA7口的8个小灯亮暗状态, 各个小灯初始状态都为暗, 首先进行通信测试, PC机发送”A”( 65) , 若MCU接收到则8个小灯全亮, 并回送字符”A”( 65) , 虽然MCU
36、接收到但有问题, 不是”A”( 65) , 说明有误码, 则4个小灯全亮, 并回送字符”0”( 48) , 否则8个小灯全暗无反应, 通信测试成功后进入控制状态, PC机发送字符串”11”, PTA0口灯亮; 发送”10”, PTA0口灯暗; 发送”21”, PTA1口灯亮; 发送”20”, PTA1口灯暗; 依此类推, 当给PTA口发送”01”, 8个小灯全亮, 发送”00”, 全暗。参见随书光盘的习题参考解答程序。第6章 GPIO的应用实例键盘、 LED与LCD 习题参考答案1为了实现对键盘的编程, 至少应该考虑哪几个方面的问题? 分别如何解决? 答: 第一, 如何识别键盘上的按键? 第二
37、, 如何区分按键是否真正地被按下, 还是抖动? 第三, 如何处理重键问题? ( 1) 键的识别如何知道键盘上哪个键被按下就是键的识别问题。若键盘上闭合键的识别由专用硬件实现, 称为编码键盘; 而靠软件实现的称为未编码键盘。在这里主要讨论未编码键盘的接口技术和键盘输入程序的设计。识别是否有键被按下, 主要有查询法、 定时扫描法与中断法等。而要识别键盘上哪个键被按下主要有行扫描法与行反转法。( 2) 抖动问题当键被按下时, 会出现所按的键在闭合位置和断开位置之间跳几下才稳定到闭合状态的情况, 当释放一个按键时也会出现类似的情况, 这就是抖动问题。抖动持续的时间因操作者而异, 一般为510ms之间,
38、 稳定闭合时间一般为十分之几秒几秒, 由操作者的按键动作所确定。在软件上, 解决抖动的方法一般是延迟等待抖动的消失或多次识别判定。( 3) 重键问题所谓重键问题就是有两个及两个以上按键同时处于闭合状态的处理问题。在软件上, 处理重键问题一般有连锁法与巡回法。2编程: 对于键盘程序, 样例中使用的是中断法。请用查询法实现键盘功能。答: 略。3简述扫描法LED显示编程原理。答: 略。具体参见本章6.2.1。4简述字符型液晶显示控制器HD44780的编程结构。答: 从编程角度看, HD44780内部主要由指令寄存器( IR) 、 数据寄存器( DR) 、 忙标志( BF) 、 地址计数器( AC)
39、、 显示数据寄存器( DD RAM) 、 字符发生器ROM( CG ROM) 、 字符发生器RAM( CG RAM) 及时序发生电路构成。5编程: 在LCD上同步显示PC时间。答: 略。第7章 定时器模块 习题参考答案1实现计数与定时的基本方法有哪些? 比较它们的优缺点。答: 实现计数与定时的基本方法有三种: 完全硬件方式、 完全软件方式和可编程计数器/定时器方法。其中完全硬件方式速度快, 但通用性和灵活性差; 完全软件方式的优点是节省硬件。主要缺点是执行延时程序期间, CPU一直被占用, 因此降低了CPU的使用效率, 也不容易提供多作业环境; 可编程计数器/定时器方法的最突出的优点是计数时不
40、占用CPU的时间。2简述AW60定时器模块的定时功能是如何实现的。答: 在AW60定时器的内部有状态和控制寄存器, 经过对它某些位的设置, 就能够确定多少时间计数器加1, 即定时间隔。经过对状态和控制寄存器的某位进行设置, 能够决定在计数器溢出时, 是否允许中断。利用这样的中断, 能够编写中断例程, 实现预设的功能。在定时器内部还有个预置寄存器, 当计数器的值等于预置寄存器的值时, 称为计数器溢出, 当计数器溢出时, 计数器的值被赋0, 同时将计数器溢出标志等状态置于状态和控制寄存器中。使用预置计数功能能够得到精确的溢出时间, 能够在任何时候暂停或清除计数器的计数( 溢出功能是定时器的最基本的
41、功能) 。3定时器模块的核心是什么, 为什么? 答: 定时器模块的核心是计数器。计数器装载预置的初始计数值之后, 启动会以预设的频率进行加一或者减一的运作, 当其值变化到0( 溢出到0或者减到0) 时, 即完成了定时的功能, 其定时的时长取决于预置的初始计数值和预设的频率。4设计并编程: 仿照本章给出的定时器1通道0输入捕捉中断里程, 捕捉两路输入信号, 分别用相应的指示灯指示。请参考随书光盘内的习题解答程序。5比较AW60定时器模块实现输出比较功能与PWM功能的异同点。答: PWM产生一个在高电平和低电平之间重复交替的输出信号, 这个信号被称为PWM信号, 也叫脉宽调制波。经过指定所需的时钟
42、周期和占空比来控制高电平和低电平的持续时间。一般定义占空比为信号处于高电平的时间(或时钟周期数)占整个信号周期的百分比, 方波的占空比是50%。脉冲宽度是指脉冲处于高电平的时间。PWM的另一个常见用途是控制输入到某个设备的平均电流或电压。PWM的常见应用是为其它设备产生类似于时钟的信号。因为S08是8位MCUs系列, 定时器通道寄存器的设置被缓存起来, 以确保连续16位数据更新, 并避免出现意外的PWM脉冲宽度。写TPMxCnVH或TPMxCnVL中的任意一个寄存器, 也就是写缓冲寄存器。在边沿对齐模式下, 只有在一个16位寄存器的两个8位字节都被写入后, 且TPMxCNTH:TPMxCNTL
43、计数器中的值为0x0000, 计数值被转移至相应的定时器通道寄存器( 直到下一个整周期新的占空比才有效) 。6综合设计: 利用输入捕捉功能, 只用定时器的一个通道, 测量一路输入, 将输入信号的电平( 只区分高低) 随时间变化的情况以图形方式显示在PC屏幕上。请参考随书光盘内的习题解答程序。第11章 模数转换模块A/D 习题参考答案1若A/D转换的参考电压为5V, 要能区分1.22mV的电压, 则要求采样位数为多少? 答: 因为5/212=1.22mV, 则要求采样位数为12位。2为什么要对采集的数据进行滤波, 除了中值滤波和均值滤波外, 还有什么滤波方法? 答: 为了使采样的数据更准确, 必
44、须对采样的数据进行筛选去掉误差较大的毛刺。一般我们采用滤波来提高采样精度。除了中值滤波和均值滤波外, 还有一阶滞后滤波, 限幅滤波法等。3简述AW60的A/D转换模块的主要特性。答: AW60 ADC的主要特性总结如下: ( 1) 具有10位分辨率的线性逐次逼近算法。( 2) 高达28个模拟输入。( 3) 10位或8位右对齐输出格式。( 4) 单次转换或连续转换(单次转换后自动返回空闲状态)。( 5) 采样时间和转换速度/功率可配置。( 6) 最多可选择4个输入时钟源。( 7) 在等待或stop3模式下实现了低噪音运行。( 8) 异步时钟源实现了低噪音运行。( 9) 可选的异步硬件转换触发。(
45、 10) 与小于, 大于或等于可编程值自动比较的中断。( 11) 内置温度传感器与AD26通道相连。4若总线时钟频率为20MHz, 当ADC1CFG寄存器的ADCLK位被设置为01, ADIV位被设置为10时, A/D采样的频率为多少? 答: 因为ADCLK位被设置为01, 则时钟源=总线时钟/2=10MHz; 又因为ADIV位被设置为10, 则选择ADC生成内部时钟ADCK所使用的分频率为4分频输入时钟, 则A/D采样的频率=10/4=2.5MHz。5使用AW60的A/D转换模块采集一路数据, 然后用中值滤波和一阶滞后滤波法( 取a=0100, 本次滤波结果=(100-a) 本次采样值+a上次滤波结果)/100滤波, 最终显示在PC端。答: 略