第 4 章 中断系统和定时 / 计数器

113
第4第 第第第 第第第 / 第第第 第第第第第第 第第第第第第 第第第第第第第第第第第第第第 第第 80C51 第第第第 5 第第第第第第第第第第第第 第第第第第第第第第第第第第第第 IE IP TCON SCON 第 T MOD 第第第第第第第第第第第 第第第第第第第 / 第第第第 4 第第第第第 第第第第第第 1 第第 2 第第第 第第第第 / 第第第第第第第 第第第第第第第第第第第 第第第第第第第第第第第第 第第 ,、 / 第第第第

Upload: kenaz

Post on 04-Feb-2016

140 views

Category:

Documents


0 download

DESCRIPTION

第 4 章 中断系统和定时 / 计数器. 本章学习目标 : 理解中断概念,能正确描绘单片机中断响应过程 熟记 80C51 单片机的 5 个中断源及其中断入口地址 能按要求正确设置特殊功能寄存器 IE 、 IP 、 TCON 、 SCON 和 TMOD 熟悉中断优先控制的方法 能正确描绘定时 / 计数器的 4 种工作方式,重点掌握方式 1 、方式 2 的应用 学会定时 / 计数初值的计算 能读懂教材中的控制实例,学会编写同等难度的中断、定时 / 计数程序. 4.1 中断系统. 4.1.1 中断系统的基本概念. 1. 中断的概念 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 4 章    中断系统和定时 / 计数器

第 4 章 中断系统和定时 / 计数器本章学习目标 :

理解中断概念,能正确描绘单片机中断响应过程熟记80C51单片机的5个中断源及其中断入口地址能按要求正确设置特殊功能寄存器IE、 IP、 TCON、 SCON和 TMOD熟悉中断优先控制的方法能正确描绘定时/计数器的4种工作方式,重点掌握方式1、方式2的应用学会定时/计数初值的计算能读懂教材中的控制实例,学会编写同等难度的中断、定时/计数程序

Page 2: 第 4 章    中断系统和定时 / 计数器

4.1 中断系统4.1.1 中断系统的基本概念

某人看书——某人正在处理一件事 A

电话铃响——出现另一件须立即解决的事 B

暂停看书——中止 A

书中作记号——记录断点,便于接续 电话谈话——处理 B

继续看书——继续 A 的工作

保护断点

中断响应

中断请求

中断返回

1. 中断的概念 ( 1 )现实生活中的中断:

Page 3: 第 4 章    中断系统和定时 / 计数器

中断原因: 一个人不可能同时

完成两项任务。

单片机只有一个 CPU ,一旦面临

多任务,它也会中断吗?

先接电话,然后再继续看书,这

样效率最高!

先接电话,然后再继续看书,这

样效率最高!

4.1.1 中断系统的基本概念

Page 4: 第 4 章    中断系统和定时 / 计数器

( 2 )单片机中的中断• CPU 在处理某一事件 A 时,发生了另一事件 B 请求

CPU 迅速去处理(中断发生或中断请求);• CPU 暂时中断当前的工作,转去处理事件 B (中断

响应和中断服务);• 待 CPU 将事件 B 处理完毕后,再回到原来事件 A 被

中断的地方继续处理事件 A (中断返回)。

中断请求→中断响应→中断服务→中断返回

中断过程事件 B 的处理过程

事件 A

事件 B

什么是什么是中断中断

??

Page 5: 第 4 章    中断系统和定时 / 计数器

2. 中断技术的应用

• 并行处理 CPU 可以与多台外设并行工作,并分时与他们进行信息

交换,提高了 CPU 的工作效率。• 实时控制 单片机应用系统可能随机请求 CPU 提供服务。有了中断

系统, CPU 就可以立即响应并予以处理。• 故障处理 单片机系统在工作时可能会出现一些突发故障,如电源断

电,存储器出错,程序执行错误(如除数为 0 )等,一旦出现故障, CPU 就可及时转去执行故障处理程序,而不必停机。

Page 6: 第 4 章    中断系统和定时 / 计数器

3. 中断系统

为实现中断功能而配置的硬件和编写的软件就是中断系统。

中断由谁来实施?中断由谁来实施?

中断功能由中断系统来执行。

Page 7: 第 4 章    中断系统和定时 / 计数器

图 4-1 中断系统的结构框图

Page 8: 第 4 章    中断系统和定时 / 计数器

4.1.2 中断源——中断的申请方

能够向CPU发出中断申请的部件称为中断源。80C51单片机有5个中断源。见下表

那些部件可以向 CPU 申请中断呢?

中断源 说明

外部中断 从 P3.2 引脚引入的外部中断申请定时器 T0 中断 定时器 T0 溢出时引发中断申请

外部中断 从 P3.3 引脚引入的外部中断申请

定时器 T1 中断 定时器 T1 溢出时引发中断申请串行口中断 一次串行发送或接收完成后,发出中断申

0INT

1INT

Page 9: 第 4 章    中断系统和定时 / 计数器

4.1.3 中断控制——中断的控制“工具”

• 中断允许寄存器 IE• 中断优先级寄存器 IP• 定时 / 计数器及外部中断控制寄存器 TCON• 串口控制寄存器 SCON

单片机通过对 4 个特殊功能寄存器实施中断控制:

Page 10: 第 4 章    中断系统和定时 / 计数器

1 .中断允许寄存器 IE

• 功能: 控制单片机是否接受中断申请,以及接

受哪一种中断申请• 字节地址: A8H

其格式和每位的含义如下:

Page 11: 第 4 章    中断系统和定时 / 计数器

图 4-2 IE 的格式

Page 12: 第 4 章    中断系统和定时 / 计数器

由位操作指令或数据传送指令实现。

例:同时打开外部中断 0 和串行口中断,可设置为:法 1 : MOV IE,#10010001

B 法 2 : SETB EA

SETB ES

SETB EX0

〈想一想〉还可以怎样实现?

如何对如何对 IEIE 进进行设置?行设置?

IE 的设置方法:

Page 13: 第 4 章    中断系统和定时 / 计数器

2 .中断优先级寄存器 IP

• 功能: 对 80C51 单片机进行高级别或低级别

中断的设置,• IP 的字节地址: B8H

格式和每位的含义如下:

Page 14: 第 4 章    中断系统和定时 / 计数器

  图 4-3 IP 的格式

Page 15: 第 4 章    中断系统和定时 / 计数器

举例

例:令串行口为高优先级中断,外部中断 0为低优先级中断。

设置方法:

法 1 : MOV IE,#10010001B ;开中断 MOV IP,#00010000B ;设优先级

法 2 : MOV IE,#10010001B

SETB PS

说明:此时串口的优先级高于外部中断 0 的优先级

Page 16: 第 4 章    中断系统和定时 / 计数器

答案: 此时 CPU 按自然优先级顺序确定该响应哪个中断请求。

如果几个同级别的中断如果几个同级别的中断源同时申请中断,源同时申请中断, CPUCPU如何响应?如何响应?

注意: 自然优先级由硬件决定,用户不能更改。排列见表 4 - 2

Page 17: 第 4 章    中断系统和定时 / 计数器

表 4- 2 中断入口地址及自然优先级

Page 18: 第 4 章    中断系统和定时 / 计数器

3 .定时 / 计数器及外部中断控制寄存器 TCON• 功能:

• 字节地址: 88H

可设置外部中断申请的形式:低电平触发还是下降沿触发控制定时 / 计数器的计时开始或停止是各中断源(串口中断除外)是否申请中断的标志位

格式如下,各位含义见表 4- 3

TCON D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

Page 19: 第 4 章    中断系统和定时 / 计数器

形式 符号 位地址 功 能 说 明

中断控制

IT0 88H 外部中断 0 的触发控制位IT0=0 :低电平触发 IT0=1 :下降沿触发

IT0 的状态由用户通过初始化程序定义

IE0 89H 外部中断 0 请求标志位。CPU采样到外部中断 0 的中断请求时, IE0=1

CPU 响应该中断时, IE0= 0

IE0 的状态由单

片机自动设置

IT1 8AH 外部中断 1 的触发控制位IT1=0 :低电平触发IT1=1 :下降沿触发

IT1 的状态由用户通过初始化程序定义

IE1 8BH 外部中断 1 的中断请求标志位CPU采样到外部中断 1 的中断请求时, IE1=1

CPU 响应该中断时, IE1= 0

IE1 的状态由单片机自动设置

表 4- 3 TCON 的功能说明

Page 20: 第 4 章    中断系统和定时 / 计数器

形式 符号 位地址 功 能 说 明

定时/

计数控制

TR0 8CH TR0=1 :启动定时 / 计数器 T0TR0=0 :停止定时 / 计数器 T0

TR0 的状态由用户通过初始化程序定义

TF0 8DH 定时 / 计数器 T0溢出中断请求位T0 定时或计数完成时 TF0=1 ,同时申请中断CPU 响应该中断时, TF0= 0

TF0 的状态由单片

机自动设置

TR1 8EH TR1=1 :启动定时 / 计数器 T1

TR1=0 :停止定时 / 计数器 T1 TR1 的状态由用户通过初始化程序定义

TF1 8FH 定时 / 计数器 T1溢出中断请求位T1 定时或计数完成时 TF1=1 ,同时申请中断 CPU 响应该中断时, TF1= 0

TF1 的状态由单片

机自动设置

续表 4- 3

Page 21: 第 4 章    中断系统和定时 / 计数器

例 1

编程设定 TCON 为低电平触发的高优先级中断源。分析: 这是典型的中断初始化问题,方法一般如下:1 )对 TCON 的相关位赋值2 )设定所用中断源的优先级——赋值 IP

3 )开中断——置位 IE

Page 22: 第 4 章    中断系统和定时 / 计数器

解: 法 1 : CLR IT1

SETB PX1

SETB EX1

SETB EA

例 1

法 2 : CLR IT1

MOV IP,#04H

MOV IE,#84H

Page 23: 第 4 章    中断系统和定时 / 计数器

4 .串口控制寄存器 SCON

• 功能: 只有 D1 和 D0 位用于中断,作为串口中断

请求标志,即串口中断请求寄存器• 字节地址: 98H

格式如下:

Page 24: 第 4 章    中断系统和定时 / 计数器

RI 为接收中断请求标志位。当串口接收完一帧串行数据时, RI自动置 1 ;

CPU 响应中断后,用软件对 RI清 0 。

TI 为串行口发送中断请求标志。当串口发送完一帧串行数据时, TI自动置 1 ,请求中断。 CPU 响应中断后,由软件对 TI清零。其他几位的含义及用法见第 5 章。

Page 25: 第 4 章    中断系统和定时 / 计数器

4.1.4 中断响应

• 无同级或高级中断正在服务• 有中断请求信号• 相应的中断源已打开,即 EA=1 ,中断源

对应中断允许位也为 1 。• 当前的指令周期已经结束• 如果当前指令为 RETI 或访问 IE 和 IP 的

指令,至少还要再执行完一条指令。

1. 中断响应条件

Page 26: 第 4 章    中断系统和定时 / 计数器

2. 中断响应过程

图 4- 4 中断响应过程

将当前寄存器内容压入堆栈,如 PUSH ACC

在中断服务程序中实现,解决单片机中断后要干什么的问题。

把保存在堆栈中的寄存器内容取出,送回原来的位置,如 POP ACC

Page 27: 第 4 章    中断系统和定时 / 计数器

☆4.1.5 中断嵌套

答案: CPU要进行分析判断,决定是否响应:

当当 CPUCPU 正在执行中断服正在执行中断服务程序时,又有新的中务程序时,又有新的中断源发出中断申请,响断源发出中断申请,响应吗?应吗?

情况 1 : 同级或低级中断源申请中断, CPU

不予理睬

情况 2 : 高级别中断源申请中断, CPU 就要响应。

待执行完高级别中断服务程序后再转回低级中断服务程序继续执行,这就是中断嵌套。

Page 28: 第 4 章    中断系统和定时 / 计数器

图 4- 5 二级中断嵌套的执行过程

Page 29: 第 4 章    中断系统和定时 / 计数器

• 软件构成:主程序 + 中断服务程序• 程序编制的关键点: 要对题目要求进行精确分析,明确哪

些环节应该安排在主程序中,哪些环节应该安排在中断服务程序中,再分别编制主程序和中断服务程序。

4.2 中断的应用4.2.1 中断应用指导 1 .中断系统的程序编制

Page 30: 第 4 章    中断系统和定时 / 计数器

1 .中断系统的程序编制

(1) 编制主程序

第一部分:主程序初始化

功能:

第二部分:须由主程序完成的其它功能。

此部分必须编写

用于设置堆栈位置;定义触发方式(低电平触发或脉冲下降沿触发)对 IE 和 IP赋值等;

Page 31: 第 4 章    中断系统和定时 / 计数器

(2)选择中断服务程序的入口地址。(3) 编制中断服务程序。

1 .中断系统的程序编制

即明确中断服务程序的起始位置

注意 1 :一般要保护断点 , 即保护进入中断时累加器 A、进 /借位标志 CY 和 SFR 的状态,并在退出中断之前将其

恢复;

注意 2 :必须在中断服务程序中设定是否允许再次中断(即中断嵌套),由用户对 EX0 (或 EX1 )位置位或清 0 决定。

说明:一般在中断服务程序中涉及到关键数据的设置时应关 中断,即禁止嵌套。

Page 32: 第 4 章    中断系统和定时 / 计数器

2 .中断应用举例——三相交流电的故障检测电路

例 2 图 4-6 是三相交流电的故障检测电路。当 A相缺电时,发光二极管 LEDA 亮;当 B相缺电时,发光二极管 LE

DB亮;当 C相缺电时,发光二极管 LEDC亮。

硬件特点: ①外部中断 由 3 个交流继电器的触点和一个或非门扩展而成; ②3 个 220V 的交流继电器的线圈 ZA、 ZB、 ZC 分别接在A、 B、 C各相和交流地之间。

►图 4-6 三相交流电的故障检测电路

Page 33: 第 4 章    中断系统和定时 / 计数器

( 1 )检测原理

①三相电正常情况下3 个线圈同时得电

3 个常开触点全都闭合

00

01

不申请外部中断

Page 34: 第 4 章    中断系统和定时 / 计数器

②故障情况下(假设 A相掉电)

( 1 )检测原理

线圈 ZA失电

常开触点 ZA 断开0

申请外部中断,在外部中断服务程序中读取 P1.0引脚状态

00

1

1

产生 A相掉电状态信号送入 P1.0

1

在中断服务程序中对该引脚输出 1

A相故障指示灯亮

线圈 ZB、 ZC 有电

常开触点 ZB、 ZC闭合

B、 C相故障指示灯不亮

Page 35: 第 4 章    中断系统和定时 / 计数器

(2) 软件设计

ORG 0000HLJMP MAIN ;跳至主程序ORG 0013H ;的中断入口地址LJMP TEST ;转至中断服务程序ORG 0100H

MAIN : MOV P1 , #15H ; P1.0、 P1.2、 P1.4 作输入; P1.1、 P1.3、 P1.5输出 0

SETB EX1 ;开中断 CLR IT1 ;为低电平触发

SETB EA ; CPU 开中断SJMP $ ;等待中断

TEST: JNB P1.0 , LB ; A相正常,转测 B相SETB P1.1 ; A相掉电,点亮 LEDA

LB : JNB P1.2 , LC ; B相正常,转测 C相SETB P1.3 ; B相掉电,点亮 LEDB

LC : JNB P1.4 , LL ; C相正常,返回SETB P1.5 ; C相掉电,点亮 LEDC

LL : RETI END

Page 36: 第 4 章    中断系统和定时 / 计数器

4.2.2 课题与实训 7 中断控制流水灯一 . 实训目的 学习外部中断的基本用法 掌握中断处理程序的编程方法二 .课题要求 在程序正常运行时 P1 口的 8 个 LED灯作单灯左移 8次而

后单灯右移 7次,如此循环;中断时(即按键按下)则 P1 口的 8 个 LED闪烁 3次(即全亮全灭 3次)。

三 .背景知识 1 .中断程序的设计主要涉及开中断、设定优先级,外中断还

涉及触发方式的设定。 2 .在软件设计中,首先要对主程序和中断服务程序所完成的

任务进行划分。根据该课题提出的要求,在主程序中应该 完成的任务是 8 个 LED循环左移右移;在中断服务程序中 应该完成的功能是 8 个 LED闪烁 3次。

Page 37: 第 4 章    中断系统和定时 / 计数器

四 . 硬件电路 硬件结构如图 ,12引脚的按键点动表示有中断请求发出。

图 4-7 实训 7 电路

Page 38: 第 4 章    中断系统和定时 / 计数器

五 .参考程序 ORG 0000H LJMP START ORG 0003H LJMP INT0 ORG 0100H

START:MOV SP,#60H MOV IE,#81H ;开 INT0 中断 SETB IT0 ; INT0 下降沿触发 L1 : MOV   A,#0FFH ;设初值 MOV   R0,#8  ;设定左移八次 CLR   C  ;将 CY清 0 L2: RLC   A ;带进位位循环左移一位 MOV   P1,A  ;送 P1 口 ,P1.0灯亮

Page 39: 第 4 章    中断系统和定时 / 计数器

ACALL   DELAY   ;延时 0.2秒 DJNZ R0,   L2  ;判断是否左移 8次 MOV   R0,#7  ;移动 7次L3: RRC   A   ;带进位位循环右移 MOV   P1,A ;送 P1 口 ACALL   DELAY

DJNZ   R0,L3 ;是否右移 7次? AJMP   L1 ;重新开始DELAY:MOV   R5,#4 ;延时 0.2秒 D1: MOV   R6,#200

D2: MOV   R7,#123

NOP

DJNZ   R7,$

Page 40: 第 4 章    中断系统和定时 / 计数器

DJNZ   R6,D2 DJNZ   R5,D1 RETINT0: PUSH PSW ; 保护 PSW,ACC值 PUSH ACC MOV A,#00H ;使 8 个 LED全亮 MOV R2,#6 ;闪烁 3次(全亮全灭各 3次) L4 : MOV P1,A ; A值送出 LCALL DELAY ;延时 0.2秒 CPL A ; A值取反 DJNZ R2 , L4 ;闪烁 3次? POP ACC ;恢复保护的 A值 POP PSW ;恢复保护的 PSW值 RETI ;返回主程序 END

Page 41: 第 4 章    中断系统和定时 / 计数器

六 .总结与提高 1. 总结:中断服务程序与子程序对比

共同点:格式相近,执行过程大体相同

子程序

执行时刻是确定的, CPU 只要执行LCALL、 ACALL等调用指令就会转去执行子程序

中断服务程序

中断申请往往是随机发生的。中断服务程序的发生可能是在开中断后的任意时刻,也可能不发生,

Page 42: 第 4 章    中断系统和定时 / 计数器

2 .提高 编写一个由两个中断(外部中断 0、外部中断

1 )控制的流水灯程序。要求: 主程序不变,中断 0 可使 P1.0~ P1.3 的 LED

闪烁 5次,中断 1 可使 P1.4~ P1.7 的 LED闪烁5次,设定中断 1 的优先级比中断 0 高。

Page 43: 第 4 章    中断系统和定时 / 计数器

4 .3 定时/计数器 1. 日常生活中定时、计数的例子: 如闹钟、画“正”统计选票、家用水表对水量的计数。 2 . 单片机应用系统中定时计数的需求: 如用单片机控制的打铃器、空调的定时开关、啤酒自动生产线上对酒瓶的计数装置等。 3 . 80C51 单片机片内的定时 / 计数器: 两个16位可编程的定时/计数器: T0 和 T1 ,都能定时和对外部事件进行计数。 此外, T1还可以作为串行接口的波特率发生器。

Page 44: 第 4 章    中断系统和定时 / 计数器

4 .3.1 定时/计数器的结构1 . 定时和计数的原理( 1 )计数 定时/计数器的实质是加1计数器(16位),其原理类似于古代用来计时的水钟:

假设计满一小时需要 100 , 000 , 000滴,这称为水钟的计数容量

16 位定时 / 计数器的计数容量是 65536

单片机是对脉冲个数计数,计数器每接收到一个脉冲,计数值加 1 ,

当接收满 65535 个脉冲后,再来一个脉冲,计数值清 0表明这一轮计数结束,同时将标志位 TF0 或 TF1 置 1 。

Page 45: 第 4 章    中断系统和定时 / 计数器

( 2 )定时 单片机内部的计数器用作定时器时,是对标准的时钟进行了计数,每来一个时钟脉冲,计数器加 1 ,只要保证计数脉冲的间隔相等,则计数值就代表了时间的流逝。

计数器如何能作为定时计数器如何能作为定时器使用呢?器使用呢?

单片机中的定时器和计数器其实是一个器件:计数器:是对外部发生的事件进行计数,定时器:是对单片机内部的标准时钟脉冲进行计数。

Page 46: 第 4 章    中断系统和定时 / 计数器

单片机内部的标准时钟单片机内部的标准时钟脉冲是如何获得的呢?脉冲是如何获得的呢?

见图 4-9 ,它是由单片机的晶振经过 12 分频后得到。由于晶振的频率很准,所以这个时钟脉冲的时间间隔也很准。不难算出,当单片机采用 12MHz的晶振时,它提供给计数器的脉冲频率是12MHz/12=1MHz,脉冲周期就是1微秒。

图 4-9 定时 / 计数器 T0 的结构示意图

Page 47: 第 4 章    中断系统和定时 / 计数器

单片机内部的 16 位定时/计数器由高 8 位和低 8

位两个寄存器组成: T0 由 TH0 和 TL0组成, T1 由 TH1 和 TL1组成, 定时/计数器的计数值就存放在这里面。定时 / 计数器 T1 的结构与 T0相同。

图 4-9 定时 / 计数器 T0 的结构示意图

2 .定时 / 计数器的结构

Page 48: 第 4 章    中断系统和定时 / 计数器

再以水钟为例,当水不断落下,下面容器中的水不断变多,最终总有一滴水使得容器完全充满。这时如果再有一滴水落下,就会发生“溢出”。与此类似, 16

位定时/计数器计满 65536 个脉冲时,也会发生溢出。

定时/计数器溢出后标志位 TF0 (或 TF1 )由 0

变 1 ,由此能够引发定时中断(在中断定时方式下),这就像定时的时间一到,闹钟就会响一样。

如果采用 12MHz的晶振,对应的脉冲周期是1微秒,计满 65536 个脉冲所对应的时间就是 65.536ms 。

3 .定时 / 计数值的设置

Page 49: 第 4 章    中断系统和定时 / 计数器

现实生活中,如何满足现实生活中,如何满足计数值少于计数值少于 6553665536 的需的需要?要?如牛奶包装线上如牛奶包装线上 2424盒盒装箱一次。装箱一次。

再回到水钟的例子上去:

刚才假设下面容器滴入 100 , 000 , 000滴水才会满,现在我们在开始滴水之前先放入一勺水,这样问题就解决了。

计数器的道理是一样的,只要用预置数的方法先在计数容器内存入一个初值 (通常称为时间常数),如我们要计 100 ,那就存入 65436 ,只要再来 100 个脉冲,就刚好会溢出,引发中断。

计数器初值的设置

Page 50: 第 4 章    中断系统和定时 / 计数器

在主频为 12MHz 的情况下,每个时钟脉冲是 1微秒,则计满 65536 个脉冲需 65.536毫秒,如要定时 10毫秒则存入初值 55536 ,( 10毫秒是 10000微秒,需计数 10000 个脉冲)。可见, 定时器的定时时间长短与系统时钟和定时器初值有关。

说明 1. 当定时/计数器用作计数器时,通过引脚 P3.4(P3.

5) 对外部输入脉冲计数。 2 . 定时/计数器 T0(T1)启动运行后,会按设定的工作方式独立进行计数,不再占用 CPU 时间。当计数器 T0

(T1) 计满溢出时, TF0(TF1) 置 1 ,向 CPU 发出中断请求信号。

定时器初值的设置

Page 51: 第 4 章    中断系统和定时 / 计数器

4-10 定时 / 计数器的控制关

Page 52: 第 4 章    中断系统和定时 / 计数器

4.3.2 定时/计数器的控制

在单片机中有两个特殊功能寄存器与定时 / 计数有关,它们就是 TMOD 和 TCON ,定时/计数器 T0、 T1 就由它们来控制: TMOD 用于设置工作方式; TCON 用于控制其启动、停止和中断申请。

1. 定时器工作方式寄存器 TMOD

TMOD 用于设置 T0 和 T1 的工作方式,字节地址为 89H ,不能按位寻址。其格式和各位的含义如下:

Page 53: 第 4 章    中断系统和定时 / 计数器
Page 54: 第 4 章    中断系统和定时 / 计数器
Page 55: 第 4 章    中断系统和定时 / 计数器

2 .定时 / 计数器控制寄存器 TCON

TCON 的低 4 位用于控制外部中断,高 4 位用于控制定时 / 计数器的启动和中断申请。 TF0 (或 TF1 )

当计数溢出时, TF0 (或 TF1 )会自动由 0变1 ,告诉我们计数已满,我们可以通过查询 TF0( 或TF1) 位的状态来判断计时时间是否已到;

如果采用定时中断方式,则 TF0 (或 TF

1 )由 0变 1 时,能自动引发中断。

Page 56: 第 4 章    中断系统和定时 / 计数器

TR0( 或 TR1)

由图 4-11 可知,只有当 TR0( 或 TR1) 为 1 时,开关 1才能闭合,计数脉冲才能进入计数器,故 TR

0( 或 TR1) 称为运行控制位,可用指令“ SETB T

R0( 或 TR1)” 来置位以启动定时 / 计数器运行;或用指令“ CLR TR0( 或 T

R1)” 来关闭定时 / 计数器的工作,一切全靠编程人员控制。

图 4-11 定时 / 计数器 T0 方式0 的逻辑结构示意图

Page 57: 第 4 章    中断系统和定时 / 计数器

4.3.3 定时 /计数器的工作方式

80C51 单片机定时 / 计数器 T0 有 4 种工作方式(方式 0、1、 2、 3 ), T1 有 3 种工作方式(方式 0、 1、 2 )。

1. 方式 0

当 TMOD 的 M1M0=00 时,定时 / 计数器工作于方式 0 。

方式 0 为 13 位定时 / 计数器,由 TL0 的低 5 位和 TH0 ( 8

位)共同完成计数功能( TL0 的高 3 位可忽略)。

当 TL0 的低 5 位溢出时,向 TH0产生进位; TH0溢出时,将定时器中断请求标志位 TF0 置 1 ,可申请中断,也可对 TF

0 进行查询。

Page 58: 第 4 章    中断系统和定时 / 计数器

图 4-11 定时 / 计数器 T0 方式 0 的逻辑结构示意图

Page 59: 第 4 章    中断系统和定时 / 计数器

2. 方式 1 当 M1M0=01 时,定时 / 计数器工作于方式 1 。方式 1 的

计数位数是 16 位,由 TL0 作为低 8 位, TH0 作为高 8 位共同构成。其余操作同方式 0 。

图 4-12 定时 / 计数器 T0 方式 1 的逻辑结构示意图

Page 60: 第 4 章    中断系统和定时 / 计数器

3. 方式 2 当 M1M0=10 时,定时 / 计数器工作于方式 2 。这是自动重装初值的 8 位计数方式,它省去了方式 0 和方式 1 在多次重复计数状态下必须重新设定计数初值的麻烦,但是却付出了减小定时时间的代价。

图 4-13 定时 / 计数器 T0 方式 2 的逻辑结构示意图

特别适合于制作比较精确的脉冲信号发生器。

Page 61: 第 4 章    中断系统和定时 / 计数器

4. 方式 3

方式 3 只适用于定时 / 计数器 T0 。当 T1 被设定为方式 3状态时,将停止计数。

当 M1M0=11 时, T0 工作于方式 3 。 此时 TL0 和 TH0 作为两个相互独立的 8 位定时 / 计数器使用。TL0既可定时又可计数,它使用 T0 的各控制位、引脚和中断源,

即 C/、 GATE、 TR0、 TF0、 T0 ( P3.4引脚)、( P3.2

引脚);TH0 此时只能用作内部定时功能,它借用了定时 / 计数器 T1 的

控制位 TR1 和 T1 的中断标志位 TF1 ,其启动和停止只受 TR

1 控制。

Page 62: 第 4 章    中断系统和定时 / 计数器

图 4-14 定时 / 计数器 T0 方式 3 的逻辑结构示意图 定时器 T1无工作方式 3,当定时器 T0工作在方式 3时,定时器 T1可设置为方式 0、方式 1和方式2。

Page 63: 第 4 章    中断系统和定时 / 计数器

4.4.1 应用指导 1 .定时 / 计数器的定时 / 计数范围 定时 / 计数器工作于不同方式下的位数不同,它所具有的计数范围也不一样:

工作方式 0 : 13 位定时 / 计数方式,因此,最多可以计到 213 ,也就是 8192次。 工作方式 1 : 16 位定时 / 计数方式,因此,最多可 以计到 216 ,也就是 65536次。 工作方式 2 和工作方式 3 :都是 8 位定时 / 计数方 式,因此,最多可以计到 2 8 ,也就是 256次。

< 想一想 > 如果我们需要超过计数器计数范围的定时或计数功能,应该怎样做?

4.4 定时 /计数器应用与训练

Page 64: 第 4 章    中断系统和定时 / 计数器

2 .时间常数初值的计算 定时 / 计数器只要预设一个时间常数初值,就可以完成不超过其计数范围的任意大小的计数。算法如下: 定时时间常数初值 X : 方式 0 X=8192-t(fosc/12)

方式 1 X=65536-t(fosc/12)

方式 2、方式 3 X=256-t(fosc/12)

其中 t 是需要定时的时间,单位是微秒; fosc 是晶振 计数时间常数 X : 方式 0 X=8192-S

方式 1 X=65536-S

方式 2、方式 3 X=256-S

说明:式中 S 是需要计数的次数

Page 65: 第 4 章    中断系统和定时 / 计数器

假设流水线上一个包装是 12盒,要求每到 12盒就产生一个动作,用单片机的工作方式 0 来控制,应当预置的计数初值是多少呢? 对了,就是 8192-12=8180 。3 .定时 / 计数器的初始化对 80C51 单片机的定时 / 计数器编程的初始化方法:① 对 TMOD赋值,以确定 T0 和 T1 的工作方式;② 计算时间常数初值,并将其写入 TH0、 TL0 或 TH1、 TL1 ;③ 采用中断定时方式时,需对 IE赋值开中断;④ 置位 TR0 或 TR1 ,启动定时 / 计数器。

Page 66: 第 4 章    中断系统和定时 / 计数器

4.4.2 基本训练—初始化训练

例 3 :某牛奶生产线上一个包装是 12盒,要求每生产 12盒就执行装箱操作,用 80C51 单片机来控制,请编写初始化程序。

1 .思路与计算:要确定定时器( T0 或 T

1 ),选择其工作方式。我们以 T0 的工作方式 2

为例,计算时间常数并赋值给 TH0、 TL0 。 X=256-S=256-12=244=0F4H

Page 67: 第 4 章    中断系统和定时 / 计数器

2 .初始化程序: MOV TMOD, #06H ; T0作计数器,工作于方式 2 MOV TH0, #0F4H ;装入时间常数初值 MOV TL0, #0F4H ;自动重装时间常数 MOV IE , #00H ;用查询方式确定计满 12盒?(或MOV IE , #82H);使用 T0中断,计满 12盒后, ;自动申请中断 SETB TR0 ;启动 T0波特率发生器 3.总结:对计数过程是否结束有查询和中断两种方法,要合理选择,并在程序设计中正确体现。

Page 68: 第 4 章    中断系统和定时 / 计数器

4.4.3应用实例 1 . 定时 / 计数器用于外部脉冲宽度的测量 ( 1 )测量原理

可以利用定时/计数器方式寄存器 TMOD 中的门控位 GATE 与 引脚配合使用,控制定时/计数器的启动与停止: 当 GATE= 1 时,要求 TR1= l ,且 为高电平,才能启动定时器 T1 计数工作;如果 出现低电平,则 T1 停止计数; 当 GATE=0 时,只要 TR1= 1 就可以启动定时器,而与 的输入状态无关。

可以利用定时/计数器方式寄存器 TMOD 中的门控位 GATE 与 引脚配合使用,控制定时/计数器的启动与停止: 当 GATE= 1 时,要求 TR1= l ,且 为高电平,才能启动定时器 T1 计数工作;如果 出现低电平,则 T1 停止计数; 当 GATE=0 时,只要 TR1= 1 就可以启动定时器,而与 的输入状态无关。

Page 69: 第 4 章    中断系统和定时 / 计数器

利用上述特点,将被测脉冲信号从( P3.3 )引入,在T1 的程序初始化中令 GATE

= 1 ,同时“ SETB TR1” ,这样脉冲信号的上升沿就能启动 T1 计数,脉冲信号下降沿能使 T1 停止计数。利用定时器 T1 的计数值m乘以机器周期就可以得到被测脉冲信号的宽度 TW 。

( 2 )硬件电路 硬件电路简图如图 4-15 。

Page 70: 第 4 章    中断系统和定时 / 计数器

( 3 )程序设计 利用 80C51 的内部 RAM30H、 31H 单元保存被测脉冲宽度对应的计数值。 参考程序如下: ORG 0000H

AJMP MAIN

ORG 0100H

MAIN : MOV SP , #60H ;设堆栈指针 MOV TMOD , #90H ;设置控制字, T1 工作于方式 ; 1 , GATE=1

MOV TH1 , #00H ;设定计数初值为 00H

Page 71: 第 4 章    中断系统和定时 / 计数器

MOV TL1 , #00HL1 : JB P3.3, L1 ;等待输入变为低电平 SETB TR1 ;预置 TR1=1 ,准备启动 T1L2 : JNB P3.3, L2 ;等待上升沿,以便开始计数L3: JB P3.3, L3 ;是高电平则计数继续 CLR TR1 ;低电平则停止计数 MOV A, TL1 ;读低位计数值 MOV 30H, A ;低位计数值存于 30H MOV A, TH1 ;读高位计数值 MOV 31H, A ;高位计数值存于 31H END

Page 72: 第 4 章    中断系统和定时 / 计数器

( 4 )总结与思考 定时 / 计数器还可用于测量脉冲信号的频率、周期等。本实例是利用定时 / 计数器的门控位( GATE )测量脉冲宽度。但要注意,在晶振 12MHz 的情况下,被测脉冲宽度范围最大为 65535×1μs=65.536ms 。 < 想一想 >,如果要测量脉冲信号的周期,该如何去做? 2 .计数器用于绕线机的控制 绕线机常用于对电机或变压器的绕组进行绕制,图 4-16

是绕线机的控制电路。当按下工作按钮以后,机器启动,绕线机在直流电机和减速齿轮的带动下开始工作。当绕线架上的线圈绕到规定的圈数时,绕线机会自动停止绕线。如果再次按下工作按钮,绕线机会重复以上过程。

Page 73: 第 4 章    中断系统和定时 / 计数器

图 4-16 绕线机的控制电路控制说明: 1 .软件控制 P1.0=0 时,绕线机开始绕线; P1.0=1 时,绕线机不绕线。 2 .绕线机每绕一圈,绕线机脉冲产生电路就产生一个脉冲信号。

Page 74: 第 4 章    中断系统和定时 / 计数器

( 1 )工作原理 由于单片机复位后 P1 口的输出状态全部为 1 ,所以系统上电后, P1.0输出高电平“ 1”绕线机不工作。 当按下工作按钮以后, P1.1输入低电平“ 0” ,当程序检测到 P1.1=0 时,在程序指令的控制下从 P1.0输出低电平“ 0” 。绕线机开始绕线。绕线机每绕一圈,定时 / 计数器 T1

的输入引脚上就会产生一个负跳变的输入脉冲。因此,只要用定时 / 计数器 T1 的计数功能控制好输入脉冲的个数,就等于控制了绕线机的绕线圈数。 当绕线机缠绕到指定的圈数时,定时 / 计数器 T1引发计数中断,在程序指令的控制下, P1.0 将输出的高电平“ 1” ,使电机停转,制动器恢复制动,于是系统回到最初的停机状态。

Page 75: 第 4 章    中断系统和定时 / 计数器

我们假设绕线架的规定匝数是 5000圈,为控制这个圈数,可以设定定时 / 计数器 T1 用作计数器且工作在方式 1 ,于是确定其计数初值为: 初值 =65536-5000=60536=0EC78H

所以( TH1 ) =0ECH , (TL1)=78H

( 2 )控制程序 参考程序如下: ORG 0000H

AJMP MAIN

ORG 001BH

AJMP COUNT

ORG 0100H

Page 76: 第 4 章    中断系统和定时 / 计数器

MAIN : MOV TMOD , #50H ;设置 T1 为计数器,工作于方式 1

MOV TH1 , #0ECH ;设定计数初值 MOV TL1 , #78H

MOV SP , #60H ;设堆栈指针 SETB ET1 ;开 T1 中断 SETB EA ; CPU 开中断 CLR F0 ;用户标志 F0清 0WAIT : MOV C,P1.1 ;等待启动

JC WAIT ; P1.1=1 ,等待 CLR P1.0 ;启动设备 SETB TR0 ; T1 开始计数

Page 77: 第 4 章    中断系统和定时 / 计数器

LOOP : JNB F0,$ ;等待计数 5000 中断 SETB P1.0 ;绕线机停止工作 CLR TR0 ; T1 停止计数 CLR F0 ;清 0

SJMP WAIT ;等待重新启动 ORG 0200H ; T1 中断服务程序起始地址 C

OUNT : MOV TH1 , #0ECH ;重新设定计数初值 MOV TL1 , #78H

SETB F0 ;用户标志置 1

RETI ;中断返回 END

Page 78: 第 4 章    中断系统和定时 / 计数器

4 .4.4课题与实训 8 简易方波发生器一 . 实训目的 掌握定时器初值的计算方法 学习定时器的使用及定时中断程序的设计方法 掌握方波信号发生器的设计方法二 .课题要求 1 .基本要求: 利用定时 / 计数器 T1 ,工作于方式 0 ,采用查询方式,

在 P1.0引脚输出频率为 500Hz 的方波,并用示波器进行观察(晶振采用 12MHz )。

2 .较高要求: 利用定时 / 计数器 T1 ,工作于方式 0 ,采用中断方式,

在 P1.0引脚输出频率为 500Hz 的方波,并用示波器进行观察(晶振采用 12MHz )。

Page 79: 第 4 章    中断系统和定时 / 计数器

三 .背景知识 1 .方波产生原理 使 P1.0引脚的输出状态定时翻转,则该端口能输出一定频率的方波。 2 .方式 0 的时间常数初值 定时 / 计数器工作于方式 0状态下,定时 / 计数的长度是 1

3 位。应用前面给出的时间常数初值的计算公式 X=8192-t(fosc/12)

我们可以很方便地计算出时间常数初值,但在将其装入定时 / 计数器的 TH、 TL 寄存器时,必须要注意:将计算结果的高 8 位装入 TH1 (或 TH0 )、低 5 位装入 TL1 (或 TL

0 ),这一环节是非常容易出错的。

Page 80: 第 4 章    中断系统和定时 / 计数器

以该实训 T1 方式 0产生 500Hz 的方波(周期是 2ms )为例,需要进行 1ms 的定时,时间常数初值 X=8192-1×10-3× ( 12×106/12 ) =8192-

1000=7192=1C18H=0001110000011000B

以 13 位二进制数表示,是 11100000 11000B , 则( TL1 ) =00011000B=18H ,( TH1 ) =

11100000B=0E0H

定义 TMOD=00000000B

Page 81: 第 4 章    中断系统和定时 / 计数器

四 . 硬件电路该实训硬件电路十分简单,见图 4-17 。

图 4-17 简易方波发生器的硬件电路

Page 82: 第 4 章    中断系统和定时 / 计数器

五 .参考程序( 1 ) P1.0输出 500Hz 方波——查询方式 ORG 0000H

LJMP MAIN ;跳至主程序 ORG 0100H

MAIN : MOV TMOD , #00H ;置 T1 工作于方式 0

MOV TH1 , #0E0H ;装入时间常数初值 MOV TL1 , #18H

SETB TR1 ;启动 T1

LOOP : JNB TF1 , LOOP ;查询等待 CLR TF1 ;清 TF1

CPL P1.0 ; P1.0取反

Page 83: 第 4 章    中断系统和定时 / 计数器

MOV TH1,#0E0H ;重新装入时间常数初值 MOV TL1 , #18H

AJMP LOOP ;继续生成波形 END

Page 84: 第 4 章    中断系统和定时 / 计数器

( 2 ) P1.0输出 500Hz 方波——中断方式 ORG 0000H

LJMP MAIN ;跳至主程序 ORG 001BH ; T1 的中断入口地址 LJMP FANGBO ;转至中断服务程序 ORG 0100H

MAIN : MOV TMOD , #00H ;置 T1 工作于方式0

MOV TH1 , #0E0H ;装入时间常数初值 MOV TL1 , #18H

SETB ET1 ;允许 T1 中断 SETB EA ; CPU 开中断 SETB TR1 ;启动 T1

Page 85: 第 4 章    中断系统和定时 / 计数器

SJMP $ ;等待中断FANGBO:CPL P1.0 ; P1.0取反

MOV TH1,#0E0H ;重新装入时间常数初值 MOV TL1 , #18H

RETI ;中断返回 END

六 .总结与提高 1 .总结 本实训利用定时器 T1 的定时功能,以两种形式输出频率为 500Hz 方波。在实际应用中,方波的频率可能要根据现场测量参数、给定参数或按照某种函数关系而变化。因此输出波形的频率在编程时还是未知的。

Page 86: 第 4 章    中断系统和定时 / 计数器

2 .提高 定时 / 计数器的计时范围有限,当晶振采用 12MHz

时,方式 1 的计时时间最长,也只有 65.536ms 。当需要定时的时间超出了定时 / 计数器的计数范围,如需定时 2

秒,这时可以采用以下两种方法来处理:⑴ 定时器 + 软件计数的方法 思路是:利用定时 / 计数器 T1 ,工作于方式 1 ,实现 5

0 ms/次的定时,只要定时 40次即可实现 2s 定时。可以算出定时 / 计数器 T1 工作于方式 1 时,时间常数初值为 X=65536-t(fosc/12)=65536-50×10-3× ( 12×106/12 ) =15536=3CB0H

于是( TH1 ) =3CH ,( TL1 ) =0B0H 。

Page 87: 第 4 章    中断系统和定时 / 计数器

定义 TMOD=00010000B ,此处只给出延时 2s 的查询方式子程序。DELAY : MOV R3 , #40 ;设置定时器溢出次数 SETB TR1 ;启动 T1 开始计时 D1 : MOV TH1 , #3CH ;装入时间常数初值

MOV TL1 , #0B0H

D2 : JBC TF1 , D3 ; TF1 为 1 否 ? 是则跳至 D3 ,并清 TF1 , AJMP D2 ;否,则跳至 D2

D3 : DJNZ R3 , D1 ; R3=0 ?不是,跳到 D1

CLR TR1 ;是,则停止计数 RET

Page 88: 第 4 章    中断系统和定时 / 计数器

⑵采用两个定时器串联的方法 思路是: 将两个定时器中的一个(如 T0 )设置为定时方式,另一个( T1 )设置成计数方式;将定时器 T0 计满产生的输出,通过一根 I/O 口线(如 P1.0 )连接到计数器 T

1 的计数脉冲输入端 P3.5 ,从而实现更长时间的定时。

Page 89: 第 4 章    中断系统和定时 / 计数器

4 .5中断与定时/计数器综合应用举例 4.5.1 概述 定时 / 计数功能与中断一样,都是单片机的常用功能。两者常常同时使用。如实训 7 就是简单的中断、定时综合应用实例。在这类程序的编制过程中,要注意这样几个问题:

选择合适的中断和定时 /计数方式。 如外部中断是采用电平触发还是脉冲下降沿触发;定时 / 计数是用自动重装方式还是每次定时结束后用软件重装。

Page 90: 第 4 章    中断系统和定时 / 计数器

确定定时结束的判别方法,用中断还是查询。 如采用中断,与其它中断的优先级如何确定,是否会影响系统功能。 正确初始化。 合理分配控制功能。

☆4 .5.2课题与实训 9 音乐门铃一 . 实训目的 1. 掌握中断与定时 / 计数综合程序的设计方法 2. 学习音乐门铃的设计过程二 .课题要求 在单片机 P1.0引脚外接扬声器,唱出《祝你生日快乐》歌。

Page 91: 第 4 章    中断系统和定时 / 计数器

三 .背景知识 1.音频脉冲的产生 声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单片机某个口线的“高”电平或“低”电平,则在该口线上就能产生一定频率的方波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调。 例如,要产生中音 1 。从表 4-5 可知,中音 1 的频率为 523

Hz ,周期 T=1/523=1912μs ,其半周期为 1912/2=956μs ,因此只要在 P1.0引脚产生半周期为 956μs 的方波,即可听到持续的 1音。 C调各音符频率与计数初值的对应表如下:

Page 92: 第 4 章    中断系统和定时 / 计数器

注:不发音的简谱码用“ 0” 表示

Page 93: 第 4 章    中断系统和定时 / 计数器

2 .音乐节拍的生成 要唱出一首歌,只产生出音频脉冲还不够,还要考虑节拍。 定义:每个音符占用一个字节,字节的高 4 位代表音符的高低,低 4 位表示该音符的节拍,如果一拍为 0.4秒,则 1

/4拍是 0.1秒,只要设定延迟时间就可获得节拍的时间。我们也可以设 1/4拍为 1 个 DELAY,则 1拍应该是 4 个 DELAY ,只要求得 1/4拍的 DELAY 时间,其余的节拍就是它的倍数。见表

表 4-6 节拍与节拍码对照表

Page 94: 第 4 章    中断系统和定时 / 计数器

3.建立音乐的步骤: 先把谱的音符找出,然后由上表建立时间常数初值 T 的顺序表,标号为 TABLE1 。 建立音符和节拍表,标号为 TABLE ,将构成发音符的计数值放在其中。 TABLE 表的结构为:简谱码(代表音符)为高 4 位,节拍码(表示节拍数)为低 4 位,在唱歌程序中对每一个有节拍的音符能通过设计共同生成音符节拍码,本程序的音符节拍码表见表 4-5 。

Page 95: 第 4 章    中断系统和定时 / 计数器

( 1 ) 1/4拍的延迟时间 =187毫秒DELAY : MOV R5 , #02

D1 : MOV R4 , #187

D2 : MOV R3 , #248

DJNZ R3,$

DJNZ R4,D2

DJNZ R5,D1

DJNZ R6,DELAY

RET ( 2 )歌谱 生日快乐歌 C3/4

︱ 5 . 5 6 5︱ 7 -︱ 5 . 5 6 5︱ -︱祝 你生日 快 乐 祝 你 生 日 快 乐︱ 5 . 5 ︱ 7 6︱︱ -︱我 们高声 歌 唱 祝 你生日 快 乐

Page 96: 第 4 章    中断系统和定时 / 计数器

四 . 硬件电路

图 4-18 音乐的应用 电路

Page 97: 第 4 章    中断系统和定时 / 计数器

五 .参考程序 ORG 0000H

LJMP MAIN ;跳至主程序 ORG 001BH ; T1 的中断入口地址 LJMP TIM1 ;转至中断服务程序 ORG 0100H

MAIN : MOV TMOD , #10H ;置 T1 工作于方式 1

SETB ET1 ;开 T1 中断 SETB EA ; CPU 开中断

MAIN1: MOV 60H , #00H ;取简谱码指针 NEXT : MOV A , 60H ;简谱码指针装入 A

MOV DPTR , #TABLE ;指向简谱码 TABLE 表地址 MOVC A , @A+DPTR ;简谱码存入 A

MOV R1 , A ;简谱码暂存 R1

JZ STOP ;是否取到结束码 00 ?

Page 98: 第 4 章    中断系统和定时 / 计数器

ANL A , #0FH ;没有,则取低 4 位的节拍码 MOV R6 , A ;取到的节拍码存入 R6 MOV A , R1 ;将取到的简谱码再装入 A SWAP A ;高低 4 位交换 ANL A , #0FH ;取低 4 位的音符码 JNZ SING ;取到的音符码是否为 0 ? CLR TR1 ;是,则不发音 AJMP DT ;转至 DTSING : DEC A ;对取到的非 0音符码减1 MOV 22H , A ;音符码暂存 22H RL A ;乘 2 MOV DPTR , #TABLE1 ;至 TABLE1取与高字节相 ;对应的频率初值

Page 99: 第 4 章    中断系统和定时 / 计数器

MOVC A , @A+DPTR ; MOV TH1 , A ;取到的高字节存入 TH1

MOV 21H , A ;取到的高字节存入 21H

MOV A , 22H ;重装取到的音符码 RL A ;乘 2

INC A ;加 1

MOVC A , @A+DPTR ;至 TABLE1取与低字节相对 ;应的频率初值 MOV TL1 , A ;取到的低字节存入 TL1

MOV 20H , A ;取到的低字节存入 20H

SETB TR1 ;启动 T1 ,开始计时DT : LCALL DELAY ; 1/4拍的基本单位时间 187毫秒 INC 60H ;将简谱码指针加 1

Page 100: 第 4 章    中断系统和定时 / 计数器

AJMP NEXT ;取下一个码STOP : CLR TR1 ;计时停止 AJMP MAIN1 ;重复循环 TIM1 : PUSH ACC ;保护 A值 PUSH PSW ;保护 PSW

MOV TH1 , 21H ;重装入时间常数初值 MOV TL1 , 20H ;重装入时间常数初值 CPL P1.0 ; P1.0取反,发声 POP PSW ;恢复 PSW

POP ACC ;恢复 A

RETI

DELAY : MOV R5 , #2 ; 187毫秒子程序,决定音乐节拍 D2 : MOV R4 , #187 ;

Page 101: 第 4 章    中断系统和定时 / 计数器

D3 : MOV R3 , #248 ; DJNZ R3 , $ ; DJNZ R4 , D3 ; DJNZ R5 , D2 ; DJNZ R6 , DELAY ; RETTABLE1 : DW 64260 , 64400 , 64524 , 64580 DW 64684 , 64777 , 64820 , 64898 DW 64968 , 65030 , 65058 , 65110 DW 65157 , 65178 , 65217 TABLE : ; 1 DB 82H , 01H , 81H , 94H , 84H DB 0B4H , 0A4H , 04H DB 82H , 01H , 81H , 94H , 84H DB 0C4H , 0B4H , 04H

Page 102: 第 4 章    中断系统和定时 / 计数器

DB 0E2H , 01H , 0E1H , 0D4H ,0B4H

DB 0C4H , 0B4H , 04H

DB 00

END六 .总结与提高

制作音乐门铃的关键就是对乐谱建表,包括 T值表和简码表。以表 4-5 的 T值表为例,对于简单的乐谱,只需再增加高音区和低音区的几个音符,其余部分不变;而简码表则不然,它要随着每个音的音符和节拍而定,因曲目而异。

; 2 DB 82H , 01H , 81H , 0F4H , 0D4H DB 0B4H , 0A4H , 94H

Page 103: 第 4 章    中断系统和定时 / 计数器

下面给出《两只老虎》的乐谱,你能制作出它的音乐门铃吗?

两只老虎 4/4

‖1 2 3 1︱ 1 2 3 1︱ 3 4 5_︱ 3 4 5_︱ 两只老虎 两只老虎 跑得快跑得快 ︱ 5 6 5 4 3 1︱ 5 6 5 4 3 1︱ 1 5 1_︱︱ 1 5 1

_︱ 一只没有耳朵 一只没有尾巴 真奇怪 真奇怪

Page 104: 第 4 章    中断系统和定时 / 计数器

☆4.6外部中断源的扩展 在单片机控制系统中,外部中断的使用非常重要,通过它可以中断 CPU 的运行,转去处理更为紧迫的外部事务,如报警、电源掉电保护等。

80C51 单片机仅提供了两个外部中断源,在实际控制系统中可能出现多个外部中断,因此有必要对外部中断源进行扩展。

4.6.1利用定时器溢出中断扩展外部中断源 即把内部不使用的定时 / 计数器出借给外部中断使用,方法如下: 将 80C51 单片机闲置的定时 / 计数器的初值设为全 1 ,只要从计数引脚( T0/T1 )输入一个脉冲就可以使其引起中断。

Page 105: 第 4 章    中断系统和定时 / 计数器

可以采用下面的程序初始化 T1 : MOV TMOD , #60H; T1 工作于方式 2 MOV TL1 , #0FFH ;设为全 1 MOV TH1 , #0FFH SETB TR1 ;启动 T1 SETB ET1 ;开 T1 中断 SETB EA ; CPU 开中断 ┇ 中断服务程序 ┇ RETI

Page 106: 第 4 章    中断系统和定时 / 计数器

4.6.2利用中断与查询相结合的方式扩展 电路如图 4- 19所示,当 CPU检测到 的中断请求信号时,由 P1 口查询判断中断源,点亮相应的发光二极管。

源程序如下: ORG 0000H

AJMP MAIN ; 设主程序入口 ORG 0003H ; 中断入口 AJMP LL ; 转中断服务程序 ORG 0100H ;主程序起始地址 MAIN:ORL P1,#0FFH ; P1 口置输入

0INT

0INT

SETB IT0 ;设 边沿触发SETB EX0 ;允许 中断SETB EA ;开中断AJMP $ ;等待中断

0INT

0INT

0INT0INT

Page 107: 第 4 章    中断系统和定时 / 计数器

ORG 0200H

LL : JNB P1.0, LED1 ; IN0没中断,再判断下一 个 CLR P1.4 ; IN0 中断,灯 L0亮LED1 : JNB P1.1, LED2 ; IN1未中断 CLR P1.5 ; IN1 中断, L1亮LED2 : JNB P1.2, LED3 ; IN2未中断 CLR P1.6 ; IN2 中断, L2亮LED3 : JNB P1.3, END0 ; IN3未中断 CLR P1.7 ; IN3 中断, L3亮END0 : RETI ;返回 END

除此之外,还可以采用串行口方式和中断控制芯片 8259来扩展。

Page 108: 第 4 章    中断系统和定时 / 计数器

本章小结

中断系统及定时 / 计数器是单片机的重要组成部分。利用中断技术能够更好地发挥单片机系统的处理能力,有效地解决慢速工作的外设与快速工作的 CPU之间的矛盾,从而提高了 CPU 的工作效率,增强了它的实时处理能力。 中断处理一般包括中断请求、中断响应、中断服务、中断返回四个环节。 80C51 单片机中断系统有 5 个中断源,即外部中断0 和外部中断 1 ,定时 / 计数器 T0 和 T1 的溢出中断,串行口的发送和接收中断。这 5 个中断源可以分成两个中断优先级,由用户对中断优先级寄存器 IP赋值来实现。

Page 109: 第 4 章    中断系统和定时 / 计数器

CPU 对所有中断源以及某个中断源的开放和禁止是由中断允许寄存器 IE管理的; 5 个中断源的中断请求是借用定时 /

计数器的控制寄存器 TCON 和串行控制寄存器 SCON 中的有关位作为标志,由 CPU 在每个机器周期自动进行查询的方式实现的。80C51内部有两个 16 位的定时 / 计数器 T0 和 T1 ,它们均可以工作于定时或计数模式(但 T0 或 T1 不能同时工作于这两种模式下)。不论是作定时器,还是计数器,它们都有4 种工作方式,由 TMOD 中的 M1M0 来设定。 定时 / 计数器的启、停由 TMOD 中的 GATE 位和 TCO

N 中的 TR0、 TR1 位控制(软件控制),或由 、 引脚输入的外部信号控制(硬件控制)。

INT0 INT1

Page 110: 第 4 章    中断系统和定时 / 计数器

思考题与习题 1 . 80C51 有几个中断源?有几个中断标志?这些中断标 志如何置位、复位? 2 . 80C51 在响应中断的过程中, PC值如何变化? 3 .设系统有两个中断源,分别是外部中断 0 和串行口中 断,要求串行口中断优先级高,试编制它们的初始化 程序。 4 .设在单片机的 P1.0引脚接一个开关,用 P1.1 控制一个 发光二极管。要求当开关按下时 P1.1 能输出低电平, 控制发光二极管发亮,请设计相关电路,并编写一个 查询方式的控制程序。如果开关改接在( P3.3脚)改 用中断方式,编写一个控制程序。 5 .某啤酒自动生产线上,需要每生产 10瓶执行自动装箱 操作(转至装箱操作程序入口即可),试编程实现之。

Page 111: 第 4 章    中断系统和定时 / 计数器

图 4-20 习题 6 图

7 . 当定时 / 计数器 T0 用作方式 3 时,定时 / 计数器 T1可以 工作在何种方式下?如何控制 T1 的开启和关闭?

6 .已知晶振为 12MHz ,试编程实现在 P1.0输出如下波形。

8 .按下列要求分别设置相关控制位。 ① 为边沿触发方式 ; ② 为电平触发方式; ③T1启动运行 ; ④ T0 停止运行。9 .用一条指令分别实现下列要求: ① 、 T0 开中断,其余禁止中断; ②T0、串行口开中断,其余禁止中断; ③全部开中断; ④全部禁止中断;

INT0 INT1

INT0

Page 112: 第 4 章    中断系统和定时 / 计数器

⑤ 、 T1 开中断,其余位保持不变; ⑥ 、 T0禁止中断,其余位允许中断;10 .已知 TMOD 的值,试分析 T0、 T1 的工作状态。 ①TMOD=68H TMOD=52H② ③TMOD=0CBH TMOD=93H④11 .按下列要求设置定时初值,并设置 TH 和 TL 的初值。 ①fosc=12MHz、 T0 方式 1 ,定时 50ms ; ②fosc=6MHz、 T1 方式 2 ,定时 300μs ; ③fosc=12MHz、 T1 方式 1 ,定时 15ms 。

INT0

INT1

12 .设计一个比赛抢答器,电路如图 4-21所示, P1.0~ P1.3 分别接按钮 S1~ S4 ,当其中任何一个按钮按下 时,都能立即从 P3.3 发出铃声信号,并点亮相应的 发光二极管。即 S1 点亮 VL1 , S2 点亮 VL2 , S3点亮 VL3 , S4 点亮 VL4 。

Page 113: 第 4 章    中断系统和定时 / 计数器

13 .编程实现 80C51 单片机单步工作。电路如图 4-22 ,要求利用外部中断来实现每按一次按键执行一条指令。

◄图 4-21 习题 12 电路

▲图 4-22 习题 13 电路