外部中断的一些预备知识

一、中断源

二、中断申请标志寄存器——TCON(和定时器的那个TCON是一样的)
(每次中断都需要先申请)

1、每一个中断源都有相应的中断标志位;
2、某一个中断源申请中断,相应中断标志位置1,系统自动置1,程序可通过检查中断申请标志位0 还是1,判断有无中断产生

二、中断允许标志寄存器IE
(申请外部中断之后要开允许,不开允许外部中断是不能接受中断的)

1、EA:总中断允许位,EA=1开放所有中断,EA=0,禁止所有中断;
2、某一个中断源还有相应的中断允许位,1允许相应中断源的中断,0禁止相应中断源的中断。(这两个就有点像是总开关和局部开关的关系)

三、中断的优先级标志寄存器IP
(当有多个中断来临的时候,设置优先级可以决定哪个中断程序先执行)

1、单片机中有两个中断优先级,即高优先级中断和低优先级中断,前者优先权高于后者(在程序中设置,相应位=1,为高优先级);
2、同一优先级别的中断源按照自然优先级顺序确定优先级别(硬件形成,无法改变)。

例子:按照按键次序,先后依次点亮8盏灯中的一盏,要求采用中断方式编程。

代码展示:

ORG  0000HLJMP 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  ACCJNB       P1.0,EXT0   ;中断源查询并转相应服务程序JNB       P1.1,EXT1JNB      P1.2,EXT2JNB      P1.3,EXT3EXIT: POP   ACC                       ;恢复现场POP   PSWRETI

外部中断和定时器的中断的区别在于:
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为方式0MOV    TH1,#63H ;置定时器初值,我们前面的计算MOV    TL1,#18H         SETB TR1;启动T1LP1: JBC TF1,LP2      ;查询计数溢出,溢出就转移到LP2来执行SJMP  LP1     ;未到5 ms继续计数LP2:   MOV TH1,#63H         ;重新置定时器初值MOV TL1,#18HRET      ;返回主程序
  • 方式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计数循环次数100MOV  TMOD,#20H    ;置定时器1为方式2MOV  TH1,#06H   ;置定时器重装的初值MOV  TL1,#06H         ;置定时器初值SETB  TR1       ;启动定时器LP1:  JBC    TF1,LP2 ;查询计数溢出,溢出转LP2SJMP   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 ∴机器脉冲周期=振荡脉冲周期*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,;定时模式,工作方式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,#010HSJMP 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_0MOV  TMOD,#50H ; 定时/计数器1,计数模式,工作方式1(16位);MOV  TH1,#0FFH ; 计数初值1111 1111B+1-00010110B=11101010BMOV  TL1,#0EAH ; 11101010B=0EAH;同样式分高八位和第八位设置初始值SETB  TR1 ; 启动计数器T1(外部脉冲),从#FFEAH开始增1计数,;计满22个脉冲,即计数值到#FFFFH+1溢出;SETB   TCON.6
LP1: JBC TF1, LP2 ;查询计数器1是否计满溢出,溢出转LP2,灯变色;JBC TCON.7,LP2SJMP LP1  ;没有溢出,继续查询LP2: CPL P1_0 ; 溢出处理:P1.0红灯变色,亮变暗,暗变亮。MOV TH1,#0FFH; 重新赋计数初值MOV  TL1,#0EAHSJMP LP1;再次转LP1查询溢出否
END

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

  1. 51单片机学习笔记之中断(外部中断、定时器中断、中断嵌套)

    要学习51单片机中断的朋友,拥有这一篇博文就够了,深入浅出,里面包含了寄存器,外部中断.定时器中断.中断嵌套等的讲解,还有代码实战.快一万字,写得不容易,还请大家点赞支持一下,后续持续更新 (一)寄存 ...

  2. 【单片机学习笔记】(31):串口调试技巧、TFT触摸屏初识别、stm32F4与F1对比使用(全系列初始化概览)、YSF4的光耦隔离保护、外部中断与定时器消抖相结合的按键检

    串口调试技巧 可以将调试时会用到,但实际演示是不需要用到的代码用 #if xxx   //这里放调试代码 #endif xxx是 一个宏定义,如果等于0则不编译相关代码,如果为1则编译相关代码 TFT ...

  3. LPC2124单片机的基础操作——GPIO、外部中断、定时器和串口

    LPC2124单片机的基础操作--GPIO.外部中断.定时器和串口 LPC2124的简介 LPC2124之GPIO GPIO简介 编程习惯 代码编写 LPC2124之EINT(外部中断) EINT简介 ...

  4. AT89C52流水灯+外部中断INT0+定时器(汇编语言)

    AT89C52流水灯+外部中断INT0+定时器(汇编语言) 任务要求 用 AT89S52 单片机控制彩灯(流水灯)图形及继电器.即: ①AT89S52 单片机上电时控制由发光二极管组成的图形有规律地不 ...

  5. STC15单片机——外部中断

    STC15单片机拥有5路外部中断,分别为外部中断0.1.2.3.4.本文章将其分为外部中断0.1和外部中断2.3.4介绍,分别介绍其相关的寄存器以及注意事项. 由于STC15单片机外部中断的使用于传统 ...

  6. 51单片机按键控制数码管0~9_51单片机外部中断

    前面为大家介绍的点亮LED灯.数码管.按键只用到了51单片机的IO资源,我们要是仅仅用单片机点灯.操作数码管,那可真是大才小用了.这些都只是51单片机资源的冰山一角,51单片机还有好多的功能,我后面将 ...

  7. PIC16F877A单片机 (中断与定时器Timer1)

    PIC16F877A单片机 (中断与定时器Timer1) 1 基本原理 2 实现代码 1 基本原理 上图中,如果RC0左边外接了外部的晶振,那么T1OSCEN必须置一.这个外部的晶振频率一般都比较低. ...

  8. 51单片机外部中断的使用以及优先级设置

    51单片机中断的使用及优先级设置 51单片机有两个外部中断,两个定时器/计数器,两个外部中断分别是int0,int1.定时器/计数器分别是t0,t1,还有一个串口中断TI/RI,加起来有五个中断.它们 ...

  9. c语言51单片机外部中断,51单片机外部中断0实例详解

    今天就以51单片机的外部中断0为例,来简单讲解一下单片机中断的用法. 1 51单片机的中断源 51单片机共有5个中断源,分别为:外部中断0 定时器0中断 外部中断1 定时器1中断 串口中断 每一个中断 ...

最新文章

  1. 当你打开的程序在任务栏出现两个一样的怎么办?
  2. C语言指针总结大学霸IT达人
  3. 单文档应用程序弹出新对话框_简介——文档
  4. poj 1830 开关问题
  5. 分析jQuery源码时记录的一点感悟
  6. J2EE看tomcat运行参数和去掉工程名作为请求的根路径
  7. 使用ETag识别ajax,如何使用jQuery AJAX请求访问ETag头?
  8. 被嫌弃的eval和with
  9. cmake安装更新(解决cmake报错:CMake 3.8 or higher is required. You are running version 3.5.1
  10. DirectX9:先导篇 图形学基础
  11. 泥瓦匠 5 年 Java 的成长感悟(下)
  12. 网络扫描工具zmap
  13. markdown语法简单而全面,带有源码和图片(10mins内看完)
  14. pyCharm最新2018.2激活 附激活文件/教育版免费使用
  15. 可调直流稳压电源的工作原理以及常见问题
  16. jquery怎么读(jquery怎么读音英语)
  17. 73个必会的经济类热词
  18. Postfix配置QQ邮箱发邮件
  19. 获取windows系统时间
  20. php中英文章,PHP 中英文混合排版中处理字符串常用的函数

热门文章

  1. Bean Validation数据校验和分组校验
  2. 第7章 PKI和密码应用
  3. requests.exceptions.ConnectionError:HTTPSConnectionPool(host
  4. 360浏览器收藏夹导出问题终极解决方案
  5. 数据结构之单链表 python实现
  6. BLDC无刷直流电机和PMSM永磁同步电机 基于stm32F1的有传感器和无传感驱动 直流无刷电机有传感器和无传感驱动程序
  7. 微软服务器ip,微软服务器环境中的IP地址管理
  8. 由FlexBox算法强力驱动的Weex布局引擎
  9. 提高SDN控制器拓扑发现性能
  10. 更改tomcat端口8080为80的时候,有系统端口占用的问题