80C51定时器中断

发布者:tnzph488最新更新时间:2022-04-28 来源: eefocus关键字:80C51  定时器中断  时序 手机看文章 扫描二维码
随时随地手机看文章

0、CPU时序知识

一个机器周期是12个振荡周期,换算成频率的话,是晶振频率的1/12;


使用汇编语言编写程序的时候,一条指令一般是1~4个机器周期。

1) 51单片机有两组定时器/计时器,既可以用来定时,也可以用来计数,故称为定时器/计数器


2)定时器/计数器和单片机的CPU是相互独立的,定时器/计数器的工作过程是自动完成的,不需要CPU参与。(计时器仍然是内嵌在CPU板中的)


3)定时器/计数器是根据机器内部的时钟或者脉冲信号(P3^4/P3^5引脚接入)对寄存器中的数据加1(每个定时器都有2个寄存器TH0、TL0(TH1、TL1))


4)有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加1的工作可以交给定时器/计数器去做,CPU转而处理一些复杂的事情。同时可以实现精确定时的功能。(因为定时器与CPU相互独立)


1、定时器结构

 

1) 51单片机有2个计数器(16位加1计数器),每个计数器又有高8位和低8位两个寄存器TH0、TL0(TH1、TL1.)组成。


2)工作方式寄存器:TMOD


3)控制寄存器:TCON


使用定时器/计数器,就是要对上述4个寄存器进行操作。


1.1TMOD寄存器

对于TMOD寄存器,高4位是控制T1定时器的运行模式;低4位是控制T0定时器的运行模式;


每个定时器都有4种方式,我们常用的是方式1;

GATE是门控位,用于控制定时器的启动是否受外部中断源信号的影响。GATE=0,不受影响;GATE=1,受影响。


一般情况下,我们用于定时,GATE=0;只要用软件使TCON中断的TR0或TR1为1,就可以启动定时器工作。


注意:当GATE =1时,使TCON中断的TR0或TR1为1外,还需要额外加上外部中断引脚INT0/1为高电平,才能启动定时器工作。


C/T:0,定时器模式,1计数模式;


M1M0:工作方式设置位。

 方式1常用,我们以方式1来分析;只有方式2才可以自动装载初值。

用作定时器的时候,采用的是内部的机器周期,12MHz的晶振,机器周期是1us;


T0引脚(P3^4)接外部方波的时候,一般作为计数器使用。

方式2在串口通信的时候会用到,在高8位TH0中写入初值,低8位TL0来计数,计数完成溢出后变为0后,TH0将初值自动装载到TL0中,继续计数。方式2适合用作较精确的脉冲信号发生器波特率


1.2控制寄存器TCON

对于TCON寄存器,高4位是定时器位TF1,TR1是定时器1;TF0,TR0是定时器0;控制定时器启动和中断申请。


低4位,在上文中使用过,用来控制外部中断0和外部中断1的触发方式。

TF1、TF0的操作,都是硬件自动操作的,不用我们操作什么。


2使用定时器步骤:

1)对TMOD赋值,确定T0和T1的工作方式。


2)计算初值,并将其写入TH0、TL0或TH1、TL1.


3)中断方式时,则对EA赋值,开放定时器中断


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


5)写中断服务程序


中断使能位ET0 = 1及中断号1参见本文


//功能:数码管每隔1s,数字加1

unsigned char kk,num;

unsigned char code smg_du[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9

void main()

{

    TMOD = 0x01;//定时器0 工作方式1

    TH0 = (65536-5000)/256; //计算初值//50ms

    TL0 = (65536-5000)%256;

    EA = 1;//打开总中断开关

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

    TR0 = 1;//启动定时器

    while(1)

    {

        if(kk == 20)//1s

        {

            kk =0;

            P1 = smg_du[num];

            num++;

            if(num==10)

            num = 0;

        }

        

    }

}

void timer0() interrupt 1    //每次50ms,共20次,总计1s

{

    //50ms后,高8位,低8位全都进位了,都为0,所以需要重新设定初值

    TH0 = (65536-5000)/256; //存放整数个256//方式1需要先装载初值//8位即逢256进1

    TL0 = (65536-5000)%256;//存放不够256的值

    kk++;

}

总结:


方式1情形下,写入初值后,启动定时器,1us加一个数,加到65536,THx、TLx溢出,使TFx置1,触发CPU中断,执行中断函数,TFx置0;


不受外部中断影响--->GATE=0;定时模式---->C/T = 0;   方式1----->01;------------>TMOD = 0x01;//0000 0001


在此过程中,我们并没有在P3^4引脚上接外界电路(即保持计时模式)

关键字:80C51  定时器中断  时序 引用地址:80C51定时器中断

上一篇:89C51中断系统介绍(外部中断)
下一篇:独立键盘的使用

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved