330 likes | 513 Views
第五章 MCS-51 定时 / 计数器、串行口及中断系统. 本章重点讨论:. 1. 定时 / 计数器;. 2. 全双工串行口;. 3. 中断系统。. 5.1 MCS-51 定时 / 计数器. 5.1.1 定时器 / 计数器的基本概念 5.1.2 MCS-51 定时 / 计数器的组成 5.1.3 定时器 / 计数器的控制方法 5.1.4 定时器、计数器的初始化 5.1.5 举例 5.1.6 定时计数器总结. 计数概念的引入 1.
E N D
第五章MCS-51定时/计数器、串行口及中断系统 本章重点讨论: 1. 定时/计数器; 2. 全双工串行口; 3. 中断系统。
5.1 MCS-51定时/计数器 5.1.1 定时器/计数器的基本概念 5.1.2 MCS-51定时/计数器的组成 5.1.3 定时器/计数器的控制方法 5.1.4 定时器、计数器的初始化 5.1.5 举例 5.1.6 定时计数器总结
计数概念的引入1 生活中计数的例子处处可见。例:录音机上的计数器、家里面用的电度表、汽车上的里程表等等。再举一个工业生产中的例子,线缆行业在电线生产出来之后要计米,也就是测量长度,怎么测法呢?用尺量?不现实,太长不说,要一边做一边量呢,怎么办呢?行业中有很巧妙的方法,用一个周长是1米的轮子,将电缆绕在上面一周,由线带轮转,这样轮转一周不就是线长1米嘛,所以只要记下轮转了多少圈,就可以知道走过的线有多长了。
计数概念的引入2 石油工业中,也有大量计数的问题。 比如如何确定油层的深度?通常采用的方法是在裸眼井完钻测井以后,需要下金属套管固井,每一根套管的长度是一样的,比如10米,在每根套管的接箍处都打上磁标记。 下完套管就要用水泥固井,然后套管就被永久埋在地下。为了产出石油,下一步就是在测井以后确定的层位处射孔。这时在射孔枪的上面就通过电缆接了一根磁定位仪器,这个仪器可以测量到套管接箍上的磁标记,并且可以计量磁标记的数目,因此就可以确定射孔枪的目标油层的深度。当然10m以内的深度是靠地面测量电缆长度确定的。
计数器的容量1 从一个生活中的例子看起:一个水盆在水龙头下,水龙没关紧,水一滴滴地滴入盆中。水滴不断落下,盆的容量是有限的,过一段时间之后,水就会逐渐变满。 那么单片机中的计数器有多大的容量呢?8031单片机中有两个计数器,分别称之为T0和T1,这两个计数器分别是由两个8位的RAM单元组成的,即每个计数器都是16位的计数器,最大的计数量是65535。
计数器的容量2 一般的下井电缆长度在7000m,根据井眼长度的不同还有更长或更短的电缆,可以依据需要选取。 因此,计数器的容量就是由电缆长度决定的。
计数与定时的关系 • 8031中的计数器除了可以作为计数之用外,还可以用作时钟,时钟的用途当然很大,如学校的打铃器,电视机定时关机,空调定时开关等等,那么计数器是如何作为定时器来用的呢? • 一个闹钟,将它定时在1个小时后闹响,换言之,也可以说是秒针走了(3600)次后闹响,所以时间就转化为秒针走的次数,也就是计数的次数了。可见,计数的次数和时间之间的确十分相关。那么它们的关系是什么呢?那就是秒针每一次走动的时间正好是1秒。 • 因此只要计数脉冲的间隔相等,计数脉冲的周期已知,则计数值就代表了时间的流逝。
溢出 • 让我们再来看水滴的例子,当水不断落下,盆中的水不断变满,最终有一滴水使得盆中的水满了。这时如果再有一滴水落下,就会发生什么现象?水会漫出来,用个术语来讲就是“溢出”。 • 水溢出是流到地上,而计数器溢出后将使得TF0变为“1”。至于TF0是什么我们稍后再谈。一旦TF0由0变成1,就是产生了变化,产生了变化就会引发事件,就象定时的时间一到,闹钟就会响一样。
溢出2 如果电缆的最大长度为7000m ,那么磁标记计数器计满700以后,就要产生一个溢出信号,这个溢出信号意味着电缆已经放到头了,需要地面的缆车立即停止工作,否则可能造成射孔枪落井的事故。 计数器溢出后会引发什么事件,我们下次课再介绍,现在我们来研究另一个问题:要有多少个计数脉冲才会使TF0由0变为1?
任意定时及计数的方法 刚才已研究过,MCS-51计数器的容量是16位,也就是最大的计数值到65536,因此计数计到65536就会产生溢出。问题是在现实生活中,经常会有少于65536个计数值的要求,如包装线上,一打为12瓶,一瓶药片为100粒,怎么样来满足这个要求呢? • 提示:如果是一个空的盆要10000滴水滴进去才会满,如果在开始滴水之前就先放入一勺水,还需要10000滴吗? • 我们采用预置数的方法,要计数100次,那就先放进65436,再来100个脉冲,不就到了65536了吗。 • 定时也是如此,每个脉冲是1微秒,则计满65536个脉冲需时65.536毫秒。如果现在只要10毫秒定时怎么办? • 10个毫秒为10000个微秒,所以,只要在计数器里面放进65536-10000=55536就可以了。
OV Set D0 G0 [1] D1 G1 [2] [ …… ] .. .. [32768] D15 G15 图5-1 数字电路中计数器的逻辑图 MCS-51中的16位可预置加法计数器
输 入 输 出 set cp D0 D1 …. D15 G0 G1 …. G15 0 × × × × × × × 0 0 0 0 1 0 × ↑ d0 d1 …. d15 d0 d1 …. d15 1 1 1 ↑ × × × × 计 数 表5-1 计数器的真值表 计数器真值表
T1 5.1.2 MCS-51定时/计数器的组成
T0由两个8位的寄存器TH0和TL0组成 • T1由两个8位的寄存器TH1和TL1组成 • T0和T1都是16位的可预置加1计数器 • T0和T1都是16位的可编程定时/计数器 与定时/计数器相关的特殊功能寄存器 特殊功能寄存器 : TH0 TH1 存放计数初值的高8位 TL0 TL1 存放计数初值的低8位 TMOD (定时器工作模式寄存器) TCON (定时器控制寄存器 )
5.1.3 定时器/计数器的控制方法 定时器/计数器的工作由TCON和TMOD控制。由软件把控制字写入TCON和TMOD,用来设置T0和T1的工作方式和控制功能。当8051系统复位时,TCON和TMOD所有位都被清0。
一.工作模式控制寄存器—TMOD(89H) 控 制 T 控 制 T 1 0 GATE M M GATE M M C/T C/T 89H 1 0 1 0 M M 方 式 1 0 和T 类同 0 00 方式0 01 方式1 10 方式2 11 方式3 0 定时器模式 1 计数器模式 与INT 无关 0 0 与INT 有关 1 0 定时器工作模式寄存器TMOD
二.定时器控制寄存器—TCON(88H) 定时器工作模式寄存器TCON
M1和M0 工作方式选择位 这两位可形成四种编码,对应四种工作方式: M1 M0 方式 功 能 描 述 0 0 0 为13位定时器/计数器,TL存放低5位,TH存高8位 0 1 1 为16位定时器/计数器 1 0 2 常数自动装入8位定时器/计数器 1 1 3 仅适于T0,两个8位定时器/计数器 三.定时器/计数器的四种工作模式
方式0 高8位和低5位的一个13位计数器的运行方式,见下图. 当TL1的低5 位溢出时,向TH1进位,而TH1溢出(回零)时向TF1标志进位(硬件置位TF1),并申请中断。还可以通过查询TF1是否置位来判断TH1是否回零溢出。
启动控制B=TR1A =TR1(INT1+/GATE ) GATE TRx INTx 启动情况 0 0 X 停止 0 1 X 启动定时/计数 1 0 X 停止 1 1 启动定时/计数 1 1 停止 其中: 1 表示高电平,0表示低电平,X表示任意状态
方式1 方式1是一个16为定时器/计数器,见下图。 方式1的结构几乎与方式0完全一样,唯一的差别是:方式1中的TH1(TH0)和TL1(TL0) 均是8位的,构成16位计数器。
方式2 在方式2时,T/C被拆成一个8位的寄存器TH1(TH0)和一个8位计数器TL1(TL0),两者构成可以自动重装载的8位T/C,如图所示。
每当它计满回零时 1. 将溢出标志TF1置“1”,若中断开放,向CPU发出溢出中断请求; 2. 从TH1(或TH0)中重新获得初值并启动计数; 也就是CPU 自动将TH1(或TH0)中存放的初值重新装回到TL1(或TL0),并在此初值的基础上对TL1(或TL0)开始新一轮计数,周而复始,直到下停止计数或更改工作方式命令为止。?
方式3 方式3只适合于定时器T0,TH0和TL0按两个独立的8位计数器工作.
5.1.4 定时器、计数器的初始化 1. 初始化的步骤 MCS-51内部的T/C是可编程的,其工作方式和模式通过程序进行设定和控制,称为对T/C的初始化。初始化的步骤是: 1) 确定工作方式,即根据题目要求先给TMOD送一个方式控制字。 2)计算计数初值/定时初值,并写入TH0、TL0或 TH1、 TL1中。 3)根据需要,置位EA使CPU开放中断,同时置位ETx允许T/C中断。IP设定中断优先级。 4)给TCON送命令控制字,即置位TRx启动T/C计数。
2.计数器初值的计算 T/C在计数模式下,计数之前必须给它的计数器TH0、TL0或TH1、TL1选送计数初值。T/C的计数器是在计数初值的基础上加1计数的,当计数器回“0”时自动产生溢出,置位TFx中断标志,向CPU 提出中断请求。 设需要计数器计数的个数为 X,计数初值为C,由此可得出如下计算计数初值的通式: 计数初值: C = M - X (5—1) 式中,M为计数器的模值,该值和计数器的工作方式有关。 当方式0时 M= 当方式1时 (5—2) 当方式2、3时
[例5-1] 利用T0方式1产生1ms的定时,在P1.0引脚上输出周期为2ms的方波。设单片机晶振频率fosc = 12MHZ。 解: (1)确定T0的工作方式 要在P1.0输出周期为2ms的方波,只要使P1.0每隔1ms 取反一次即可。 (2)确定T0的方式控制字 若用方式1,设置TMOD=01H
(3)计算定时初值 Tcy=12/fosc=12/(12×106)S=1μs 计数个数 : X=1ms/1μs=1000 定时初值:1〉若采用方式0,13位,则 C=( -X)= 8192-1000 = 7192D =1C18H = 11100000 11000B 高8位0E0H 低5 位18H TH0初值为0E0H,TL0初值为18H 。 2〉若采用方式1,16位,则 定时初值: C = 65536-1000 = 64536 = FC18H TH0初值为0FCH,TL0初值为18H
START 设定工作方式 启动T0定时 载入初值 否 TF0=0? 是 输出方波 软件TF0=0 END ORG 0000H SJMP 0030H ORG 0030H MOV TMOD,#01H SETB TR0 LOOP:MOV TH0,#0FCH MOV TL0,#18H JNB TF0,$ CPL P1.0 CLR TF0 SJMP LOOP END 查询方式
4) 查询方式: 还可以使CPU采用查询TF0的方式处理T/C0定时溢出,编程简单,但效率较低。 程序中查询采用JNB TF0,$ 指令,目的是当判到TF1=1后,必须用软件复位TF1,为下次计数器回零溢出做好准备,这条指令具有判TF1为1后清零的双重功能。 [例5-2] 利用GATE门控位测量从INT1引脚输入的正脉冲宽度。解:1. 确定工作方式 (1)送方式控制字 (TMOD)=1001 0000B=90H ; T/C1定时,方式1 ,GATE=1 。
(2)计算初值 由于被测正脉冲宽度未知, 假设宽度<= 65.536ms,fosc=12MHz ,则: 计数个数:X=65536(最大) 定时初值:C=65536-X=65536-65536=0, (TH1)=00H,(TL1)=00H。 (3)编程方法 对P3.3(INT1)引脚输入的脉冲采用查询的方法。 P3.3 (INT1) 被测脉宽 置1 TR1 TH1TL1从0开始计数 清0 TR1,停止T/C1计数 脉冲测试原理
程序清单: ORG 0000H SJMP 0030H ORG 0030H MAIN:MOV TMOD,#90H ;置T1方式控制字 MOV TL1,#00H ; MOV TH1,#00H ;T1从0开始计数 JB P3.3,$;等 低电平 SETB TR1 ; T1允许计数 JNB P3.3, $;等 高电平 JB P3.3, $;等 低电平 CLR TR1 ;停止计数
5.1.6 定时计数器总结 在单片机实时应用系统中,定时和对外部事件计数的功能 。 定时:对周期已知的脉冲信号计数 计数:对外部事件计数,对周期未知的外来脉冲信号计数 采用软件占用CPU的时间,降低了CPU的使用效率; 采用专门的硬件电路,参数调节不便; 采用可编程的定时器/计数器是较好的方法; 可以方便灵活地修改定时或计数的参数或方式; 与CPU并行工作,大大提高了CPU的工作效率