《51单片微型机原理和接口教程》(周思跃)习题解答 联系客服

发布时间 : 星期二 文章《51单片微型机原理和接口教程》(周思跃)习题解答更新完毕开始阅读

答:首先需中断系统开放(1→EA),然后相应的中断源需开放(即相关的标志EX0、ET0、EX1、ET1、ES、ET2需置1)

5-2.中断响应时CPU需要做哪些事情?

答:先将被响应的中断源所属的优先级存入优先级状态触发器;再将PC当前值(即断点)压入堆栈(先PCL,后PCH),然后将被响应中断源对应的中断入口地址送入PC。

5-3.中断入口与中断服务子程序入口有什么区别?

答:中断入口指的是当一个中断被响应时,由CPU自动调用的程序存储器的某个单元地址,这些地址是按不同中断源预先安排好的;而中断服务子程序入口指的是用户编制的中断服务子程序的第一条指令在程序存储器中存放的地址,两者一般来讲是不一样的,通常会在中断入口处安排一条跳转指令(LJMP或AJMP)指向中断服务子程序的入口。

5-4.89C52单片机中有哪些中断源?它们的中断申请标志分别是什么? 答:外部中断0,标志IE0 定时器/计数器T0中断,标志TF0 外部中断1,标志IE1 定时器/计数器T1中断,标志TF1 串行口中断,标志RI、TI 定时器/计数器T2中断,标志TF2、EXF2

5-5.若在某一个89C52单片机应用系统中,在系统初始化中将特殊功能寄存器IE和IP分别设置为10101111B和00101100B。当该系统正在运行时,问: ? 如果外部中断1和定时器/计数器1同时申请中断,CPU将为哪一个中断源服

务?为什么?

? 如果CPU正在执行外部中断0的中断服务子程序,这时CPU还能响应系统

哪些中断源的中断申请?为什么?

提示:根据IE,IP的内容可知,当前开放的中断源为外部中断0,T0中断,外部中断1,T1中断,T2中断;其中外部中断1,T1中断,T2中断为高级中断,外部中断0,T0中断为低级中断。

答:1) 如果外部中断1和定时器/计数器1同时申请中断,CPU将为外部中断1服务,因为它们同属高级中断,而在硬件查询序列中外部中断1排在T1前。

2) 由于外部中断0为低级中断,所以它的中断过程可以被其它任何高级中断源打断,在此处即CPU还能响应外部中断1,T1,T2的中断申请。

5-6.若在某一个单片机应用系统中,有一个外部中断1,中断级别为低级中断,中断申请信号为脉冲信号,中断服务子程序的首地址为1100H,中断服务子程序的任务是将P1口的数据传递至外部数据存储器2400H单元。编制初始化程序及中断服务子程序。 ORG 0 ;主程序入口 LJMP MAIN ;跳转到用户程序 ORG 13H ;外部中断1入口 LJMP X1IPG ;跳转到中断服务子程序入口 ORG 100H ;用户程序入口地址 MAIN: MOV SP, #60H ;堆栈指针初始化

SETB IT1 ;外部中断1设为脉冲模式

SETB EA ;允许中断 SETB ET1 ;开放外部中断1 CLR PT1 ;外部中断1设为低级中断 SJMP $ ;主程序原地等待,等待中断发生(即表示CPU可以做任何其它事情) ORG 1100H ;中断服务子程序入口 X1IPG: PUSH ACC ;保护现场(由于ACC和DPTR被使用,所以先要对其原先内容进行保护) PUSH DPL PUSH DPH MOV DPTR,#2400H MOV A, P1 MOVX @DPTR , A ;(P1)→2400H POP DPH ;恢复现场(即退出中断前,恢复ACC,DPTR中原来的内容) POP DPL POP ACC RETI ;中断返回指令 END

5-7.有一个单片机实验系统,实验线路如实验八所示。要求编制一程序,当开关5发出一脉冲信号时,程序由此转入中断服务子程序,该中断服务子程序的任务是将P1口的内容取反,然后返回到主程序。

分析:由实验八(105页)可知,开关5接在(P3.2)引脚上,故该实验其实是编制一个带外部中断0的程序。并且由于开关5发出的是脉冲信号,所以外部中断0必须工作在边沿触发方式。 ORG 0 ;主程序入口 LJMP MAIN ORG 3 ;外部中断0入口 CPL P1 RETI ; 由于中断服务子程序的内容较少(只有两条指令,占3个字节),所以直接安排在入口处 ORG 200H

MAIN: MOV SP, #60H ;堆栈指针初始化 SETB IT0 ;外部中断0边沿触发方式 SETB EA ;开放外部中断0 SETB EX0 SJMP $ ;主程序在此循环等待,等待中断发生

第六章习题答案

6-1.单片机的定时器/计数器具有哪些功能? 答:定时/计数器T0,T1具有一般的定时和计数的功能。当它们对内部机器周期信

号进行计数时,由于此信号的周期时确定的,则此时它们实现的是定时器功能;当它们对外部脉冲信号进行计数时,它们实现的是计数器的功能。另外,T1可作为串行通讯时的波特率发生器。

T2是一个高级CTC,其具有四个功能:自动装入初值的定时器/计数器、捕捉外部信号、信号发生器、串行通讯的波特率发生器。

6-2.请说明CTC的定时器工作方式的工作原理。 答:当CTC设置成对内部信号计数时,由于该内部计数信号的周期和频率是确定的(频率为fosc/12,周期即为一个机器周期),所以其计入信号的个数就能换算成时间,在实际使用中,一般根据定时的需要,先给CTC一个初值,然后启动其计数工作,当其计数溢出时会置1溢出标志,产生一个定时信号。

6-3.请说明T2捕捉工作模式的工作原理、

答:略,参见113页。大致原理:外部信号(P1.1脚)每来一个下降沿,便触发一次中断,同时记录下当前定时器T2计数值,这样可通过对相邻两次中断(即两个相邻的脉冲)时记录下来的计数值相减,便可得该脉冲信号的周期。其实这种功能也可通过T0,T1实现,只不过T2功能更强,实现起来相对容易。

6-4.若系统时钟的频率为fosc=6MHZ,请分析T1工作在模式1和模式2时,定时器最长的定时时间分别为多少?

答:已知fosc=6MHZ,故机器周期=12/fosc=2us

T1在模式1时为16位计数器,当其工作在定时方式(即作为定时器使用)时,每个机器周期加1,则其最长定时时间为216=65536个机器周期=131072(us)=131.072(ms)。

T1在模式2时为自动装入初值的8位计数器,当其工作在定时方式(即作为定时器使用)时,每个机器周期加1,则其最长定时时间为28=256个机器周期=512(us)。

6-5.已知系统时钟频率为fosc=6MHZ,若要求T1在模式1进行5ms定时,采用内部启动。请计算T1计数器的初值a,并对T1进行初始化编程。 答:由上题计算可知,当fosc=6MHZ时,T1在模式1最大定时为131.072ms > 5ms,所以T1在模式1可满足5ms定时需要。

初值计算:a=216- T定时/T机器=216- T定时×fosc/12=65536-5ms×6MHz/12=65536-5000/2=63036=F63CH 初始化编程

INIT: MOV TMOD,#10H ;T1工作在定时器方式,内部启动,模式1(即TMOD=0001XXXXB) MOV TH1, #0F6H ;T1装入初值a MOV TL1, #3CH SETB TR1 ;启动T1计时

6-6.已知系统时钟频率为fosc=6MHZ,若要求T0在模式2进行250us定时,采用外部启动。请计算T0计数器的初值a,并对T0进行初始化编程。

答:由上题计算可知,当fosc=6MHZ时,T0在模式2最大定时为512us > 250us,所以T0在模式2可满足250us定时需要。

初值计算:a=28-T定时/T机器=256-250us/2us=256-125=131=83H 初始化编程

INIT: MOV TMOD,#0AH ;T0工作在定时器方式,外部启动,模式2(即TMOD=XXXX1010B) MOV TL0, #83H ;T0装入初值a MOV TH0, #83H ; 模式2时,TH0必须和TL0装入同样的初值,以便在溢出时自动重装初值。 SETB TR0 ;准备接收外部启动命令

6-7.已知系统时钟频率为fosc=24MHZ,若要求T0在模式1计数器方式,计满500个信号,向CPU提出中断申请,采用内部启动。问该系统对外部计数信号的频率最高是多少?请计算T0计数器的初值a,并对T0进行初始化编程。

答:在计数器方式下,T0每个机器周期采集一次P3.4引脚上的电平信号,当前一次采集到低电平而后一次采集到高电平(即相邻两次采集捕捉到一个上升沿)时,T0加1;因此为了有效的捕捉到外部计数信号的上升沿,对信号有如下要求:外部信号的高电平和低电平都必须维持1个机器周期以上(即高低电平的脉宽都必须不小于1个机器周期);由前一条件可知,外部计数信号的频率不得高于fosc/24(即外部计数信号的周期必须不小于2个机器周期)! 由以上分析可知:外部计数信号的频率最高为fosc/24=1MHZ。 计数方式下的初值计算:a=2-C所需计数=65536-500=65036=FE0CH 初始化编程: ORG 0 LJMP INIT ;转到用户编制的初始化程序起始处 ORG 0BH ;T0中断入口地址 LJMP T0IPG ;转到T0中断服务子程序入口 ORG 100H ;此处假设初始化程序从程序存储器100H处开始 INIT: MOV TMOD, #05H ;设置T0为内部启动,计数方式,模式1(TMOD=XXXX0101B) MOV TH0, #0FEH ;装入初值 MOV TL0, #0CH ; SETB EA ;允许T0中断 SETB ET0 SETB TR0 ;启动T0计数 SJMP $ ;原地等待(表示CPU可做其它工作),等待T0计数溢出中断发生。 ORG 400H ;假设T0中断服务子程序从程序存储器400H处开始 T0IPG: ORL TL0, #0CH ;重装初值,不用MOV指令可消除误差,为什么,自己想一下。 MOV TH0, #0FEH …… ;中断服务子程序需完成的实际动作 RETI ;由中断返回 END

说明:既然用到了中断,就必须对中断系统进行相关的初始化操作,以上程序中

16