本文简单阐述了怎么使用51的定时器/计数器。
如果不在意细节,可以直接看“五、应用实例”。

一、原理(简略)

​ 定时器/计数器实质是加1计数器,该计数器由两个寄存器存储着计数的值(每一个有8位),将其称之为高8位、低8位寄存器;意即高8位、低8位的数值总和即为计数总和。

​ 当高8位、低8位寄存器全满时(即16位全为1,等同于216),若再计数一次,定时器/计数器会产生一次“溢出”,将高8位、低8位寄存器清0,并向单片机发生中断请求。所以只要设定了寄存器的初值,就可以控制啥时候溢出了。

​ 然而,什么时候计数一次呢?脉冲下降沿。而脉冲有两个来源:一是系统的时钟振荡器,二是T0或T1引脚输入的外部脉冲源。一般情况下,使用系统的时钟源即可满足需求。

二、寄存器

1.控制寄存器TCON

位: 7 6 5 4 3 2 1 0
字节地址:88H TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

各标志位功能如下:(仅讲4位与定时器有关的)

  • TF1——定时器1的溢出标志位。当加1计数器达到最大值时,则在下一次脉冲时产生溢出,此时由硬件将TF1置1,发出中断请求;响应中断后,该位由硬件清0。【注:软件也可以对它进行操作】
  • TR1——定时器1的运行控制位。设定为1时,定时器开始工作;为0时,定时器停止工作。
  • TF0、TR0——分别是定时器0的溢出标志位、运行控制位,功能与上述相同。

2.工作方式寄存器TMOD

位: 7 6 5 4 3 2 1 0
字节地址:89H GATE C/T M1 M0 GATE C/T M1 M0

各标志位功能如下:(低4位控制T0,高4位控制T1;此处仅以高4位为例)

  • GATE——门控位。设定为0时,定时器/计数器T1的运行启动仅受TCON的TR1控制;为1时,不但需要TR1=1,还需要外部引脚INT0=1。
  • C/T——工作模式选择位。设定为0时,T1是定时器;为1时,T1是计数器。
  • M1、M0——工作方式控制位。设定为00,对应方式0;为01,则方式1;为10,则方式2;为11,则方式3。

3.加1计数器的寄存器THx和TLx

  • TH0、TL0是T0的计数器,TH1、TL1是T1的计数器。TH是高8位,TL是低8位。
  • 当我们需要设定初值时,就可以对THx和TLx进行赋值,而后定时器/计数器会从这个值开始累加,直至216

三、如何设定初值

由于常使用工作方式1,所以下面以T0为例,展示在工作方式1的情况下如何设定初值。

  • 计数器模式:

    设初值为X、计算次数为M,则
    X=65536−MX=65536-M X=65536−M

  • 定时器模式:

    设初值为X、定时为t微秒,时钟频率为f MHz、时钟周期为T微秒(12分频后,T=12/f),则
    X=65536−t/T=65536−t∗f/12X=65536-t/T=65536-t*f/12 X=65536−t/T=65536−t∗f/12

放入数值:
//提示:2的8次方等于256
TH0=X/256;
TL0=X%256;

四、定时器/计数器的编程(使用中断)

初始化

//使用T1
TMOD=0x10;  //GATE=0,C/T=0,工作方式为1

赋初值

//想要计数50000次,则设定初值为15536
TH1=15536/256;
TL1=15536%256;

开中断

EA=1;   //总中断
EX0=1;  //开定时器中断
TR1=1; //使能定时器

写中断服务程序

void time() interrupt 1      //1是定时器T0中断序号
{write something
}

五、应用实例

利用中断、定时器,实现精准延时1s和延时t s,让LED每2s取反一次:

/*功能:通过中断延时,令LED1的闪烁间隔为2s。(使用T0)*/#include <reg52.h>
#define uint unsigned intsbit led1=P1^0;
uint num=0;/**函数功能:精准延时1s**/
void delay_1s(){while(num<=20);num=0;
}/**函数功能:精准延时。单位:s**/
void delay(uint t){while(num<=20*t);num=0;
}/**函数功能:初始化T0**/
void init_T0(){TMOD=0x01;  //受TR0控制、定时器、方式1//想要计数50000次,则设定初值为19456(f=11.059)TH0=19456/256;TL0=19456%256;}void main()
{   init_T0();led1=0;EA=1;    //开总中断ET0=1;   //开定时器中断TR0=1;     //使能定时器while(1){delay(1);delay_1s();led1=~led1;}
}void time() interrupt 1        //T0中断序号为1
{num++;
}

51单片机的定时器/计数器及编程相关推荐

  1. 【51单片机】定时器/计数器的工作原理和结构(一)

    [51单片机]定时器/计数器的工作原理和结构 回看下单片机中断系统内部结构: 分析内部中断触发: 先看图 TCON:和外部中断相比少了IT位设置触发方式 :1跳沿触发 0电平触发:此处我的理解是:就好 ...

  2. 51单片机之定时器\计数器的工作原理

    51单片机之定时器\计数器的工作原理 定时器/计数器的结构: 何时处于计数器方式?何时处于定时器方式? TCON和TMOD特殊功能寄存器: 定时器/计数器工作方式: 方式0:13位的定时器/计数器 方 ...

  3. 51单片机笔记:定时器/计数器

    单片机笔记 定时器/计数器 定时器/计数器的结构 AT89S51内部两个16位定时器/计数器:T0(P3.4),T1(P3.5),定时器/计数器T0由特殊寄存器TH0,TL0构成,T1由特殊功能寄存器 ...

  4. 六、51单片机之定时器/计数器_理论

    1.什么是定时器.计数器 定时器就是单片机设定一个时间间隔,时间间隔到后通知单片机.例如设置100ms的定时器,100ms后定时器通知单片机时间到了. (1)定时器是单片机的一种内部外设.(以前的单片 ...

  5. 51单片机之定时器/计数器应用实例(方式0、1、2、3)

    硬件:STC89C52RC 开发工具:Keil uVision4 对于刚接触单片机的同学来说可能会对定时器/计数器的应用很蒙圈,特别是初值的计算和各种定时方式的选择.下面希望能给你带来一个清晰的思路. ...

  6. 51单片机内部定时器/计数器实验

    51单片机内部定时器/计数器实验 一.实验内容 使用MCS-51内部定时/计数器,定时1秒钟,CPU运用定时中断方式,实现每1秒钟输出状态发生一次反转,即发光管每隔1秒钟亮一次(P1.7接LED). ...

  7. 51单片机计算定时器初值

    51单片机计算定时器初值 前言 理论分析 工作方式寄存器 TMOD GATE 门控位 C/T' 计数器模式和定时器模式选择位 M1 M0 工作方式选择位 定时器/计数器控制寄存器 TCON TCON补 ...

  8. 51单片机学习--定时器--中断--串口通信

    51单片机学习–定时器–中断–串口通信 定时器–中断–串口通信 中断分类 定时器中断 外部中断 串口中断 基本概念 对于单片机来讲, 中断是指 CPU 在处理某一事件 A 时, 发生了另一事件 B, ...

  9. 51单片机的定时/计数器

    51单片机的定时/计数器 实现LED灯闪烁,代码如下: #include <reg51.h> //51单片机头文件 sbit LED = P0^0; //定义特殊寄存器p0.0;注意:sb ...

  10. (六)51单片机基础——定时器

    定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成. 定时器主要作用: 用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作. 替代长时间的Dela ...

最新文章

  1. win10红色警戒黑屏解决
  2. C#编程概念系列(一):面向对象编程
  3. BZOJ 1269: [AHOI2006]文本编辑器editor Splay
  4. 【线上分享】华为云视频的Cloud Native实践
  5. 前端人职场发展的 6 个方向
  6. OpenCV中Mat属性step,size,step1,elemSize,elemSize1
  7. [大数据行业应用发展前景分析] 阿里潘永花报告:大数据产业将成为新的煤和石油介绍...
  8. py导入包异常跳出_Python:尝试从导入的包导入模块时出现“ModuleNotFoundError”
  9. linux下tools.jar,Linux android studio :'tools.jar' seems to be not in Android Studio classpath.
  10. 最佳深度学习书单(从零到深度学习工程师)
  11. 二分法04:猜数字大小
  12. IDEA删除文件如何恢复
  13. 数据压缩作业:JPEG原理分析及JPEG解码器的调试
  14. JavaScript 英文根据规则转成相对应的中文
  15. 【朋友圈点赞】测试场景(十一)
  16. ZZULIOJ: 1187: 棒棒糖(结构体专题)
  17. 【FeatherNets】《FeatherNets:Convolutional Neural Networks as Light as Feather for Face Anti-spoofing》
  18. C语言笔记-10-函数空间-函数概念与规则
  19. 可爱猫+python3+Flask+aiohttp简单搭建微信机器人
  20. 李嘉诚拥有8500亿资产,财富早已超过比尔盖茨,为何要藏富呢?

热门文章

  1. 云原生时代的镜像分发工具——Dragonfly简介
  2. 【vue】微信sdk中接口和标签本地调试
  3. 浅析API网关——Ocelot[网关]+Consul[服务发现负载均衡]+Polly[服务熔断]+Ids4[服务认证]
  4. Windows 10微软拼音中添加自定义短语
  5. git提交错分支怎么办
  6. 冒泡排序 - 数据结构和算法88
  7. 如何查看计算机关机事件,深度技术win7系统如何查看电脑的开关机时间【图文】...
  8. win7休眠开启与关闭
  9. 桌面计算机休眠快捷键,Win7怎么在桌面创建休眠快捷方式|win7休眠快捷键
  10. 菜菜的刷题日记 | 215. 数组中的第K个最大元素