MCU 51-3定时器
51定时/计数器简介
51单片机有2个16位定时器/计数器:定时器0(T0为P3.4)和定时器1(T1为P3.5)。这里所说的16位是指定时/计数器内部分别有16位的计数寄存器。
当工作在定时模式时,每经过一个机器周期内部的16位计数寄存器的值就会加1,当这个寄存器装满时溢出。 我们可以算出工作在定时模式时最高单次定时时间为 65535*1.085us=时间(单位us)
当工作在计数器模式时,T0(P3.4引脚),T1(P3.5引脚) 每来一个脉冲计数寄存器加1
定时器作用:可以用于精确事件定时,PWM脉宽调制,波形发生,信号时序测量的方面。
使用51定时/计数器步骤
(1)启动定时/计数器(通过TCON控制器)
(2)设置定时/计数器工作模式(通过TMOD控制器)
(3)查询定时/计数器是否溢出(读TCON内TF位)
51定时/计数器控制寄存器
TF1(T1溢出标志位):当定时/计数器T1溢出时由硬件置“1”TF1,向CPU发出中断请求,一直保持到CPU响应时,才由硬件清“0”(TF1也可以由程序查询清“0”)
TR1(定时器T1运行控制位):该位由软件置“1”或清零。TR1= 1就允许T1开始计数TR1=0时禁止T1计数。
TF0(T0溢出标志位)
TR0(定时器T0运行控制位),配置方法与T1相同。
IE1、IT1、IE0、IT0与定时/计数器无关,是控制外部中断的。
51定时/计数器工作模式寄存器(不可位寻址)
bit7 控制T1,置“1”时只有在P3.3脚为高及TR1置“1”时才可以启动T1,置“0”时TR1为“1”就允许T1启动。
bit6 置“1”时T1做计数器,置“0”时T1做定时器。
当工作在计数器模式时,T0(P3.4引脚),T1(P3.5引脚) 每来一个脉冲计数寄存器加1
bit5~4 M1 M0
M1 = 0,M0 = 0时 工作模式0。13位定时器模式,这是为了与8048兼容而设计的。16位计数器只用了13位,即TH0的高8位和TL0的低5位,组成一个13位定时器/计数器。
M1 = 0,M0 = 1,工作模式1 此时由TH1、TL1寄存器组成16位计数器,TH1 为16位的高8位,TL1为16位的低8位,当这个16位计数 器加满时,T1溢出。TF1被硬件置“1”。
M1 = 1,M0 = 0,工作模式2,时8位自动重装定时器,当TL1溢 出时,将TH1的值自动装入到TL1中,TF1被硬件置“1”。
M1 = 1,M0 = 1,工作模式3,T1停止计数。
bit3~0 设置T0定时器的,和T1设置相同(除工作模式3)
定时器1:
/*定时器1,定时模式 工作模式1 16位计数器,
定时20秒后点亮LED1,数码管显示*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit we = P2^;
sbit du = P2^; uchar code leddata[]={ 0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
0x00 //自定义 }; void delay(uint z)
{
uint x,y;
for(x = z; x > ; x--)
for(y = ; y > ; y--);
} void display(uchar i)
{
uchar shi, ge;
shi = i / ;//求模 i除以10取商的整数部分
ge = i % ;//求余 i除以10取余数部分 P0 = 0xff; //清除断码
we = ;//打开位选
P0 = 0xfe;//1111 1110 只选通第一位数码管
we = ; //关闭位选 du = ; //打开段选
P0 = leddata[shi];
du = ; //关闭段选
delay();//延时5毫秒 P0 = 0xff;//清除断码
we = ; //打开位选
P0 = 0xfd;//1111 1101 只选通第二位数码管
we = ; //关闭位选 du = ;//打开段选
P0 = leddata[ge];
du = ; //关闭段选
delay();//延时5毫秒
} void main()
{
uchar a; //50次数计数
uchar b;//秒计数
TR1 = ;//启动T1
TMOD = 0x10;//T1为定时器,工作模式1 16位计数器
//在初值基础上加,溢出则定时时间到
//晶振是11.0592MHz 65535-(50 000/1.085)==0x4BFC
TH1 = 0x4b;
TL1 = 0xfc;//0x4bfc 定时50ms
while()
{
if(TF1 == )//判断T1是否溢出
{
TH1 = 0x4b;
TL1 = 0xfc;//0x4bfc 定时50ms
TF1 = ;//清零便于下次判断
a++;//50毫秒计数加1
}
if(a == )//判断是否到1秒
{
a = ;//清零便于下次记录50ms的次数
b++;//秒加1
}
if(b == )//检查是否到20秒
{
TR1 = ;//时间到关闭定时器1
P1 = 0xfe;//点亮LED1
} display(b);//显示秒的值
}
}
定时器0:
/*定时器0,定时模式 工作模式1 16位计数器,
定时20秒后点亮LED2,数码管显示*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit we = P2^;
sbit du = P2^; uchar code leddata[]={ 0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
0x00 //自定义 }; void delay(uint z)
{
uint x,y;
for(x = z; x > ; x--)
for(y = ; y > ; y--);
} void display(uchar i)
{
uchar shi, ge;
shi = i / ;//求模 i除以10取商的整数部分
ge = i % ;//求余 i除以10取余数部分 P0 = 0xff; //清除断码
we = ;//打开位选
P0 = 0xfb;//1111 1011 只选通第三位数码管
we = ; //关闭位选 du = ; //打开段选
P0 = leddata[shi];
du = ; //关闭段选
delay();//延时5毫秒 P0 = 0xff;//清除断码
we = ; //打开位选
P0 = 0xf7;//1111 0111 只选通第四位数码管
we = ; //关闭位选 du = ;//打开段选
P0 = leddata[ge];
du = ; //关闭段选
delay();//延时5毫秒
} void main()
{
uchar a; //50次数计数
uchar b;//秒计数
TR0 = ;//启动T0
TMOD = 0x01;//T0为定时器,工作模式1 16位计数器
TH0 = 0x4b;
TL0 = 0xfc;//0x4bfc 定时50ms
while()
{
if(TF0 == )//判断T0是否溢出
{
TH0 = 0x4b;
TL0 = 0xfc;//0x4bfc 定时50ms
TF0 = ;//清零便于下次判断
a++;//50毫秒计数加1
}
if(a == )//判断是否到1秒
{
a = ;//清零便于下次记录50ms的次数
b++;//秒加1
}
if(b == )//检查是否到20秒
{
TR0 = ;//时间到关闭定时器1
P1 = 0xfd;//点亮LED2
} display(b);//显示秒的值
}
}
定时器1做计数器,定时器0定时:
/*定时器1做计数器,工作模式2,使用定时器0让LED1小灯100毫秒闪烁一次,
定时器1记录LED1闪烁次数,并且用数码管实时显示计数数值。*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit we = P2^;
sbit du = P2^;
sbit LED1 = P1^; uchar code leddata[]={ 0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
0x00 //自定义 }; void delay(uint z)
{
uint x,y;
for(x = z; x > ; x--)
for(y = ; y > ; y--);
} void display(uchar i)
{
uchar bai, shi, ge;
bai = i / ; //显示百位
shi = i % / ; //显示十位
ge = i % ;//显示个位 P0 = 0xff; //清除断码
we = ;//打开位选
P0 = 0xfe;//1111 1110
we = ; //关闭位选 du = ; //打开段选
P0 = leddata[bai];
du = ; //关闭段选
delay();//延时5毫秒 P0 = 0xff;//清除断码
we = ; //打开位选
P0 = 0xfd;//1111 1101
we = ; //关闭位选 du = ;//打开段选
P0 = leddata[shi];
du = ; //关闭段选
delay();//延时5毫秒 P0 = 0xff;//清除断码
we = ; //打开位选
P0 = 0xfb;//1111 1011
we = ; //关闭位选 du = ;//打开段选
P0 = leddata[ge];
du = ; //关闭段选
delay();//延时5毫秒
} void main()
{
uchar a; //50次数计数
TR0 = ;//启动T0
TR1 = ;//启动T1
TMOD = 0x61;//T0为定时器,工作模式1 16位计数器,T1为计数器,工作模式2,8位自动重装
TH0 = 0x4b;
TL0 = 0xfc;//0x4bfc 定时50ms
//P3.5来一个脉冲,计数器T1就会自动加1,这里的脉冲应是LED管脚处的脉冲,需要进行串联这两个引脚
TH1 = 0;//8位自动重装,TL1加到255后,会把TH1的0值装载到TL1里面
TL1 = ;//当TL1溢出时自动装入TH1的值
while()
{
if(TF0 == )//判断T0是否溢出
{
TH0 = 0x4b;
TL0 = 0xfc;//0x4bfc 定时50ms
TF0 = ;//清零便于下次判断
a++;//50毫秒计数加1
}
if(a == )//判断是否到100毫秒
{
a = ;//清零便于下次记录50ms的次数
LED1 = ~LED1;//闪烁LED1
}
display(TL1);//显示T1计数值
}
}
MCU 51-3定时器的更多相关文章
- 51单片机定时器实现LED闪烁
要启用一个定时器,先要开启定时器,然后产生中断 系统中断: 初始化程序应完成如下工作: 对TMOD赋值,以确定T0和T1的工作方式. 计算初值,并将其写入TH0.TL0或TH1.TL1. 中断方式时, ...
- MCU & 51单片机
- STM32学习笔记(五)——通用定时器计数延时
STM32定时器概述 STM32F40x系列总共最多有14个定时器,定时器分为三类:基本定时器.通用定时器和高级定时器.它们的都是通过计数来达到定时的目的,和51的定时器差不多,基本原理都是一样的,就 ...
- STM32通用定时器实现LED灯闪烁
刚才看了一下STM32通用定时器的教程,其实和51的定时器使用差不多.只是因为32的时钟更复杂,可操控的寄存器更多,所以写的时候可能更复杂. 使用通用定时器中断的一般步骤:1.使能定时器时钟 这个需要 ...
- 第32章 TIM—高级定时器—零死角玩转STM32-F429系列
第32章 TIM—高级定时器 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...
- 痞子衡嵌入式:嵌入式MCU中通用的三重中断控制设计
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是嵌入式MCU中通用的三重中断控制设计. 我们知道在 MCU 裸机中程序代码之所以能完成多任务并行实时处理功能,其实主要是靠中断来调度的, ...
- [Beautifulzzzz的博客目录] 快速索引点这儿O(∩_∩)O~~,红色标记的是不错的(⊙o⊙)哦~
3D相关开发 [direct-X] 1.direct-X最小框架 [OpenGL] 1.环境搭建及最小系统 [OpenGL] 2.企业版VC6.0自带的Win32-OpenGL工程浅析 51单片机 [ ...
- Ubuntu LTS 系统学习使用体会和实用工具软件汇总 6.04 8.04 10.04 12.04 14.04 16.04
Ubuntu LTS 系统学习体会和工具软件汇总 6.04 8.04 10.04 12.04 14.04 16.04 ubuntu入门必备pdf:http://download.csdn.net/de ...
- uC/OS-III 时钟节拍,时间管理,时间片调度
uC/OS-III 时钟节拍,时间管理,时间片调度 时钟节拍 时钟节拍可谓是 uC/OS 操作系统的心脏,它若不跳动,整个系统都将会瘫痪. 时钟节拍就是操作系统的时基,操作系统要实现时间上的管理, ...
- uC/OS-III 时钟节拍(一)
时钟节拍就是操作系统的时基,操作系统要实现时间上的管理,必须依赖于时基(时基即时间基准,操作系统的基准时钟). uC/OS-III时钟节拍的实现过程 时钟节拍就是系统以固定的频率产生中断(时基中断), ...
随机推荐
- Python类中装饰器classmethod,staticmethod,property,
@classmethod 有的时候在类中会有一种情况,就是这个方法并不需要使用每一个对象属性 因此 这个方法中的self参数一个完全无用的参数,使用classmethod class A: __cou ...
- 基于移动最小二乘法的点云曲面拟合(python)
1.移动最小二乘法介绍 为了更好地对数据量大且形状复杂的离散数据进行拟合,曾清红等人[1]开发出一种新的算法——移动最小二乘法.这种新的最小二乘算法为点云数据的处理提供了新的方法.使用点云数据拟合曲面 ...
- 面试:在面试中关于List(ArrayList、LinkedList)集合会怎么问呢?你该如何回答呢?
前言 在一开始基础面的时候,很多面试官可能会问List集合一些基础知识,比如: ArrayList默认大小是多少,是如何扩容的? ArrayList和LinkedList的底层数据结构是什么? Arr ...
- (十一)Maven之profile实现多环境配置动态切换
原文链接:https://www.cnblogs.com/zeng1994/p/a442108012ffd6a97b22c63055b48fe9.html 一.多环境配置文件的放置 将不同环境下的配 ...
- 049.Kubernetes集群管理-集群监控Metrics
一 集群监控 1.1 Metrics Kubernetes的早期版本依靠Heapster来实现完整的性能数据采集和监控功能,Kubernetes从1.8版本开始,性能数据开始以Metrics API的 ...
- 【JMeter_05】创建第一个简单的接口脚本
聚合数据:提供了很多开放的API,可以去练习使用https://www.juhe.cn/ 如果有小伙伴对HTTP协议不是很了解,可以看下这里 http://home.ustc.edu.cn/~xie1 ...
- Centos7 composer安装时 Warning: This development build of composer is over 60 days old. It is recommended to update it by running "/usr/bin/composer self-update" to get the latest version.
emmm,其实就是想让你运行一下/usr/bin/composer self-update这个命令更新一下
- Java学习笔记6(集合类)
集合类 集合按照其存储结构可以分为两大类,即单列集合Collection和双列集合Map. Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,有List和Set两个重要子接口 ...
- docker安装mysql,设置mysql初始密码
docker安装mysql,只需要2分钟就可以完成 docker search mysql 拉取mysql镜像(https://hub.docker.com/_/mysql) docker pull ...
- Spring学习笔记下载
动力节点的spring视频教程相当的经典:下载地址 https://pan.baidu.com/s/1eTSOaae