MCU-51:定时器

news2024/11/24 9:20:49

目录

  • 一、定时器介绍
    • 1.1 定时器的功能
    • 1.2 定时器的结构
    • 1.3 定时器框图
  • 二、定时器控制
    • 2.1 工作模式寄存器TMOD
    • 2.2 控制寄存器TCON
  • 三、中断系统
    • 3.1 中断系统介绍
    • 3.2 中断程序流程
    • 3.3 STC89C52中断资源
  • 四、应用
    • 4.1 定时器控制LED闪烁
    • 4.2 基于定时器按键控制LED流水灯
    • 4.3 定时器时钟

一、定时器介绍

1.1 定时器的功能

其实就是单片机的内部,通过系统时钟的每一个机器周期产生一个记数脉冲,即每一个机器周期计数器加一。
比如,这里我的实验板的晶振是12MHZ,1MHZ信号每个脉冲的持续时间为1us,如果定时器T0对1MHZ的信号进行计数,从0~65536us,当达到最大的65536us的时候,定时器计数达到最大值,会溢出,于是产生中断信号,向中断系统申请中断,中断系统接受中断请求,执行中断子程序。

1.2 定时器的结构

定时器的结构如下图所示,主要包括
1.两个定时器/计数器。T0和T1,每个定时器/计数器都是由两个8位的计数器所构成的16位计数器。
2.TCON 寄存器。TCON为控制寄存器,用来控制两个定时器/计数器的启动和停止。
3.TMOD寄存器。TMOD为工作方式控制寄存器,用来设置定时器/计数器的工作方式。

1.3 定时器框图

定时器在单片机内部就像一个小闹钟一样,根据时钟的输出信号,每隔“一秒”,计数单元的数值就增加一,当计数单元数值增加到“设定的闹钟提醒时间”时,计数单元就会向中断系统发出中断申请,产生“响铃提醒”,使程序跳转到中断服务函数中执行
在这里插入图片描述

二、定时器控制

2.1 工作模式寄存器TMOD

TMOD为工作方式控制寄存器,用来设置定时器/计数器的工作方式。如下图所示。
通过配置TMOD寄存器来对定时器T0和T1的工作模式进行控制。
注意这里TMOD的地址为89H,不可位寻址。
TMOD的高四位用于T1,低四位用于T0。
其中主要各位的功能:

C/-T,定时器/计数器的选择控制位。置0,为定时器模式,置1,为计数器模式。
M1和M0,模式选择控制位,通过对两位进行赋值,可以选择定时器的4种模式。00,模式0,13位计数器。01,模式1,16位计数器。10,模式2,自动重装8位计数器,11,模式3。
GATE,置1后,就可由TR0或TR1单独控制定时器。
在这里插入图片描述

2.2 控制寄存器TCON

TCON寄存器,地址为88H,可以字节寻址,也可位寻址。寄存器各位如下图所示。
其中各位的功能:

TF1(TF0)。定时器T1(T0)溢出标志位。当T1(T0)溢出时,硬件自动使TF1(TF0)置1,并且向cpu申请中断。当Cpu响应中断,进入中断服务子程序后,TF1(TF0)由硬件自动清0,当然也可以用软件写代码清0。

TR0(TR1)。定时器T1(T0)运行控制位,置1,定时器T1(T0)就开始运行,计数。

后面几个是外部中断控制位。
在这里插入图片描述

三、中断系统

定时器涉及中断系统,在这里简单的提一下

3.1 中断系统介绍

在这里插入图片描述

3.2 中断程序流程

在这里插入图片描述

3.3 STC89C52中断资源

中断源个数:8个(外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、定时器2中断、外部中断2、外部中断3)

中断优先级个数:4个

中断号:在这里插入图片描述
注意:中断的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的中断资源,例如中断源个数不同、中断优先级个数不同等等

四、应用

4.1 定时器控制LED闪烁

#include <REGX52.H>
void TImer0_Init()
{
	//TMOD=0x01;//0000 0001
	TMOD=TMOD&0xF0;//把TM0D的低四位清零,高四位保持不变
	TMOD=TMOD|0x01;//把TM0D的最低位置置1,高四位保持不变
	TF0=0;
	TR0=1;
	TH0=64535/256;
	TL0=64535%256;
	ET0=1;
	EA=1;
	PT0=0;
}
void main()
{ 
	TImer0_Init();
        while(1)
        {
        
         }
}

unsigned int T0Count;
void Timer0_Routine() interrupt 1
{
	TH0=64535/256;
	TL0=64535%256;
	T0Count++;
	if(T0Count>=1000)
	{
		T0Count=0;
	P2_0=~P2_0;
	}
}

4.2 基于定时器按键控制LED流水灯

main函数:

#include <REGX52.H>
#include "Timer0.h"
#include "Key.h"
#include <INTRINS.h>

unsigned char KeyNum,LEDMode;

void main()
{ 
	P2=0xFE;
	TImer0_Init();
        while(1)
        {
					KeyNum=Key();
					if(KeyNum)
					{
						if(KeyNum==1)
						{
							LEDMode++;
							if(LEDMode>=2)LEDMode=0;
						}
						
					}
        
         }
}


void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TL0=0x18;//设置定时初值
	TH0=0xFC;//设置定时初值
	T0Count++;
	if(T0Count>=500)
	{
		T0Count=0;
		if(LEDMode==0)
			P2=_crol_(P2,1);
		if(LEDMode==1)
			P2=_cror_(P2,1);
	}
}

Timer0.c函数

#include <REGX52.H>
//简介:定时器0初始化,1毫秒@12.000MHZ
void TImer0_Init()
{
	//TMOD=0x01;//0000 0001
	TMOD=TMOD&0xF0;//把TM0D的低四位清零,高四位保持不变
	TMOD=TMOD|0x01;//把TM0D的最低位置置1,高四位保持不变
	TL0=0x18;//设置定时初值
	TH0=0xFC;//设置定时初值
	TF0=0;//清除TF0标志
	TR0=1;//计时器0开始计时
	ET0=1;
	EA=1;
	PT0=0;
}

Delay.c

void Delay(unsigned int i)
{
	while(i--);
}


key.c函数

#include <REGX52.H>
#include "Delay.h"

unsigned char Key()
{
	unsigned char KeyNumber=0;
	if(P3_1==0)
	{
		Delay(20);while(P2_1==0);Delay(20);KeyNumber=1;
	}
  if(P3_0==0)
	{
		Delay(20);while(P2_0==0);Delay(20);KeyNumber=2;
	}
	if(P3_2==0)
	{
		Delay(20);while(P2_2==0);Delay(20);KeyNumber=3;
	}
	if(P3_3==0)
	{
		Delay(20);while(P2_3==0);Delay(20);KeyNumber=4;
	}
		
	return KeyNumber;
	
}

key.h函数

#ifndef __KEY_H__
#define __KEY_H__

unsigned char Key();

#endif

Timer0.h函数

#ifndef __TIMER0_H__
#define __TIMER0_H__

void TImer0_Init(void);

#endif

Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int i);

#endif

4.3 定时器时钟

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "Timer0.h"

unsigned char Sec,Min,Hour;
void main()
{ 
	LCD_Init();
	Timer0_Init();
	LCD_ShowString(1,1,"CLOCK:");
	LCD_ShowString(2,1,"  :  :");
        while(1)
        {
          LCD_ShowNum(2,1,Hour,2);
					LCD_ShowNum(2,4,Min,2);
					LCD_ShowNum(2,7,Sec,2);
					
         }
}

void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TL0=0x18;//设置定时初值
	TH0=0xFC;//设置定时初值
	T0Count++;
	if(T0Count>=1000)
	{
		T0Count=0;
	Sec++;
		if(Sec>=60)
		{
			Sec=0;
			Min++;
			if(Min>=60)
			{
				Min=0;
				Hour++;
				if(Hour>=24)
				{
					Hour=0;
				}
			}
		}
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116664.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C进阶 :征服指针之指针与数组强化笔试题练习(1)

目录 &#x1f63c;&#x1f638;一.彻底明白 sizeof 操作符 &#xff0c;数组名&#xff0c;strlen 函数 &#x1f405;1.数组名的意义 &#x1f406;2. sizeof 详解 &#x1f40b;3.strlen详解 &#x1f996;3.数组名意义详细图解演示 &#x1f431;&#x1f640;二.关于…

使用JDBC+javafx写一个简单功能齐全的图书管理系统

目录 1、JDBC的使用 2、对应包和Java文件的层级关系及对应的含义 3、数据库 4、相关代码 1&#xff09;、bookmanager包 Ⅰ、main函数 Ⅱ、utils包 Ⅲ、bean包 Ⅳ、controller包 2)resources(为资源文件包&#xff0c;可以看链接文章了解) Ⅰ、book包 Ⅱ、 login包…

嘘!P站数据分析年报;各省市疫情感染进度条;爱奇艺推出元宇宙App;You推出AI聊天机器人;GitHub今日热榜 | ShowMeAI资讯日报

&#x1f440;日报合辑 | &#x1f3a1;AI应用与工具大全 | &#x1f514;公众号资料下载 | &#x1f369;韩信子 &#x1f4e2; 『The 2022 Year in Review』P站2022年度报告 Pornhub 发布了第 9 次年度报告&#xff0c;数据科学家们绘制了多张彩色可视化图表&#xff0c;回顾…

Spring注册Bean系列--方法3:@Import+@Bean

原文网址&#xff1a;Spring注册Bean系列--方法3&#xff1a;ImportBean_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Spring注册Bean的方法&#xff1a;ImportBean。 注册Bean的方法我写了一个系列&#xff0c;见&#xff1a;Spring注册Bean(提供Bean)系列--方法大全_IT利刃出鞘…

Redis-SDS

本文你能得到&#xff1a; 1 SDS基本介绍 。 2 SDS与 C语言传统字符串的区别&#xff0c;为什么使用SDS。 3 SDS的结构和策略详解。 1 SDS 是什么&#xff1f;用来做什么&#xff1f; 1.1 ​ Redis没有直接使用C语言传统的字符串表示&#xff08;以空字符结尾的字符数组&a…

[网络工程师]-STP

生成树协议&#xff08;Spanning Tree Protocol&#xff0c;STP&#xff09;是一种链路管理协议&#xff0c;为网络提供路径冗余&#xff0c;同时防止产生环路。交换机之间使用网桥协议数据单元&#xff08;Bridge Protocol Data Unit&#xff0c;BPDU&#xff09;来交换STP信息…

C语言中单井号(#)和双井号(##)在宏语句中的应用

在阅读Linux内核代码过程中&#xff0c;特别是一些预处理指令宏的时候&#xff0c;会看到宏语句里会包含一些# 或者是连着的## 符号&#xff0c;刚接触的时候觉得很一头雾水&#xff0c;但这些宏语句有时候绕不开&#xff0c;所以为了更好地读懂这些代码&#xff0c;很有必要仔…

头豹研究院发布《2022年腾讯安全威胁情报能力中心分析报告》:助力企业掌握安全防御主动权

12月23日&#xff0c;头豹研究院发布了《2022年腾讯安全威胁情报能力中心分析报告》&#xff08;以下简称《报告》&#xff09;&#xff0c;深度研究了腾讯安全威胁情报能力建设、威胁情报能力应用、威胁情报价值实践方面的现状及成果&#xff0c;从专业视角分析腾讯安全威胁情…

全网首发!华为云UCS正式商用

日前&#xff0c;华为云UCS正式商用。华为云UCS是业界首个分布式云原生服务&#xff0c;支持对华为云集群、伙伴云集群、多云集群、本地集群和附着集群的统一管理&#xff0c;覆盖中心Region、专有Region、边缘云、客户数据中心和第三方云场景&#xff0c;提供无处不在的云原生…

深度学习02:损失函数总结

目录 nn.L1Loss: nn.NLLLoss: nn.MSELoss: nn.CrossEntropyLoss: 损失函数是用来估量模型的预测值与真实值的不一致程度&#xff0c;它是一个非负实值函数。我们训练模型的过程&#xff0c;就是通过不断的迭代计算&#xff0c;使用梯度下降的优化算法&#xff0c;使得损失函…

Day 05- Vue3 Vue2响应式原理

Vue2的响应式 核心&#xff1a;通过 Object.defineProtytype() 对对象的已有属性值的读取和修改进行劫持&#xff1b; 数据劫持 --> 给对象扩展属性 --> 属性设置 实现原理&#xff1a; 对象类型&#xff1a;通过Object.defineProperty()对属性的读取、修改进行拦截…

风控黑名单库的使用与判断指南

反欺诈策略中有一类策略是专门针对黑名单用户的&#xff0c;我们称之为黑名单命中策略。 一、黑名单定义 黑名单是对严重逾期、骗贷、失联、诈骗等系列高风险客群构建的名单&#xff0c;即为明确非意向客群的名单。黑名单也是反欺诈的第一道防线&#xff0c;可以有效识别黑产客…

近些年大火的零信任,落地情况怎么样?

疫情以来      居家办公、远程工作需求激增      企业IT环境变得更加复杂      在此背景下      以“持续验证,永不信任”为核心的      零信任火爆出圈      引得国内外企业机构纷纷布局      然而根据戴尔2022全球数据保护指数(GDPI),尽管91%的组…

使用FFmpeg+go搭建m3u8点播服务器

一. 前言 HLS&#xff08;HTTP Live Streaming&#xff09; 是苹果公司提出的基于 HTTP 的流媒体传输协议&#xff0c;它的工作原理是将整个文件切分成一个个小的文件&#xff08;通常是 TS 格式文件&#xff09;&#xff0c;客户端通过 HTTP 下载播放。在准备播放某个 m3u8 媒…

Linux系统运行时参数命令--Linux基础命令和工具

目录 1 Linux基础命令和工具 1.1 grep搜索字符 1.2 find查找文件 1.3 ls显示文件 1.4 wc命令 1.5 ulimit用户资源 1.6 scp远程拷贝 1.7 dos2unix和unix2dos 1.8 sed 行处理 简单模式 替换模式 1.9 awk 列处理 C/CLinux服务器开发/后台架构师【零声教育】-学习视频…

车载软件架构—CP和AP相同与不同

文章目录 前言一、两者不同之处二、两者架构设计原则总结前言 AUTOSAR(AUTmotive Open System ARchitecture) 是汽车电子E/E系统发展的一个重要的节点。该标准是由包括BMW、DAIMLER、GM、TOYOTA、福特等主机厂和包括博世、大陆等供应商牵头成立的一个标准发展组织定义的一个开…

45页智慧交通数字化解决方案2022

【版权声明】本资料来源网络&#xff0c;仅用于行业知识分享&#xff0c;供个人学习参考&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间进行删除&#xff01; 完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 项目建设目标…

RabbitMQ简单模式

&#x1f341;博客主页&#xff1a;&#x1f449;不会压弯的小飞侠 ✨欢迎关注&#xff1a;&#x1f449;点赞&#x1f44d;收藏⭐留言✒ ✨系列专栏&#xff1a;&#x1f449;Linux专栏 &#x1f525;欢迎大佬指正&#xff0c;一起学习&#xff01;一起加油&#xff01; 目录&…

20 个常用的 pandas 使用技巧

大家好&#xff0c;我是小寒。 今天来分享 20 个常用的 pandas 使用技巧。如果觉得不错&#xff0c;点赞、转发安排起来。 1、以 Markdown 格式输出 DataFrame import pandas as pddf pd.DataFrame({a: [1, 2, 3, 4],b: [5, 6, 7, 8]})# You can control the printing of th…

ATAC-seq分析:教程简介(1)

简介 本课程[1]介绍 Bioconductor 中的 ATACseq 分析。 该课程由 2 个部分组成。这将引导您完成正常 ATACseq 分析工作流程的每个步骤。它涵盖比对、QC、peak calling、基因组富集测试、基序富集和差异可及性测试。 环境准备 IGV IGV 可以从 BROAD 网站安装。 》 https://www.b…