51单片机的定时器/计数器及编程
本文简单阐述了怎么使用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单片机的定时器/计数器及编程相关推荐
- 【51单片机】定时器/计数器的工作原理和结构(一)
[51单片机]定时器/计数器的工作原理和结构 回看下单片机中断系统内部结构: 分析内部中断触发: 先看图 TCON:和外部中断相比少了IT位设置触发方式 :1跳沿触发 0电平触发:此处我的理解是:就好 ...
- 51单片机之定时器\计数器的工作原理
51单片机之定时器\计数器的工作原理 定时器/计数器的结构: 何时处于计数器方式?何时处于定时器方式? TCON和TMOD特殊功能寄存器: 定时器/计数器工作方式: 方式0:13位的定时器/计数器 方 ...
- 51单片机笔记:定时器/计数器
单片机笔记 定时器/计数器 定时器/计数器的结构 AT89S51内部两个16位定时器/计数器:T0(P3.4),T1(P3.5),定时器/计数器T0由特殊寄存器TH0,TL0构成,T1由特殊功能寄存器 ...
- 六、51单片机之定时器/计数器_理论
1.什么是定时器.计数器 定时器就是单片机设定一个时间间隔,时间间隔到后通知单片机.例如设置100ms的定时器,100ms后定时器通知单片机时间到了. (1)定时器是单片机的一种内部外设.(以前的单片 ...
- 51单片机之定时器/计数器应用实例(方式0、1、2、3)
硬件:STC89C52RC 开发工具:Keil uVision4 对于刚接触单片机的同学来说可能会对定时器/计数器的应用很蒙圈,特别是初值的计算和各种定时方式的选择.下面希望能给你带来一个清晰的思路. ...
- 51单片机内部定时器/计数器实验
51单片机内部定时器/计数器实验 一.实验内容 使用MCS-51内部定时/计数器,定时1秒钟,CPU运用定时中断方式,实现每1秒钟输出状态发生一次反转,即发光管每隔1秒钟亮一次(P1.7接LED). ...
- 51单片机计算定时器初值
51单片机计算定时器初值 前言 理论分析 工作方式寄存器 TMOD GATE 门控位 C/T' 计数器模式和定时器模式选择位 M1 M0 工作方式选择位 定时器/计数器控制寄存器 TCON TCON补 ...
- 51单片机学习--定时器--中断--串口通信
51单片机学习–定时器–中断–串口通信 定时器–中断–串口通信 中断分类 定时器中断 外部中断 串口中断 基本概念 对于单片机来讲, 中断是指 CPU 在处理某一事件 A 时, 发生了另一事件 B, ...
- 51单片机的定时/计数器
51单片机的定时/计数器 实现LED灯闪烁,代码如下: #include <reg51.h> //51单片机头文件 sbit LED = P0^0; //定义特殊寄存器p0.0;注意:sb ...
- (六)51单片机基础——定时器
定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成. 定时器主要作用: 用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作. 替代长时间的Dela ...
最新文章
- win10红色警戒黑屏解决
- C#编程概念系列(一):面向对象编程
- BZOJ 1269: [AHOI2006]文本编辑器editor Splay
- 【线上分享】华为云视频的Cloud Native实践
- 前端人职场发展的 6 个方向
- OpenCV中Mat属性step,size,step1,elemSize,elemSize1
- [大数据行业应用发展前景分析] 阿里潘永花报告:大数据产业将成为新的煤和石油介绍...
- py导入包异常跳出_Python:尝试从导入的包导入模块时出现“ModuleNotFoundError”
- linux下tools.jar,Linux android studio :'tools.jar' seems to be not in Android Studio classpath.
- 最佳深度学习书单(从零到深度学习工程师)
- 二分法04:猜数字大小
- IDEA删除文件如何恢复
- 数据压缩作业:JPEG原理分析及JPEG解码器的调试
- JavaScript 英文根据规则转成相对应的中文
- 【朋友圈点赞】测试场景(十一)
- ZZULIOJ: 1187: 棒棒糖(结构体专题)
- 【FeatherNets】《FeatherNets:Convolutional Neural Networks as Light as Feather for Face Anti-spoofing》
- C语言笔记-10-函数空间-函数概念与规则
- 可爱猫+python3+Flask+aiohttp简单搭建微信机器人
- 李嘉诚拥有8500亿资产,财富早已超过比尔盖茨,为何要藏富呢?
热门文章
- 云原生时代的镜像分发工具——Dragonfly简介
- 【vue】微信sdk中接口和标签本地调试
- 浅析API网关——Ocelot[网关]+Consul[服务发现负载均衡]+Polly[服务熔断]+Ids4[服务认证]
- Windows 10微软拼音中添加自定义短语
- git提交错分支怎么办
- 冒泡排序 - 数据结构和算法88
- 如何查看计算机关机事件,深度技术win7系统如何查看电脑的开关机时间【图文】...
- win7休眠开启与关闭
- 桌面计算机休眠快捷键,Win7怎么在桌面创建休眠快捷方式|win7休眠快捷键
- 菜菜的刷题日记 | 215. 数组中的第K个最大元素