1.13k likes | 1.34k Views
第 4 章 中断系统和定时 / 计数器. 本章学习目标 : 理解中断概念,能正确描绘单片机中断响应过程 熟记 80C51 单片机的 5 个中断源及其中断入口地址 能按要求正确设置特殊功能寄存器 IE 、 IP 、 TCON 、 SCON 和 TMOD 熟悉中断优先控制的方法 能正确描绘定时 / 计数器的 4 种工作方式,重点掌握方式 1 、方式 2 的应用 学会定时 / 计数初值的计算 能读懂教材中的控制实例,学会编写同等难度的中断、定时 / 计数程序. 4.1 中断系统. 4.1.1 中断系统的基本概念. 1. 中断的概念
E N D
第4章 中断系统和定时/计数器 • 本章学习目标 : • 理解中断概念,能正确描绘单片机中断响应过程 • 熟记80C51单片机的5个中断源及其中断入口地址 • 能按要求正确设置特殊功能寄存器IE、IP、TCON、SCON和TMOD • 熟悉中断优先控制的方法 • 能正确描绘定时/计数器的4种工作方式,重点掌握方式1、方式2的应用 • 学会定时/计数初值的计算 • 能读懂教材中的控制实例,学会编写同等难度的中断、定时/计数程序
4.1 中断系统 4.1.1中断系统的基本概念 1.中断的概念 (1)现实生活中的中断: 中断请求 某人看书——某人正在处理一件事A 电话铃响——出现另一件须立即解决的事B 暂停看书——中止A 书中作记号——记录断点,便于接续 电话谈话——处理B 继续看书——继续A的工作 保护断点 中断响应 中断返回
先接电话,然后再继续看书,这样效率最高! 4.1.1中断系统的基本概念 中断原因: 一个人不可能同时完成两项任务。 单片机 只有一个CPU,一旦面临多任务,它也会 中断吗?
事件A 事件B的处理过程 事件B 什么是中断 ? 中断过程 中断请求→中断响应→中断服务→中断返回 (2)单片机中的中断 • CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生或中断请求); • CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); • 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回)。
2.中断技术的应用 • 并行处理 CPU可以与多台外设并行工作,并分时与他们进行信息交换,提高了CPU的工作效率。 • 实时控制 单片机应用系统可能随机请求CPU提供服务。有了中断系统,CPU就可以立即响应并予以处理。 • 故障处理 单片机系统在工作时可能会出现一些突发故障,如电源断电,存储器出错,程序执行错误(如除数为0)等,一旦出现故障,CPU就可及时转去执行故障处理程序,而不必停机。
中断由谁来实施? 3.中断系统 中断功能由中断系统来执行。 为实现中断功能而配置的硬件和编写的软件就是中断系统。
那些部件可以向CPU申请中断呢? 4.1.2 中断源——中断的申请方 能够向CPU发出中断申请的部件称为中断源。 80C51单片机有5个中断源。见下表
4.1.3 中断控制——中断的控制“工具” 单片机通过对4个特殊功能寄存器实施中断控制: • 中断允许寄存器IE • 中断优先级寄存器IP • 定时/计数器及外部中断控制寄存器TCON • 串口控制寄存器SCON
1.中断允许寄存器IE • 功能: 控制单片机是否接受中断申请,以及接受哪一种中断申请 • 字节地址: A8H 其格式和每位的含义如下:
如何对IE进行设置? IE的设置方法: 由位操作指令或数据传送指令实现。 例:同时打开外部中断0和串行口中断,可设置为: 法1:MOV IE,#10010001B 法2:SETB EA SETB ES SETB EX0 〈想一想〉还可以怎样实现?
2.中断优先级寄存器IP • 功能: 对80C51单片机进行高级别或低级别中断的设置, • IP的字节地址: B8H 格式和每位的含义如下:
举例 例:令串行口为高优先级中断,外部中断0为低优先级中断。 设置方法: 法1:MOV IE,#10010001B;开中断 MOV IP,#00010000B;设优先级 法2:MOV IE,#10010001B SETB PS 说明:此时串口的优先级高于外部中断0的优先级
如果几个同级别的中断源同时申请中断,CPU如何响应?如果几个同级别的中断源同时申请中断,CPU如何响应? 答案: 此时CPU按自然优先级顺序确定该响应哪个中断请求。 注意: 自然优先级由硬件决定,用户不能更改。排列见表4-2
3.定时/计数器及外部中断控制寄存器TCON • 可设置外部中断申请的形式:低电平触发还是下降沿触发 • 控制定时/计数器的计时开始或停止 • 是各中断源(串口中断除外)是否申请中断的标志位 • 功能: • 字节地址:88H 格式如下,各位含义见表4-3
例 1 编程设定TCON为低电平触发的高优先级中断源。 分析: 这是典型的中断初始化问题,方法一般如下: 1)对TCON的相关位赋值 2)设定所用中断源的优先级——赋值IP 3)开中断——置位IE
例 1 解:法1:CLR IT1 SETB PX1 SETB EX1 SETB EA 法2:CLR IT1 MOV IP,#04H MOV IE,#84H
4.串口控制寄存器SCON • 功能: 只有D1和D0位用于中断,作为串口中断请求标志,即串口中断请求寄存器 • 字节地址: 98H 格式如下:
RI为接收中断请求标志位。 当串口接收完一帧串行数据时,RI自动置1; CPU响应中断后,用软件对RI清0。 TI为串行口发送中断请求标志。 当串口发送完一帧串行数据时,TI自动置1,请求中断。CPU响应中断后,由软件对TI清零。 其他几位的含义及用法见第5章。
4.1.4 中断响应 1.中断响应条件 • 无同级或高级中断正在服务 • 有中断请求信号 • 相应的中断源已打开,即EA=1,中断源对应中断允许位也为1。 • 当前的指令周期已经结束 • 如果当前指令为RETI或访问IE和IP的指令,至少还要再执行完一条指令。
2.中断响应过程 将当前寄存器内容压入堆栈,如 PUSH ACC 在中断服务程序中实现,解决单片机中断后要干什么的问题。 把保存在堆栈中的寄存器内容取出,送回原来的位置,如POP ACC 图4-4中断响应过程
当CPU正在执行中断服务程序时,又有新的中断源发出中断申请,响应吗?当CPU正在执行中断服务程序时,又有新的中断源发出中断申请,响应吗? 情况1: 同级或低级中断源申请中断,CPU不予理睬 情况2: 高级别中断源申请中断,CPU就要响应。 ☆4.1.5中断嵌套 答案:CPU要进行分析判断,决定是否响应: 待执行完高级别中断服务程序后再转回低级中断服务程序继续执行,这就是中断嵌套。
4.2 中断的应用 4.2.1中断应用指导 • 软件构成:主程序+中断服务程序 • 程序编制的关键点: 要对题目要求进行精确分析,明确哪些环节应该安排在主程序中,哪些环节应该安排在中断服务程序中,再分别编制主程序和中断服务程序。 1.中断系统的程序编制
1.中断系统的程序编制 (1)编制主程序 此部分必须编写 • 第一部分:主程序初始化 功能: • 用于设置堆栈位置; • 定义触发方式(低电平触发或脉冲下降沿触发) • 对IE和IP赋值等; • 第二部分:须由主程序完成的其它功能。
说明: 一般在中断服务程序中涉及到关键数据的设置时应关 中断,即禁止嵌套。 1.中断系统的程序编制 (2)选择中断服务程序的入口地址。 (3)编制中断服务程序。 即明确中断服务程序的起始位置 注意1: 一般要保护断点,即保护进入中断时累加器A、进/借位标志CY和SFR的状态,并在退出中断之前将其恢复; 注意2: 必须在中断服务程序中设定是否允许再次中断(即中断嵌套),由用户对EX0(或EX1)位置位或清0决定。
2.中断应用举例——三相交流电的故障检测电路2.中断应用举例——三相交流电的故障检测电路 例2图4-6是三相交流电的故障检测电路。当A相缺电时,发光二极管LEDA 亮;当B相缺电时,发光二极管LEDB亮;当C相缺电时,发光二极管LEDC亮。 硬件特点: ①外部中断 由3个交流继电器的触点和一个或非门扩展而成; ②3个220V的交流继电器的线圈ZA、ZB、ZC分别接在A、B、C各相和交流地之间。 • 图4-6 三相交流电的故障检测电路
0 0 0 (1)检测原理 ①三相电正常情况下 3个线圈同时得电 3个常开触点全都闭合 1 不申请外部中断
1 0 0 1 (1)检测原理 ②故障情况下(假设A相掉电) 线圈ZB、ZC有电 申请外部中断,在外部中断服务程序中读取P1.0引脚状态 线圈ZA失电 常开触点ZA断开 0 常开触点ZB、ZC闭合 1 产生A相掉电状态信号送入P1.0 A相故障指示灯亮 B、C相故障指示灯不亮 在中断服务程序中对该引脚输出1
(2)软件设计 ORG 0000H LJMP 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
4.2.2 课题与实训7 中断控制流水灯 一.实训目的 学习外部中断的基本用法 掌握中断处理程序的编程方法 二.课题要求 在程序正常运行时P1口的8个LED灯作单灯左移8次而后单灯右移7次,如此循环;中断时(即按键按下)则P1口的8个LED闪烁3次(即全亮全灭3次)。 三.背景知识 1.中断程序的设计主要涉及开中断、设定优先级,外中断还 涉及触发方式的设定。 2.在软件设计中,首先要对主程序和中断服务程序所完成的 任务进行划分。根据该课题提出的要求,在主程序中应该 完成的任务是8个LED循环左移右移;在中断服务程序中 应该完成的功能是8个LED闪烁3次。
四.硬件电路 硬件结构如图,12引脚的按键点动表示有中断请求发出。 图4-7 实训7电路
五.参考程序 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灯亮
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,$
DJNZ R6,D2 DJNZ R5,D1 RET INT0: 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
共同点:格式相近,执行过程大体相同 中断服务程序 子程序 执行时刻是确定的,CPU只要执行LCALL、ACALL等调用指令就会转去执行子程序 中断申请往往是随机发生的。中断服务程序的发生可能是在开中断后的任意时刻,也可能不发生, 六.总结与提高 1. 总结:中断服务程序与子程序对比
2.提高 编写一个由两个中断(外部中断0、外部中断1)控制的流水灯程序。 要求: 主程序不变,中断0可使P1.0~P1.3的LED闪烁5次,中断1可使P1.4~P1.7的LED闪烁5次,设定中断1的优先级比中断0高。
4.3定时/计数器 1. 日常生活中定时、计数的例子: 如闹钟、画“正”统计选票、家用水表对水量的计数。 2 . 单片机应用系统中定时计数的需求: 如用单片机控制的打铃器、空调的定时开关、啤酒自动生产线上对酒瓶的计数装置等。 3 . 80C51单片机片内的定时/计数器: 两个16位可编程的定时/计数器:T0和T1,都能定时和对外部事件进行计数。 此外,T1还可以作为串行接口的波特率发生器。
4.3.1定时/计数器的结构 1.定时和计数的原理 (1)计数定时/计数器的实质是加1计数器(16位),其原理类似于古代用来计时的水钟: 单片机是对脉冲个数计数,计数器每接收到一个脉冲,计数值加1, 当接收满65535个脉冲后,再来一个脉冲,计数值清0表明这一轮计数结束,同时将标志位TF0或TF1置1。 16位定时/计数器的计数容量是65536 假设计满一小时需要100,000,000 滴,这称为水钟的计数容量
计数器如何能作为定时器使用呢? 单片机中的定时器和计数器其实是一个器件:计数器:是对外部发生的事件进行计数, 定时器:是对单片机内部的标准时钟脉冲进行计数。 (2)定时 单片机内部的计数器用作定时器时,是对标准的时钟进行了计数,每来一个时钟脉冲,计数器加1,只要保证计数脉冲的间隔相等,则计数值就代表了时间的流逝。
单片机内部的标准时钟脉冲是如何获得的呢? 图4-9 定时/计数器T0的结构示意图 见图4-9 ,它是由单片机的晶振经过12分频后得到。由于晶振的频率很准,所以这个时钟脉冲的时间间隔也很准。不难算出,当单片机采用12MHz的晶振时,它提供给计数器的脉冲频率是12MHz/12=1MHz,脉冲周期就是1微秒。
图4-9 定时/计数器T0的结构示意图 2.定时/计数器的结构 • 单片机内部的16位定时/计数器由高8位和低8位两个寄存器组成: • T0由TH0和TL0组成, • T1由TH1和TL1组成, 定时/计数器的计数值就存放在这里面。定时/计数器T1的结构与T0相同。
3.定时/计数值的设置 再以水钟为例,当水不断落下,下面容器中的水不断变多,最终总有一滴水使得容器完全充满。这时如果再有一滴水落下,就会发生“溢出”。与此类似,16位定时/计数器计满65536个脉冲时,也会发生溢出。 定时/计数器溢出后标志位TF0(或TF1)由0变1,由此能够引发定时中断(在中断定时方式下),这就像定时的时间一到,闹钟就会响一样。 如果采用12MHz的晶振,对应的脉冲周期是1微秒,计满65536个脉冲所对应的时间就是65.536ms。
现实生活中,如何满足计数值少于65536的需要?如牛奶包装线上24盒装箱一次。现实生活中,如何满足计数值少于65536的需要?如牛奶包装线上24盒装箱一次。 计数器初值的设置 再回到水钟的例子上去: 刚才假设下面容器滴入100,000,000滴水才会满,现在我们在开始滴水之前先放入一勺水,这样问题就解决了。 计数器的道理是一样的,只要用预置数的方法先在计数容器内存入一个初值(通常称为时间常数),如我们要计100,那就存入65436,只要再来100个脉冲,就刚好会溢出,引发中断。
说明 1. 当定时/计数器用作计数器时,通过引脚P3.4(P3.5)对外部输入脉冲计数。 2 . 定时/计数器T0(T1)启动运行后,会按设定的工作方式独立进行计数,不再占用CPU时间。当计数器T0(T1)计满溢出时,TF0(TF1)置1,向CPU发出中断请求信号。 定时器初值的设置 在主频为12MHz的情况下,每个时钟脉冲是1微秒,则计满65536个脉冲需65.536毫秒,如要定时10毫秒则存入初值55536,(10毫秒是10000微秒,需计数10000个脉冲)。可见, 定时器的定时时间长短与系统时钟和定时器初值有关。