外部中断的一些预备知识
一、中断源
二、中断申请标志寄存器——TCON(和定时器的那个TCON是一样的)
(每次中断都需要先申请)
1、每一个中断源都有相应的中断标志位;
2、某一个中断源申请中断,相应中断标志位置1,系统自动置1,程序可通过检查中断申请标志位0 还是1,判断有无中断产生
二、中断允许标志寄存器IE
(申请外部中断之后要开允许,不开允许外部中断是不能接受中断的)
1、EA:总中断允许位,EA=1开放所有中断,EA=0,禁止所有中断;
2、某一个中断源还有相应的中断允许位,1允许相应中断源的中断,0禁止相应中断源的中断。(这两个就有点像是总开关和局部开关的关系)
三、中断的优先级标志寄存器IP
(当有多个中断来临的时候,设置优先级可以决定哪个中断程序先执行)
1、单片机中有两个中断优先级,即高优先级中断和低优先级中断,前者优先权高于后者(在程序中设置,相应位=1,为高优先级);
2、同一优先级别的中断源按照自然优先级顺序确定优先级别(硬件形成,无法改变)。
例子:按照按键次序,先后依次点亮8盏灯中的一盏,要求采用中断方式编程。
代码展示:
ORG 0000H
LJMP MAIN
ORG 0013H ; 中断矢量,外部中断1—INT1—P3.3
LJMP INT
ORG 040H
MAIN:SETB EX1 ; 开外部中断INT1允许
CLR PX1 ; 外部中断INT1低优先级
SETB IT1; INT1边沿触发
SETB EA; 开中断总允许
MOV A,#01H; A=准备的显示初值0000 0001B
HERE:SJMP HERE; 原地等待中断申请
INT:
MOV P1,A ; 输出到P1口显示
RL A ; 左环移一次,准备下次显示的数据
RETI ; 中断返回
END
中断扩展——中断和查询结合
代码展示:
ORG 0003H ;外部中断0入口
AJMP INT0 ;转向中断服务程序入口
INT0: PUSH PSW ;保护现场
PUSH ACC
JNB P1.0,EXT0 ;中断源查询并转相应服务程序
JNB P1.1,EXT1
JNB P1.2,EXT2
JNB P1.3,EXT3
EXIT: POP ACC ;恢复现场
POP PSW
RETI
外部中断和定时器的中断的区别在于:
1、外部中断是靠中断来实现中断程序的,定时器是看对应的标志位是否出现溢出来实现中断的,出现溢出就处理,没有溢出就不处理。
2、外部中断需要给出外部中断的入口,但是定时器是不用的
3、联系:他们都是使用同一的接口
定时器的一些预备知识
一、定时/计数器组成框图
8051定时/计数器由定时器0(T0)、定时器1(T1)、定时器方式寄存器TMOD和定时器控制寄存器TCON组成。
二、定时的原理——计数周期
- 当定时/计数器设置为定时工作方式时,计数器对内部机器周期进行计数,每过一个机器周期,计数器增1,直至计满溢出。
- 定时器的定时时间与系统的振荡频率紧密相关,因MCS-51单片机的一个机器周期由12个振荡脉冲组成,所以,计数频率fc=fosc/12。如果单片机系统采用12 MHz晶振,则计数周期为:T = 1/(12×106×1/12) = 1 μs,这是最短的定时周期。适当选择定时器的初值可获取各种定时时间。
三、定时器/计数器方式寄存器TMOD
在进行编程的时候,我们往往会设置TMOD这个值,这个值高八位是定时器1,低八位是定时器0,这两个字段的含义是完全相同的
(1)M1 和M0的含义
-------------------------------------------------------------------------
对工作方式的说明
对TMOD寄存器中M0、M1位进行设置,可选择4种工作方式,下面逐一进行论述
- 方式0
方式0构成一个13位定时/计数器。图5.2是定时器0在方式0时的逻辑电路结构,定时器1的结构和操作与定时器0完全相同。
1、若GATE=0(这个时候的GATE就是1,经过或非之后一定是0,也就是说这个时候的控制信号完全由TR0来决定),软件控制启动,SETB TR0启动T0计数,逻辑动作:控制信号为1,开关合上,硬件自动置TF0=1(溢出)。
2、若GATE=1**(这个时候控制信号有两部分来决定(就必须保证或非门之后的结果是0),所以不常用)**,INT0(非)=1 软件控制启动,SETB TR0启动T0计数,逻辑动作:控制信号为1,开关合上,硬件自动置TF0=1,通过软件查询TF0位,可判断是否溢出,如 JBC TF0, LP2 。
举个例子:例:单片机晶振12MHz,定时器1方式0(使用的是13为计数器),编写5ms延时程序。
分析: 1、晶振12MHz,定时脉冲1MHz,周期1us,因方式0采用13位计数器, 13位最大值 1FFFH=8192-1=8191(因为有存储就是十六位,但是实际上我们只能使用其中的十三位) 就会发生溢出2、计数溢出值为8192,最大定时时间为:8192×1 us = 8.192 ms,若选择定时时间为5
ms,确定计数值为5000(1us*5000=5ms),则定时器1的初值为13位初值X = M-计数值= 8192-5000 =
3192 = C78H = 0 1100 0111 1000B3、因13位计数器中TL1的高3位未用(这是规定的,这里用斜体表示,就是在原来的X值中间插入三个0就可以了),应填写0,TH1占高8位,所以,X的实际填写值应为
初值X = 0110 0011 0001 1000B = 6318H 即TH1 =
63H,TL1=18H,定时器1方式0,故TMOD = 00H。
5ms延时子程序如下:
MOV TMOD,#00H ;设定时器1为方式0
MOV TH1,#63H ;置定时器初值,我们前面的计算
MOV TL1,#18H
SETB TR1;启动T1
LP1: JBC TF1,LP2 ;查询计数溢出,溢出就转移到LP2来执行
SJMP LP1 ;未到5 ms继续计数
LP2: MOV TH1,#63H ;重新置定时器初值
MOV TL1,#18H
RET ;返回主程序
- 方式2
定时器工作于方式1时,构成一个16位定时/计数器,其逻辑结构图如图3所示。
针对这个图的说明(很重要):
这里系统执行的时候,数值一开始是存储在高八位的,也就是TH0(或者TH1,看使用的是T1还是T0)这里,然后系统会自动把高八位的数据打入低八位,低八位溢出之后,溢出标志位变为1,然后系统就继续吧高八位的数据打入到低八位,所以这里计数溢出的时候,不需要计数重新赋初始值,因为系统会自动执行这个操作
这也是后面例2的MOV TH1,#06H ;置定时器重装的初值 MOV TL1,#06H ;置定时器初值
的原因
例2 12MHz晶振,试用定时/计数器T1,方式2实现25ms的延时。
分析: 1、方式2下,TL1是8位定时/计数器(最多可以存储256个数),其最大定时时间为:256×1 us = 256 us,为实现25m s延时,可选择定时时间为250 us,再循环100次。2、定时时间选定后,可确定计数值为250,则定时器T1的初值(从初值(每次都是这个初值)开始计数250个数为一次,一共计数100次)为:X
= M-计数值=256-250 = 6 = 6H。采用定时器1,方式2工作,因此,TMOD =20H=0010 0000B
25ms延时子程序如下:
DELAY:MOV R6,#100 ;置250 us计数循环次数100
MOV TMOD,#20H ;置定时器1为方式2
MOV TH1,#06H ;置定时器重装的初值
MOV TL1,#06H ;置定时器初值
SETB TR1 ;启动定时器
LP1: JBC TF1,LP2 ;查询计数溢出,溢出转LP2
SJMP LP1 ;无溢出则继续计数
LP2: DJNZ R6,LP1;溢出不到100次,未到25 ms继续循环
RET
---------------------------------------------------------------------
(2)
当这个值=0,为定时器的工作方式;这个值=1,为计数器方式
定时器模式:使用单片机内部脉冲,计数周期=机器周期=晶振周期*12。
计数器模式:单片机15脚接片外脉冲,即P3.5/T1脚接555振荡器产生的计数脉冲
(3)TMOD是不能被位选址的,只能用字节指令设置高4位来定义定时器1的工作方式,用低4位来定义定时器0的工作方式。复位时,TMOD所有位均置0。这个也是为什么我们设置的时候要分开设置两个初始状态(看后面的代码就知道了)
四、 定时/计数器控制寄存器TCON
TCON的作用是控制定时器的启动、停止,标志定时器的溢出和中断情况。定时器控制字TCON的格式如下:
各位含义如下:
(1) TCON.7(TF1):定时器1溢出标志位。当定时器1计满数产生溢出时,由硬件自动置TF1=1。JBC TF1, LP2 ; T1溢出TF1=1转至LP2;查询定时器/计数器T1是否溢出
【在中断允许时,该位向CPU发出定时器1的中断请求;进入中断服务程序后,该位由硬件自动清0。在中断屏蔽时,TF1可作查询测试用,此时只能由软件清0。】
(2) TCON.6(TR1):定时器1运行控制位。由软件置1启动,清0关闭。当GATE=1,且 为高电平时,TR1置1启动定时器1;当GATE=0时,TR1置1即可启动定时器1,如前例: SETB TR1 启动T1计数。
(3) TCON.5(TF0):定时器0溢出标志位。其功能及操作情况同TF1。如前例: JBC TF0, LP2 ; 溢出TF0=1转至LP2
(4) TCON.4(TR0):定时器0运行控制位。其功能及操作情况同TR1。如前例: SETB TR0启动T0计数。
(5) TCON.3(IE1):外部中断1( INT1 )请求标志位。
(6) TCON.2(IT1):外部中断1触发方式选择位是选择下降沿还是电平触发。
(7) TCON.1(IE0):外部中断0( INT1 )请求标志位。
(8) TCON.0(IT0):外部中断0触发方式选择位,同上面。
五、定时/计数器的初始化
(1) 确定工作方式——对TMOD赋值。
(2) 预置定时或计数的初值——从什么值开始计时,可以满足题目要求的计时时间发生溢出
(3) 启动定时/计数器工作——将TR0或TR1置1。
MOV TMOD,#01H ; 使用定时/计数器T0,
;定时模式,工作方式1(16位)
MOV TH0,#00H ; 计数初值高8位
MOV TL0,#010H ; 计数初值低8位
SETB TR0; 启动T0,从16开始增1计数,
;计到216=65536溢出
实例说明
一、任务一:系统采用12MHz晶振,要求:P1.0信号闪烁显示,65520us明暗变化一次(实例如下)
- 分析:
1、采用定时/计数器T0,定时模式,工作方式1来实现任务(所以我们的TMOD的值就可以确定是:0000
0001B=01H)
2、计算计数脉冲周期(计数值增1需要的时间称计数脉冲周期) 计数脉冲周期=机器周期=振荡脉冲周期12=1/12us12=1us 说明:∵系统采用12MHz晶振,12MHz=12000000Hz(这个是频率,周期是频率的倒数)
∴一个时钟振荡周期是1/12000000=1/12us ∴机器脉冲周期=振荡脉冲周期*123、计数溢出:十六位计数最大值是FFFFH,所以达到FFFFH+1的时候会发生溢出,系统就会在溢出标志位上置1,被接收到溢出信号之后,系统会自动重置标志位为0
4、计算初始的值是多少: 前面计算知道,1us会计数1,那65520us会计数65520次
设x是我们需要的初始的值,则x+65520=FFFFH+1,所以x=10H
下面是我们的源代码
1_0 EQU P1.0
ORG 0000H
Main:
CLR P1_0;对引脚使用CLR,就是将引脚清零,置为低电平
MOV TMOD,#01H ; 设定工作方式:定时/计数器T0,;定时模式,工作方式1(16位)
;
MOV TH0,#00H ; 设置计数初值高8位
MOV TL0,#010H ; 设置计数初值低8位
;这两行代码就是设置我们前面计算到的x值,也就是说我们的值从x开始计算,计数65520次之后会发生溢出,溢出之后对后面进行操作
SETB TR0; 启动定时器T0,从10H开始增1计数,
LP1: JBC TF0, LP2 ; 定时器计满溢出转LP2
; 溢出标志位TF0,为TCON的D5位
SJMP LP1 ;计数值未溢出,转LP1再判断溢出否
LP2:
CPL P1_0 ; 溢出P1.0取反,灯变色
MOV TH0,#00H ; 重赋定时器T0的计数初值
MOV TL0,#010H
SJMP LP1 ;转LP1再判断溢出否
END
二、计数脉冲为外部脉冲,采用555振荡器产生,要求:p1.0信号灯闪烁显示。
电路图如下:外部555定时器电路产生计数脉冲。
- 分析:
1、T1计数模式,工作方式1(16位), TMOD=#50H=0101 0000B(就是使用高八位部分,低八位不用)
2、计数模式(计数器)的计数脉冲为外部脉冲,现采用555振荡器产生计数脉冲,计数脉冲周期:0.7RC=0.7(2*20K+2K)1uF=29.4ms=29400us=29.4ms。
3、每隔655200us灯明暗变化一次,若每过655200us计数值溢出,依据溢出标志改变P1.0电平,即可改变灯的明暗。
655200us =655.2ms≈ 29.4*22ms,需要计数22次才溢出。
因FFEAH+0016H(22)=FFFF+1,计数初值为FFEAH。
源代码:
P1_0 EQU P1.0
ORG 0000H
Main:
CLR P1_0
MOV TMOD,#50H ; 定时/计数器1,计数模式,工作方式1(16位)
;
MOV TH1,#0FFH ; 计数初值1111 1111B+1-00010110B=11101010B
MOV TL1,#0EAH ; 11101010B=0EAH
;同样式分高八位和第八位设置初始值
SETB TR1 ; 启动计数器T1(外部脉冲),从#FFEAH开始增1计数,
;计满22个脉冲,即计数值到#FFFFH+1溢出
;SETB TCON.6
LP1: JBC TF1, LP2 ;查询计数器1是否计满溢出,溢出转LP2,灯变色
;JBC TCON.7,LP2
SJMP LP1 ;没有溢出,继续查询
LP2:
CPL P1_0 ; 溢出处理:P1.0红灯变色,亮变暗,暗变亮。
MOV TH1,#0FFH; 重新赋计数初值
MOV TL1,#0EAH
SJMP LP1;再次转LP1查询溢出否
END