51单片机定时器/计数器(中断系统:定时器中断)

实现功能

通过定时器终端控制LED灯 D1 间隔一秒闪烁

单片机型号:STC89C52

定时器介绍

1、51单片机定时器原理

定时器实质上就是一个加1计数器。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自动加1,,当加到定数器满时,再输入一个脉冲就使定时器回零,且定时器的溢出使相应的中断标志位置1,向CPU发出中断请求。如果定时器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。

定时器由高8位和低8位两个寄存器 TH0/TH1和TL0/TH1 组成。

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

2、工作方式寄存器 TMOD

51单片机有两个定时器,所以 TMOD 里面有两组。

GATE:是门控位, 一般默认GATE=0

C/T :定时/计数模式选择位。低电平为定时模式;高电平为计数模式。

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

方式0

13位定时/计数器,由 TL0 的低5位(高3位未用)和 TH0 的8位组成。如果TL0 的低5位溢出会向 TH0 进位,TH0 溢出时,置位 TCON 中的 TF0 标志,向CPU发出中断请求。**(这里不自动重装载,所以在中断处理函数中需要重新赋值 TH0 和 TL0) **

方式1

16位定时/计数器,由 TL0 作为低8位,TH0 作为高8位,组成了16位加1计数器 。(这里不自动重装载,所以在中断处理函数中需要重新赋值TH0和TL0)

方式2

自动重装初值的8位计数方式。(这里自动重装载,所以在中断处理函数中不需要重新赋值TH0和TL0)

方式3

3、控制寄存器 TCON

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

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

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

TR0:T0运行控制位,其功能与TR1类同。

4、计数器初值计算

初值的计算与外部晶振有关,一般是12MHZ或者11.056MHZ。
计数器是每次到溢出了才会中断,所以要找到初值,保证初值到溢出的时间为你想定时的时间,即:溢出数字 - 初值 = 定时时间
如果用定时器 T0,并采用方式1(16位定时/计数器),定时1ms的初值是多少?
因为方式一16位定时器,所以最多可以计数到 216-1=65525;1ms/1us=1000,所以初值=65535-1000+1=64536=FC18
可以这样赋值:
TH0=0xFC
TL0=0x18;

如果定时的时间非常大,寄存器无法存储下时,例如1s,可以用一个循环,定时1ms,将定时的1ms循环1000遍就是1s了

硬件原理

中断系统就是当系统在进行一项工作时,需要终止这项工作,转而去执行另一项工作,当执行完成后再接着执行第一项工作。

如上图,STC89C52有两个外部中断(INT0INT1)、两个定时器中断(T0T1)、一个串口中断(RX/TX

以定时器中断 T0 讲解,T1 同理。

定时器中断 T0 中的 ET0T0 的中断允许,将其赋值为 1 ,则可以开启 T0 的中断允许。EA 是总中断 ,只有将其打开才能允许终端。IP 是控制终端的优先级的,这里不做介绍,使用默认优先级。T0 的管脚连在 P3^4T1 的管脚连接在 P3^5

中断标号为:

  • INT0 0
  • T0 1
  • INT1 2
  • T1 3
  • RX/TX 4

软件编写

定时器中断配置:

  • 对 TMOD 赋值,以确定 T0 和 T1 的工作方式

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

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

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

首先将定时器中断配置好,再写出定时器中断需要执行的函数。在写定时器中断函数时需要用到关键字 interrupt ,再在后面写上中断标号。例如定时器中断 T0 的中断函数这样写 void Time0() interrupt 1 ,千万不要将中断标号写错了。

#include <REGX52.H>sbit LED=P2^0;void Time0_Init()
{TMOD|=0x01;    //选择为定时器0模式,工作方式1TH0=0xFC;      //给定时器赋初值,定时1msTL0=0x18;      ET0=1;         //打开定时器0中断允许EA=1;          //打开总中断TR0=1;         //打开定时器
}void Time0() interrupt 1   //定时器0中断函数
{static unsigned int i; //定义静态变量 i 如果不是静态变量会出现每次调用函数重复赋值为0;TH0=0xFC;    //再次给定时器赋初值 TL0=0x18;    //因为1ms时间到了,寄存器中的数被置0了,所以要重新赋值 1msi++;if(i==1000)   //将定时1ms循环1000遍,就是1s{i=0;LED=!LED;}
}void main()
{Time0_Init();     //定时器0中断配置while(1){}
}

51单片机定时器/计数器(定时器中断)相关推荐

  1. 51单片机学习笔记之中断(外部中断、定时器中断、中断嵌套)

    要学习51单片机中断的朋友,拥有这一篇博文就够了,深入浅出,里面包含了寄存器,外部中断.定时器中断.中断嵌套等的讲解,还有代码实战.快一万字,写得不容易,还请大家点赞支持一下,后续持续更新 (一)寄存 ...

  2. 51单片机中的定时器

    文章目录 1 51单片机中的定时器介绍 1.1 定时器的初步认识 1.2 定时器的寄存器 1.3 使用定时器的方法 1.4 定时时间的计算 2 定时器模式1 2.1 定时器模式1原理分析 2.2 使用 ...

  3. 51单片机 (八)中断系统

    什么是中断? 中断的作用只有一个,那就是打断单片机中别的程序,先执行自身的程序,执行完之后再让单片机继续执行原来的程序. 一般分为几个步骤:中断请求->记录现在的状态->中断响应-> ...

  4. 用 C学习51单片机——记录 4、中断系统 (1)外部中断

    用 C学习51单片机--记录 4.中断系统 用 C 学习51单片机过程与自我拓展--记录(STC89C52芯片) 前言--其实51并不太难,多看 多写代码,多调试,就一定会有所感悟. 所以我在此留下一 ...

  5. 51单片机:利用外部中断实现按键按一下数码管数字加1直到加到99,另一个按键实现清零

    51单片机:利用外部中断实现按键按一下数码管数字加1直到加到99,另一个按键实现清零 题目要求: 利用外部中断实现按键按一下数码管数字加1,实现00-99的循环,另一个按键实现清零,不管数码管数字是多 ...

  6. 51单片机开发 矩阵键盘中断实验与简易计算器及proteus仿真

    51单片机开发 矩阵键盘中断实验与简易计算器及proteus仿真 文章目录 51单片机开发 矩阵键盘中断实验与简易计算器及proteus仿真 实验内容 一.实验一 矩阵键盘中断实验 数码管显示 1.仿 ...

  7. 51单片机复习:外部中断,定时器/计数器中断

    中断: 什么是中断,就是打断,你一开始在做一件事,突然意外发生(中断源),你不得不停止手中的事,(中断响应),去处理那 件意外(中断服务),处理完意外后你继续做刚才那件事(中断返回),这就是中断,而单 ...

  8. 51单片机学习-5定时器与中断

    5 定时器与中断 [toc] 注:笔记主要参考B站江科大自化协教学视频"51单片机入门教程-2020版 程序全程纯手打 从零开始入门". 注:工程及代码文件放在了本人的Github ...

  9. 51单片机自学笔记定时器中断

    目录 相关寄存器 中断允许寄存器IE 中断优先级寄存器IP 定时器/计数器控制寄存器TCON 定时器/计数器工作模式寄存器TMOD 程序 代码 计算定时器初值 中断函数写法 相关寄存器 中断允许寄存器 ...

  10. 51单片机交通灯(定时器+38译码器+中断)

    51单片机交通灯这个实例主要用到的知识点有: >如何点亮LED >38译码器位选与段选 >定时器控制 >中断控制 #include <reg52.h>/****** ...

最新文章

  1. 前端思想实现:面向UI编程_____前端框架设计开发
  2. 【收藏清单】AI学习资料汇总——你想要的AI资源,这里都有
  3. Podman又是什么新技术?它和Docker有啥区别?
  4. android内存代码,Android内存优化(五) Lint代码扫描工具
  5. 第26讲:模拟登录爬取实战案例
  6. Android 基本测试工具的使用
  7. python cannot import name main_virtualenv: cannot import name 'main'
  8. java简单功能测试,java 自动化测试小功能集锦
  9. pythonfor循环是迭代器吗_[Python] 迭代器是什么?你每天在用的for循环都依赖它!...
  10. Star Schema完全参考手册读书笔记三
  11. 《原力计划【第二季】》第 6 周周榜揭晓!!!
  12. CF 460C Present 【DP+】主意
  13. 数字逻辑实验-交通灯控制设计
  14. 关于git的安装与配置问题
  15. 饥荒:进阶·放火烧树
  16. 泛微oa流程表单之取值弹窗
  17. 交互式机器学习/ 强化学习在图像领域中的应用
  18. 【Unity】Obi插件系列(一)—— 总览、Actors与Solvers
  19. 这是一篇假的回顾过去展望未来计划书
  20. 【textarea】按下回车发送消息不换行,怎么实现?

热门文章

  1. C++常见十六进制数组转换char数组方法
  2. 戴尔游匣g15 5515笔记本电脑g3060锐龙cpu版装入显卡驱动配置pytorch环境踩坑总结
  3. 论文笔记:《DeepGBM: A Deep Learning Framework Distilled by GBDT for Online Prediction Tasks》
  4. 一种基于颜色统计和特征指纹的图片相似度计算方法
  5. DDR3L和LPDDR3区别
  6. Unity HoloLens2 开发笔记(六):使用眼动追踪 追踪物体
  7. 爬虫01-requests的基本用法
  8. 4.9 朗斯基行列式
  9. 【Java设计模式】迭代器模式
  10. DSP_1 环境搭建