单片机—外部中断与定时器 学习笔记
外部中断的一些预备知识
一、中断源
二、中断申请标志寄存器——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 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为方式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 ∴机器脉冲周期=振荡脉冲周期*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,#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
单片机—外部中断与定时器 学习笔记相关推荐
- 51单片机学习笔记之中断(外部中断、定时器中断、中断嵌套)
要学习51单片机中断的朋友,拥有这一篇博文就够了,深入浅出,里面包含了寄存器,外部中断.定时器中断.中断嵌套等的讲解,还有代码实战.快一万字,写得不容易,还请大家点赞支持一下,后续持续更新 (一)寄存 ...
- 【单片机学习笔记】(31):串口调试技巧、TFT触摸屏初识别、stm32F4与F1对比使用(全系列初始化概览)、YSF4的光耦隔离保护、外部中断与定时器消抖相结合的按键检
串口调试技巧 可以将调试时会用到,但实际演示是不需要用到的代码用 #if xxx //这里放调试代码 #endif xxx是 一个宏定义,如果等于0则不编译相关代码,如果为1则编译相关代码 TFT ...
- LPC2124单片机的基础操作——GPIO、外部中断、定时器和串口
LPC2124单片机的基础操作--GPIO.外部中断.定时器和串口 LPC2124的简介 LPC2124之GPIO GPIO简介 编程习惯 代码编写 LPC2124之EINT(外部中断) EINT简介 ...
- AT89C52流水灯+外部中断INT0+定时器(汇编语言)
AT89C52流水灯+外部中断INT0+定时器(汇编语言) 任务要求 用 AT89S52 单片机控制彩灯(流水灯)图形及继电器.即: ①AT89S52 单片机上电时控制由发光二极管组成的图形有规律地不 ...
- STC15单片机——外部中断
STC15单片机拥有5路外部中断,分别为外部中断0.1.2.3.4.本文章将其分为外部中断0.1和外部中断2.3.4介绍,分别介绍其相关的寄存器以及注意事项. 由于STC15单片机外部中断的使用于传统 ...
- 51单片机按键控制数码管0~9_51单片机外部中断
前面为大家介绍的点亮LED灯.数码管.按键只用到了51单片机的IO资源,我们要是仅仅用单片机点灯.操作数码管,那可真是大才小用了.这些都只是51单片机资源的冰山一角,51单片机还有好多的功能,我后面将 ...
- PIC16F877A单片机 (中断与定时器Timer1)
PIC16F877A单片机 (中断与定时器Timer1) 1 基本原理 2 实现代码 1 基本原理 上图中,如果RC0左边外接了外部的晶振,那么T1OSCEN必须置一.这个外部的晶振频率一般都比较低. ...
- 51单片机外部中断的使用以及优先级设置
51单片机中断的使用及优先级设置 51单片机有两个外部中断,两个定时器/计数器,两个外部中断分别是int0,int1.定时器/计数器分别是t0,t1,还有一个串口中断TI/RI,加起来有五个中断.它们 ...
- c语言51单片机外部中断,51单片机外部中断0实例详解
今天就以51单片机的外部中断0为例,来简单讲解一下单片机中断的用法. 1 51单片机的中断源 51单片机共有5个中断源,分别为:外部中断0 定时器0中断 外部中断1 定时器1中断 串口中断 每一个中断 ...
最新文章
- 当你打开的程序在任务栏出现两个一样的怎么办?
- C语言指针总结大学霸IT达人
- 单文档应用程序弹出新对话框_简介——文档
- poj 1830 开关问题
- 分析jQuery源码时记录的一点感悟
- J2EE看tomcat运行参数和去掉工程名作为请求的根路径
- 使用ETag识别ajax,如何使用jQuery AJAX请求访问ETag头?
- 被嫌弃的eval和with
- cmake安装更新(解决cmake报错:CMake 3.8 or higher is required. You are running version 3.5.1
- DirectX9:先导篇 图形学基础
- 泥瓦匠 5 年 Java 的成长感悟(下)
- 网络扫描工具zmap
- markdown语法简单而全面,带有源码和图片(10mins内看完)
- pyCharm最新2018.2激活 附激活文件/教育版免费使用
- 可调直流稳压电源的工作原理以及常见问题
- jquery怎么读(jquery怎么读音英语)
- 73个必会的经济类热词
- Postfix配置QQ邮箱发邮件
- 获取windows系统时间
- php中英文章,PHP 中英文混合排版中处理字符串常用的函数
热门文章
- Bean Validation数据校验和分组校验
- 第7章 PKI和密码应用
- requests.exceptions.ConnectionError:HTTPSConnectionPool(host
- 360浏览器收藏夹导出问题终极解决方案
- 数据结构之单链表 python实现
- BLDC无刷直流电机和PMSM永磁同步电机 基于stm32F1的有传感器和无传感驱动 直流无刷电机有传感器和无传感驱动程序
- 微软服务器ip,微软服务器环境中的IP地址管理
- 由FlexBox算法强力驱动的Weex布局引擎
- 提高SDN控制器拓扑发现性能
- 更改tomcat端口8080为80的时候,有系统端口占用的问题