单片机—外部中断与定时器 学习笔记

外部中断的一些预备知识

在这里插入图片描述

一、中断源
在这里插入图片描述
二、中断申请标志寄存器——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 1000B

3、因13位计数器中TL1的高3位未用(这是规定的,这里用斜体表示,就是在原来的X值中间插入三个0就可以了),应填写0,TH1占高8位,所以,X的实际填写值应为
初值X = 0110 0011 0001 1000B = 6318HTH1 =
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,
                  ;定时模式,工作方式116位)
 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 ∴机器脉冲周期=振荡脉冲周期*12

3、计数溢出:十六位计数最大值是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,;定时模式,工作方式116位)
      	; 
      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,计数模式,工作方式116位)
       ;
      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
  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值