单片微型计算机原理与接口技术
变时;若EXF2置1,但不会发生重装载或捕获操作。这时,T2EX可以作为一个附加的外部中断源。
例如,把外部中断请求信号2连到80C51.单片机的T1引脚上,定时器/计数器T1设为计数器的方式2,即8位自动重装载方式,时间常数设为满刻度值FFH。外部中断2的服务程序人口地址存放在T1的中断矢量区中。其初始化程序段如下: ORG 0000H AJMP MAIN
ORG 001BH ;T1中断矢量作为外部中断2的中断矢量使用 LJMP INT2 ORG 0030H
MAIN: MOV TMOD,#60H ;设定时器/计数器T1为计数器方式2 MOV TLI.,#0FFH ;置T1计数常数 MOV THI,#0FFH
SETB EA ;开中断 SETB TRI. ;启动计数
INT2: …… ;外部中断2的中断服务程序 RETI
【5一11】请简述80C51单片机的中断与子程序调用的异同点,并举例加以说明。 【答】中断与子程序调用的相似点如下:
·都是中断当前正在执行的程序,转去执行子程序或中断服务子程序。 ·都是由硬件自动把断点地址压入堆栈,然后通过软件完成现场保护。
·执行完子程序或中断服务子程序后,都要通过软件完成现场恢复,并通过执行返回指令,重新返回到断点处,继续执行程序。
·两者都可以实现嵌套,如中断嵌套和子程序嵌套。 中断与子程序调用的不同点如下:
·中断请求信号可以由外部设备发出,是随机的,比如故障产生的中断请求、按键中断等;子程序调用却是由软件编排好的。
·中断响应后由固定的矢量地址转入中断服务程序;子程序地址由软件设定。 ·中断响应是受控的,其响应时间会受一些因素影响;子程序响应时间是固定的。
第6章 【单片机的定时器/计数器原理及应用】 思考与练习题解析
【6-1】80C51单片机内部设有几个定时器/计数器?简述各种工作方式的特点。
【答】80C51单片机内部设有2个16位定时器/计数器TO和T1。定时器/计数器有4种工作方式,其特点如下: .
①方式O是13位定时器/计数器。由THx高8位(作计数器)和TLx的低5位(32分频的定标器)构成,TLx的低5位溢出时,向THx进位;THx溢出时,硬件置位TFx(可用于软件查询),并可以申请定时器中断。
②方式1是16位定时器/计数器。TLx的低8位溢出时向THx进位,THx溢出时,硬 件置位TFx(可用于软件查询),并可以申请定时器中断。
③方式2是定时常数自动重装载的8位定时器/计数器。TLx作为8位计数寄存器, THx作为8位计数常数寄存器。当TLx计数溢出时,一方面将TFx置位,并申请中断;另一
41
单片微型计算机原理与接口技术
方面将THx的内容自动重新装入TLx中,继续计数。由于重新装入不影响THx的内容,所以可以多次连续再装入。方式2对定时控制特别有用。 .
④方式3只适用于TO,T0被拆成两个独立的8位计数器TLO和TH0。TLO做8位计 数器,它占用了T0的GATE、INTO、启动/停止控制位TRO、TO引脚(P3.4)以及计数溢出标志位TF0和TO的中断矢量(地址为000BH)等TH0只能做8位定时器用,因为此时的外部引脚T0已为定时器/计数器TLO所占用。这时它占用了定时器/计数器T1的启动/停止控制位TRl、计数溢出标志位TFl.及T1中断矢量(地址为001BH)。
T0设为方式3后,定时器/计数器T1只可选方式O、1或2。由于此时计数溢出标志位TFI.及T1中断矢量(地址为001BH)已被TH0所占用,所以T1仅能作为波特率发生器或其他不用中断的地方。 .
【6—2】定时器/计数器做定时器使用时,定时时间与哪些因素有关?定时器/计数器做计数器使用时,外界输入计数频率最高为多少?
【答】定时器/计数器做定时器用时,定时器的定时时间与系统的振荡频率^sc,计数器的 长度(如8位、13位或16位等)和定时初始值等有关。定时器/计数器做计数器用时,通过引脚T0(P3.4)和Tl(P3.5)对外部信号进行计数,由于检测一个1到O的跳变需要两个机器周期,故计数脉冲频率不能高于振荡脉冲频率的1/24。
【6-3】当定时器/计数器T0设为方式3后,对定时器/计数器T1如何控制?
【答】当定时器/计数器T0设为方式3后,定时器/计数器T1.只可选方式O、1或2。由于此时T1的计数溢出标志位TFl及T1中断矢量(地址为001BH)已被THO所占用,所以定时器/计数器T1仅能作为波特率发生器或用于其他不用中断的地方。T1用作串行口波特率发生器时,它的计数输出直接去串行口,只需设置好工作方式,串行口波特率发生器自动开始运行。若要T1停止工作,只需向T1送一个设T1为工作方式3的控制字即可。 【6-4】门控位GATE可使用于什么场合?请举例加以说明。
【答】当设门控位GATE=1时,由外部中断引脚INT0和TR0、INTl和TRl.共同来启动
定时器。当TR0置位时,INT0引脚为高电平才能启动定时器TO;当TRl置位时,INTl脚为高电平才能启动定时器T1。由此可测得INT0和INTl引脚上输入脉冲的高电平持续时间,继而可测得INT0和INT1引脚上输入脉冲的低电平持续时间,从而测出INT0和INTl引脚上输入脉冲的周期、频率和占空比等。
【6-5】定时器/计数器T2有哪几种工作方式?分别举例说明。
【答】T2有3种工作方式:捕获方式、自动重装载方式和波特率发生器方式,由T2CON 中有关位决定。
① 捕获方式是指在一定条件下,自动将计数器TH2和TL2的数据读人捕获寄存器 RCAP2H和RCAP2L中,即TH2和TL2内容的捕获是通过捕获寄存器RCAP2H和RCAP2L来实现的。
捕获操作发生于下述两种情况下:
·定时器2的寄存器TH2和TL2溢出时,打开重装载三态缓冲器,把TH2和TL2的内容自动读人到捕获寄存器RCAP2H和RCAP2L中。
·当EXEN2=1且T2EX(P1.1)端的信号有负跳变时,将发生捕获操作。
②自动重装载方式是指在一定条件下,自动地将捕获寄存器RCAP2H和RCAP2L的数 据装入计数器TH2和TL2中。一般说来,捕获寄存器RCAP2H和RCAP2L在这里起预置 计数初值的功能。
重装载操作发生于下述两种情况下:
·定时器/计数器T2的寄存器TH2和TL2溢出时,打开重装载三态缓冲器,把捕获寄存器RCAP2H和RCAP2L的内容自动装载到TH2和TL2中。
42
单片微型计算机原理与接口技术
·当EXEN2=1且T2EX(P1.1)端的信号有负跳变时,将发生重装载操作。
② 波特率发生器方式是指T2溢出脉冲用做串行口的时钟,在T2CON中,RCLK选择串
行通信接收波特率发生器,TCLK选择发送波特率发生器,因此,发送和接收的波特率可以不同。
【6—6】监视定时器T3功能是什么?它与定时器/计数器TO、T1有哪些区别?
【答】T3俗称“看门狗\,它的作用是强迫单片机进入复位状态,使之从硬件或软件故障中 解脱出来。
在实际应用中,由于现场的各种干扰或者程序设计错误,可能使单片机的程序进入了“死 循环\或\程序区\如表格数据区)之后,在一段设定的时间内,假如用户程序没有重装监视 定时器T3,则监视电路将产生一个系统复位信号,强迫单片机退出“死循环\或“非程序区”,重新进行“冷启动”或“热启动”。
在程序正常运行时,需要不断地对T3进行“喂狗”,当由于干扰而没能及时“喂狗\,则强迫单片机进入复位状态,从而退出非正常运行状态。“喂狗”的时间间隔就是允许的失控时间。T3的定时溢出表示出现非正常状态,而TO和T1的定时溢出是正常状态。 【6—7】如何计算计数和定时工作方式时的定时常数?请以方式O为例说明。
【答】80C51.单片机的定时器/计数器本质上都是计数器,定时方式是对内部机器周期进 行计数,计数方式是对80C51单片机的引脚TO或T1上输入的下跳变脉冲进行计数。由于计数器是加1(向上)计数的,所以预先置人的计数常数TC应为补码。 计数公式如下:
定时方式 定时时间=(2 N一TC)×机器周期 计数方式 计数次数=2 N—TC 对于定时器/计数器TO和T1: 在方式0下, N=13,213=8192
机器周期=12*振荡器周期
【6—8】用8OC51单片机的定时器/计数器如何测量脉冲的周期、频率和占空比?若时钟频率为6 MHz,那么允许测量的最大脉冲宽度是多少?
【答】欲测量的脉冲应接至80C51单片机的引脚T0或T1上,利用门控信号GATE位启 动定时器,对INT0或INT1脚上输入的脉冲的高电平进行测量,从而测出脉宽。
当GATE位设为1,并设定时器/计数器的启动位TR0或TRl为1,这时定时器/计数器的定时完全取决于INT0和INT1引脚上信号的电平,仅当INT0和INT1引脚电平为1时,定时器才工作。换个角度来看,定时器实际记录的时间就是INT0和INT1引脚上高电平的持续时间。脉冲反相后送INT0或INT1引脚上可测得脉冲低电平持续时间,二者之和即为脉冲周期,脉冲周期倒数为脉冲频率,脉冲高电平与总周期之比是占空比。 当时钟频率为6 MHz时,机器周期为2μs。
采用查询方式时,方式1的最大允许被测脉冲宽度为 65536 X 2μ s=131072μ s=131.072 ms
采用中断方式时,方式1的最大允许被测脉冲宽度为 最大允许被测脉冲宽度=131.072 ms/次×中断次数
【6—9】使用一个定时器时,如何通过软硬件结合的方法,实现较长时间的定时? ’ 【答】当需要较长时间的定时情况下,可以采用定时中断的方式,在定时器中断服务程序中对中断次数进行计数,则定时时间一定时×中断次数。若设定为100 ms产生定时中断,当 定时中断次数达到100次时,定时为100 ms/次X 1 00次=10 s。 【6—10】如何在运行中对定时器/计数器进行\飞读\ 【答】80C51单片机可以随时读出计数寄存器TLx和THx(x为O或1)中的值,称为“飞读”,
43
单片微型计算机原理与接口技术
用于实时显示计数值等。但在读取时应注意由于分时读取TLx和TH x而带来的特殊性。假如先读TLx,后读THx,由于这时定时器/计数器还在运行,在读THx之前刚好发生TLx溢出向THx进位的情况,这样读得的TLx值就不正确了。同样,先读THx,后读TLx时也可能产生这种错误。
一种解决办法是:先读THx,后读TLx,再重读TH x,若二次读得的THx值是一样的,则可以确定读人的数据是正确的;若两次读得的THx值不一致,则必须重读。 【6—11】请编程实现8OC51单片机产生频率为100.kHz等宽矩形波(定时器/ 计数器TO,方式O,定时器中断),假定单片机的晶振频率为12 MHz。加上必要的伪指令,并对源程序加以注释。
【答】100 kHz等宽矩形波,周期为10s,定时周期为5s,机器周期为1 s。
计算:TC=213一(1 2 X 106 X 5 X 106)÷12=8187=1FFBH 方式0:定时常数TCH=FFH,TCL=1BH。 · 程序如下: ORG 0000H
0000 0130 AJMP MAIN
ORG 000BH 定时器T0中断矢量 000B 0141 AJMP INTER‘ ORG 0030H
0030 758900 MAIN:MOV TMOD,#00H ;写控制字,设TO为定时器,方式O 0033 758CFF MOV TH0,#OFFH ;写定时常数,定时为5μ 0036 7 58AIB MOV TL0,#IBH
0039 D28c SETB TR0 ;开启定时器T0
003B D2A9 SETB ET0 ;开定时器T0中断 ’ 003D D2AF SETB EA ;开中断
003F 013F AJMP $ ;中断等待 ‘ 定时器T0中断 ‘
0041 758CFF INTER: MOV TH0,#0FFH ;重写定时常数 0044 758AIB MOV TL0,#IBH
0047 B290 CPL P1.0 ;P1口作为输出端,P1.0变反输出 0049 32 RETI ;中断返回 END
【6-12】采用中断方法设计8OC51单片机的秒、分脉冲发生器。要求采用定时器/计数器T1的方式1编程,实现P1.0每秒钟产生一个机器周期的正脉冲,P1.1每分钟产生一个机器周期的正脉冲。加上必要的伪指令,并对源程序加以注释。晶振频率为12 MHz。
【答】机器周期为1μs,定时器采用方式1时,最长定时时间仅为65 ms。需要采用定时×溢出次数=所需定时。如定时设为10 ms,则定时溢出中断100次时,为定时1 S。 计算:10 ms=(2 M—TC)×1μs,TC=55536=D8F0 H 程序如下: ORG 0000H
0000 013 0 AJMP MAIN ORG 001BH
001B 0149 AJMP INTER ORG 0030H
0030 758910 MAIN: MOV TMOD,#1 0H ;设控制字,T1为定时器方式1
44
单片微型计算机原理与接口技术
0033 758DD8 MOV THI,#0D8H ;i 0 ms定时初始值 0036 758BF0 MOV TLI,#0FOH
0039 7F3C MOV R7,#60 ;定时1分计数器 003B 7864 MOV R0,#1 00 ;定时1 S计数器 003D D28E SETB TRI ;开启定时器T1
003F D2AB SETB ETI ;开定时器T1中断 0041 D2AF SETB EA ;开中断 0043 C29 0 CLR P1.0 ;初始值 0045 C29 1 CLR P1.1
0047 0147 AJMP $ ;定时中断等待 定时10ms中断服务程序 .
0049 758DD8 INTER:MOV THI,#0D8H
004C 758BF0 MOV TLI,#0FOH ;重置10ms定时常数 004F D80A DJNZ. RO,REP
0051 B290 CPL P1.0 ;1 s定时到,P1.0取反输出 0053 7864 MOV R0,#1 00
0055 DF04 DJNZ R7,REP ;若R7不为0,则中断返回 , 0057 B291 CPL P1.1 ;1分定时到,则P1.1取反输出 0059 7F3C MOV R7,#60 ;循环值 005B 32 REP:RETI
【6—1 3】80C51单。片机的定时器/计数器T0以定时方法在P3.1引脚上周期为400μs,占空比为9:1的矩形脉冲,以定时工作方式2编程实现。加上必要的伪指令,并对源程序加以注释。fosc=6 M H z。
【答】矩形脉冲高电平时间为3 6 0μs,低电平时间为40μs。机器周期为2μs。 计算:40μs定时,40μs=(28一TC)×2μs,TC=ECH 360μs定时,360μs=(28一TC)×2μs,TC=4CH 采用查询法编程: ORG 0000H
0000 013 0 AJMP MAIN ORG 0030H
0030 758902 MAIN: MOV TMOD,#02H ;定时器T0以方式2定时 0033 758CEC MOV TH0,#0ECH ;定时40μs 0036 758AEC MOV TL0,#0ECH
0039 C2BI CLR P3.1 ;P3.1初始值
003B D28C SETB TR0 . ;开启定时器TO 003D C2BI LOOP: CLR P3.1
003F 108D02 JBC TF0,REP ;查询40μs定时到,则转 0042 013D AJP LOOP
0044 D2BI REP: SETB P3.1 ;P3.1输出高电平360 μs 0046 7F09 MOV R7,#09H ;定时40 μs X 9=360 μs
0048 108D02 LOOPl:JBC TF0,REPI ;查询高电平360μs定时到,则转 004B 0148 AJMP LOOPl
004D DFF9 REPI:DJNZ R7,LOOPl
45