单片机作业整理 下载本文

《单片机》第一周作业:2013年8月30日

1、MCU是英文 Micro Controller Unit 的缩写,中文含义是 微控制器 。

2、Freescale S08系列MCU的HCS08核由哪些部分组成?CPU寄存器有哪几个、位数是多少、各有什么作用?(教材P34-P35)

3、Freescale S08系列MCU复位时SP的初值为 $00FF ,PC会自动装入位于$FFFE 和 $FFFF 存储单元中的复位向量值,MCU产生中断时CPU寄存器自动入栈顺序从先到后依次是 程序计数器的低字节PCL 、 程序计数器的高字节PCH 、 变址寄存器的低字节X 、 累加器A 、 CCR寄存器 ,为了和HC08系列保持兼容, H 寄存器并不会被自动压入堆栈。

4、CCR中的I位为 0 表示CPU允许中断,I位为 1 表示CPU禁止中断,I位的上电复位默认值为 1 。在响应中断时,CCR被自动入栈保存后I位会被自动设为 1 以阻止不必要的中断嵌套。

5、如何把SP初始化到RAM末地址?

一般初始化SP的值指向片内RAM空间的末字节,以便释放出0页地址空间的一些存储单元作为通用作为通用存储区使用。 LDHX #RAMEnd+1 TXS

6、存储器独立编址和统一编址的含义是什么? 各有什么特点?

CPU读/写存储器需要通过存储器的地址来进行读写,CPU和片内外围模块通信需要通过外围模块的地址(寄存器地址)来进行访问。 CPU和存储器、外围模块通信本质上都是CPU和不同地址通信,不同地址可以代表不同对象。 存储器独立编址方式:哈佛结构。 RAM和Flash的地址各自独立编址。如MCS-51系列MCU。

独立编址的好处是可以生成双倍的存储器空间,独立编址的寄存器地址出现重叠,但通过不同的控制线并配合不同的指令就可以区分不同存储器。

例如在MCS-51指令系统中,用MOVC指令访问Flash存储器,用MOV或MOVX指令访问RAM存储器。 存储器统一编址方式:普林斯顿结构。 RAM和Flash的统一编址在一个地址范围内,分段使用。如Freescale的08、S08、S12等系列MCU,Microchip的PIC系列MCU。 统一地址所获得的存储器空间比分离编址减半,但通过同一指令再配合不同地址参数就

可以区分不同存储器。

7、MCU内部的RAM作用主要是什么?Flash的主要作用是什么?内部寄存器的主要作用是什么?CPU如何访问片内外围模块?(教材P27-P29) 8、MC9S08AW60的整个$0000~$FFFF范围64KB的空间分成寄存器、 、Flash三大区域。

寄存器又分成三组: 、 和 。 Flash又分为两组: Flash空间 和 中断向量区 。 (其余参考教材P27-P29)

9、S08系列MCU的每个中断向量表占用 2 字节,其中的中断复位向量地址为 $FFFE 和 $FFFF 。

10、若MC9S08AW60上电复位之后PC=1860H,则FFFEH存储单元中的值为 18H ,FFFFH存储单元中的值为 60H 。

《单片机》第三周作业:2013年9月13日 1.给出AW60存储器映像的简要说明。

答:所谓存储器映像,是指地址$0000 ~ $FFFF这个64KB空间,哪些地址被何种存储器所占用,或者说AW60的RAM、Flash、I/O映像寄存器各使用$0000 ~ $FFFF这个64KB空间中的哪些地址。简单地说,就是$0000 ~ $FFFF这个64KB空间是如何分配的。

3.嵌入式系统中RAM和Flash作用分别是什么?

答:一般来说RAM这个区域安排用户数据(主要是全局变量)和堆栈空间;Flash 要用于存储程序、常数、中断向量等。

4.给出AW60的硬件最小系统。

答:AW60芯片的硬件最小系统包括电源及其滤波电路、复位电路、晶振电路及PLL滤 波电路、写入器接口电路。

《单片机》第四周作业:

MCU工作模式:

1、MC9S08系列的MCU通常具有RUN模式 、 活动背景调试模式 、 Wait模式 、

Stop模式 等工作模式。其中, RUN 模式功耗最大, Stop 模式功耗最小, Run 模式是MCU的正常工作模式,也就是MCU复位后进入的模式。

2、MC9S08系列的MCU具有的四种低功耗模式,分别是 Stop1模式 、 Stop2模式 、 Stop3模式 和 Wait模式 。其中的 Wait 模式功耗最大, Stop1 模式功耗最小。

4、当系统选项寄存器SOPT中的STOPE位为1时,执行指令 STOP 会使得MC9S08AW60进入Stop模式,至于是进入Stop2还是Stop3模式,通过设定寄存器SPMSC2中的 PPDC 位来决定,该位为 1 则进入Stop2模式,该位为 0 则进入Stop3模式。

5、MC9S08AW60处于Stop2模式时,只要发生下列任何一个唤醒事件: RESET 、 IRQ 或 RTI中断 ,MCU就会从Stop2模式唤醒。

6、MC9S08AW60处于Stop3模式时,只要发生下列任何一个唤醒事件: RESET 、 RTI 、 LVD 、 ADC 、 IRQ 或 KBI ,MCU就会从Stop3模式唤醒。

7、如果要想禁止在Stop模式下使用LVD,必须通过设定寄存器SPMSC1中的LVDSE= 0 或者LVDE= 0 。如果在Stop模式下允许LVD,不管PPDC为何值,执行STOP指令都会使MCU进入Stop3模式。

《单片机》第五周作业:

复位和中断:

1、MC9S08AW60系列MCU的一种外部复位为 RESET引脚 复位,六种内部复位分别为 复位、 上电(POR,Powered-on Reset) 复位、 看门狗(COP) 复位、 低电压检测(LVD) 复位、 非法操作码 复位、 背景调试强制 复位、 时钟发生器时钟失锁和时钟丢失 复位。

2、MC9S08AW60系列MCU发生复位后,PC从复位向量 $FFFE:$FFFF 处载入地址值,CCR中的I位为 1 ,SP的复位值为 $00FF ,总线时钟频率约为 4 MHz,CPU时钟频率约为 8 MHz,同时还会把寄存器 SRS 中的相应标志位自动置1。 4、COP具有两种溢出周期,分别是 213 和 218 个BUSCLK周期,通过

SOPT(系统选项) 寄存器中的 COPT 位进行选择,此位为 0 时选择溢出短周期,此位为 1 时选择溢出长周期,此位的复位默认值为 1 。

5、允许COP需要设定 SOPT 寄存器中的 COPE 位为 1 来实现,COP在复位之后COPE位默认状态是 1 ,其溢出周期为 218 个BUSCLK周期。为了防止COP计数器溢出,需要使用指令 STA SRS 周期性清零COP计数器,也可以设置 COPE 位为 0 来禁止COP。

10、CCR中的I位在复位之后默认为 1 ,开总中断指令为 CLI 。

11、当寄存器 IRQSC 中的 IRQPE 位为 1 时允许IRQ引脚功能,若要将IRQ引脚设为仅为上升沿触发,需要分别设定 IRQEDG 位为 1 ,设定 IRQMOD 位为 0 。IRQ的中断向量表首地址为 $FFFA 。清零IRQF位时需要向 IRQACK位 写1来实现。

12、RTI模块的状态和控制寄存器SRTISC中的RTIS[2:0]在MCU上电复位后的默认值为 0:0:0 ,说明RTI模块在MCU上电复位后是 禁止 (禁止或允许)的

13、COP能够使得MCU在程序跑飞之后自动恢复正常运行的原理是什么?

《单片机》第七周作业参考:

内部时钟生成器:

1、HCS08系列单片机的CPU时钟频率是总线频率的 2 倍,HCS08系列单片机的最高总线频率可达 20MHz ,CPU频率最高可达 40MHz 。

2、除了关断模式外,ICG模块具有四种工作模式: SCM 、 FEI 、 FBE 和 FEE 。MCU上电复位之后的默认模式是 SCM ,此时不需要外接晶振,CPU频率约为 8MHz ,总线频率约为 4MHz 。

3、ICG模块的输出有四个时钟: ICGOUT 、 FFE 、 ICGLCLK 和 ICGERCLK ,其中的 ICGOUT 用于生成CPU时钟和系统总线时钟。

4、ADC模块可以选择两个时钟源作为ADC时钟: ICGERCLK 和 BUSCLK 。

9、什么是实时中断(RTI,Real-Time Interrupt)?相关寄存器是什么? (1)如何使能实时中断?

(2)如何设置实时中断时钟源? (3)如何清零实时中断标志位? (4)如何设置实时中断周期?

《单片机》第八周作业参考 串行通信接口:

2、SCI模块采用 总线时钟(BUSCLK) 作为时钟源,

3、若要允许SCI的发送器,可以设置寄存器 SCIxC2 中 TE 位为1。

允许发送器之后,寄存器 SCIxS1 中 TDRE 位为1时就可以写发送数据到寄存器

SCIxD 中,寄存器 SCIxS1 中 TC 位为0时表明正在发送,为1表明发送完成。

4、若要允许SCI的接收器,可以设置寄存器 SCIxC2 中 RE 位为1。允许接收器之后,寄存器 SCIxS1 中 RDRF 位为1时表明SCI接收到了数据。

5、每一个SCI模块具有 SCI发送中断 、 SCI接收中断 和 SCI错误中断 三种中断,可以根据实际灵活选用。

6、如何清零RDRF标志位?

RDRF是SCI状态寄存器1(SCIxS1)的标志位,为“接收数据寄存器满标志”。当一个字符从接收移位寄存器传送到接收数据寄存器SCIxD时,该位变为1。在8位模式中,要清零RDRF,可以在RDRF=1时,先读SCIxS1,然后读SCI数据寄存器SCIxD。 例如,在SCI2接收中断服务子程序中: LDA SCI2S1 LDA SCI2D …………….

《单片机》第九、十周作业参考 键盘中断模块:

1、MC9S08AW60的8个键盘引脚中, KBIP3 ~ KBIP0 总是下降沿/低电平触发, KBIP7 ~ KBIP4 可以被配置成上升沿/高电平触发或者下降沿/低电平触发。

2、MC9S08AW60的KBI功能允许后,只要键盘引脚有按键按下,寄存器 KBI1SC 中的KBF位就变为1,要清零该标志位,需要向该寄存器中的 KBACK 位写1来实现,对应指令为: BSET 2, KBI1SC 。

定时计数器TPM:

1、MC9S08AW60内部具有 2 个 16 位的TPM模块,每个模块都支持传统的四种功能: 计数定时 、 输入捕捉 、 输出比较 和 脉宽调制PWM 。

2、MC9S08AW60复位之后,CLKSB:CLKSA= 0:0 ,因此没有选中TPM时钟源,TPM不工作。通常设定CLKSB:CLKSA= 0:1 ,让总线时钟驱动定时器。每一个TPM模块的

时钟源能够独立选定三种时钟源 总线时钟 、 固定系统时钟 或 外部时钟 。

5、MC9S08AW60包含两个独立的TPM模块:TPM1和TPM2,TPM1具有 6 个通道,TPM2具有 2 个通道。每个模块的每一个通道引脚都可以单独配置为 输入捕捉 、 输出比较 或 带缓冲的边缘对齐PWM 功能。每个模块的所有通道引脚都可以配置 为 带缓冲的中心对齐PWM 功能。

6、TPM具有两种PWMS: 边沿对齐PWM 和 中心对齐PWM ,具体受寄存器 TPMxSC 中 CPWMS 位的控制。

7、当CPWMS=0时,TPMxCNT从0开始每隔一个TPMx计数周期就加1计数,加到 0xFFFF 或 TPM模数寄存器中的值 时,重新从 0x0000 开始加1计数。

8、当CPWMS=1时,TPMxCNT从0开始每隔一个TPMx计数周期就加1计数,加到 结束值 时,进行减1计数直到 0x0000 ,然后又开始加1计数。

9、当计数器溢出标志TOF为1时,若中断信号TOIE= 1 则允许向CPU产生中断请求。

10、若要将TPMxCHn引脚设为仅在上升沿输入捕捉,则需要将寄存器 TPMxSC 中的 CPWMS 位设为0,同时还需要将寄存器 TPMxCnSC 中的 MSn[B:A] 位设为 00 、 ELSn[B:A] 位设为 01 。

14、边沿对齐PWM模式中,PWM信号的周期决定于寄存器 模数寄存器 中的设定值,占空比取决于寄存器 通道值 中的设定值,极性取决于 ELSn[B:A] 控制位的设定。

15、中心对齐PWM模式中,TPMxMOD的设定值应该在 0x0001 到 0x7FFF 之间。

16、清零TPM中断标志位通过两个步骤完成:首先 读标志位 ,然后 写0到标志位 。

《单片机》第十一周作业参考

1、已知MC9S08AW60单片机系统的总线时钟频率为4MHz,写出利用TPM1模块精确定时500ms的初始化子程序,并解释。

《单片机实验》实验一参考

1、如何理解Freescale单片机中汇编工程的执行过程?(见教材P97)

《单片机实验》实验二参考 1、给出SCI编程的通用模型。(很重要,见教材P115-116)

2、简述中断的作用与处理过程。(见教材P131-132)

3、S08系列MCU都有哪些中断源?(见教材P133-134)

4、S08系列MCU的中断执行过程是怎样的?(见教材P132-133)

5、给出AW60中断编程框架及基本步骤。(见教材P134-136)

《单片机实验》实验三参考

1、键盘中断编程的原理是什么?键值又是如何计算的?并通过表格加以说明。(见教材P143-144)

《单片机》第十二周作业答案(最后一次).doc (很重要)

1、如何理解volatile变量?并举例说明。

答:volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。volatile应该解释为“直接存取原始内存地址”比较合适。

使用该关键字的例子如下: int volatile nVint;

当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。

一般说来,volatile用在如下的几个地方:

(1)中断服务程序中修改的供其它程序检测的变量需要加volatile; (2)多任务环境下各任务间共享的标志应该加volatile; (3)存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义。

2、SCI编程的通用模型是什么?请加以说明。(见教材P115-116)

答:从基本原理的角度看,串行通信SCI接口的主要功能是:接收时,把外部的单线输入的数据变成一个字节的并行数据送入MCU内部;发送时,把需要发送的一个字节的并行数据转换为单线输出。

为了设置波特率,SCI应具有波特率寄存器。为了设置通信格式、是否校验、是否允许中断等,SCI应具有控制寄存器。而要知道串口是否有数据可收、数据是否发送出去等,需要有SCI状态寄存器。

编程时,程序员并不直接与“发送移位寄存器”和“接收移位寄存器”打交道,只与数据寄存器打交道,所以MCU中没有设置“发送移位寄存器”和“接收移位寄存器”的映像地址。

发送时,程序员通过判定状态寄存器的相应位,了解是否可以发送一个新的数据。若可以发送,则将待发送的数据放入SCI数据寄存器中,剩下的工作由MCU自动完成:将数据从“SCI数据寄存器”送到“发送移位寄存器”,硬件驱动将“发送移位寄存器”的数据一位一位地按照规定的波特率送到发送引脚TxD,供对方接收。

接收时,数据一位一位地从接收引脚RxD进入“接收移位寄存器”,当收到一个完整字节时,MCU会自动将数据送入“SCI数据寄存器”,并将状态寄存器的相应位改变,供程序员判定并取出数据。

3、简要说明AW60中断编程框架及基本步骤。(见教材P134-136)

? ? ? ? ?

?

答:在CW环境下使用AW60芯片中断的步骤是:

在main.c中,依照“关总中断→开模块中断→开总中断”的顺序打开模块中断。 在isr.c文件中,编写中断服务程序,修改中断向量表。 AW60的中断编程可概括为下述3个步骤:

新建(或者复制)一个isr.c文件,并加入工程中。 定义中断向量表(复制isr.c的应修改中断向量表)。中断向量表是一个指针数组,内容是中断函数的地址。首先要定义该中断向量表的地址,AW60的中断向量从0xFFCC开始,要使用预编译指令将中断向量表的首地址定义在0xFFCC。 定义ISR并在中断向量表填入相应ISR的名称。

4、已知MC9S08AW60单片机系统的总线时钟频率为4MHz,写出利用TPM1模块精确定时500ms的初始化子程序,并解释。

答:选定总线时钟作为TPM1的时钟源,需要设定TPM1SC中的CLKSB:CLKSA=01,若选取分频因子为64,即PS[2:0]=110,那么TPM1的计数脉冲周期为64/4MHz=16μs,500ms需要500ms/16μs=32250=7A12H个计数周期,这就需要把TPM1MOD设置为7A12H,TPM1MODH和TPM1MODL两个寄存器都要写。当TPM1CNT计数值和TPM1MOD值相等时,TPM1CNT在下一个计数周期回到0重新开始计数,同时TOF位为1,如果允许TPM1溢出中断,将向CPU产生TPM1溢出中断请求。 参考代码如下:

TPM1_Init: ; TPM1模块中断方式初始化子程序l MOV #$4E, TPM1SC ; BUSCLK为TPM1中断源,64分频, ; 允许TPM1中断

MOV #$7A,TPM1MODH

MOV #$12, TPM1MODL ; 500ms对应的模数值 CLI ; 开总中断 RTS

5、S08系列MCU的中断执行过程是怎样的?(见教材P132-133)

答:CPU每执行完一条指令,若程序有开放某些中断及总中断,则CPU按照优先级次序查询所有中断标志位,若某个中断已发送,则响应该中断请求。

当CPU收到一个许可的中断请求后,它在相应中断之前要完成当前指令。中断顺序遵守与SWI指令相同的循环顺序,包括:

(1)在堆栈中保存CPU寄存器:CPU内的寄存器PCL、PCH、X、A、CCR依次进栈(注意H未被保护,必要时,H应由用户中断服务程序保护。建议中断服务例程ISR开始把H压到堆栈中,在用从ISR中返回的RTI之前恢复H)。 (2)CCR中的I位置1,即自动关总中断(相当于自动执行SEI指令),防止其他中断进入。 (3)在目前等待的中断中取出最高优先级中断的中断向量,从相应的中断向量地址取出中断向量(即中断服务程序的入口地址)送给PC。

(4)执行中断服务程序,直到执行中断返回指令RTI。RTI指令从堆栈中依次弹出CCR、A、X、PCH、PCL,使CPU返回原来中断处继续执行。

(5)若中断过程也允许响应新的中断,可在中断服务程序中用CLI指令开放中断。

6、如下图,说明键盘中断编程的原理是什么?键值又是如何计算的?

4×4键盘与MCU接法示例(图1) 键盘定义(图2)

答:

(1)键盘中断编程的原理:

图1中列线(n1~n4)通过电阻接Vcc(+5V),当键盘上没有键闭合时,所有的行线和列线断开,列线n1~n4都呈高电平。当键盘上某一个键闭合时则该键所对应的行线与列线短接。例如,第2排第3个按键被按下闭合时,行线m2和列线n3短路,此时n3线上的电平由m2的电位所决定。

那么如何确定键盘上哪个按键被按下呢?可以把列线n1~n4接到MCU的输入口,行线m1~m4接到MCU的输出口,则在MCU的控制下,使行线m1为低电平(0),其余三根行线m2、m3、m4都为高电平(1),并读n1~n4状态。

如果n1~n4都为高电平,则m1这一行上没有键闭合,如果读出列线n1~n4的状态不全为高电平,那么为低电平的列线和m1相交的键处于闭合状态。

如果m1这一行上没有键闭合,接着使行线m2为低电平,其余行线为高电平,用同样的方法检查m2这一行上有无键闭合。

以此类推,最后使行线m4为低电平,其余的行线为高电平,检查m4这一行上是否有键闭合。

这种逐行逐列地检查键盘状态的过程称为对键盘的一次扫描。 (2)键值计算:

键盘与MCU接线见图1,图2给出了键的定义符号“0”~“9”、“A”~“D”、“*”、“#”等。如何识别“1”键呢?这里将列线n1~n4分别接PTG4、PTD2、PTD3、PTD7,且编程时将这四个引脚定义为输入并进行上拉,行线m1~m4分别接PTG0~PTG3,且编程时将PTG0~PTG3定义为输出,那么“1”键对应于按照PTD7、PTD3、PTD2、PTG4、PTG3、PTG2、PTG1、PTG0的顺序为11101110,即$EE。

“2”键对应于11011110,即$DE;……;“D”键对应于01110111,即$77。 前者$EE、$DE、$77就是“键值”,这种情况“键值”是一个字节。 这样,按图1的接法可以得出键值表。

键值可以通过扫描法获得,由键值通过查表法编程可得到键的定义值。