中断的基本概念
80C51中断源中断控制寄存器中断处理过程中断优先控制和中断嵌套中断系统的应用
80C51定时 /计数器定时 /计数器控制寄存器定时 /计数器工作方式定时 /计数器的应用第 5章 中断系统 和 定时 /计数器本章要点:
§ 5-1 80C51中断系统
CPU暂时中止其正在执行的程序,转去执行请求中断的那个外设或事件的服务程序,等处理完毕后再返回执行原来中止的程序,叫做中断。
⒉ 为什么要设置中断?
⑴ 提高 CPU工作效率
⑵ 具有实时处理功能
⑶ 具有故障处理功能
⑷ 实现分时操作
5.1.1 中断概述
⒈ 什么叫中断?
中断功能强弱是计算机性能优劣的重要标志
① 中断源
②中断申请
③开放中断
④保护现场
⑤中断服务
⑥恢复现场
⑦中断返回中断涉及的几个环节
CPU 在每个机器周期的 S5P2期间,会自动查询各个中断申请标志位,若查到某标志位被置位,将启动中断机制。
CPU识别中断申请的依据:
⑴ INT0:外部中断 0,中断请求信号由 P3.2输入。
⑵ INT1:外部中断 1,中断请求信号由 P3.3输入。
⑶ T0:定时 /计数器 0溢出中断,对外部脉冲计数由 P3.4输入。
⑷ T1:定时 /计数器 1溢出中断,对外部脉冲计数由 P3.5输入。
⑸ 串行中断,包括 串行接收中断 RI和 串行发送中断 TI。
5.1.2 中断源和中断控制寄存器
⒈ 中断源中断源是指能发出中断请求,引起中断的装置或事件。
80C51单片机的中断源共有 5个,其中 2个为外部中断源,3个为内部中断源:
① 中断请求:定时和外中断控制寄存器 TCON;
串行控制寄存器 SCON;
② 中断允许控制寄存器 IE;
③ 中断优先级控制寄存器 IP。
⒉ 中断控制寄存器
80C51单片机中涉及中断控制的有 3个方面 4个特殊功能寄存器,
INT0,INT1,T0,T1中断请求标志放在 TCON中串行中断请求标志放在 SCON中。
⑴ 中断请求控制寄存器
TCON D7 D6 D5 D4 D3 D2 D1 D0
位名称 TF1 — TF0 — IE1 IT1 IE0 IT0
位地址 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H
功能
T1
中断标志

T0
中断标志
— 中断标志触发方式中断标志触发方式
TCON的结构、位名称、位地址和功能如下:
TCON位功能,
① TF1 —— T1溢出中断请求标志
T1计数溢出后,TF1=1
② TF0 —— T0溢出中断请求标志
T0计数溢出后,TF0=1
TF0/TF1:定时器溢出中断申请标志位:
=0:定时器未溢出;
=1:定时器溢出申请中断,进中断后自动清零。
③ IE1 —— 外中断中断请求标志当 P3.3引脚信号有效时,IE1=1
④ IE0 —— 外中断中断请求标志当 P3.2引脚信号有效时,IE0=1
IE0/IE1:外部中断申请标志位:
=0:没有外部中断申请;
=1:有外部中断申请。
⑤ IT1 —— 外中断触发方式控制位
IT1=1,边沿触发方式;
IT1=0,电平触发方式。
⑥ IT0 —— 外中断触发方式控制位其意义和功能与 IT1相似。
IT0/IT1:外部中断请求的触发方式选择位:
=0:在 INT0/INT1端申请中断的信号低电平有效 ;
=1:在 INT0/INT1端申请中断的信号负跳变有效,
串行控制寄存器 SCON
TCON D7 D6 D5 D4 D3 D2 D1 D0
位名称 — — — — — — TI RI
位地址 — — — — — — 99H 98H
功能 — — — — — — 串行发送中断标志 串行接收中断标志
① TI —— 串行口发送中断请求标志
② RI —— 串行口接收中断请求标志
80C51对中断源的开放或关闭由中断允许控制寄存器 IE控制。
⑵ 中断允许控制寄存器 IE
IE的结构、位名称和位地址如下:
IE D7 D6 D5 D4 D3 D2 D1 D0
位名称 EA — — ES ET1 EX1 ET0 EX0
位地址 AFH — — ACH ABH AAH A9H A8H
中断源 CPU — — 串行口 T1 T0
① EA —— CPU中断允许控制位 (总开关)
EA=1,CPU开中;
EA=0,CPU关中,且屏蔽所有 5个中断源。
② EX0 —— 外中断 INT0中断允许控制位
EX0=1,INT0开中; EX0=0,INT0关中。
③ EX1 —— 外中断 INT1中断允许控制位
EX1=1,INT1开中; EX1=0,INT1关中。
④ ET0 —— 定时 /计数器 T0中断允许控制位
ET0=1,T0开中; ET0=0,T0关中。
⑤ ET1 —— 定时 /计数器 T1中断允许控制位
ET1=1,T1开中; ET1=0,T1关中。
⑥ ES —— 串行口中断 (包括串发、串收 )允许控制位
ES=1,串行口开中; ES=0,串行口关中。
说明,80C51对中断实行 两级 控制,总控制位是 EA,
每一中断源还有各自的控制位。 首先 要 EA=1,其次 还要自身的控制位置,1” 。
例如,要使 INT0开中 (其余关中 ),可执行下列指令:
MOV IE,#1000000lB ;
或者,SETB EA ;
SETB EX0 ;
IE D7 D6 D5 D4 D3 D2 D1 D0
位名称 EA — — ES ET1 EX1 ET0 EX0
位地址 AFH — — ACH ABH AAH A9H A8H
中断源 CPU — — 串行口 T1 T0
中断允许控制寄存器 IE
① PX0,INT0中断优先级控制位。 PX0=1,为 高 优先级;
PX0=0,为 低 优先级;
② PX1,INT1中断优先级控制位。控制方法同上。
③ PT0,T0中断优先级控制位。控制方法同上。
④ PT1,T1中断优先级控制位。控制方法同上。
⑤ PS,串行口中断优先级控制位。控制方法同上。
⑶ 中断优先级控制寄存器 IP
80C51有 5个中断源,划分为 2个中断优先级:
高优先级和低优先级 。
IP的结构、位名称和位地址如下:
IE D7 D6 D5 D4 D3 D2 D1 D0
位名称 — — — PS PT1 PX1 PT0 PX0
位地址 — — — BCH BBH BAH B9H B8H
中断源 — — — 串行口 T1 INT1 T0 INT0
例如,若要将 INT1、串行口设置为高优先级,其余中断源设置为低优先级,可执行下列指令:
MOV IP,#00010100B;
需要指出的是,若置 5个中断源全部为高优先级,
就等于不分优先级。
IE D7 D6 D5 D4 D3 D2 D1 D0
位名称 — — — PS PT1 PX1 PT0 PX0
位地址 — — — BCH BBH BAH B9H B8H
中断源 — — — 串行口 T1 INT1 T0 INT0
中断优先级控制寄存器 IP
5.1.3 中断处理过程中断处理过程大致可分为四步:
中断请求、中断响应、中断服务、中断返回
⒈ 中断请求中断源发出中断请求信号,相应的中断请求标志位 (在中断允许控制寄存器 IE中 )置,1” 。
⒉ 中断响应
CPU查询(检测)到某中断标志为,1”,在满足中断响应条件下,响应中断。
⑴ 中断响应条件,
① 该中断已经“开中”;
② CPU此时没有响应同级或更高级的中断;
③ 当前正处于所执行指令的最后一个机器周期;
④ 正在执行的指令不是 RETI或者是访向 IE,IP的指令,否则必须再另外执行一条指令后才能响应。
⑵ 中断响应操作
CPU响应中断后,进行下列操作:
① 保护断点地址;
② 撤除该中断源的中断请求标志;
③ 关闭同级中断;
④ 将相应中断的入口地址送入 PC;
80C51五个中断入口地址,
INT0,0003H;
T0,000BH;
INT1,0013H;
T1,001BH;
串行口,0023H
⒊ 执行中断服务程序中断服务程序应包含以下几部分:
⑴ 保护现场
⑵ 执行中断服务程序主体,完成相应操作
⑶ 恢复现场
⒋ 中断返回在中断服务程序最后,必须安排一条中断返回指令 RETI,当 CPU执行 RETI指令后,自动完成下列操作:
⑴ 恢复断点地址。
⑵ 开放同级中断,以便允许同级中断源请求中断。
5.1.4 中断响应等待时间若排除 CPU正在响应同级或更高级的中断情况,中断响应等待时间为,
3~ 8个机器周期
5.1.5 中断请求的撤除中断源发出中断请求,相应中断请求标志置,1” 。
CPU响应中断后,必须 清除中断请求,1” 标志。否则中断响应返回后,将再次进入该中断,引起死循环出错。
⑴ 对定时 /计数器 T0,T1中断,外中断边沿触发方式,
CPU响应中断时就用 硬件自动清除 了相应的中断请求标志。
⑵ 对外中断电平触发方式,需要采取 软硬结合的方法 消除后果。
⑶ 对串行口中断,用户应在串行中断服务程序中用软件清除 TI或 RI。
例:
硬件电路如图所示。当外部设备有中断请求时,中断请求信号经反相,加到锁存器 CP端,作为 CP脉冲。
由于 D端接地为 0,Q端输出低点平,触发 INT0生中断。 当 CPU响应中断后,应在该中断服务程序中按排两条指令,
CLR P1,0:
SETB P1,0
从而撤消引起重复中断的 INT0低电平信号。
因此一般来说,对外中断 INT0,INTl,应尽量采用边沿触发方式,以简化硬件电路和软件程序。
5.1.6中断优先控制和中断嵌套
⒈ 中断优先控制
80C51中断优先控制首先根据中断优先级,此外还规定了同一中断优先级之间的中断优先权。其 从高到低的顺序为,
INT0,T0,INT1,T1、串行口。
中断优先级是可编程的,而 中断优先权是固定的,不能设置,仅用于同级中断源同时请求中断时的优先次序。
80C51中断优先控制的基本原则:
① 高优先级中断 可以中断 正在响应的低优先级中断,
反之则不能。
② 同优先级中断 不能互相中断 。
③ 同一中断优先级中,若有多个中断源同时请求中断,
CPU将 先响应 优先权高的中断,后响应 优先权低的中断。
⒉ 中断嵌套当 CPU正在执行某个中断服务程序时,如果发生更高一级的中断源请求中断,CPU可以“中断”正在执行的低优先级中断,转而响应更高一级的中断,这就是中断嵌套。
中断嵌套只能高优先级“中断”低优先级,低优先级不能“中断”高优先级,同一优先级也不能相互“中断”。
中断嵌套结构类似与调用子程序嵌套,不同的是,
① 子程序嵌套是在程序中事先按排好的;中断嵌套是 随机 发生的。
② 子程序嵌套无次序限制,中断嵌套只允许高优先级“中断”低优先级。
5.1.7 中断系统的应用
⒈ 中断初始化
⑴ 设置堆栈指针 SP
⑵ 定义中断优先级
⑶ 定义外中断触发方式
⑷ 开放中断
⑸ 安排好等待中断或中断发生前主程序应完成的操作内容。
⒉ 中断服务主程序中断服务子程序内容要求:
⑴ 在中断服务入口地址设置一条跳转指令,转移到中断服务程序的实际入口处。
⑵ 根据需要保护现场。
⑶ 中断源请求中断服务要求的操作。
⑷ 恢复现场。与保护现场相对应,注意先进后出、后进先出操作原则。
⑸ 中断返回,最后一条指令必须是 RETI。
⒈ 中断初始化
⑴ 设置堆栈指针 SP
因中断涉及保护断点 PC地址和保护现场数据,
且均要用堆栈实现保护,因此要设置适宜的堆栈深度。
① 深度要求不高且工作寄存器组 1~ 3不用时,
可维持复位时状态,SP=07H,深度为 24B(20H~2FH
为位寻址区 )。
② 要求有一定深度时,可设置 SP=60H或 50H,
深度分别为 32B和 48B。
⑵ 定义中断优先级根据中断源的轻重缓急,划分高优先级和低优先级。
用 MOV IP,#XXH或 SETB XX指 令设置。
⑶ 定义外中断触发方式一般情况,定义边沿触发方式为宜。若外中断信号无法适用边沿触发方式,必须采用电 平触发方式时,应在硬件电路上和中断服务程序中采取撤除中断请求信号的措施。
⑷ 开放中断注意开放中断必须同时开放二级控制,即同时置位 EA和需要开放中断的中断允许控制 位。可用
MOV IE,#XXH指令设置,也可用 SETB EA和 SETB XX
位操作指令设置。
⑸ 安排好等待中断或中断发生前主程序应完成的操作内容。
⒉ 中断服务主程序中断服务子程序内容要求:
⑴ 在中断服务入口地址设置一条跳转指令,转移到中断服务程序的实际入口处。
由于 80C51相邻两个中断入口地址间只有 8B的空间,8B只能容纳一个有 3~8条指令的极短程序,
一般情况中断服务程序均大大超出 8B长度。因此,
必须跳转到其他合适的地址空间。跳转指令可用
SJMP,AJMP或 LJMP指令,SJMP,AJMP均受跳转范围影响,建议用 LJMP指令,则可将真正的中断服务程序不受限制地安排在 64KB任何地方。
⑵ 根据需要保护现场 。
保护现场不是中断服务程序的必需部分。 通常是保护 Acc,PSW和 DPTR等特殊功能寄存器中的内容。若中断服务程序中不涉及 Acc,PSW,DPTR,则不需保护,
也不需恢复。例如:累加器 A是最常用的特殊功能寄存器,主程序中不可能不用到 A。而发生中断又是随机的,可能正好发生在对 A进行操作,A中的数据还有用时进入中断,而在中断服务程序中又涉及到 A,改变了 A中的内容,则在进入中断服务程序对 A操作前应对原 A中数据进行保护,以便中断返回后恢复 A中原来数据需要指出的是,保护现场数据越少越好,数据保护越多,堆栈负担越重,堆栈深度设置 应越深。
⑶ 中断源请求中断服务要求的操作 。
⑷ 若是外中断电平触发方式,应有 中断信号撤除操作。若是串行收发中断,应有对 RI,TI清 0指令。
⑸ 恢复现场 。与保护现场相对应,注意先进后出、
后进先出操作原则。
(6)中断返回,最后一条指令必须是 RETI。
【 例 5-1】 出租车计价器计程方法是车轮每运转一圈产生一个负脉冲,从外中断 INT0( P3.2)引脚输入,
行驶里程为轮胎周长 × 运转圈数,设轮胎周长为 2m,
试实时计算出租车行驶里程(单位米),数据存
32H,31H,30H。
⒊ 中断系统应用举例解:编程如下:
ORG 0000H ;复位地址
LJMP STAT ;转初始化
ORG 0003H ;中断入口地址
LJMP INT ;转中断服务程序
ORG 0100H ;初始化程序首地址
STAT,MOV SP,#60H ;置堆栈指针
SETB IT0 ;置边沿触发方式
MOV IP,#01H ;置高优先级
MOV IE,#81H ;开中
MOV 30H,#0 ;里程计数器清 0
MOV 31H,#0 ;
MOV 32H,#0 ;
LJMP MAIN ;转主程序,并等待中断
ORG 0200H ;中断服务子程序首地址
INT,PUSH Acc ;保护现场
PUSH PSW ;
MOV A,30H ;读低 8位计数器
ADD A,#2 ;低 8位计数器加 2m
MOV 30H,A ;回存
CLR A ;
ADDC A,31H ;中 8位计数器加进位
MOV 31H,A ;回存
CLR A ;
ADDC A,32H ;高 8位计数器加进位
MOV 32H,A ;回存
PUSH PSW ;恢复现场
PUSH Acc ;
RETI ;中断返回
MAIN主程序可以处理循环显示等任务。
【 例 5-3】 现有 5个外中断源 EX1,EX20,EX21,EX22和
EX23,高电平时表示请求中断,要求执行相应中断服务程序,试编制程序。
解:
ORG 0000H;复位地址
LJMP MAIN ;转主程序
ORG 0003H;中断入口地址
LJMP PINT0;转中断服务程序
ORG 0013H;中断入口地址
LJMP PINT1;转中断服务程序
ORG 0100H ;主程序首地址
MAIN,MOV SP,#60H ;置堆栈指针
ORL TCON,#05H ;置 INT0,INT1为边沿触发方式
SETB PX0 ;置为高优先级
MOV IE,#0FFH ;全部开中;主程序内容
ORG 1000H ;中断服务程序首地址
PINT0,PUSH Acc ;中断,保护现场
LCALL WORK1 ;调用 EX1服务子程序
POP Acc ;恢复现场
RETI ;中断返回
ORG 2000H ;中断服务程序首地址
PINT1,CLR EA ;CPU禁中
PUSH Acc ;中断保护现场
PUSH DPH ;
PUSH DPL ;
SETB EA ;CPU开中
JB P1.0,LWK20;P1.0=1,EX20请求中断
JB P1.1,LWK21;P1.1=1,EX21请求中断
JB P1.2,LWK22;P1.2=1,EX22请求中断
LCALL WORK23 ;P1.3=1,调用 EX23服务子
LRET,CLR EA ;CPU禁中
POP DPL ;恢复现场
POP DPH ;
POP Acc ;
SETB EA ;CPU开中
RETI ;中断返回
LWK20,LCALL WORK20 ;P1.0 = 1,调用 EX20服务子程序
SJMP LRET ;转中断返回
LWK21,LCALL WORK21 ;P1.1 = 1,调用 EX21服务子程序
SJMP LRET ;转中断返回
LWK22,LCALL WORK22 ;P1.2 = 1,调用 EX22服务子程序
SJMP LRET ;转中断返回
【 例 】
通过外部中断 1,在中断服务中将 B寄存器里的内容左环移一位。已知,(B)=01h,要求采用 边沿触发,低优先级 。
此例的实际意义:在 INT1引脚接一个 按钮开关 到地,每按一下按钮就申请一次中断,中断服务则是,依次点亮八盏灯中的一盏。
P1.0
P1.7
INT1 300?
ORG 0000H
LJMP MAIN
ORG 0013H ;中断矢量
LJMP INT
MAIN,SETB EA ;开总中断允许,开关,
SETB EX1 ;开分中断允许,开关,
CLR PX1 ;0 优先级(也可不要此句)
SETB IT1 ;边沿触发
MOV B,#01H ;给 B 寄存器赋初值
HERE,SJMP HERE ;原地等待中断申请
INT,MOV A,B ;自 B寄存器中 取数
RL A ;左环移一次
MOV B,A ;存回 B,备下次取用
MOV P1,A ;输出到 P1口
RETI ;中断返回中断服务程序定时 /计数器是单片机系统一个重要的部件,其工作方式灵活、编程简单、使用方便,
可用来实现 定时控制,延时,频率测量,脉宽测量,信号发生,信号检测 等。此外,定时 /
计数器还可作为串行通信中波特率发生器。
§ 5-2 80C51定时 /计数器
1.定时 /计数器的结构一,定时 /计数器概述内部总线工作方式工作方式
TH1 TL1 TH 0 TL 0
TCON TMOD
T 1( P3.5) T 0( P3.4)
微处理器定时器,对片内机器时钟 (周期方波 )进行计数计数器,对 Tx引脚 输入的负脉冲进行计数
80C51单片机内部有 两个定时 /计数器 T0和 T1,其核心是计数器,基本功能是 加 1。
对外部事件脉冲( 下降沿 )计数,是计数器;对片 内机周脉冲计数,是定时器。
计数器由 二个 8位计数器 组成。
定时时间和计数值可以编程设定,其方法是在计数器内设置一个初值,然后 加 1计满后溢出 。 调整计数器初值,可调整从 初值 到 计满溢出 的数值,
即调整了定时时间和计数值。
定时 /计数器作为计数器时,外部事件脉冲必须从规定的引脚输入。且外部脉冲的最高频率不能超过时钟频率的 1/24。
5.2.1 定时 /计数器概述
TCON低 4位与外中断,有关,已在 中断中叙述。
高 4位与定时 /计数器 T0,T1有关。
⑴ TF1:定时 /计数器 T1溢出标志。
⑵ TF0:定时 /计数器 T0溢出标志。
⑶ TR1:定时 /计数器 T1运行控制位。 TR1=1,T1运行 ;TR1=0,T1停。
⑷ TR0:定时 /计数器 T0运行控制位。 TR0=1,T0运行 ;TR0=0,T0停。
TCON的字节地址为 88H,每一位有位地址,均可位操作。
⒈ 定时 /计数器 控制 寄存器 TCON
5.2.2 定时 /计数器的控制寄存器
TCON
T1
中断标志
T1
运行标志
T0
中断标志
T0
运行标志
INT1
中断标志
INT1
触发方式
INT0
中断标志
INT0
触发方式位名称 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
位地址 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H
INT0 INT1
高 4位控制 T1 低 4位控制 T0
门控位计数 /定时方式选择工作方式选择门控位计数 /定时方式选择工作方式选择
G C / T M1 M0 G C / T M1 M0
TMOD用于设定定时 /计数器的工作方式低 4位 用于控制 T0,高 4位 用于控制 T1。
⒉ 定时 /计数器工作方式控制寄存器 TMOD
⑴ M1M0 —— 工作方式选择位
M1M0 工作方式 功能
00 方式 0 13位计数器
01 方式 1 16位计数器
10 方式 2 两个 8位计数器,初值自动装入
11 方式 3 两个 8位计数器,仅适用 T0
⑵ C/T —— 计数 /定时方式选择位
C/T=1,计数 工作方式,对外部事件脉冲计数,用作计数器。
C/T=0,定时 工作方式,对片内机周脉冲计数,用作定时器。
⑶ GATE —— 门控位
GATE=0,运行只受 TCON中运行控制位 TR0/TR1的控制。
GATE=1,运行同时受 TR0/TR1和外中断输入信号 的双重控制。
只有当 INT0/INT1=1且 TR0/TR1=1,T0/T1才能运行。
TMOD字节地址 89H,不能位操作,设置 TMOD须用字节操作指令。
5.2.3 定时 /计数器工作方式
⒈ 工作方式 0
13位 计数器,由 TL0低 5位和 TH0 8位组成,TL0低 5位计数满时不向 TL0第 6位进位,而是向 TH0进位,13位计满溢出,
TF0置,1” 。 最大计数值 213 = 8192。
⒉ 工作方式 1
16位 计数器,最大计数值为 216 = 65536。当 fosc=12MHZ,
最大定时 65536?S,而用方式 0最大定时时间为 8192?S.
⒊ 工作方式 2
8位 计数器,仅用 TL0计数,最大计数值为 28= 256,计满溢出后,一方面进位 TF0,使溢出标志 TF0 = 1;另一方面,使原来装在 TH0中的 初值 装入 TL0。
优点:定时初值可自动恢复,TH0中存放初值 ;缺点:计数范围小。
适用于需要重复定时,而定时范围不大的应用场合。
⒋ 工作方式 3
方式 3仅适用于 T0,T1无方式 3。
⑴ T0方式 3
在方式 3情况下,T0被拆成二个独立的 8位计数器 TH0、
TL0。
TL0可以为定时 /计数器;
TH0只能作为 8位定时器。
① TL0使用 T0原有的控制寄存器资源,TF0,TR0,GATE,C/T,INT0,组成一个 8位的定时 /计数器;
② TH0借用 T1的中断溢出标志 TF1,运行控制开关 TR1,只能对片内机周脉冲计数,组成另一个 8位定时器 (不能用作计数器 )。
⑵ T0方式 3情况下的 T1
T1由于其 TF1,TR1被 T0的 TH0占用,计数器溢出时,只能将输出信号送至串行口,即 用作串行口波特率发生器 。
其中,N与工作方式有关,方式 0时,N=13;
方式 1时,N=16;
方式 2,3时,N=8。
机周时间与主振频率有关,机周时间 =12/fosc
fosc=12MHZ时,1机周 =1?S;
fosc=6MHZ 时,1机周 =2?S。
5.2.4 定时 /计数器的应用
⒈ 计算定时 /计数初值
80C51定时 /计数初值计算公式:
解:⑴ 工作方式 0:
213– 500?S/2?S=8192-250=7942=1F06H
1F06H化成二进制:
1F06H=0001 1111 0000 0110B
=000 11111000 00110 B
其中,低 5位 00110前添加 3位 000送入 TL0
TL0=000 00110B=06H;
高 8位 11111000B送入 TH0
TH0=11111000B=F8H。
【 例 5-4】 已知晶振 6MHz,要求定时 0.5ms,试分别求出 T0工作于方式 0、方式 1、方式 2、方式 3时的定时初值。
⑵ 工作方式 1:
T0初值 =216-500?s/2?s=65536– 250=65286=FF06H
TH0=FFH; TL0=06H。
⑶ 工作方式 2:
T0初值 =28-500?s/2?s=256-250=6
TH0=06H; TL0=06H。
⑷ 工作方式 3:
T0方式 3时,被拆成两个 8位定时器,定时初值可分别计算,计算方法同方式 2。两个定时初值一个装入 TL0,另一个装入 TH0。因此:
TH0=06H; TL0=06H。
从上例中看到,方式 0时计算定时 初值比较麻烦,根据公式计算出数值后,还要变换一下,容易出错,不如直接用方式 1,且方式 0计数范围比方式 1小,方式 0完全可以用方式
1代替,方式 0与方式 1相比,无任何优点 。
⒉ 定时 /计数器应用步骤
⑴ 合理选择定时 /计数器 工作方式
⑵ 计算定时 /计数器定时 初值 (按上述公式计算 )
⑶ 编制应用程序
①定时 /计数器的初始化包括定义 TMOD、写入定时初值、设置中断系统、
启动定时 /计数器运行等。
②正确编制定时 /计数器中断服务程序注意 是否需要重装 定时初值,若需要连续反复使用原定时时间,且未工作在方式 2,则应在中断服务程序中重装定时初值。
【 例 5-5】 试用 T1方式 2编制程序,在 P1.0引脚输出周期为 400?S的脉冲方波,已知 fosc=12MHZ。
解,① 计算定时初值
T1初值 =28-200?s/1?s=256– 200=56=38H
TH1=38H; TL1=38H
② 设置 TMOD:
0 0 10 0000 B=20H
T0控制位,与 T1无关
T1方式 2
T1定时器
T1启动与 无关INT1
③ 编制程序 如下:
ORG 0000H ;复位地址
LJMP MAIN ;转主程序
ORG 001BH ;T1中断入口地址
LJMP IT1 ;转 T1中断服务程序
ORG 0100H ;主程序首地址
MAIN,MOV TMOD,#20H ;置 T1定时器方式 2
MOV TL1,#38H ;置定时初值
MOV TH1,#38H ;置定时初值备份
MOV IP,#00001000B;置 T1高优先级
MOV IE,#0FFH ;全部开中
SETB TR1 ;T1运行
SJMP $ ;等待 T1中断
ORG 0200H ;T1中断服务程序首地址
IT1,CPL P1.0 ;输出波形取反首地址
RETI ;中断返回
【 课堂练习题 】
参照以上例题工作方式 2,按下列要求分别修改程序:
① 脉冲方波从 P3.0输出;
② fosc=6MHz;
③ 脉冲方波脉宽为 100?s;
④ 用定时 /计数器 T0;
【 例 5-6】 已知晶振 12MHZ,参阅图 5-15,要求利用定时器 T0使图中发光二极管 D进行秒闪烁。
解:发光二极管进行秒闪烁。即一秒钟一亮一暗,亮 500ms,暗 500
ms。晶振 12MHz,每机周 1?s,T0方式 1最大定时只能 65ms余。
取 T0定时 50ms,计数 10次,即可实现
500ms定时。
① 计算定时初值
T0初值 =216-50000?s/1?s
=65536– 50000=15536=3CB0H
TH0=3CH; TL0=B0H。
② 设置 TMOD:
0000 0 0 01 B = 01H
T0方式 1
T0
与 无关
T1控制位
INT0
③ 编制程序 如下:
ORG 0000H ;复位地址
LJMP MAIN ;转主程序
ORG 000BH ;T0中断入口地址
LJMP IT0 ;转 T0中断服务程序
ORG 0100H ;主程序首地址
MAIN:MOV TMOD,#01H ;置 T0定时器方式 1
MOV TH0,#3CH ;置 T0初值 50ms
MOV TL0,#0B0H ;
MOV IE,#10000010B;T0开中
MOV R7,#0AH ;置 50ms计数器初值
SETB TR0 ;T0运行
SJMP $ ;等待中断
ORG 0200H
ITO,MOV TH0,#3CH ;重置 T0初值 50ms
MOV TLO,#0BOH
DJNZ R7,GORET ;判 500ms到否?
CPL P1.7 ; 500ms到,输出取反
MOV R7,#0AH ;恢复 50ms计数器初值
GORET,RETI
【 例 5.7】 已知 fosc=6MHz,检测 T0引脚上的脉冲数,并将 1s内的脉冲数显示在显示屏上,每隔 1s刷新一次显示值 (设一秒内脉冲数 ≤ 65535个 )。
根据题目要求,T0用作计数器方式 1,T1用作定时器方式 1,定时 100ms。
3)编制程序如下:
ORG 0000H
LJMP MAIN ;转主程序
0RG 000BH
LJMP IT0 ;转 T0中断服务程序
ORG 001BH
LJMP ITl ;转 T1中断服务程序
ORG 0100H
MAIN,MOV SP,#60H ;置堆栈
MOV TMOD,#15H ;置 T0计数器方式 1,T1定时器方式 1
MOV TH0,#00H ;置 T0初值
MOV TL0,#00H ;
MOV TH1,#3CH ;置 T1初值
MOV TL1,#0BOH ;
SETB PT1 ;置 T1为高优先级
MOV IE,#10001101B ; TO、串口不开中,其余开中
SETB TR0 ; TO启动
SETB TRl ; T1启动
MOV R7,#OAH ;置 lOOms计数器初值
LDIR:LCALL DIR ;调用显示子程序,并等待中断
SJMP LDIR ;循环显示
T0中断服务程序没有编写,
ORG 0200H ; T1中断服务程序首地址
ITl,MOV THl,#3CH ;重置 T1初值
MOV TL1,#0BOH ;
DJNZ R7,GORET ;判 1s到否? 1s未到转返回
CLR TR0 ; 1s到,T0停
MOV 30H,TL0 ;记录 ls内 T0引脚脉冲个数
MOV 31H,THO ;
MOV TLO,#00H ;脉冲计数器 T0清 0
MOV TH0,#00H ;
SETB TR0 ; TO重新运行
MOV R7,#0AH ;恢复 lOOms计数器初值
PUSH Acc ;保护现场
PUSH PSW ;
PUSH DPH ;
PUSH DPL ;
LCALL WORK ;调用数据处理子程序
POP DPL ;恢复现场
POP DPH ;
POP PSW ;
POP Acc ;
GORET,RETI ; T1中断返回
【 例 5-9】 已知 fosc=6MHz,试编写 24小时模拟电子钟程序,秒分时数分别存在 R1,R2,R3中,可直接调用显示程序 DIR。
解,ORG 0000H ;复位地址
LJMP IT0 ;转 主程序
ORG 000BH ;T0中断入口地址
LJMP IT0 ;T0中断,转 T0中断服务子程序 IT0
ORG 1000H ;主程序首地址
START:MOV R1,#0 ;秒计数器清 0
MOV R2,#0 ;分计数器清 0
MOV R3,#0 ;时计数器清 0
MOV R4,#0 ;500?S计数器清 0
MOV R5,#0 ;100ms计数器清 0
MOV TMOD,#02H;置 T0定时器方式 2
MOV TL0,#06H ;置 T0定时初值 500?S
MOV TH0,#06H ;用于自动恢复定时初值
SETB TR0 ;启动 T0
WAIT,LCALL DIR ;显示时钟时分秒并等待中断
SJMP WAIT ;循环显示
ORG 0200H ;T0中断服务程序首地址
IT0,MOV TH0,#3CH ;重置 T0初值 50mS
MOV TL0,#0B0H;
DJNZ R7,GORET ;判 500mS到否?
CPL P1.7 ;500mS 到,输出取反
MOV R7,#0AH ;恢复 50mS计数器初值
GORET:RETI ;
ORG 2000H ;T0中断服务子程序首地址
IT0,INC R4 ;500?S计数器计数
CJNE R4,#200,IT01 ;判 100ms满否?
IT01,JC IT06 ;未满 100ms,转返回
MOV R4,#0 ;满 100ms,500?S计数器清 0
INC R5 ;100ms计数器计数
CJNE R5,#10,IT02 ;判 1s满否?
IT02,JC IT06 ;未满 1s,转返回
MOV R5,#0 ;满 1s,100ms计数器清 0
INC R1 ; 秒计数器加 1
CJNE R1,#60,IT03 ;判 60秒满否?
IT03,JC IT06 ;未满 60秒,转返回
MOV R1,#0 ;满 60秒,秒计数器清 0
INC R2 ; 分计数器加 1
CJNE R2,#60,IT04 ;判 60分满否?
IT04,JC IT06 ;未满 60分,转返回
MOV R2,#0 ;满 60分,分计数器清 0
INC R3 ; 时计数器加 1
CJNE R3,#24,IT05 ;判 24小时满否?
IT05,JC IT06 ;未满 24小时,转返回
MOV R3,#0 ;满 24小时,时计数器清 0
IT06,RETI ;返回解:利用定时 /计数器 T0扩展成外中断时须有两个条件:
一是 外部触发脉冲从 P3.4输入 (下降沿有效 );
二是 将定时 /计数器设置成计数临界状态,即定时初值为 FFH,再来一个脉冲即能溢出触发中断 。
【 例 5-10】 因外中断 INT0,INT1已被占用,试利用定时 /计数器 T0扩展成外中断。
编程如下,
ORG 0000H ;复位地址
LJMP START ;复位,转初始化程序 START
ORG 000BH ;T0中断入口地址
LJMP IT0 ;转 T0中断服务子程序 IT0
ORG 1000H ;初始化程序首地址
START,MOV SP,#60H ;置堆栈
MOV TMOD,#06H ;置 T0计数器方式 2(见 P132)
MOV TH0,#0FFH ;置 T0初值
MOV TL0,#0FFH ;
SETB PT0 ;置 T0为高优先级 (见 P121)
MOV IE,#0FFH ;全部开中
SETB TR0 ;T0启动
SJMP MAIN ;转主程序,并等待 T0中断
ORG 2000H ;T0中断服务子程序首地址
IT0,? ;T0中断服务子程序
RETI ;
OVER !