第4章 中断系统和定时/计数器 本章学习目标 : 理解中断概念,能正确描绘单片机中断响应过程 第4章 中断系统和定时/计数器 本章学习目标 : 理解中断概念,能正确描绘单片机中断响应过程 熟记80C51单片机的5个中断源及其中断入口地址 能按要求正确设置特殊功能寄存器IE、IP、TCON、SCON和TMOD 熟悉中断优先控制的方法 能正确描绘定时/计数器的4种工作方式,重点掌握方式1、方式2的应用 学会定时/计数初值的计算 能读懂教材中的控制实例,学会编写同等难度的中断、定时/计数程序
4.1 中断系统 4.1.1中断系统的基本概念 1.中断的概念 (1)现实生活中的中断: 某人看书——某人正在处理一件事A 4.1 中断系统 4.1.1中断系统的基本概念 1.中断的概念 (1)现实生活中的中断: 中断请求 某人看书——某人正在处理一件事A 电话铃响——出现另一件须立即解决的事B 暂停看书——中止A 书中作记号——记录断点,便于接续 电话谈话——处理B 继续看书——继续A的工作 保护断点 中断响应 中断返回
先接电话,然后再继续看书,这样效率最高! 4.1.1中断系统的基本概念 中断原因: 一个人不可能同时完成两项任务。 先接电话,然后再继续看书,这样效率最高! 单片机 只有一个CPU,一旦面临多任务,它也会 中断吗?
(2)单片机中的中断 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生或中断请求); CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回)。 什么是中断 ? 事件B的处理过程 事件A 事件B 中断请求→中断响应→中断服务→中断返回 中断过程
2.中断技术的应用 并行处理 CPU可以与多台外设并行工作,并分时与他们进行信息交换,提高了CPU的工作效率。 实时控制 故障处理 单片机系统在工作时可能会出现一些突发故障,如电源断电,存储器出错,程序执行错误(如除数为0)等,一旦出现故障,CPU就可及时转去执行故障处理程序,而不必停机。
3.中断系统 中断功能由中断系统来执行。 中断由谁来实施? 为实现中断功能而配置的硬件和编写的软件就是中断系统。
图4-1 中断系统的结构框图
4.1.2 中断源——中断的申请方 能够向CPU发出中断申请的部件称为中断源。 80C51单片机有5个中断源。见下表 中断源 说明 外部中断 定时器T0中断 定时器T0溢出时引发中断申请 从P3.3引脚引入的外部中断申请 定时器T1中断 定时器T1溢出时引发中断申请 串行口中断 一次串行发送或接收完成后,发出中断申请 那些部件可以向CPU申请中断呢?
定时/计数器及外部中断控制寄存器TCON 串口控制寄存器SCON 4.1.3 中断控制——中断的控制“工具” 单片机通过对4个特殊功能寄存器实施中断控制: 中断允许寄存器IE 中断优先级寄存器IP 定时/计数器及外部中断控制寄存器TCON 串口控制寄存器SCON
1.中断允许寄存器IE 功能: 控制单片机是否接受中断申请,以及接受哪一种中断申请 字节地址: A8H 其格式和每位的含义如下:
图4-2 IE的格式
例:同时打开外部中断0和串行口中断,可设置为: IE的设置方法: 由位操作指令或数据传送指令实现。 例:同时打开外部中断0和串行口中断,可设置为: 法1:MOV IE,#10010001B 如何对IE进行设置? 法2:SETB EA SETB ES SETB EX0 〈想一想〉还可以怎样实现?
2.中断优先级寄存器IP 功能: 对80C51单片机进行高级别或低级别中断的设置, IP的字节地址: B8H 格式和每位的含义如下:
图4-3 IP的格式
例:令串行口为高优先级中断,外部中断0为低优先级中断。 设置方法: 举例 例:令串行口为高优先级中断,外部中断0为低优先级中断。 设置方法: 法1: MOV IE,#10010001B ;开中断 MOV IP,#00010000B ;设优先级 法2: MOV IE,#10010001B SETB PS 说明:此时串口的优先级高于外部中断0的优先级
此时CPU按自然优先级顺序确定该响应哪个中断请求。 答案: 此时CPU按自然优先级顺序确定该响应哪个中断请求。 如果几个同级别的中断源同时申请中断,CPU如何响应? 注意: 自然优先级由硬件决定,用户不能更改。排列见表4-2
表4-2 中断入口地址及自然优先级
3.定时/计数器及外部中断控制寄存器TCON 功能: 字节地址: 88H 可设置外部中断申请的形式:低电平触发还是下降沿触发 控制定时/计数器的计时开始或停止 是各中断源(串口中断除外)是否申请中断的标志位 格式如下,各位含义见表4-3 TCON D7 D6 D5 D4 D3 D2 D1 D0 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
表4-3 TCON的功能说明 中 断 控 制 IT0 88H IE0 89H IT1 8AH IE1 8BH 形式 符号 位地址 功 能 功 能 说 明 中 断 控 制 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 TR0 8CH TF0 8DH TR1 8EH TF1 8FH 定 时 / 计 数 控 制 形式 符号 位地址 功 能 说 明 功 能 说 明 定 时 / 计 数 控 制 TR0 8CH TR0=1:启动定时/计数器T0 TR0=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的状态由单片机自动设置
编程设定TCON为低电平触发的高优先级中断源。 例 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自动置1; CPU响应中断后,用软件对RI清0。 TI为串行口发送中断请求标志。 当串口发送完一帧串行数据时,TI自动置1,请求中断。CPU响应中断后,由软件对TI清零。 其他几位的含义及用法见第5章。
相应的中断源已打开,即EA=1,中断源对应中断允许位也为1。 当前的指令周期已经结束 4.1.4 中断响应 1.中断响应条件 无同级或高级中断正在服务 有中断请求信号 相应的中断源已打开,即EA=1,中断源对应中断允许位也为1。 当前的指令周期已经结束 如果当前指令为RETI或访问IE和IP的指令,至少还要再执行完一条指令。
2.中断响应过程 将当前寄存器内容压入堆栈,如 PUSH ACC 在中断服务程序中实现,解决单片机中断后要干什么的问题。 把保存在堆栈中的寄存器内容取出,送回原来的位置,如POP ACC 图4-4中断响应过程
☆4.1.5中断嵌套 答案:CPU要进行分析判断,决定是否响应: 情况1: 同级或低级中断源申请中断,CPU不予理睬 情况2: 待执行完高级别中断服务程序后再转回低级中断服务程序继续执行,这就是中断嵌套。 当CPU正在执行中断服务程序时,又有新的中断源发出中断申请,响应吗? 情况1: 同级或低级中断源申请中断,CPU不予理睬 情况2: 高级别中断源申请中断,CPU就要响应。
图4-5 二级中断嵌套的执行过程
4.2 中断的应用 4.2.1中断应用指导 1.中断系统的程序编制 软件构成:主程序+中断服务程序 程序编制的关键点: 要对题目要求进行精确分析,明确哪些环节应该安排在主程序中,哪些环节应该安排在中断服务程序中,再分别编制主程序和中断服务程序。
定义触发方式(低电平触发或脉冲下降沿触发) 对IE和IP赋值等; 1.中断系统的程序编制 (1)编制主程序 此部分必须编写 第一部分:主程序初始化 功能: 用于设置堆栈位置; 定义触发方式(低电平触发或脉冲下降沿触发) 对IE和IP赋值等; 第二部分:须由主程序完成的其它功能。
(2)选择中断服务程序的入口地址。 (3)编制中断服务程序。 1.中断系统的程序编制 说明: 即明确中断服务程序的起始位置 注意1: 一般要保护断点, 即保护进入中断时累加器A、进/借位标志CY和SFR的状态,并在退出中断之前将其恢复; 注意2: 必须在中断服务程序中设定是否允许再次中断(即中断嵌套),由用户对EX0(或EX1)位置位或清0决定。 说明: 一般在中断服务程序中涉及到关键数据的设置时应关 中断,即禁止嵌套。
2.中断应用举例——三相交流电的故障检测电路 例2 图4-6是三相交流电的故障检测电路。当A相缺电时,发光二极管LEDA 亮;当B相缺电时,发光二极管LEDB亮;当C相缺电时,发光二极管LEDC亮。 硬件特点: ①外部中断 由3个交流继电器的触点和一个或非门扩展而成; ②3个220V的交流继电器的线圈ZA、ZB、ZC分别接在A、B、C各相和交流地之间。 图4-6 三相交流电的故障检测电路
(1)检测原理 ①三相电正常情况下 3个线圈同时得电 3个常开触点全都闭合 1 不申请外部中断
申请外部中断,在外部中断服务程序中读取P1.0引脚状态 (1)检测原理 ②故障情况下(假设A相掉电) 线圈ZB、ZC有电 申请外部中断,在外部中断服务程序中读取P1.0引脚状态 线圈ZA失电 常开触点ZA断开 1 常开触点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 中断控制流水灯 一.实训目的 二.课题要求 三.背景知识 学习外部中断的基本用法 掌握中断处理程序的编程方法 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电路
五.参考程序 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
六.总结与提高 1. 总结:中断服务程序与子程序对比 共同点:格式相近,执行过程大体相同 中断服务程序 中断申请往往是随机发生的。中断服务程序的发生可能是在开中断后的任意时刻,也可能不发生, 子程序 执行时刻是确定的,CPU只要执行LCALL、ACALL等调用指令就会转去执行子程序
主程序不变,中断0可使P1.0~P1.3的LED闪烁5次,中断1可使P1.4~P1.7的LED闪烁5次,设定中断1的优先级比中断0高。 2.提高 编写一个由两个中断(外部中断0、外部中断1)控制的流水灯程序。 要求: 主程序不变,中断0可使P1.0~P1.3的LED闪烁5次,中断1可使P1.4~P1.7的LED闪烁5次,设定中断1的优先级比中断0高。
4.3定时/计数器 如闹钟、画“正”统计选票、家用水表对水量的计数。 2 . 单片机应用系统中定时计数的需求: 1. 日常生活中定时、计数的例子: 如闹钟、画“正”统计选票、家用水表对水量的计数。 2 . 单片机应用系统中定时计数的需求: 如用单片机控制的打铃器、空调的定时开关、啤酒自动生产线上对酒瓶的计数装置等。 3 . 80C51单片机片内的定时/计数器: 两个16位可编程的定时/计数器:T0和T1,都能定时和对外部事件进行计数。 此外,T1还可以作为串行接口的波特率发生器。
4.3.1定时/计数器的结构 1.定时和计数的原理 (1)计数 定时/计数器的实质是加1计数器(16位),其原理类似于古代用来计时的水钟: (1)计数 定时/计数器的实质是加1计数器(16位),其原理类似于古代用来计时的水钟: 单片机是对脉冲个数计数,计数器每接收到一个脉冲,计数值加1, 当接收满65535个脉冲后,再来一个脉冲,计数值清0表明这一轮计数结束,同时将标志位TF0或TF1置1。 16位定时/计数器的计数容量是65536 假设计满一小时需要100,000,000 滴,这称为水钟的计数容量
单片机中的定时器和计数器其实是一个器件:计数器:是对外部发生的事件进行计数, 定时器:是对单片机内部的标准时钟脉冲进行计数。 (2)定时 单片机内部的计数器用作定时器时,是对标准的时钟进行了计数,每来一个时钟脉冲,计数器加1,只要保证计数脉冲的间隔相等,则计数值就代表了时间的流逝。 计数器如何能作为定时器使用呢? 单片机中的定时器和计数器其实是一个器件:计数器:是对外部发生的事件进行计数, 定时器:是对单片机内部的标准时钟脉冲进行计数。
见图4-9 ,它是由单片机的晶振经过12分频后得到。由于晶振的频率很准,所以这个时钟脉冲的时间间隔也很准。不难算出,当单片机采用12MHz的晶振时,它提供给计数器的脉冲频率是12MHz/12=1MHz,脉冲周期就是1微秒。 单片机内部的标准时钟脉冲是如何获得的呢? 图4-9 定时/计数器T0的结构示意图
定时/计数器的计数值就存放在这里面。定时/计数器T1的结构与T0相同。 2.定时/计数器的结构 单片机内部的16位定时/计数器由高8位和低8位两个寄存器组成: T0由TH0和TL0组成, T1由TH1和TL1组成, 定时/计数器的计数值就存放在这里面。定时/计数器T1的结构与T0相同。 图4-9 定时/计数器T0的结构示意图
3.定时/计数值的设置 再以水钟为例,当水不断落下,下面容器中的水不断变多,最终总有一滴水使得容器完全充满。这时如果再有一滴水落下,就会发生“溢出”。与此类似,16位定时/计数器计满65536个脉冲时,也会发生溢出。 定时/计数器溢出后标志位TF0(或TF1)由0变1,由此能够引发定时中断(在中断定时方式下),这就像定时的时间一到,闹钟就会响一样。 如果采用12MHz的晶振,对应的脉冲周期是1微秒,计满65536个脉冲所对应的时间就是65.536ms。
计数器初值的设置 再回到水钟的例子上去: 刚才假设下面容器滴入100,000,000滴水才会满,现在我们在开始滴水之前先放入一勺水,这样问题就解决了。 现实生活中,如何满足计数值少于65536的需要?如牛奶包装线上24盒装箱一次。 计数器的道理是一样的,只要用预置数的方法先在计数容器内存入一个初值 (通常称为时间常数),如我们要计100,那就存入65436,只要再来100个脉冲,就刚好会溢出,引发中断。
定时器初值的设置 在主频为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发出中断请求信号。
4-10 定时/计数器的控制关系
4.3.2定时/计数器的控制 在单片机中有两个特殊功能寄存器与定时/计数有关,它们就是TMOD和TCON,定时/计数器T0、T1就由它们来控制: TMOD用于设置工作方式; TCON用于控制其启动、停止和中断申请。 1.定时器工作方式寄存器TMOD TMOD用于设置T0和T1的工作方式,字节地址为89H,不能按位寻址。其格式和各位的含义如下:
2.定时/计数器控制寄存器TCON TCON的低4位用于控制外部中断,高4位用于控制定时/计数器的启动和中断申请。 TF0(或TF1) 当计数溢出时,TF0(或TF1)会自动由0变1,告诉我们计数已满,我们可以通过查询TF0(或TF1)位的状态来判断计时时间是否已到; 如果采用定时中断方式,则 TF0(或TF1)由0变1时,能自动引发中断。
TR0(或TR1) 由图4-11 可知,只有当TR0(或TR1)为1时,开关1才能闭合,计数脉冲才能进入计数器,故TR0(或TR1)称为运行控制位,可用指令“SETB TR0(或TR1)”来置位以启动定时/计数器运行;或用指令“CLR TR0(或TR1)”来关闭定时/计数器的工作,一切全靠编程人员控制。 图4-11 定时/计数器T0方式0的逻辑结构示意图
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,可申请中断,也可对TF0进行查询。
图4-11 定时/计数器T0方式0的逻辑结构示意图
当M1M0=01时,定时/计数器工作于方式1。方式1的计数位数是16位,由TL0作为低8位,TH0作为高8位共同构成。其余操作同方式0。 2. 方式1 当M1M0=01时,定时/计数器工作于方式1。方式1的计数位数是16位,由TL0作为低8位,TH0作为高8位共同构成。其余操作同方式0。 图4-12 定时/计数器T0方式1的逻辑结构示意图
特别适合于制作比较精确的脉冲信号发生器。 3. 方式2 当M1M0=10时,定时/计数器工作于方式2。这是自动重装初值的8位计数方式,它省去了方式0和方式1在多次重复计数状态下必须重新设定计数初值的麻烦,但是却付出了减小定时时间的代价。 特别适合于制作比较精确的脉冲信号发生器。 图4-13 定时/计数器T0方式2的逻辑结构示意图
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,其启动和停止只受TR1控制。
图4-14 定时/计数器T0方式3的逻辑结构示意图 定时器T1无工作方式3,当定时器T0工作在方式3时,定时器T1可设置为方式0、方式1和方式2。
4.4定时/计数器应用与训练 4.4.1应用指导 1.定时/计数器的定时/计数范围 定时/计数器工作于不同方式下的位数不同,它所具有的计数范围也不一样: 工作方式0:13位定时/计数方式,因此,最多可以计到213,也就是8192次。 工作方式1:16位定时/计数方式,因此,最多可 以计到216,也就是65536次。 工作方式2和工作方式3:都是8位定时/计数方 式,因此,最多可以计到2 8,也就是256次。 <想一想> 如果我们需要超过计数器计数范围的定时或计数功能,应该怎样做?
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是需要计数的次数
假设流水线上一个包装是12盒,要求每到12盒就产生一个动作,用单片机的工作方式0来控制,应当预置的计数初值是多少呢? 对了,就是8192-12=8180。 3.定时/计数器的初始化 对80C51单片机的定时/计数器编程的初始化方法: ① 对TMOD赋值,以确定T0和T1的工作方式; ② 计算时间常数初值,并将其写入TH0、TL0或TH1、 TL1; ③ 采用中断定时方式时,需对IE赋值开中断; ④ 置位TR0或TR1,启动定时/计数器。
4.4.2 基本训练—初始化训练 例3:某牛奶生产线上一个包装是12盒,要求每生产12盒就执行装箱操作,用80C51单片机来控制,请编写初始化程序。 1.思路与计算:要确定定时器(T0 或T1),选择其工作方式。我们以T0的工作方式2为例,计算时间常数并赋值给TH0、TL0。 X=256-S=256-12=244=0F4H
MOV TMOD,#06H ;T0作计数器,工作于方式2 MOV TH0,#0F4H ;装入时间常数初值 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.总结:对计数过程是否结束有查询和中断两种方法,要合理选择,并在程序设计中正确体现。
4.4.3应用实例 (1)测量原理 可以利用定时/计数器方式寄存器TMOD中的门控位GATE与 引脚配合使用,控制定时/计数器的启动与停止: 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就可以启动定时器,而与 的输入状态无关。
利用上述特点,将被测脉冲信号从(P3.3)引入,在T1的程序初始化中令GATE=1,同时“SETB TR1”,这样脉冲信号的上升沿就能启动T1计数,脉冲信号下降沿能使T1停止计数。利用定时器T1的计数值m乘以机器周期就可以得到被测脉冲信号的宽度TW。 (2)硬件电路 硬件电路简图如图4-15。
(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
MOV TL1,#00H L1: JB P3.3,L1 ;等待输入变为低电平 SETB TR1 ;预置TR1=1,准备启动T1 L2: 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
(4)总结与思考 定时/计数器还可用于测量脉冲信号的频率、周期等。本实例是利用定时/计数器的门控位(GATE)测量脉冲宽度。但要注意,在晶振12MHz的情况下,被测脉冲宽度范围最大为65535×1μs=65.536ms。 <想一想>,如果要测量脉冲信号的周期,该如何去做? 2.计数器用于绕线机的控制 绕线机常用于对电机或变压器的绕组进行绕制,图4-16是绕线机的控制电路。当按下工作按钮以后,机器启动,绕线机在直流电机和减速齿轮的带动下开始工作。当绕线架上的线圈绕到规定的圈数时,绕线机会自动停止绕线。如果再次按下工作按钮,绕线机会重复以上过程。
图4-16 绕线机的控制电路 控制说明:1.软件控制P1.0=0时,绕线机开始绕线;P1.0=1时,绕线机不绕线。 2.绕线机每绕一圈,绕线机脉冲产生电路就产生一个脉冲信号。
(1)工作原理 由于单片机复位后P1 口的输出状态全部为1,所以系统上电后,P1.0输出高电平“1”绕线机不工作。 当按下工作按钮以后,P1.1输入低电平“0”,当程序检测到P1.1=0时,在程序指令的控制下从P1.0输出低电平“0”。绕线机开始绕线。绕线机每绕一圈,定时/计数器T1的输入引脚上就会产生一个负跳变的输入脉冲。因此,只要用定时/计数器T1的计数功能控制好输入脉冲的个数,就等于控制了绕线机的绕线圈数。 当绕线机缠绕到指定的圈数时,定时/计数器T1引发计数中断,在程序指令的控制下,P1.0将输出的高电平“1”,使电机停转,制动器恢复制动,于是系统回到最初的停机状态。
我们假设绕线架的规定匝数是5000圈,为控制这个圈数,可以设定定时/计数器T1用作计数器且工作在方式1,于是确定其计数初值为: 初值=65536-5000=60536=0EC78H 所以(TH1)=0ECH,(TL1)=78H (2)控制程序 参考程序如下: ORG 0000H AJMP MAIN ORG 001BH AJMP COUNT ORG 0100H
MAIN: MOV TMOD,#50H ;设置T1为计数器,工作于方式1 MOV TH1,#0ECH ;设定计数初值 MOV TL1,#78H MOV SP,#60H ;设堆栈指针 SETB ET1 ;开T1中断 SETB EA ;CPU开中断 CLR F0 ;用户标志F0清0 WAIT: MOV C,P1.1 ;等待启动 JC WAIT ;P1.1=1,等待 CLR P1.0 ;启动设备 SETB TR0 ;T1开始计数
LOOP: JNB F0,$ ;等待计数5000中断 SETB P1.0 ;绕线机停止工作 CLR TR0 ;T1停止计数 CLR F0 ;清0 SJMP WAIT ;等待重新启动 ORG 0200H ;T1中断服务程序起始地址COUNT:MOV TH1,#0ECH ;重新设定计数初值 MOV TL1,#78H SETB F0 ;用户标志置1 RETI ;中断返回 END
4.4.4课题与实训8 简易方波发生器 一.实训目的 掌握定时器初值的计算方法 学习定时器的使用及定时中断程序的设计方法 4.4.4课题与实训8 简易方波发生器 一.实训目的 掌握定时器初值的计算方法 学习定时器的使用及定时中断程序的设计方法 掌握方波信号发生器的设计方法 二.课题要求 1.基本要求: 利用定时/计数器T1,工作于方式0,采用查询方式,在P1.0引脚输出频率为500Hz的方波,并用示波器进行观察(晶振采用12MHz)。 2.较高要求: 利用定时/计数器T1,工作于方式0,采用中断方式,在P1.0引脚输出频率为500Hz的方波,并用示波器进行观察(晶振采用12MHz)。
三.背景知识 1.方波产生原理 使P1.0引脚的输出状态定时翻转,则该端口能输出一定频率的方波。 2.方式0的时间常数初值 定时/计数器工作于方式0状态下,定时/计数的长度是13位。应用前面给出的时间常数初值的计算公式 X=8192-t(fosc/12) 我们可以很方便地计算出时间常数初值,但在将其装入定时/计数器的TH、TL寄存器时,必须要注意:将计算结果的高8位装入TH1(或TH0)、低5位装入TL1(或TL0),这一环节是非常容易出错的。
以该实训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
四.硬件电路 该实训硬件电路十分简单,见图4-17。 图4-17 简易方波发生器的硬件电路
五.参考程序 (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取反
MOV TH1,#0E0H ;重新装入时间常数初值 MOV TL1,#18H AJMP LOOP ;继续生成波形 END
MAIN:MOV TMOD,#00H ;置T1工作于方式0 MOV TH1,#0E0H ;装入时间常数初值 MOV TL1,#18H (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
SJMP $ ;等待中断 FANGBO:CPL P1.0 ;P1.0取反 MOV TH1,#0E0H ;重新装入时间常数初值 MOV TL1,#18H RETI ;中断返回 END 六.总结与提高 1.总结 本实训利用定时器T1的定时功能,以两种形式输出频率为500Hz方波。在实际应用中,方波的频率可能要根据现场测量参数、给定参数或按照某种函数关系而变化。因此输出波形的频率在编程时还是未知的。
2.提高 定时/计数器的计时范围有限,当晶振采用12MHz时,方式1的计时时间最长,也只有65.536ms。当需要定时的时间超出了定时/计数器的计数范围,如需定时2秒,这时可以采用以下两种方法来处理: ⑴ 定时器+软件计数的方法 思路是:利用定时/计数器T1,工作于方式1,实现50 ms/次的定时,只要定时40次即可实现2s定时。 可以算出定时/计数器T1工作于方式1时,时间常数初值为 X=65536-t(fosc/12)=65536-50×10-3×(12×106/12) =15536=3CB0H 于是(TH1)=3CH ,(TL1)=0B0H。
定义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
⑵采用两个定时器串联的方法 思路是: 将两个定时器中的一个(如T0)设置为定时方式,另一个(T1)设置成计数方式;将定时器T0计满产生的输出,通过一根I/O口线(如P1.0)连接到计数器T1的计数脉冲输入端P3.5,从而实现更长时间的定时。
4.5中断与定时/计数器综合应用举例 4.5.1 概述 定时/计数功能与中断一样,都是单片机的常用功能。两者常常同时使用。如实训7就是简单的中断、定时综合应用实例。在这类程序的编制过程中,要注意这样几个问题: 选择合适的中断和定时/计数方式。 如外部中断是采用电平触发还是脉冲下降沿触发;定时/计数是用自动重装方式还是每次定时结束后用软件重装。
☆4.5.2课题与实训9 音乐门铃 确定定时结束的判别方法,用中断还是查询。 如采用中断,与其它中断的优先级如何确定,是否会影响系统功能。 正确初始化。 合理分配控制功能。 ☆4.5.2课题与实训9 音乐门铃 一.实训目的 1. 掌握中断与定时/计数综合程序的设计方法 2.学习音乐门铃的设计过程 二.课题要求 在单片机P1.0引脚外接扬声器,唱出《祝你生日快乐》歌。
三.背景知识 1.音频脉冲的产生 声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单片机某个口线的“高”电平或“低”电平,则在该口线上就能产生一定频率的方波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调。 例如,要产生中音1。从表4-5可知,中音1的频率为523Hz,周期T=1/523=1912μs,其半周期为1912/2=956μs,因此只要在P1.0引脚产生半周期为956μs的方波,即可听到持续的1音。C调各音符频率与计数初值的对应表如下:
注:不发音的简谱码用“0”表示
要唱出一首歌,只产生出音频脉冲还不够,还要考虑节拍。 2.音乐节拍的生成 要唱出一首歌,只产生出音频脉冲还不够,还要考虑节拍。 定义:每个音符占用一个字节,字节的高4位代表音符的高低,低4位表示该音符的节拍,如果一拍为0.4秒,则1/4拍是0.1秒,只要设定延迟时间就可获得节拍的时间。我们也可以设1/4拍为1个DELAY,则1拍应该是4个DELAY,只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数。见表 表4-6 节拍与节拍码对照表
3.建立音乐的步骤: 先把谱的音符找出,然后由上表建立时间常数初值T的顺序表,标号为TABLE1。 建立音符和节拍表,标号为TABLE,将构成发音符的计数值放在其中。 TABLE表的结构为:简谱码(代表音符)为高4位,节拍码(表示节拍数)为低4位,在唱歌程序中对每一个有节拍的音符能通过设计共同生成音符节拍码,本程序的音符节拍码表见表4-5。
(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︱︱-︱ 我 们高声 歌 唱 祝 你生日 快 乐
四.硬件电路 图4-18 音乐的应用 电路
五.参考程序 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?
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 ;转至DT SING: DEC A ;对取到的非0音符码减1 MOV 22H,A ;音符码暂存22H RL A;乘2 MOV DPTR,#TABLE1 ;至TABLE1取与高字节相 ;对应的频率初值
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
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 ;
D3: MOV R3,#248; DJNZ R3,$; DJNZ R4,D3; DJNZ R5,D2; DJNZ R6,DELAY; RET TABLE1: 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 0C4H,0B4H,04H
;2 DB 82H,01H,81H,0F4H,0D4H DB 0B4H,0A4H,94H DB 0E2H,01H,0E1H,0D4H,0B4H DB 0C4H,0B4H,04H DB 00 END 六.总结与提高 制作音乐门铃的关键就是对乐谱建表,包括T值表和简码表。以表4-5的T值表为例,对于简单的乐谱,只需再增加高音区和低音区的几个音符,其余部分不变;而简码表则不然,它要随着每个音的音符和节拍而定,因曲目而异。
下面给出《两只老虎》的乐谱,你能制作出它的音乐门铃吗? 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_︱ 一只没有耳朵 一只没有尾巴 真奇怪 真奇怪
☆4.6外部中断源的扩展 4.6.1利用定时器溢出中断扩展外部中断源 在单片机控制系统中,外部中断的使用非常重要,通过它可以中断CPU的运行,转去处理更为紧迫的外部事务,如报警、电源掉电保护等。 80C51单片机仅提供了两个外部中断源,在实际控制系统中可能出现多个外部中断,因此有必要对外部中断源进行扩展。 4.6.1利用定时器溢出中断扩展外部中断源 即把内部不使用的定时/计数器出借给外部中断使用,方法如下: 将80C51单片机闲置的定时/计数器的初值设为全1,只要从计数引脚(T0/T1)输入一个脉冲就可以使其引起中断。
可以采用下面的程序初始化T1: MOV TMOD,#60H ;T1工作于方式2 MOV TL1,#0FFH ;设为全1 MOV TH1,#0FFH SETB TR1 ;启动T1 SETB ET1 ;开T1中断 SETB EA ;CPU开中断 ┇ 中断服务程序 RETI
4.6.2利用中断与查询相结合的方式扩展 电路如图4-19所示,当CPU检测到 的中断请求信号时,由P1口查询判断中断源,点亮相应的发光二极管。 源程序如下: ORG 0000H AJMP MAIN ;设主程序入口 ORG 0003H ; 中断入口 AJMP LL ;转中断服务程序 ORG 0100H ;主程序起始地址 MAIN:ORL P1,#0FFH ;P1口置输入 SETB IT0 ;设 边沿触发 SETB EX0 ;允许 中断 SETB EA ;开中断 AJMP $ ;等待中断
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来扩展。
本章小结 中断系统及定时/计数器是单片机的重要组成部分。利用中断技术能够更好地发挥单片机系统的处理能力,有效地解决慢速工作的外设与快速工作的CPU之间的矛盾,从而提高了CPU的工作效率,增强了它的实时处理能力。 中断处理一般包括中断请求、中断响应、中断服务、中断返回四个环节。 80C51单片机中断系统有5个中断源,即外部中断0和外部中断1,定时/计数器T0和T1的溢出中断,串行口的发送和接收中断。这5个中断源可以分成两个中断优先级,由用户对中断优先级寄存器IP赋值来实现。
CPU对所有中断源以及某个中断源的开放和禁止是由中断允许寄存器IE管理的;5个中断源的中断请求是借用定时/计数器的控制寄存器TCON和串行控制寄存器SCON中的有关位作为标志,由CPU在每个机器周期自动进行查询的方式实现的。 80C51内部有两个16位的定时/计数器T0和T1,它们均可以工作于定时或计数模式(但T0或T1不能同时工作于这两种模式下)。不论是作定时器,还是计数器,它们都有4种工作方式,由TMOD中的M1M0来设定。 定时/计数器的启、停由TMOD中的GATE位和TCON中的TR0、TR1位控制(软件控制),或由 、 引脚输入的外部信号控制(硬件控制)。
思考题与习题 1.80C51有几个中断源?有几个中断标志?这些中断标 志如何置位、复位? 2.80C51在响应中断的过程中,PC值如何变化? 3.设系统有两个中断源,分别是外部中断0和串行口中 断,要求串行口中断优先级高,试编制它们的初始化 程序。 4.设在单片机的P1.0引脚接一个开关,用P1.1控制一个 发光二极管。要求当开关按下时P1.1能输出低电平, 控制发光二极管发亮,请设计相关电路,并编写一个 查询方式的控制程序。如果开关改接在(P3.3脚)改 用中断方式,编写一个控制程序。 5.某啤酒自动生产线上,需要每生产10瓶执行自动装箱 操作(转至装箱操作程序入口即可),试编程实现之。
6.已知晶振为12MHz,试编程实现在P1.0输出如下波形。 图4-20 习题6图 7. 当定时/计数器T0用作方式3时,定时/计数器T1可以 工作在何种方式下?如何控制T1的开启和关闭? 8.按下列要求分别设置相关控制位。 ① 为边沿触发方式 ; ② 为电平触发方式; ③T1启动运行 ; ④T0停止运行。 9.用一条指令分别实现下列要求: ① 、T0开中断,其余禁止中断; ②T0、串行口开中断,其余禁止中断; ③全部开中断; ④全部禁止中断;
⑤ 、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。 12.设计一个比赛抢答器,电路如图4-21所示,P1.0~ P1.3分别接按钮S1~S4,当其中任何一个按钮按下 时,都能立即从P3.3发出铃声信号,并点亮相应的 发光二极管。即S1点亮VL1,S2点亮VL2,S3点亮 VL3,S4点亮VL4。
13.编程实现80C51单片机单步工作。电路如图4-22,要求利用外部中断来实现每按一次按键执行一条指令。 图4-22 习题13电路 图4-21 习题12电路