51的单片机定时中断基本概念及简单实验

发布者:czm721002最新更新时间:2023-01-12 来源: zhihu关键字:51单片机  定时中断  基本概念 手机看文章 扫描二维码
随时随地手机看文章

定时器相关内容

CPU时序的有关知识

①振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)。

②状态周期:2 个振荡周期为 1 个状态周期,用 S 表示。振荡周期又称 S 周期或时钟周期。

③机器周期:1 个机器周期含 6 个状态周期,12 个振荡周期。

即机器周期=6个状态周期=12个震荡周期。

指令周期:完成 1 条指令所占用的全部时间,它以机器周期为单位。

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

振荡周期=1/12us;

状态周期=1/6us;

机器周期=1us;

指令周期=1~4us;

定时器/计数器

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

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

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

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


51单片机定时原理

定时/计数器的实质是加 1 计数器(16 位),由高 8 位和低 8 位两个寄存器 THx 和 TLx 组成。它随着计数器的输入脉冲进行自加 1,也就是每来一个脉冲,计数器就自动加 1,当加到计数器为全 1 时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置 1,向 CPU 发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。可见,由溢出时计数器的值减去计数初值才是加 1 计数器的计数值。


51内部结构及实现原理

51定时器/计数器内部结构

上图中的 T0 和 T1 引脚对应的是单片机 P3.4 和 P3.5 管脚。51 单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD 是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON 是控制寄存器,控制 T0、 T1 的启动和停止及设置溢出标志。

定时器/计数器通过两个寄存器进行工作。


控制寄存器 TCON

1.作用: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 类同

低4位(TCON.3~TCON.0):外部中断相关为,用于控制外部中断。


工作方式寄存器TMOD

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

2.格式如图所示:

GATE: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:工作方式设置位。定时/计数器有四种工作方式。

3.定时/计数器的工作方式

前面我们知道,TMOD中m1m0为工作方式设置位,共有4中方式

(1)方式0:

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

门控位 GATE 具有特殊的作用:

当 GATE=0 时,由图可以看出,先经过一个非门变为高电平1,然后经过或门,因为是或门,仍为高电平1,在经过与门,此时与TR0相与,所以由TR0控制技术的开始。当TR0为1时,相与后仍为高电平,计数开始,待计数溢出时,申请中断。

当GATE=1时,经过非门变为低电平0,此时因为是或门,所以要受到外部中断引脚控制,然后经与门与TR0相与。所以计时的开始是由TR0和外部中断同时控制的。

计数初值与计数个数的关系为:X=2(13)-N。其中 2(13)表示 2 的 13 次方。

(2)方式1:

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

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

计数控制方式同方式0.

(3)方式2:

方式 2 为自动重装初值的 8 位计数方式。工作方式 2 特别适合于用作较精确的脉冲信号发生器。计数初值与计数个数的关系为:X=2(8)-N。

计数控制方式同方式1原理。

(4)方式3:


这几种工作方式中应用较多的是方式 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 秒了。


中断实现过程伪代码

void Timer0Init()

{

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

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

TL0=0X18;

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

EA=1;//打开总中断

TR0=1;//打开定时器

}


定时中断实验

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

默认阳极为高电平,只要利用定时器中断控制P20口即可


代码实现

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

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

typedef unsigned char u8;

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


/*

* 函 数 名         : Timer0Init

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

*/


void Timer0Init()

{

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

        TH0=0XFC;       //给定时器赋初值,定时1ms高4位为FC  FC18=64536

        TL0=0X18;       //低4位为18

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

        EA=1;//打开总中断

        TR0=1;//打开定时器                   

}


/*

* 函 数 名       : main

* 函数功能           : 主函数

*/

void main()

{       

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

        while(1);       //一直循环执行定时器0    

}


/*

* 函 数 名         : void Timer0() interrupt 1

* 函数功能             : 定时器0中断函数

*/

void Timer0() interrupt 1

{

        static u16 i;

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

        TL0=0X18;

        i++;

        if(i==1000)//如果i==1000,即执行1000次后,重新置0,led发生变化

        {

                i=0;

                led=~led;       

        }       

}


关键字:51单片机  定时中断  基本概念 引用地址:51的单片机定时中断基本概念及简单实验

上一篇:51单片机EEPROM-IIC原理及实验
下一篇:51单片机外部中断点亮LED

推荐阅读最新更新时间:2024-11-12 17:02

51单片机学习笔记5 -- 外部中断
1.外部中断概念 外部中断是单片机实时地处理外部事件的一种内部机制。当某种外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理;中断处理完毕后.又返回被中断的程序处,继续执行下去。 2.引脚功能复用 51单片机芯片内部有很多外设,这些外设的引脚都是与IO口复用的。也就是说,一个IO口如果可以复用为内置外设的功能引脚,那么当这个IO口作为内部外设使用的时候,就叫做复用(一般来说,当某个引脚作为复用功能使用时,它将不能作为其他复用功能和普通IO来使用,即单个引脚只能作为普通IO或单个复用功能来使用)。 51单片机也有引脚具备复用功能,如下图P3端口的引脚可复用成串口收发或外部中断 3.中
[单片机]
<font color='red'>51单片机</font>学习笔记5 -- 外部<font color='red'>中断</font>
51单片机-按键的中断检测
接着昨天,继续说按键的事。昨天说的是扫描检测,今个说一下中断检测。先插播一个小故事~~ 当年我和凯凯学单片机的时候,我用扫描检测的方法做的项目,他用中断检测的方法做的项目。当我俩坐一起交流按键检测的方式时,他火了,直接跳起来跟我吼:你不用中断怎么检测? 当时我就意识到他可能陷入了只能用中断的误区,然后就乐呵呵的说:用扫描啊~ 他继续吼,我继续乐,我俩就这样陷入了死循环。终于都累了,然后把程序和原理给他看,了解~ 在STC89C52单片机上,具有外部中断功能的引脚有两个:P3.2 –INT0 和 P3.3-INT1。上电默认的情况下,他们是普通IO引脚;当配置好相关寄存器之后,他们就变成
[单片机]
学<font color='red'>51单片机</font>-按键的<font color='red'>中断</font>检测
51单片机】STC89C52数码管静态显示实验,含c代码(5)
1.参考教程: 清翔51单片机教程 2.基本原理 : 1)数码管位数:几个数码管连在一起,就是几位。 2)数码管共级:共阴极-数码管中间的线是GND。共阳极-数码管中间的线是VCC。用万用表测:黑表笔放GND(中间)处,红表笔放a处,若a灯亮起则是共阴极。 3)控制每段的亮灭,亮输入高电平,灭低电频。例:数码管显示数字1。对应二进制排列:00000110. 3.静态显示 每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直达送入新字形码为止。 1)锁存器原理 2)位选和段选 用两个锁存器分别进行位选和位选。 位选流程: ①P27赋高定平(也就是位选锁存器的LE脚打开
[单片机]
【<font color='red'>51单片机</font>】STC89C52数码管静态显示实验,含c代码(5)
51单片机计时器实现1000以内的计数功能
#include reg51.h #include intrins.h unsigned char code LED7Code = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,//0-9字模 0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极7段数码管A-F字模,原来的是错误的. unsigned char num,temp; unsigned int a, b,c; void system_init() { EA=1; //开中断总开关 ET0=1;//加一行,开定时器T0中断 TMOD=0x01; //定时
[单片机]
51单片机累计主循环次数实现独立按键
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: Independent-KEY ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200505 ---- @ModifiedTime: 20200505 ---- @Description:
[单片机]
<font color='red'>51单片机</font>累计主循环次数实现独立按键
4-基于51单片机的多量程数字电压表
具体实现功能 仿真可以实现四个量程的切换(2V、20V、200V、500V),并模拟实现直流电压的测量与显示。 单片机介绍 51单片是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM,32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X51 可降至0Hz 静态逻辑操作,支持2种软件可选择节
[单片机]
4-基于<font color='red'>51单片机</font>的多量程数字电压表
51单片机——8X8点阵显示
74hc595.h: #ifndef __74hc595_H__ #define __74hc595_H__ /************************************位定义************************************/ sbit DATA_IN = P1^0; //串行数据输入 sbit ST_CK = P1^1; //存储寄存器时钟输入 sbit SH_CK = P1^2; //移位寄存器时钟输入 /***********************************函数声明***********************************/ voi
[单片机]
编程点滴:16位AVR定时器比较匹配中断测试程序
程序实现以Timer1比较匹配中断方式控制LED以500ms为间隔产生亮灭变化。 文件组成:测试程序 main.c ,定时器配置程序 timer_16bit_test.c 和头文件 timer_16bit_test.h 。 main.c /* ********************************************* * File name: main.c * Function: 16位定时器比较匹配中断方式测试程序 * Description: 定时器控制LED以500ms间隔闪烁 * Author & Date: Joshua Chan, 2012/03/26 * ******************
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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