毕业回馈-89c51之定时器/计数器(Timer/Count)

今天分享的是89c51系列单片机的内部资源定时器/计数器,在所有的嵌入式系统中都包含这两个内部功能。

首先先了解几个定时器/计数器相关的概念:

?时钟周期:时钟周期 T 是时序中最小的时间单位,具体计算的方法就是1/时钟源频率,(一般单片机采用的是11.0592mHz)

?机器周期:我们的单片机完成一个操作的最短时间。标准51单片机,一个机器周期是 12 个时钟周期,也就是 12/11059200 秒。

?定时器:当T/C工作在定时器时,对振荡源12分频的脉冲计数,即每个机器周期计数值加1,计数频率=当前单片机工作频率/12。当单片机工作在12MHz时,计数频率=1MHz,单片机每1us计数值加1。

?计数器:计数脉冲来自外部脉冲输入引脚 T0(P3.4)或T1(P3.5)。当T0或T1引 脚上负跳变时计数值加1。识别引脚上的负跳变需要2个机器周期,即24个振荡周期。所以T0或者T1 输入的可计数外部脉冲的最高频率为当前单片机工作频率/24。当单片机工作在12MHz时,最高计数频率 为500KHz,高于该频率将计数出错。

定时器/计数器所涉及到的寄存器如下:

其中TCON为定时器/计数器T0,T1的可控制及窜起,同时也锁存T0,T1溢出中断源和外部请求中断源等。

TCON寄存器可以进行位寻址

TCON中每一位的使用如下:

注:

TF1:定时器/计数器T1溢出标志。T1被允许计数以后,从初值开始加1计数。当最高位产生溢出时由硬件置‘1’TF1,向CPU发送中断请求,一直保持到CPU响应中断时,由硬件自动清零,当不执行中断时,也可以通过查询的方式对TF1标志位进行软件清零

TR1:定时器T1的运行控制位。由软件置位和清零。当GATE(TMOD.7)=0,TR1=1时就运行T1开始计数,TR1=0时禁止T1计数。当GATE(TMOD.7)=1,TR1=1且INTI外部输入高电平时,才允许T1计数

TF0:同TF1拥有两种清零方式

TMOD寄存器不可位寻址:

每一位的使用如下:

THx/TLx(x=0,1)介绍如下:

T/C是16位的,计数寄存器由TH高8位和TL低8位构成。

在特殊功能寄存器(SFR)中,

对应T/C0为TH0和TL0;

对应T/C1为TH1和TL1。

定时器/计数器的初始值通过TH1/TH0和TL1/TL0设置。

定时器模式介绍:

?模式 0(M1=0,M0=0),是8位计数器带32分频的预分频器。该模式下,定时器0配置为13位的计数器,由TL0的低5位和TH0的8位构成。TL0的低5位溢出向TH0进位,TH0计数溢出置位TCON中的溢出标志位TF0.

工作模式示意图:

?模式 1(M1=0,M0=1),是THn和TLn组成了一个16位的定时器,计数范围是0~65535,溢出后,只要不对THn和TLn重新赋值,则从0开始计数。(最常用的一种定时模式)

工作模式示意图:

?模式 2 (M1=1,M0=0),是8位自动重装载模式,只有TLn做加1计数,计数范围0~255,THn的值并不发生变化,而是保持原值,TLn溢出后,TFn就直接置1了,并且THn原先的值直接赋给TLn,然后TLn从新赋值的这个数字开始计数。 (常用于串口通信)

工作模式示意图:

?模式 3(M1=1,M0=1),两个8位计数器。对定时器1,在模式3时,定时器1停止计数,效果与将TR1设置为0相同。对于定时器0,此模式下定时器0的TL0及THO作为两个独立的8位计数器。模式3为了增加一个附加的8位定时器/计数器而提供的,使单片机具有三个定时器/计数器。

模式示意图以及对示意图的分析如下:

?1、TR0 和下边或门电路的结果要进行与运算,TR0 如果是 0 的话,与运算完了肯定是 0,所以如果要让定时器工作,那么 TR0 就必须置 1。

?2、这里的与门结果要想得到 1,那么前面的或门出来的结果必须也得是 1 才行。在 GATE 位为 1 的情况下,经过一个非门变成 0,或门电路结果要想是 1 的话,那 INT0 即 P3.2 引脚必须是 1 的情况下,这个时候定时器才会工作,而 INT0 引脚是 0 的情况下,定时器不工作, 这就是 GATE 位的作用。

?3、当 GATE 位为 0 的时候,经过一个非门会变成 1,那么不管 INT0 引脚是什么电平,经过或门电路后都肯定是 1,定时器就会工作。 4、要想让定时器工作,就是自动加 1,从图上看有两种方式,第一种方式是那个开关打 到上边的箭头,就是 C/T = 0 的时候,一个机器周期 TL 就会加 1 一次,当开关打到下边的箭 头,即 C/T =1 的时候,T0 引脚即 P3.4 引脚来一个脉冲,TL 就加 1 一次,这也就是计数器功能。

不同方式下单片机的最大定时间隔:

?公式:单片机的一个机器周期=12/工作频率。

?那么当前单片机的机器周期=12/12MHz=1us

?方式0 13位定时器最大定时器间隔=213 X 1us=8.192ms

?方式1 16位定时器最大定时器间隔=216 X 1us=65.536ms

?方式2 8位定时器最大定时器间隔=28 X 1us=256us

?假如需要50ms的定时,则需要选择方式1

定时器初值的计算:

?定时时间为50ms时:选择模式一

?那么设计数器初始值为t,同时机器周期为1us,

?即(65536-t)x 1us=50000us

?t=65536-50000

?那么

?TH0= (65536-50000 )/256

?TL0=(65536-50000)%256

实验案例:50msLED灯闪烁:

?50ms延时的定时器初值计算 (我们采用10ms一延时的方式)

?假设我们单片机的时钟源为12MHz,则机器周期T=1us

?设计数器的初值为t,采用方式一

?则(2^8-t)*1us=10000us 所以t=(2^8-1000)=(65536-10000)

?TH0=(65536-10000 )/256 =0xD8

TL0=(65536-10000)%256 =0XF0

电路原理图如下:

程序设计如下:

定时器初始化:

main函数如下:

Technorati Tags: 毕业回馈、89c51、嵌入式开发、

源代码如下:

#include "51_Include.h"

void GPIO_Init(void);

void Timer_Init(void);

void main(void)

{
     uint32 cnt=0;
     delay(100);//等待系统上电稳定运行
     GPIO_Init();//初始化GPIO端口功能
     Timer_Init();//初始化定时器
     while(1)
     {
         /***********************************************************
         *本部分添加程序执行的内容,也可根据用户开发需要,将while循环去掉
         ************************************************************/
         if (TF0 == 1)          //判断定时器0是否溢出        
             {            
                 TF0 = 0;           //T0 溢出后,清零溢出标志            
                 TH0 = 0xD8;        //定时器重新赋初值            
                 TL0 = 0xF0;            
                 cnt++;             //计数值自加1,没加一次代表计时10ms            
                 if (cnt >= 50)    //判断 T0 溢出是否达到100次即50*10=500ms=0.5s                                
                 {
                     cnt = 0;      //达到50次后计数值清零,重新开始计数                
                     led_1 = ~led_1;  //LED 取反:0-->1、1-->0  
                 }         
             }
     }

}

/************************************************************

* 函数名:void GPIO_Init(void)

* 参  数:无

* 功  能:初始化IO口

* 作者:Mr.Wang

* 日期:2018-01-10

*************************************************************/

void GPIO_Init(void)

{
     /***********************************************************
     *本部分添加GPIO初始化执行的内容
     ************************************************************/
     led_1=0;//初始化GPIO引脚为低电平

}

/************************************************************

* 函数名:void Timer_Init(void)

* 参  数:无

* 功  能:初始化Timer

* 作者:Mr.Wang

* 日期:2018-01-28

*************************************************************/

void Timer_Init(void)

{
     TMOD=0X01;//设置定时器为模式一
     TH0 = 0xD8;//装载初值   (65536-10000)/256=216=0xd8
     TL0 = 0xf0;//装载初值   (65536-10000)%256=240=0xf0
     TR0=1;//Timer开始计数

}

原文地址:https://www.cnblogs.com/Mr-Wangblogs/p/8970592.html

时间: 2025-01-08 00:08:42

毕业回馈-89c51之定时器/计数器(Timer/Count)的相关文章

nrf51822-硬件(3)-定时器/计数器TIMER(IK-51822DK开发套件)

一.Timer 原理 定时器是单片机的重要外设之一,可用于定时.精确延时.计数等.而且Time在运行时不占用CPU时间,在配置好后,可以和CPU并行工作,实现精确的定时和计数.并可以通过软件控制其来产生中断,使用起来方便灵活. 在NRF51822中共有3个定时器,对应的编号为TIMER0.TIMER1.TIMER2,都可以分别工作在定时模式和计数模式下.其原理结构体如下: Timer模块从PCLK1M/PCLK16M处获取时钟源,然后经分频后的到时钟作为Timer的时钟(即图中的fTIMER),

毕业回馈-89C51之GPIO使用(流水灯)

今天分享一个89c51制作的8位流水灯案例.使用Proteus仿真. 同上一遍文章不同.上一篇文章中对于GPIO操作主要是位操作,即sbit led1=P0^0;其中P0^0代表p0.0这个引脚,然后在这样位定义以后就可以对led1这个变量进行赋值操作,控制led灯的亮灭闪烁.今天要分享的是一次性对P1.0-P1.7进行操作. 89c51单片机是以51为内核的8位处理器,可以很方便的实现8位数据的操作. 所使用的电路原理图如下: 使用200Ohm的电阻进行限流,LED灯采用阴极接法,即LED灯的

毕业回馈—89C51之GPIO使用

STC89C51系列单片机共有如下几类GPIO口: (1)P0.0-P0.7: 对应DIP40封装的39-32号引脚:P0口既可以作为输入/输出GPIO口,也可以作为地址/数据复用总线使用. a)P0口作为输入/输出IO口时,P0是一个8位准双向IO口,上电复位后处于开漏模式.且P0口内部无上拉电阻,在作为I/O使用时必须外接4.7K-10K的上拉电阻: b)P0口作为地址/数据复用总线时,是低八位地址线[A0-A7],数据线[D0-D7],无需外接上拉电阻 (2)P1.0-P1.7: 对应DI

WinForm LED循环显示信息,使用定时器Threading.Timer

原文:WinForm LED循环显示信息,使用定时器Threading.Timer 这里用一个示例来演示timer如何使用.示例:LED屏幕显示描述:这个示例其实很简单,LED屏幕上显示3个信息:        1:排队叫号         2:催缴费         3:等待列表.因为LED屏幕大小的关系,列表需要分页显示. 正常情况下,这3个信息都需要从服务器上去获得,这里的示例只做简单的模拟, 界面很简单,如图,这里我就不美化了. Timer构造函数参数说明: Callback:一个 Ti

N76E003的定时器/计数器 0和1

定时器/计数器 0和1N76E003系列定时器/计数器 0和1是2个16位定时器/计数器.每个都是由两个8位的寄存器组成的16位计数寄存器. 对于定时器/计数器0,高8位寄存器是TH0. 低8位寄存器是TL0. 同样定时器/计数器1也有两个8位寄存器, TH1 和TL1. TCON 和 TMOD 可以配置定时器/计数器0和1的工作模式. 通过TMOD中的 位来选择定时器或计数器功能. 每个定时器/计数器都有选择位,TMOD的第2位选择定时器/计数器0功能,TMOD的第6位选择定时器/计数器1功能

51单片机中断机制(定时器/计数器)

单片机中断简介 52单片机一共有6个中断源,它们的符号,名称以及各产生的条件分别如下: INT0 - 外部中断0,由P3.2端口线引入,低电平或下降沿引起 INT1 - 外部中断1,由P3.3端口线引入,低电平或下降沿引起 T0    - 定时器/计数器0中断, 由T0计数器计满回零引起 T1    - 定时器/计数器1中断, 由T1计数器计满回零引起 T2    - 定时器/计数器2中断, 由T2计数器计满回零引起 TI/RI - 串行口中断,串行端口完成一帧字符发送/接收后引起 其中T2是5

定时器计数器中断

定时器/计数器的工作由TMOD与TCON两个寄存器控制,TCON是控制寄存器,控制启动停止以及设置溢出标志,TMOD确定工作方式和功能.计数器溢出时会使得TCON寄存器中TF0或者TF1置1,并向CPU发出中断请求. TMOD 工作方式寄存器 TMOD在单片机复位时全部被清零,其高四位设置定时器1,低四位设置定时器0:四位的意义如下: GATE:门控制位,=0定时器的启动停止仅受TCON寄存器控制,=1时受TCON控制器和外部中断引脚电平状态共同控制: C/T:定时器与计数器模式选择,=1为计数

单片机 定时器/计数器

一.什么是定时器/计数器 在51单片机中,定时器/计数器是用来实现定时功能,并且具有计数的功能,来实现对外部信号的计数. 二.定时器/计数器有什么类型 在51单片机中,分为软件定时器,不可编程硬件定时器,可编程定时器. 软件定时:CPU每执行一条指令时,是需要固定时间的,所以,通过执行空指令可以达到延时的效果,这样子做的代价是占用CPU时间,所以一般很少这么做. 不可编程硬件定时器:是由电路和硬件来完成定时功能的,一般采用基电路,外接定时部件(电阻和电容),通过改变电阻的阻值和电容的电容值来修改

定时器/计数器实验报告

/************************************************* 实验名称:定时器实验一 实验目的:利用定时器/计数器让发光二极管以1HZ闪烁 *************************************************/ #include<reg52.h> sbit P10 = P1^0; unsigned char flag; void main() { flag = 0; P10 = 0; TH0 = 0xfe; TH0 = 0x