历史上的今天
返回首页

历史上的今天

今天是:2024年11月03日(星期日)

2021年11月03日 | STC89C52之定时器中断实验 ---- 自学笔记

2021-11-03 来源:eefocus

一、简述

STC89C5X含有3个定时器:定时器0,定时器1,定时器2.


51 系列单片机一定有基本的 2 个 定时器(定时器 0 和定时器 1),但不全有 3 个中断,通常 我们使用的都是基本的 2 个定时器:定时器 0/1。


二、定时器计数器

2.1、CPU 时序的有关知识

①振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡 周期)【晶振振荡产生的脉冲,一个脉冲表示一个时钟周期 】。

②状态周期:一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)。一个状态周期等于两个时钟周期【 2 个振荡周期为 1 个状态周期,用 S 表示。振荡周期又称 S 周 期或时钟周期。】

③机器周期:1 个机器周期含 6 个状态周期,12 个振荡周期【也叫CPU周期,表示从内存读取一条指令字的最短时间,它是指令周期的最小单位。它等于单指令的周期长度 】。

④指令周期:完成 1 条指令所占用的全部时间,它以机器周期为单位【条指令包括1个或多个机器周期。所有的C语言代码最后都会编译成汇编代码来执行,而执行一条汇编指令需要的机器周期就叫做指令周期 】。


振荡周期 =1/2状态周期=112机器周期

 

例如:外接晶振为 12MHz 时,51 单片机相关周期的具体值为:

振荡周期=1/12us;

1(微秒)us=0.000001s(秒)

1秒专(s)=1000毫秒(ms)

1秒(s)=1000000 微秒(μs)

状态周期=1/6us;

机器周期=1us;

指令周期=1~4us;

 

2.2,学习定时器前需要明白的几点

①51 单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之 为定时器/计数器。

②定时器/计数器和单片机的 CPU 是相互独立的。定时器/计数器工作的过程 是自动完成的, 不需要 CPU 的参与。

③51 单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信 号对寄存器中的数据加 1。

有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加 1 的 工作可以交给定时器/计数器处理。CPU 转而处理一些复杂的事情。同时可以 实 现精确定时 作用。

 

2.3、单片机定时器原理

STC89C5X 单片机内有 两个可编程的定时/计数器 T0、T1 和一个 特殊功能定 时器 T2 。定时/计数器的实质是加 1 计数器(16 位),由高 8 位和低 8 位两 个寄存器 THx 和 TLx 组成。它随着计数器的 输入脉冲 进行自加 1,也就是每来一 个脉冲,计数器就自动加 1,当加到计数器为全 1 时, 再输入一个脉冲就使计数 器回零,且计数器的溢出使相应的中断标志位置 1 ,向 CPU 发出中断请求(定时

/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到; 如果工作于计数模式,则表示 计数值已满 。可见,由溢出时计数器的值减去计数 初值才是加 1 计数器的 计数值 。


2.4、51 单片机定时/计数器结构

51 单片机定时/ 计数器的工作由两个特殊功能寄存器控制

TMOD 是定时/计数器的工作方式寄存器,确定工作方式和功能

TCON 是控制寄存器,控制 T0、 T1 的启动和停止及设置溢出标志

T0 和 T1 引脚对应的是单片机 P3.4 和 P3.5 管脚


2.4.1、工作方式寄存器

用于设置定时/计数器的工作方式,低四位用于 T0,高 四位用于 T1。

GATE 是门控位


GATE=0 时,用于控制定时器的启动是否受外部中断源信号 的影响。只要用软件使 TCON 中的 TR0 或 TR1 为 1,就可以启动定时/计数器工作;

GATA=1 时,要用软件使 TR0 或 TR1 为 1,同时外部中断引脚 INT0/1 也为高电平 时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了 INT0/1 引脚 为高电平这一条件。

 

C/T :定时/计数模式选择位。C/T =0 为定时模式;C/T =1 为计数模式。

M1M0:工作方式设置位。定时/计数器有四种工作方式。

2.4.2、控制寄存器TCON

TCON 的低 4 位用于控制外部中断,TCON 的高 4 位用于控制定时/计数器的启动和中断申请。

格式:

 

TF1(TCON.7):T1 溢出中断请求标志位。T1 计数溢出时由硬件自动置 TF1 为 1。CPU 响应中断后 TF1 由硬件自动清 0。T1 工作时,CPU 可随时查询 TF1 的 状态。所以,TF1 可用作查询测试的标志。TF1 也可以用软件置 1 或清 0,同硬 件置 1 或清 0 的效果一样。

TR1(TCON.6):T1 运行控制位。TR1 置 1 时,T1 开始工作;TR1 置 0 时, T1 停止工作。TR1 由软件置 1 或清 0。所以,用软件可控制定时/计数器的启动 与停止。

TF0(TCON.5):T0 溢出中断请求标志位,其功能与 TF1 类同。

TR0(TCON.4):T0 运行控制位,其功能与 TR1 类同。

 

2.5、定时器计数器的工作方式

1、方式0

方式 0 为 13 位计数 ,由 TL0 的低 5 位(高 3 位未用)和 TH0 的 8 位组成。 TL0 的低 5 位溢出时向 TH0 进位,TH0 溢出时,置位 TCON 中的 TF0 标志,向 CPU 发出中断请求。

 

门控位 GATE 具有特殊的作用。当 GATE=0 时,经 反相后 使 或门 输出为 1,此时仅由 TR0 控制 与门的开启,与门输出 1 时,控制开关接通,计数开始;

当 GATE=1 时,由外中断引脚信号控制或门的输出,此时控制与门的开启由外中断引脚信号 和 TR0 共同控制。


当 TR0=1 时,外中断引脚信号引脚的高电平启动计数,外中断 引脚信号引脚的低电平停止计数。这种方式常用来测量外中断引脚上正脉冲的宽 度。计数模式时,计数脉冲是 T0 引脚上的外部脉冲。计数初值与计数个数的关 系为:X=2(13)-N。其中 2(13)表示 2 的 13 次方。

 

2、方式1

方式 1 的计数位数是 16 位,由 TL0 作为低 8 位,TH0 作为高 8 位,组成了 16 位加 1 计数器。

计数初值与计数个数的关系为:X=2(16)-N。


3、方式2

方式 2 为自动重装初值的 8 位计数方式。工作方式 2 特别适合于用作 较 精确的脉冲信号发生器 。

4、方式3

方式 3 只适用于定时/计数器 T0, 定时器 T1 处于方式 3 时相当于 TR1=0, 停止计数。工作方式 3 将 T0 分成为两个独立的 8 位计数器 TL0 和 TH0。

这几种工作方式中应用较多的是方式 1 和方式 2。定时器中通常使用定时器 方式 1,串口通信中通常使用方式 2。


三、定时器计数器实现步骤

①对 TMOD 赋值,以确定 T0 和 T1 的工作方式,如果使用定时器 0 即对 T0 配 置,如果使用定时器 1 即对 T1 配置。

②根据所要定时的时间计算初值,并将其写入 TH0、TL0 或 TH1、TL1。

③如果使用中断,则对 EA 赋值,开放定时器中断。

④使 TR0 或 TR1 置位,启动定时/计数器定时或计数。

 

机器周期=1/单片机的时钟频率。51 单片机内部时钟频率是外部 时钟的 12 分频,也就是说当外部晶振的频率输入到单片机里面的时候要进行 12 分频。比如说你用的是 12MHZ 晶振,那么单片机内部的时钟频率就是 12/12MHZ, 当你使用 12MHZ 的外部晶振的时候,机器周期=1/1M=1us。如果我们想定时 1ms 的初值是多少呢?1ms/1us=1000。也就是要计数 1000 个,初值=65535-1000+1 (因为实际上计数器计数到 66636(2 的 16 次方)才溢出,所以后面要加 1) =64536=FC18H,所以初值即为 THx=0XFC,TLx=0X18。

 

知道了如何计算定时/计数器初值,那么想定时多长时间都可以计算出,当 然由于定时计数器位数有限,我们不可能直接通过初值定时很长时间,如果要实 现很长时间的定时,比如定时 1 秒钟。可以通过初值设置定时 1ms,每当定时 1ms 结束后又重新赋初值,并且设定一个全局变量累计定时 1ms 的次数,当累计到 1000 次,表示已经定时 1 秒了。需要其他定时时间类似操作,这样我们就可以 使用定时器来实现精确延时来替代之前的 delay 函数。 这里以定时器 0 为例介绍配置定时器工作方式 1、设定 1ms 初值,开启定时 器计数功能以及总中断.


void Timer0Init() 

TMOD|=0X01;        //选择为定时器 0 模式,工作方式 1,仅用 TR0 打开启动。

 TH0=0XFC;         //给定时器赋初值,定时 1ms 

TL0=0X18; ET0=1;   //打开定时器 0 中断允许 

EA=1;              //打开总中断 

TR0=1;             //打开定时器

 

 }

 


四、代码

要实现的功能是:通过定时器 0 中断控制 D1 指示灯间隔 1 秒闪烁。


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

实验现象:下载程序后,D1小灯循环点亮1秒,熄灭1秒。使用单片机内部定时器可以实现准确延时

  

接线说明: (具体接线图可见开发攻略对应实验的“实验现象”章节)

   1,单片机-->LED&交通灯模块

    P20-->D1

   

注意事项:

  

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

 

#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器

 

typedef unsigned int u16;   //对数据类型进行声明定义

typedef unsigned char u8;

 

sbit led=P2^0; //定义P20口是led

 

 

// 定时器0初始化

 

void Timer0Init()

{

TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

 

TH0=0XFC; //给定时器赋初值,定时1ms

TL0=0X18;

ET0=1;//打开定时器0中断允许

EA=1;//打开总中断

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

** * TCON的中断请求标志       

** *   

** *       位:    7      6      5      4      3      2     1      0  

** *   

** * 字节地址:   TF1     TR1    TF0   TR0    IE1    IT1   IE0    ITO  

** *     说明:   

** *ITO(TCON.0):外部中断0触发控制位。   

** *    当IT0=0时,为电平触发方式   低电平       

** *    当IT0=1时,为边沿触发方式(下降沿有效)   

** *IE0(TCON.1):外部中断0中断请求标志位。   

** *IT1(TCON.2):外部中断1触发方式控制位。   

** *IE1(TCON.3):外部中断1中断请求标志位。   

** *TF0(TCON.5):定时/计数器T0溢出中断请求标志位。置1溢出   

** *TF1(TCON.7):定时/计数器T1溢出中断请求标志位。   

** *********************************************************************   

** *  

** ********************************************************************************

** * 控制寄存器(TCON)   

 

** * TCON的低四位用于控制外部中断,    

** * TCON的高四位用于控制定时器计数器的启动和中断        

** *     

          位:  7    6    5     4     3   2    1   0    

字节地址: TF1  TR1  TF0   TR0    

   

    TF1(TCON.7):T1 溢出中断请求标志位。T1 计数溢出时由硬件自动置 TF1 为 1。      

CPU 响应中断后 TF1 由硬件自动清 0。T1 工作时,CPU 可随时查询 TF1 的 状态。      

所以,TF1 可用作查询测试的标志。TF1 也可以用软件置 1 或清 0,同硬件置 1         

或清 0 的效果一样。    

   

    TR1(TCON.6):T1 运行控制位。TR1 置 1 时,T1 开始工作;TR1 置 0 时,        

T1 停止工作。TR1 由软件置 1 或清 0。所以,    

用软件可控制定时/计数器的启动 与停止。    

   

    TF0(TCON.5):T0 溢出中断请求标志位,其功能与TF1相同。        

    TR0(TCON.4):T0 运行控制位,其功能与TR1相同。    

   

   

   

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

TR0=1;//打开定时器

}

 

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

* 函 数 名       : main

* 函数功能 : 主函数

* 输    入       : 无

* 输    出    : 无

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

void main()

{

Timer0Init();  //定时器0初始化

while(1);

}

 

 

//函 数 名         : void Timer0() interrupt 1

 

void Timer0() interrupt 1

{

static u16 i;

TH0=0XFC; //给定时器赋初值,定时1ms

TL0=0X18;

i++;

if(i==1000)

{

i=0;

led=~led;

}

}


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

实验现象:下载程序后,静态数码管间隔一秒循环显示0-F

  

接线说明: (具体接线图可见开发攻略对应实验的“实验现象”章节)

   1,单片机-->静态数码管模块

    J22-->J8

注意事项:

  

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

 

#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器

 

typedef unsigned int u16;   //对数据类型进行声明定义

typedef unsigned char u8;

 

 

u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

u8 n=0;

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

* 函 数 名         : Timer1Init

* 函数功能    : 定时器1初始化

* 输    入         : 无

* 输    出         : 无

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

void Timer1Init()

{

TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。

 

TH1=0XFC; //给定时器赋初值,定时1ms

TL1=0X18;

ET1=1;//打开定时器1中断允许

EA=1;//打开总中断

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

** * TCON的中断请求标志       **

** *   **

** *       位:    7      6      5      4      3      2     1      0  **

** *   **

** * 字节地址:   TF1     TR1    TF0   TR0    IE1    IT1   IE0    ITO **  

** *     说明:   **

** *ITO(TCON.0):外部中断0触发控制位。   **

** *    当IT0=0时,为电平触发方式   低电平       **

** *    当IT0=1时,为边沿触发方式(下降沿有效)   **

** *IE0(TCON.1):外部中断0中断请求标志位。   **

** *IT1(TCON.2):外部中断1触发方式控制位。   **

** *IE1(TCON.3):外部中断1中断请求标志位。   **

** *TF0(TCON.5):定时/计数器T0溢出中断请求标志位。置1溢出   **

** *TF1(TCON.7):定时/计数器T1溢出中断请求标志位。   **

推荐阅读

史海拾趣

EVER-WAY公司的发展小趣事

在电子产品制造行业,品质是企业的生命线。EVER-WAY公司一直高度重视品质管理,建立了完善的质量管理体系。公司从原材料采购、生产制造到产品检验等各个环节都严格把关,确保产品质量的稳定性和可靠性。同时,公司还加强了对员工的培训和教育,提高了员工的品质意识和操作技能。这些品质管理的提升不仅保证了公司产品的优良品质,也赢得了客户的信任和好评。

ETL [E-Tech Electronics LTD]公司的发展小趣事

E-Tech Electronics LTD(简称ETL)在创立之初就确立了其目标——为电子市场提供高质量、高性能的电子产品。公司凭借其创始人的远见卓识和团队的专业技术,成功开发了一系列电子产品,逐渐在市场上建立了良好的声誉。初期,ETL主要关注于特定领域的电子产品研发,通过不断优化产品设计,提升产品质量,逐渐赢得了客户的信任。

DREMEL公司的发展小趣事

随着电子行业的不断发展,数据治理和云数据湖领域也面临着越来越多的挑战。Dremio公司始终保持敏锐的市场洞察力,积极应对各种挑战。他们不断投入研发资源,推出了一系列创新产品和技术解决方案。例如,他们开发了一种基于人工智能的数据分析引擎,能够自动识别和预测数据中的异常和趋势。这一技术不仅提高了数据分析的准确性和效率,也为企业提供了更全面的数据支持。

AnalogicTech公司的发展小趣事

为了进一步扩大市场份额,AnalogicTech积极寻求与全球范围内的合作伙伴建立战略合作关系。公司通过参加国际电子展会、建立海外销售网络等方式,成功将产品推向全球市场。同时,AnalogicTech还加大了对亚洲市场的投入,在香港等地设立了分支机构,进一步提升了公司在全球市场的竞争力。

GardTec Inc公司的发展小趣事

背景:为了满足全球客户的需求,GardTec开始实施全球化战略,在亚洲和美国等地设立全球制造厂和库存地。

发展:通过在全球范围内的战略布局,GardTec不仅提升了产品的供应效率,还更好地服务了世界各地的客户。公司的全球化布局进一步巩固了其在风扇配件市场的领先地位。

影响:全球化战略的实施,使得GardTec的产品能够迅速响应市场变化,满足不同地区客户的多样化需求,从而增强了公司的市场竞争力。

Chen Yang Technologies GmbH & Co KG公司的发展小趣事

在快速发展的过程中,Chen Yang Technologies始终重视内部管理和人才培养。公司推行了一系列创新的管理理念和措施,如扁平化管理、项目制运作等,这些措施有效提高了工作效率和团队协作能力。同时,公司还注重人才培养和引进,通过设立激励机制、提供培训和发展机会等方式,吸引和留住了一批优秀的技术人才和管理人才。

问答坊 | AI 解惑

那个一个没有任何资料的液晶,如何调通

file:///C:/Documents%20and%20Settings/Administrator.79E68F10112A456/桌面/100_PANA/1.bmp老板今天扔给我一个液晶,说什么资料都没有! [ 本帖最后由 yjj 于 2009-8-12 13:25 编辑 ]…

查看全部问答>

这里有个小程序PIC12C508的,可能看有什么问题?

#include __CONFIG (INTRC & PROTECT & MCLREN & WDTEN); const unsigned char cs @ 0x1FF; void DelayUs( int  x)    // 32US {while(--x!=0)   { CLRWDT();     NOP();     unsigned ...…

查看全部问答>

瞬时无功理论谐波检测方法

瞬时无功理论谐波检测方法的资料下载,免费贡献给大家…

查看全部问答>

UART接收程序丢失数据的问题

各位大侠,我用AVR ATMEGA16的UART来接收上位机串口调试助手发来的数据,假设为0x53,0x26,0x53,0x89,0x47,前面两个数据总是对的,然后第三位就接到了最后一个数据,中间的数据就丢失了。 接收中断程序如下: #pragma interrupt_handler uart_rx_ ...…

查看全部问答>

触摸屏控制器

最近要作一款控制器是TSC2006的触摸屏的驱动!请问和ADS7846控制器有什么区别!可以通用吗!如果有区别请大哥们描述的详细点!…

查看全部问答>

张帆的驱动开发群

我建了个驱动开发群,QQ群:11312034 本人是《Windows驱动开发技术详解》的作者张帆,希望一起交流。 …

查看全部问答>

EVC下EDIT控件为何无法进行输入法的输入

编辑完对话框类后无法在EDIT里输入汉字; 还有请帮忙看看一下代码怎么修改 LOGFONT m_lf;                 //字体结构 strcpy(m_lf.lfFaceName,ipadress ); 报错:error C2664: \ ...…

查看全部问答>

高手帮忙解释一下定时器的时间怎么算的?!

比如下面这段代码:void main(void){WDTCTL = WDTPW + WDTHOLD; //停止看门狗定时器P1DIR |= 0x01; // 设P1.0为输出//TA1CTL = RT1SSEL_0 + MC_2 + TAIE; // ACLK, 定时器A计数模式,且开中断功能TA1CTL=TASSEL_2+ID_3+MC_1; //SMCLK(8KHZ). 8分频 ...…

查看全部问答>

2602型源表进行LIV测试扫描

正向电压测试 正向电压(VF)测试对激光二极管的正向直流特性进行校验,测量时扫描电流IF,测量激光二极管上的电压降。 一些大功率激光二极管可能要求电流扫描范围达到2~3A,步长一般在1mA。更多情况下,一般电流扫描至1A,步长为0.5mA或0.25mA。 ...…

查看全部问答>