毕业回馈-89c51之定时器/计数器(Timer/Count)
今天分享的是89c51系列单片机的内部资源定时器/计数器,在所有的嵌入式系统中都包含这两个内部功能。
首先先了解几个定时器/计数器相关的概念:
•时钟周期:时钟周期 T 是时序中最小的时间单位,具体计算的方法就是1/时钟源频率,(一般单片机采用的是11.0592mHz)
•机器周期:我们的单片机完成一个操作的最短时间。标准51单片机,一个机器周期是 12 个时钟周期,也就是 12/11059200 秒。
•定时器:当T/C工作在定时器时,对振荡源12分频的脉冲计数,即每个机器周期计数值加1,计数频率=当前单片机工作频率/12。当单片机工作在12MHz时,计数频率=1MHz,单片机每1us计数值加1。
•计数器:计数脉冲来自外部脉冲输入引脚 T0(P3.4)或T1(P3.5)。当T0或T1引 脚上负跳变时计数值加1。识别引脚上的负跳变需要2个机器周期,即24个振荡周期。所以T0或者T1 输入的可计数外部脉冲的最高频率为当前单片机工作频率/24。当单片机工作在12MHz时,最高计数频率 为500KHz,高于该频率将计数出错。
定时器/计数器所涉及到的寄存器如下:
其中TCON为定时器/计数器T0,T1的可控制及窜起,同时也锁存T0,T1溢出中断源和外部请求中断源等。
TCON寄存器可以进行位寻址
TCON中每一位的使用如下:
注:
TF1:定时器/计数器T1溢出标志。T1被允许计数以后,从初值开始加1计数。当最高位产生溢出时由硬件置‘1’TF1,向CPU发送中断请求,一直保持到CPU响应中断时,由硬件自动清零,当不执行中断时,也可以通过查询的方式对TF1标志位进行软件清零
TR1:定时器T1的运行控制位。由软件置位和清零。当GATE(TMOD.7)=0,TR1=1时就运行T1开始计数,TR1=0时禁止T1计数。当GATE(TMOD.7)=1,TR1=1且INTI外部输入高电平时,才允许T1计数
TF0:同TF1拥有两种清零方式
TMOD寄存器不可位寻址:
每一位的使用如下:
THx/TLx(x=0,1)介绍如下:
T/C是16位的,计数寄存器由TH高8位和TL低8位构成。
在特殊功能寄存器(SFR)中,
对应T/C0为TH0和TL0;
对应T/C1为TH1和TL1。
定时器/计数器的初始值通过TH1/TH0和TL1/TL0设置。
定时器模式介绍:
•模式 0(M1=0,M0=0),是8位计数器带32分频的预分频器。该模式下,定时器0配置为13位的计数器,由TL0的低5位和TH0的8位构成。TL0的低5位溢出向TH0进位,TH0计数溢出置位TCON中的溢出标志位TF0.
工作模式示意图:
•模式 1(M1=0,M0=1),是THn和TLn组成了一个16位的定时器,计数范围是0~65535,溢出后,只要不对THn和TLn重新赋值,则从0开始计数。(最常用的一种定时模式)
工作模式示意图:
•模式 2 (M1=1,M0=0),是8位自动重装载模式,只有TLn做加1计数,计数范围0~255,THn的值并不发生变化,而是保持原值,TLn溢出后,TFn就直接置1了,并且THn原先的值直接赋给TLn,然后TLn从新赋值的这个数字开始计数。 (常用于串口通信)
工作模式示意图:
•模式 3(M1=1,M0=1),两个8位计数器。对定时器1,在模式3时,定时器1停止计数,效果与将TR1设置为0相同。对于定时器0,此模式下定时器0的TL0及THO作为两个独立的8位计数器。模式3为了增加一个附加的8位定时器/计数器而提供的,使单片机具有三个定时器/计数器。
模式示意图以及对示意图的分析如下:
•1、TR0 和下边或门电路的结果要进行与运算,TR0 如果是 0 的话,与运算完了肯定是 0,所以如果要让定时器工作,那么 TR0 就必须置 1。
•2、这里的与门结果要想得到 1,那么前面的或门出来的结果必须也得是 1 才行。在 GATE 位为 1 的情况下,经过一个非门变成 0,或门电路结果要想是 1 的话,那 INT0 即 P3.2 引脚必须是 1 的情况下,这个时候定时器才会工作,而 INT0 引脚是 0 的情况下,定时器不工作, 这就是 GATE 位的作用。
•3、当 GATE 位为 0 的时候,经过一个非门会变成 1,那么不管 INT0 引脚是什么电平,经过或门电路后都肯定是 1,定时器就会工作。 4、要想让定时器工作,就是自动加 1,从图上看有两种方式,第一种方式是那个开关打 到上边的箭头,就是 C/T = 0 的时候,一个机器周期 TL 就会加 1 一次,当开关打到下边的箭 头,即 C/T =1 的时候,T0 引脚即 P3.4 引脚来一个脉冲,TL 就加 1 一次,这也就是计数器功能。
不同方式下单片机的最大定时间隔:
•公式:单片机的一个机器周期=12/工作频率。
•那么当前单片机的机器周期=12/12MHz=1us
•方式0 13位定时器最大定时器间隔=213 X 1us=8.192ms
•方式1 16位定时器最大定时器间隔=216 X 1us=65.536ms
•方式2 8位定时器最大定时器间隔=28 X 1us=256us
•假如需要50ms的定时,则需要选择方式1
定时器初值的计算:
•定时时间为50ms时:选择模式一
•那么设计数器初始值为t,同时机器周期为1us,
•即(65536-t)x 1us=50000us
•t=65536-50000
•那么
•TH0= (65536-50000 )/256
•TL0=(65536-50000)%256
实验案例:50msLED灯闪烁:
•50ms延时的定时器初值计算 (我们采用10ms一延时的方式)
•假设我们单片机的时钟源为12MHz,则机器周期T=1us
•设计数器的初值为t,采用方式一
•则(2^8-t)*1us=10000us 所以t=(2^8-1000)=(65536-10000)
•TH0=(65536-10000 )/256 =0xD8
TL0=(65536-10000)%256 =0XF0
电路原理图如下:
程序设计如下:
定时器初始化:
main函数如下:
源代码如下:
#include "51_Include.h"
void GPIO_Init(void);
void Timer_Init(void);
void main(void)
{
uint32 cnt=0;
delay(100);//等待系统上电稳定运行
GPIO_Init();//初始化GPIO端口功能
Timer_Init();//初始化定时器
while(1)
{
/***********************************************************
*本部分添加程序执行的内容,也可根据用户开发需要,将while循环去掉
************************************************************/
if (TF0 == 1) //判断定时器0是否溢出
{
TF0 = 0; //T0 溢出后,清零溢出标志
TH0 = 0xD8; //定时器重新赋初值
TL0 = 0xF0;
cnt++; //计数值自加1,没加一次代表计时10ms
if (cnt >= 50) //判断 T0 溢出是否达到100次即50*10=500ms=0.5s
{
cnt = 0; //达到50次后计数值清零,重新开始计数
led_1 = ~led_1; //LED 取反:0-->1、1-->0
}
}
}
}
/************************************************************
* 函数名:void GPIO_Init(void)
* 参 数:无
* 功 能:初始化IO口
* 作者:Mr.Wang
* 日期:2018-01-10
*************************************************************/
void GPIO_Init(void)
{
/***********************************************************
*本部分添加GPIO初始化执行的内容
************************************************************/
led_1=0;//初始化GPIO引脚为低电平
}
/************************************************************
* 函数名:void Timer_Init(void)
* 参 数:无
* 功 能:初始化Timer
* 作者:Mr.Wang
* 日期:2018-01-28
*************************************************************/
void Timer_Init(void)
{
TMOD=0X01;//设置定时器为模式一
TH0 = 0xD8;//装载初值 (65536-10000)/256=216=0xd8
TL0 = 0xf0;//装载初值 (65536-10000)%256=240=0xf0
TR0=1;//Timer开始计数
}
毕业回馈-89c51之定时器/计数器(Timer/Count)的更多相关文章
- 毕业回馈-89C51之GPIO使用(流水灯)
今天分享一个89c51制作的8位流水灯案例.使用Proteus仿真. 同上一遍文章不同.上一篇文章中对于GPIO操作主要是位操作,即sbit led1=P0^0;其中P0^0代表p0.0这个引脚,然后 ...
- 毕业回馈—89C51之GPIO使用
STC89C51系列单片机共有如下几类GPIO口: (1)P0.0-P0.7: 对应DIP40封装的39-32号引脚:P0口既可以作为输入/输出GPIO口,也可以作为地址/数据复用总线使用. a)P0 ...
- 毕业回馈-89C51之数码管的使用
7段码的数码管由7个LED等共同组成,根据公共端的不同有共阴和共阳之分.现在很多数码管在7段码的基础上加了一个.即dp,其内部结构如下图所示: 公共端为LED灯的阴极,所以为共阴极接法: 公共端为阳极 ...
- WinForm LED循环显示信息,使用定时器Threading.Timer
原文:WinForm LED循环显示信息,使用定时器Threading.Timer 这里用一个示例来演示timer如何使用.示例:LED屏幕显示描述:这个示例其实很简单,LED屏幕上显示3个信息: ...
- N76E003的定时器/计数器 0和1
定时器/计数器 0和1N76E003系列定时器/计数器 0和1是2个16位定时器/计数器.每个都是由两个8位的寄存器组成的16位计数寄存器. 对于定时器/计数器0,高8位寄存器是TH0. 低8位寄存器 ...
- 毕业回馈--89C51keil工程的创建
声明:毕业回馈类博客均为大学毕业前夕同同学共享内容.为了给大学做一个总结,报答母校的栽培,才发起这样一个活动. ******************************************** ...
- java web 项目中 简单定时器实现 Timer
java web 项目中 简单定时器实现 Timer 标签: Java定时器 2016-01-14 17:28 7070人阅读 评论(0) 收藏 举报 分类: JAVA(24) 版权声明:本文为博 ...
- MCS-51单片机的定时器/计数器概念
一.MCS-51单片机的定时器/计数器概念 单片机中,脉冲计数与时间之间的关系十分密切,每输入一个脉冲,计数器的值就会自动累加1,而花费的时间恰好是1微秒;只要相邻两个计数脉冲之间的时间间隔相等,则计 ...
- 传统定时器技术 Timer and TimerTask
本文为张孝祥java并发课程的学习笔记. java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks. 一个TimerTask实际上就是一个拥有run方法的类,需要定时 ...
随机推荐
- MongoDB系列五(地理空间索引与查询).
一.经纬度表示方式 MongoDB 中对经纬度的存储有着自己的一套规范(主要是为了可以在该字段上建立地理空间索引).包括两种方式,分别是 Legacy Coordinate Pairs (这个词实在不 ...
- [Leetcode] 220. Contains Duplicate III
Given an array of integers, find out whether there are two distinct indices i and j in the array suc ...
- SQL基础-----DDL
1 (My)SQL入门 这里用了(My)SQL这样的标题,目的是介绍标准SQL的同时,也将MySQL在标准SQL上的扩展一同介绍给读者. 2:SQL分类 SQL语句主要可以划分为以下3个类别 .DDL ...
- 一篇文章说透Nginx的rewrite模块
rewrite模块即ngx_http_rewrite_module模块,主要功能是改写请求URI,是Nginx默认安装的模块.rewrite模块会根据PCRE正则匹配重写URI,然后发起内部跳转再匹配 ...
- APP的宣传方式有哪些
APP应用已经成为了互联网不可缺少的话题,事实上,开发一款移动APP的成本不是很高,但是怎样以最低的成本得到最大的推广效果,这是企业和开发者都很关心的一个问题.下面,我们来探讨一下这个问题. 1.一款 ...
- mysql用limit时offset越大时间越长
首先说明一下MySQL的版本:mysql> select version();+-----------+| version() |+-----------+| 5.7.17 |+----- ...
- javascript实现双向数据绑定
双向数据绑定已经是面试中经常被问到的点,需要对原理和实现都要有一定了解. 下面是实现双向绑定的两种方法: 属性劫持 脏数据检查 一.属性劫持 主要是通过Object对象的defineProperty方 ...
- MySQL之存储过程和函数
存储过程和函数: 1.创建存储过程和函数: 存储过程: delimiter $$ create procedure proc_name() BEGIN 查询语句; // 记得加分号 END $$ de ...
- 十大面试难题解惑,看完秒杀一切 HR 面。程序员必读!
最能体现求职者能力的就是面试,能不能拿到Offer,取决于你面试时的表现,只有有准备才能在面试过程中游刃有余. 小编收集了10个面试官最爱提的问题,虽然题目千变万化,但是万变不离其宗,只要掌握了答题的 ...
- [Luogu 2817]宋荣子的城堡
Description saruka有一座大大的城堡!城堡里面有n个房间,每个房间上面都写着一个数字p[i].有一天,saruka邀请他的小伙伴LYL和 MagHSK来城堡里玩耍(为什么没有妹子),他 ...