资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单片机中断与计时计数器,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正在响应同级或更高级的中断情况,中断响应等待时间为: 38个机器周期,5.1.5 中断请求的撤除,中断源发出中断请求,相应中断请求标志置“1。 CPU响应中断后,必须去除中断请求“1标志。否那么中断响应返回后,将再次进入该中断,引起死循环出错。, 对定时/计数器T0、T1中断,外中断边沿触发方式,CPU响应中断时就用硬件自动去除了相应的中断请求标志。, 对外中断电平触发方式,需要采取软硬结合的方法消除后果。, 对串行口中断,用户应在串行中断效劳程序中用软件去除TI或RI。,例:,硬件电路如下图。当外部设备有中断请求时,中断请求信号经反相,加到锁存器CP端,作为CP脉冲。由于D端接地为0,Q端输出低点平,触发 INT0生中断。当CPU响应中断后,应在该中断效劳程序中按排两条指令:,CLR P10:,SETB P10,从而撤消引起重复中断的INT0低电平信号。,因此一般来说,对外中断INT0、INTl,应尽量采用边沿触发方式,以简化硬件电路和软件程序。,中断优先控制和中断嵌套, 中断优先控制,80C51中断优先控制首先根据中断优先级,此外还规定了同一中断优先级之间的中断优先权。其从高到低的顺序为:,INT0、 T0、 INT1、T1、串行口。,中断优先级是可编程的,而中断优先权是固定的,不能设置,仅用于同级中断源同时请求中断时的优先次序。,80C51中断优先控制的根本原那么:, 高优先级中断可以中断正在响应的低优先级中断,反之那么不能。, 同优先级中断不能互相中断。, 同一中断优先级中,假设有多个中断源同时请求中断,CPU将先响应优先权高的中断,后响应优先权低的中断。,中断嵌套,当CPU正在执行某个中断效劳程序时,如果发生更高一级的中断源请求中断,CPU可以“中断正在执行的低优先级中断,转而响应更高一级的中断,这就是中断嵌套。,中断嵌套只能高优先级“中断低优先级,低优先级不能“中断高优先级,同一优先级也不能相互“中断。,中断嵌套构造类似与调用子程序嵌套,不同的是:, 子程序嵌套是在程序中事先按排好的;中断嵌套是随机发生的。, 子程序嵌套无次序限制,中断嵌套只允许高优先级“中断低优先级。,5.1.7 中断系统的应用, 中断初始化, 设置堆栈指针SP, 定义中断优先级, 定义外中断触发方式, 开放中断, 安排好等待中断或中断发生前主程序应完成的操作内容。, 中断效劳主程序,中断效劳子程序内容要求:, 在中断效劳入口地址设置一条跳转指令,转移到中断效劳程序的实际入口处。, 根据需要保护现场。, 中断源请求中断效劳要求的操作。, 恢复现场。与保护现场相对应,注意先进后出、后进先出操作原那么。, 中断返回,最后一条指令必须是RETI。,中断初始化, 设置堆栈指针SP,因中断涉及保护断点PC地址和保护现场数据,且均要用堆栈实现保护,因此要设置适宜的堆栈深度。,深度要求不高且工作存放器组13不用时,可维持复位时状态:SP=07H,深度为24B(20H2FH为位寻址区)。,要求有一定深度时,可设置SP=60H或50H,深度分别为32B和48B。, 定义中断优先级,根据中断源的轻重缓急,划分高优先级和低优先级。用MOV IP,#XXH或SETB XX指令设置。, 定义外中断触发方式,一般情况,定义边沿触发方式为宜。假设外中断信号无法适用边沿触发方式,必须采用电平触发方式时,应在硬件电路上和中断效劳程序中采取撤除中断请求信号的措施。, 开放中断,注意开放中断必须同时开放二级控制,即同时置位EA和需要开放中断的中断允许控制位。可用MOV IE,#XXH指令设置,也可用SETB EA和SETB XX位操作指令设置。, 安排好等待中断或中断发生前主程序应完成的操作内容。, 中断效劳主程序,中断效劳子程序内容要求:, 在中断效劳入口地址设置一条跳转指令,转移到中断效劳程序的实际入口处。,由于80C51相邻两个中断入口地址间只有8B的空间,8B只能容纳一个有38条指令的极短程序,一般情况中断效劳程序均大大超出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】 出租车计价器计程方法是车轮每运转一圈产生一个负脉冲,从外中断INT0P3.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,高电平时表示请求中断,要求执行相应中断效劳程序,试编制程序。,解:,ORG0000H;复位地址,LJMPMAIN;转主程序,ORG0003H;中断入口地址,LJMPPINT0;转中断效劳程序,ORG0013H;中断入口地址,LJMPPINT1;转中断效劳程序,ORG0100H ;主程序首地址,MAIN: MOVSP,#60H;置堆栈指针,ORLTCON,#05H;置INT0、INT1为边沿触发方式,SETBPX0 ;置为高优先级,MOVIE,#0FFH;全部开中,;主程序内容,ORG 1000H;中断效劳程序首地址,PINT0: PUSHAcc;中断,保护现场,LCALL WORK1;调用EX1效劳子程序,POPAcc;恢复现场,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定时/计数器的构造,一.,定时/计数器概述,内部总线,工作,方式,工作,方式,TH,1,TL,1,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,高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,:,2,13,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,00110,B=06H;,高8位,11111000B送入TH0,TH0=,11111000,B=F8H。,【例5-4】 晶振6MHz,要求定时0.5ms,试分别求出T0工作于方式0、方式1、方式2、方式3时的定时初值。,工作方式1,:,T0,初值,=2,16,-500,s,/2,s,=65536250=65286=FF06H,TH0=FFH;TL0=06H。,工作方式2,:,T0,初值,=2,8,-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方式2S的脉冲方波,fosc=12MHZ。,解:,计算定时初值,T1,初值,=2,8,-200,s,/1,s,=256200=56=38H,TH1=38H;TL1=38H,设置TMOD,:,0,0,10,0000,B=20H,T0控制位,与T1无关,T1方式2,T1定时器,T1启动与 无关, 编制程序如下:,ORG0000H ;复位地址,LJMPMAIN ;转主程序,ORG001BH ;T1中断入口地址,LJMPIT1 ;转T1中断效劳程序,ORG0100H ;主程序首地址,MAIN: MOVTMOD,#20H ;置T1定时器方式2,MOVTL1,#38H ;置定时初值,MOVTH1,#38H ;置定时初值备份,MOVIP,#00001000B;置T1高优先级,MOVIE,#0FFH ;全部开中,SETBTR1 ;T1运行,SJMP$ ;等待T1中断,ORG 0200H ;T1中断效劳程序首地址,IT1: CPL P1.0 ;输出波形取反首地址,RETI ;中断返回,【课堂练习题】,参照以上例题工作方式2,按以下要求分别修改程序:, 脉冲方波从P3.0输出;, fosc=6MHz;, 脉冲方波脉宽为100s;, 用定时/计数器T0;,【例5-6】晶振12MHZ,参阅图5-15,要求利用定时器T0使图中发光二极管D进展秒闪烁。,解:发光二极管进展秒闪烁。即一秒钟一亮一暗,亮500ms,暗500 ms。晶振12MHz,每机周1s,T0方式1最大定时只能65ms余。,取T0定时50ms,计数10次,即可实现500ms定时。,计算定时初值,T0,初值,=216-50000,s,/1,s,=6553650000=15536=3CB0H,TH0=3CH;TL0=B0H。,设置TMOD,:,0000,0,0,01,B = 01H,T0方式1,T0,与 无关,T1控制位, 编制程序如下:,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 ;500S计数器清0,MOV R5,#0 ;100ms计数器清0,MOV TMOD,#02H;置T0定时器方式2,MOV TL0,#06H ;置T0定时初值500S,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 ;,ORG2000H ;T0中断效劳子程序首地址,IT0: INCR4;500S计数器计数,CJNER4,#200,IT01 ;判100ms满否?,IT01: JCIT06;未满100ms,转返回,MOV R4,#0 ;满100ms,500S计数器清0,INC R5;100ms计数器计数,CJNE R5,#10,IT02;判1s满否?,IT02: JCIT06;未满1s,转返回,MOV R5,#0 ;满1s,100ms计数器清0,INCR1; 秒计数器加1,CJNE R1,#60,IT03;判60秒满否?,IT03: JCIT06;未满60秒,转返回,MOVR1,#0 ;满60秒,秒计数器清0,INCR2; 分计数器加1,CJNER2,#60,IT04;判60分满否?,IT04: JCIT06;未满60分,转返回,MOVR2,#0 ;满60分,分计数器清0,INCR3; 时计数器加1,CJNER3,#24,IT05;判24小时满否?,IT05: JCIT06;未满24小时,转返回,MOVR3,#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 !,谢谢!,
展开阅读全文