51定时器计数器的深入研究-精确定时

合集下载

MCS51单片机的定时计数器及应用

MCS51单片机的定时计数器及应用

定时/计数器T0和T1的工作方式2(P143) ----8位自动重载初值
振荡器
/12
T0 TR0
GATE INT0
控制
TL0(8 位) 重载
TH0(8位)
中断 TF0
TL0(或TL1)用于计数,TH0(或TH1)用于保存初值,计满 溢出时硬件自动将TH0的值重新装入TL0。自动装载的初值:
X=256-N
while (1) ;// 原地踏步
{}
}
void time0_int(void) interrupt 1
{// 中断服务程序 SQ=!SQ ;// 输出翻转
}
采用查询方式的汇编程序(P145)
ORG 0000H
LJMP MAIN ORG 0100H ;主程序 MAIN: MOV TMOD,#02H ; 定 时器T0工作方式2 MOV TH0,#06 ;保存初值 MOV TL0,#06 ; 赋初值 SETB TR0 ; 启动T0
ORG 0030H; 主程序 MAIN:MOV TMOD,#02H; 定时器
T0工作方式2 MOV TH0,#06H;初值保存 MOV TL0,#06H; 赋初值 SETB EA; 开放总中断 SETB ET0; 开放T0溢出中断 SETB TR0; 启动T0 SJMP $; 原地踏步
END
采用中断处理方式的C51程序(P145)
微 处 理 器
TH1
启动
TCON
溢出
TL1
TH0
TL0
内部总线
启动
工作方式
工作方式
TMOD
定时/计数器的结构说明
? TH0和TL0是定时/计数器T0计数器的高 8位和低8位, TH1和TL1是定时/计数器T1计数器的高 8位和低8位。

第6章MCS-51的定时器

第6章MCS-51的定时器

• 28×12×1/12MHz=28us=256us=0.256ms
工作方式2_补充说明
8位计数器 TL0作计数器,TH0作预置寄存器使用,计数溢出时 ,TH0中的计数初值自动装入TL0,即TL0是一个自动 恢复初值的8位计数器。 在使用时,要把计数初值同时装入TL0和TH0中。 优点是提高定时精度,减少了程序的复杂程度。
工作方式1_应用分析
定时和计数的应用 计数范围:1~216 计数计算公式:计数值=216-计数初值 机器周期(MC):=12/Fosc=12/时钟频率 定时范围:1机器周期~216机器周期 定时计算公式:定时时间=(216-定时初值)×
机器周期 如果晶振频率为6MHz ,则最大定时时间为: 216×12×1/6MHz=217us=131072us=131.072ms 如果晶振频率为12MHz ,则最大定时时间为: 216×12×1/12MHz=216us=65536us=65.536ms 工作方式1的定时计数功能切换模式,与工作方式
0完全一样;而启动定时计数器的模式,也与工作方式 0完全一样。计数量方式1更大,可完全取代方式0。
6.2.3 方式2
方式2为自动重装初值的8位计数方式。
TCON
TF1 D7
申请 中断
TR1
溢出8位计数器
1
TF0
TL0
TR0
0 &
TH1重TH装0 单元 ≥1 8位
D0
T0引脚
机器周期 1
INT0引脚
6.1.1 工作方式控制寄存器TMOD TMOD(工作方式寄存器):选择定时器/计数器T0、T1的工作 模式和工作方式,字节地址为89H,不能位寻址。
8位分为两组,高4位控制T1,低4位控制T0。 (1)GATE——门控位

51单片机定时计数器的工作原理

51单片机定时计数器的工作原理

51单片机定时计数器的工作原理
51单片机是一种常用的微控制器,它具有多个定时计数器,其中包括定时器0和定时器1。

这些定时计数器是通过内部时
钟源提供的脉冲进行计数的。

定时器0和定时器1是独立的计数器,它们可以用于不同
的应用。

这里我们将主要关注定时器0的工作原理。

定时器0
由一个八位计数器和一个控制寄存器组成。

当定时器0启动时,它会根据时钟源提供的脉冲进行计数,每个脉冲会使计数器的值增加1。

定时器0的计数范围为0-255,即八位二进制数。

通过控制寄存器,我们可以设置定时器0的工作模式、计
数器的初始值以及时钟源的频率。

定时器0可以以不同的方式工作,包括定时模式和计数模式。

在定时模式下,我们可以设置一个初始值,并在每次计数
器增加到该值时产生一个中断。

这样就可以实现精确的定时功能。

定时器0的中断服务程序可以完成各种操作,例如控制其他外设、延时等。

在计数模式下,定时器0将简单地计数外部触发信号的脉
冲次数。

这可以用于测量外部事件的时间间隔或频率。

需要注意的是,定时器0的工作需要通过编程来完成。


们可以使用汇编语言或C语言来配置定时器0的寄存器,并
设计相应的中断服务程序。

51单片机定时器的工作原理是通过定时器0和定时器1实
现计数功能。

定时器0可以在定时模式或计数模式下工作,通过设置计数值和时钟源频率,实现精确的定时功能或测量外部
事件的时间间隔或频率。

编程则是必不可少的,通过配置寄存器和编写中断服务程序来实现定时器的工作。

51单片机定时器原理

51单片机定时器原理

51单片机定时器原理51单片机是一款广泛应用的微型计算机,具有体积小、功耗低、价格便宜等优点,因此在各个领域中都有广泛的应用。

其中,定时器是51单片机的重要功能之一,本文将分步骤阐述51单片机定时器原理。

一、51单片机定时器的介绍定时器是指一种能够精确计时的电子元件。

51单片机的定时器包括定时器0(T0)和定时器1(T1),它们具有不同的寄存器和使用方式。

二、定时器0的原理1. T0模式设置T0模式设置是指通过寄存器控制定时器的计数方式和时钟源。

在T0模式下,定时器的计数器是8位的,时钟源可以选择外部引脚或者内部时钟源(TH0和TL0寄存器),而计数方式可以配置为16位定时或者13位计数。

2. TH0和TL0寄存器TH0和TL0寄存器是T0模式中计数器的高8位和低8位,它们的初始值可以通过程序设置。

定时器在运行过程中会不断递增计数,当计数达到65535时,定时器会自动重新开始计数,并触发定时器0中断(TF0)。

3. 定时器中断的处理方式当定时器0到达设定的计数值时,会自动触发中断,程序会跳转到固定的中断向量地址,并执行中断服务程序。

在中断服务程序中,中断标志TF0会被自动清除,同时可以通过软件控制定时器的继续工作或停止运行。

三、定时器1的原理1. T1模式设置T1模式设置与T0模式类似,也是通过寄存器来控制计数方式和时钟源。

不同的是,在T1模式下,定时器的计数器是16位的,时钟源也可以选择外部引脚或者内部时钟源。

2. TH1和TL1寄存器TH1和TL1寄存器分别是T1模式中计数器的高8位和低8位,它们的初始值同样可以由程序设定。

定时器1在运行过程中也会不断递增计数,当计数达到65535时,同样会自动重新开始计数,并触发定时器1中断(TF1)。

3. 定时器1中断的处理方式定时器1中断的处理方式与定时器0中断相似。

当定时器1到达设定的计数值时,会自动触发中断,程序会跳转到固定的中断向量地址,并执行中断服务程序。

51单片机定时与计数的工作原理

51单片机定时与计数的工作原理

51单片机定时与计数的工作原理一、概述51单片机是一种广泛应用于嵌入式系统中的微处理器,具有高性价比、易学易用等特点。

其中,定时与计数功能是其常用的功能之一,通过定时与计数可以实现许多实际应用,如脉冲计数、PWM输出等。

本文将详细介绍51单片机定时与计数的工作原理。

二、定时器和计数器在介绍51单片机的定时与计数功能之前,我们需要先了解两个重要的概念:定时器和计数器。

1. 定时器定时器是一种能够按照设定时间进行计时的电路。

其基本原理是利用振荡电路产生一个稳定的时间基准信号,再通过分频电路将其分频得到所需的时间间隔,并通过计数器进行累加,从而实现精确的时间控制。

2. 计数器计数器是一种能够对输入脉冲进行计数并输出相应结果的电路。

其基本原理是利用触发电路对输入脉冲进行检测,并通过累加器进行累加,从而得到输入脉冲数量。

三、51单片机中的定时与计数功能在51单片机中,有两个独立的16位定时器/计数器,分别为Timer0和Timer1。

它们可以分别用作定时器或计数器,并且可以通过软件配置其工作模式。

1. Timer0Timer0是一个8位定时器/计数器,它的输入时钟源可以来自外部引脚或系统时钟。

在定时模式下,其最大计时时间为2^8×12/11MHz≈29μs,在计数模式下,其最大计数值为2^8=256。

Timer0的工作模式可以通过TCON寄存器的TF0、TR0、TMOD寄存器的M0位和GATE0位进行配置。

其中,TF0表示定时/计数溢出标志,TR0表示定时/计数启动控制位,M0位表示Timer0的工作模式(00表示13位定时/计数、01表示16位定时/计数、10表示8位自动重装载定时、11保留),GATE0表示是否使用外部引脚作为启动控制信号。

2. Timer1Timer1是一个16位定时器/计数器,它的输入时钟源可以来自外部引脚或系统时钟。

在定时模式下,其最大计时时间为2^16×12/11MHz≈5.9ms,在计数模式下,其最大计数值为2^16=65536。

51单片机定时器实验内容

51单片机定时器实验内容

51单片机定时器实验内容
51单片机定时器实验的内容可以根据不同的需求和目的进行调整,以下是
一些可能的实验内容:
1. 定时器初始化实验:实验目标是了解如何初始化51单片机的定时器,包括设置定时器的工作模式、计数值、初始值等。

实验中可以编写代码,让定时器在初始化后自动开始计时,并在达到指定时间后产生中断或输出信号。

2. 定时器中断实验:实验目标是了解如何使用51单片机的定时器中断功能,实现定时器在达到指定时间后自动触发中断,并在中断服务程序中执行特定的操作。

实验中可以编写代码,让定时器在达到指定时间后自动进入中断服务程序,并在其中执行特定的操作,如点亮LED灯等。

3. 定时器PWM输出实验:实验目标是了解如何使用51单片机的定时器PWM输出功能,实现定时器输出PWM波形。

实验中可以编写代码,让定时器输出不同占空比的PWM波形,并通过调整占空比来控制LED灯的亮
度等。

4. 定时器与外部事件同步实验:实验目标是了解如何使用51单片机的定时器与外部事件同步,实现定时器在外部事件发生时自动开始计时或停止计时。

实验中可以编写代码,让定时器在外部事件发生时自动开始计时或停止计时,并在达到指定时间后执行特定的操作。

以上是一些常见的51单片机定时器实验内容,通过这些实验可以深入了解51单片机的定时器工作原理和用法,并提高编程技能和硬件控制能力。

51单片机精确定时

51单片机精确定时

精确定时与计数一、定时器相关寄存器TCON的高4位TF1 TR1 TF0 TR0TF1(TCON.7):定时器1的溢出中断标志位TR1(TCON.6):定时器1的运行控制位TF0(TCON.5):定时器0的溢出中断标志位TR0(TCON.4):定时器0的运行控制位TMODGATE1 C/T1 M1 M0 GATE0 C/T0 M1 M0定时器1 | 定时器0TH0、TL0、TH1、TL1中断允许控制寄存器IE中的三位。

ET0(IE.1)、ET1(IE.4)、EA(IE.7)定时器的结构(以T0为例),把定时器分为六个部分来研究:脉冲源控制端计数器中断请求位中断允许控制中断服务程序晶振T0 TH0、TL0 TF0 ET0 EA void Tm0() interrup1 using 1脉冲源:用作定时器时,取晶振作为脉冲源。

每12个振荡周期(即一个机器周期)计数器(即TH0、TL0)加一。

用作计数器时T0脚出现下降沿(管脚从1到0)跳变时,计数器加一。

定时器和计数器的区别就是脉冲源不同,除此之外其他的工作过程完全相同。

配置TMOD的C/T0可以选择脉冲源。

置0是定时器,置1是计数器。

控制端:相当于一个开关,开关打开时,脉冲源的信号才能传到计数器(TH0,TL0)中,计数器会不断增一。

关闭这个开关,脉冲源的信号不能使计数器(TH0,TL0)增一。

控制端的开启和关闭状态由TR0、GATE0和INT0脚电平决定。

控制端的开启条件是TR0&(~GATE0 | INT0)如下图。

一般情况下令TR0=1,GATE0=0开启控制端。

TR0=0关闭控制端。

当需要INT0引脚控制计数器时,令TR0=1,GATE0=1,这样INT0脚为高电平时计数,低电平时停止计数,这样可以很方便的测量脉冲宽度。

计数器,中断请求位:这里说的计数器是指TH0、TL0这两个寄存器。

每收到一个脉冲源输出的脉冲,这个计数器就会增一。

计数器计满溢出时,会置位TF0,产生中断请求。

51单片机定时器-计数器

51单片机定时器-计数器

51 单片机定时器/计数器
一、80C51 定时/计数器
定时/计数器是单片机系统一个重要的部件,其工作方式灵活、编程简单、使用方便,可用来实现定时控制、延时、频率测量、脉宽测量、信号发生、
信号检测等。

此外,定时/计数器还可作为串行通信中波特率发生器。

(二) 定时/计数器的控制寄存器
⒈定时/计数器控制寄存器TCON
(1) TCON.7 TF1:定时器1 溢出标志位。

当定时器1 计满数产生溢出时,由硬件自动置TF1=1。

在中断允许时,向CPU 发出定时器1 的中断请求,进入中断服务程序后,由硬件自动清0。

在中断屏蔽时,TF1 可作查询测试
用,此时只能由软件清0。

(2) TCON.6 TR1:定时器1 运行控制位。

由软件置1 或清0 来启动或关闭定时器1。

当GATE=1,且INT1 为高电平时,TR1 置1 启动定时器1;当GATE=0 时,TR1 置1 即可启动定时器1。

(3) TCON.5 TF0:定时器0 溢出标志位。

其功能及操作情况同TF1。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51定时器/计数器的深入研究-精确定时管理提醒: 本帖被一线工人执行置顶操作(2010-04-18) ☞嘉立创PCB打样,最低50元每款,快速交货,台湾品质刚刚发现软件的一个小BUG,在选择T0的工作方式时,误把TR1置位了,造成TMOD的值显示错误。

我已经更正了程序。

请大家重新下载。

在这里我向新手朋友表示歉意。

今天结合救火车单片机实验室编写的小软件《定时器时间计算工具1.0》,来讲述定时器的工作过程。

请到免费下载。

我编这个小软件尽可能的模拟了51的定时器结构,相信你用过以后,一定会加深对定时器的理解。

一、定时器相关寄存器与定时器有关的寄存器都在下面了。

TCON 的高4位TF1 TR1 TF0 TR0TF1(TCON.7):定时器1的溢出中断标志位TR1(TCON.6):定时器1的运行控制位TF0(TCON.5):定时器0的溢出中断标志位TR0(TCON.4):定时器0的运行控制位TMODGATE1 C/T1 M1 M0 GATE0 C/T0 M1 M0定时器1 | 定时器0TH0、TL0、TH1、TL1这个不用说了吧中断允许控制寄存器IE中的三位。

ET0(IE.1)、ET1(IE.4)、EA(IE.7)定时器的结构(以T0为例)把定时器分为六个部分来研究。

脉冲源控制端计数器中断请求位中断允许控制中断服务程序晶振或T0 TH0、TL0 TF0 ET0 EA void Tm0() interrup1 using 1脉冲源:用作定时器时,取晶振作为脉冲源。

每12个振荡周期(即一个机器周期)计数器(即TH0、TL0)加一。

用作计数器时T0脚出现下降沿(管脚从1到0)跳变时,计数器加一。

定时器和计数器的区别就是脉冲源不同,除此之外其他的工作过程完全相同。

配置TMOD的C/T0可以选择脉冲源。

置0是定时器,置1是计数器。

控制端:相当于一个开关,开关打开时,脉冲源的信号才能传到计数器(TH0,TL0)中,计数器会不断增一。

关闭这个开关,脉冲源的信号不能使计数器(TH0,TL0)增一。

控制端的开启和关闭状态由TR0、GATE0和INT0脚电平决定。

控制端的开启条件是TR0&(~GATE0 | INT0)如下图。

控制端的开启条件是TR0&(~GATE0 | INT0)如图。

一般情况下令TR0=1 GATE0=0 开启控制端。

TR0=0关闭控制端。

当需要INT0引脚控制计数器时令TR0=1 GATE0=1 这样INT0脚为高电平时计数,低电平时停止计数,这样可以很方便的测量脉冲宽度。

在任何一本51书中的定时器部分都有详述。

也可以使用本文配套的小软件,来体会控制端的逻辑。

GATE=1的这种用法,我以前也没有注意过,在整理本文时才发现的。

这也是我最新的学习收获。

计数器,中断请求位:这里说的计数器是指TH0、TL0这两个寄存器。

每收到一个脉冲源输出的脉冲,这个计数器就会增一。

计数器计满溢出时,会置位TF0,产生中断请求。

注意,这里只是产生中断请求,是否能够进入中断程序,还要由中断允许位决定。

直接对TF0置位,也可以产生中断请求。

计数器TH0、TL0一共有四种计数方式方式0(M1=0 M0=0)13位计数器。

它由TH0的8位和TL0的低5位构成。

TL0大于0x1F 时就向TH0进位。

TH0计满溢出就向TF0置位请求中断。

方式1(M1=0 M0=1)16位计数器。

与方式1差不多。

由TH0的8位和TL0的8位构成。

TH0计满溢出就向TF0置位请求中断方式2(M1=1 M0=0)8位定时器。

TL0计满溢出时,置位TF0请求中断,并且将TH0中的数值重新装入TL0中。

方式3(M1=1 M0=1)这个方式只有定时器0有,把定时器0当成两个8位定时器来用。

这部分很有趣,你可以使用演示软件研究。

定时器1没有方式3,如果设成方式3就相当于停掉了定时器1。

中断允许控制:上一步产生中断请求(TF0被置1),并不代表会响应中断。

还要看中断允许控制位,这是一个开关,只有开关在开启状态,中断才会响应。

每个中断源都有自己的分开关,比如T0的中断允许位是ET0,T1的中断允许位是ET1.还有一个总开总EA,它关闭时所有的中断都被禁止。

必须是分开关和总开关都打开时,才能进入中断服务程序。

开定时器关定时器开启和关闭定时器控制端,你可以点击小软件来体会逻辑关系。

中断服务程序:如果中断条件都允许,程序跳转到中断服务程序。

ORG 0000AJMP MainORG 000BHLJMP Tim0ORG 100HMain:MOV SP,#30HMOV TMOD,#01HMOV TH0,#0EEHMOV TL0,#00HSETB ET0SETB EASETB TR0WHILE:。

主程序LJMP WHILETIM0:;TIMER0中断服务程序PUSH ACCPUSH PSWMOV TH0,#0EEH。

其他程序POP PSWPOP ACCRETI#include <reg51.h> //11.0592Mvoid timer0() interrupt 1 using 1 //5ms中断一次定时器中断处理函数{TH0=0xEE; //重置定时初始值。

其他程序}void main (void){TMOD|=0x01; //选择定时器0,工作模式1,16位定时器TH0=0xEE; //置定时初始值TL0=0x00;ET0=1; //开启定时器0中断允许,允许定时器0中断。

EA=1; //开启全局中断允许。

允许所有中断TR0=1; //开启控制端while(1){。

主程序}}顺便把其他中断源的向量表也写出来。

中断源汇编语言C语言中断向量例子中断序号例子外部中断0(INT0)0003H ORG 0003H 0 void _INT0() interrupt 0 using 1定时器T0中断000BH ORG 000BH 1 void _T0() interrupt 1 using 1外部中断1(INT1)0013H ORG 0013H 2 void _INT1() interrupt 2 using 1定时器T1中断001BH ORG 001BH 3 void _T1() interrupt 3 using 1串行口中断0023H ORG 0023H 4 void _UART() interrupt 4 using 1定时器T2中断002BH ORG 002BH 5 void _T2() interrupt 5 using 1定时器例程之一:精确定时1秒钟我使用的硬件是救火车单片机工作室的JHC-51-A型学习板。

晶振频率11.0592M。

用定时器0的工作方式1实验。

因为工作方式1,最大的计数是65536个机器周期。

晶振是11.0592M 时,最长溢出时间是71111.1111111111微秒,远远不够1秒,所以我把定时器溢出时间定成5毫秒。

在定时器工具中输入5000,点[计算TH0 TL0] 计算出TH0 = 0xEF ,TL0 = 0x00.溢出时间是5毫秒,相当1秒的200分之一。

在定时器工具中输入5000,点[计算TH0 TL0] 计算出TH0 = 0xEF ,TL0 = 0x00.溢出时间是5毫秒,相当1秒的200分之一。

在程序中声时一个外部变量,计200次中断,就是1秒。

unsigned char ms_5=0;void timer0() interrupt 1 using 1 //5ms中断一次定时器中断处理函数{TH0=0xEE; //重置定时初始值if (++ms_5>=200){ms_5=0;//程序每1秒钟进入这里一次。

}}//主程序如下:void main (void){TMOD|=0x01; //选择定时器0,工作模式1,16位定时器TH0=0xEE; //置定时初始值TL0=0x00;ET0=1; //开启定时器0中断允许,允许定时器0中断。

EA=1; //开启全局中断允许。

允许所有中断TR0=1; //开启控制端到这里我们把定时器0做成了一秒钟的程序完成了。

有很多朋友会有这样的疑问,这样做的1秒钟到底准不准?有多大误差?我可以负责任的告诉你,有误差,但可以控制到极其微小的程度。

下面我们发析一下误差的产生,以及控制方法。

晶振的误差我们的晶振一般误差都是20PPM的,百万分之二十。

想提高精度,只能选择误差更小的晶振,但它毕竟不是为精确定时设计的,很难达到时钟芯片晶振的精度。

单片机中断系统的误差。

定时器产生中断请求以后,并不一定能马上响应这个中断。

单片机要把当前的指令执行完。

51的指令是1到4个周期。

如果赶上两周期指令,就会延误一个指令周期。

最慢的情况会延误3个周期响应中断。

这点误差倒是没什么关系。

但是如果单片机正处理其他的中断(同级或更高级)。

要等其执行完其他中断,再执行一条主程序指令,才会响应定时器0中断。

因为程序千差万别,所以其他中断占用的时间,就没准儿了。

更要命的是,这类影响是随机的,你根本无法纠正。

看起来好像没有办法了,但是你深入研究定时器的工作原理以后,你会发现这个问题还是有可能解决的。

请仔细看一下,我上面的中断程序,“TH0=0xEE;”你是否注意到,我没有给TL0重新赋值。

这可不是疏忽忘了。

我们知道定时器只要开着,TH0和TL0就会不断的增一,增到FF FF,再增一就溢出,这时TF0被硬件置1(也就是中断请求)。

我们要注意的就是不管定时器中断是否被响应,TH0和TL0仍然会不断增一,FF FF增一00 00 再增一00 01 再增一00 02 。

这就是我为什么要选择5毫秒作为定时长度的原因。

因为TH0=EE TL0=00。

最主要的就是TL0=00。

定时器在溢出产生中断以后,不论响应还是不响应,TL0并不停止计数。

虽然中断响应有可能被延迟,但是延迟的时间仍然被计算。

延迟的时间在下一次中断时会“补上”。

这就是只对TH0重赋值的原因。

从理论上说,真正是一个微秒都不差。

研究出这个用法以后,着实让我兴奋了好长时间。

呵呵。

还有一点需要注意。

其他的中断占用的时间太长,TL0增数超过256,定时器中断响应时TH0已经大于0了,直接写TH0=0xEE;就有误差了.可以改成TH0=TH0+0xEE;但这样也会有一点点问题,我们不在这里详细讨论。

最好还是控制其他的中断占用时间不要超过240个机器周期。

每秒钟最后一次入中断的误差。

原因和上面说的相同,误差在下一秒也会“补上”。

定时器例程之二:模拟时钟这也是JHC-51-A的实验6-1的内容。

以下是部分程序void init_timer0(void){//以下为初始化定时器TMOD|=0x01; //选择定时器0,工作模式1:16位定时器TH0=0xEE; //置定时初始值TL0=0x00;//初始化完毕。

相关文档
最新文档