【51单片机入门记录】定时器/计数器

news2025/2/1 16:49:25

目录

一、定时器/计数器概述

(1)实现定时功能的几种方法

(2)定时器和计数器的区别

(3)基本概念

二、定时器/计数器相关寄存器

(1)控制寄存器TCON(可位寻址)

(2)工作方式寄存器TMOD(不可位寻址)

(3)辅助寄存器AUXR

(4)计数器/定时器-计数(定时)寄存器

(5)中断控制寄存器

三、定时器/计数器寄存器配置(使用STC-ISP工具配置定时器)

定时器初始化代码

四、定时器例程

(1)例程1:使用中断系统→定时器操作LED流水灯。本例以外部中断0(上升沿中断/上升沿下降沿均可中断)为例,中断产生后将L6灯取反操作。

(2)例程2:解决按键时效不稳定的问题。本例以S7按键控制LE200ms为间隔D自动向左移位,S6按键控制LED200ms为间隔自动向右移位S5按键控制LED停止循环移位,S4按键关闭所有LED为例。


一、定时器/计数器概述

(1)实现定时功能的几种方法

  1. 软件定时:软件定时不占用硬件资源,但占用了CPU时间,降低了CPU的利用率
  2. 采用时基电路定时:例如采用555电路
  3. 采用可编程电路芯片定时:这种定时芯片的定时值及定时范围很容易用软件来确定和修改,此芯片定时功能强,使用灵活
  4. 单片机定时器、扩展定时器芯片:方便、精准

(2)定时器和计数器的区别

  • 计数的概念:假如有一个水杯(1000滴水正好能够装满),初始时已经有了500滴水,还需滴入500滴水才能将其装满,第501滴水时容器溢出。
  • 定时的概念(如果滴入1滴水的时间为1秒):还需500秒时间才能将其装满,第501秒时容器溢出

(3)基本概念

  • 定时器是对周期固定的脉冲信号进行计数(如MCU内部的系统时钟)
  • 计数器是对周期不确定的脉冲信号进行计数:如MCU的I/O引脚所引入的外部脉冲信号
  • 结论:定时器和计数器本质上都是计数器,定时器是计数器的一种特例

二、定时器/计数器相关寄存器

(1)控制寄存器TCON(可位寻址)

(2)工作方式寄存器TMOD(不可位寻址)

  • TMOD不可位寻址,意味着TMOD只可以进行整体赋值,而不能例如进行GOAT=0进行赋值
  • 自动装载,溢出后重新装置;不可重装载,溢出后停止
  • (在蓝桥杯的学习中)不涉及终端引脚,所以GOAT位一般设置为0;一般使用定时器,所以C/T位一般设置为0
  • 上电后,默认为0,只需操作控制寄存器即可进行计时

(3)辅助寄存器AUXR

STC15系列单片机是1T(即不存在机器周期)的8051单片机。(之前在使用8051单片机的时候,时钟系统是每12个系统时钟,8051才有一个机器周期)

(4)计数器/定时器-计数(定时)寄存器

  • 用于计数器/定时器的计数或定时
  • 定时器0:TL0定时器0低八位寄存器,TH0定时器0高八位寄存器
  • 定时器1:TL1、YH1是定时/计数器T1的低8位、高8被状态值寄存器
  • 定时器2:T2H、T2L是定时/计数器T2的高八位、低8位状态值寄存器
  • 计时器/定时器的初始值计算:THx,TLx=65536-SYSCLK*T(sysclk是系统时间频率,T是要计时的时间)

(5)中断控制寄存器

开放总中断→开放部分中断(ET1\ET0) 若将ET0置为1,允许T0向CPU申请中断

三、定时器/计数器寄存器配置(使用STC-ISP工具配置定时器)

定时器初始化代码

  • STC-ISP软件→定时器计算器
  • 选择使用的定时器、定时器模式、定时器时钟
  • 选择系统时钟频率(下载时是什么频率,时钟就设置什么频率)
  • 设置定时长度
  • 生成C代码(注意:此为仅定时器初始化代码且已开始计时,但并没有开启定时器中断允许、也没有开启总中断)

四、定时器例程

(1)例程1:使用中断系统→定时器操作LED流水灯。本例以外部中断0(上升沿中断/上升沿下降沿均可中断)为例,中断产生后将L6灯取反操作。
 

#include <STC15F2K60S2.H>

unsigned char LED = 1;
unsigned int LED_Refresh=0;

//函数声明区域
void Timer0Init(void);	//1毫秒@11.0592MHz

void main(void)
{
	
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
	Timer0Init();
	EA=1;ET0=1;
	
	while(1)
	{
		
	}
	
}

void Timer0(void) interrupt 1
{
	
	if(++LED_Refresh == 1000)
	{
		LED_Refresh = 0;
		P0=~(0X01<<LED);
		if(++LED == 9) LED=0;
	}
	
}

(2)例程2:解决按键时效不稳定的问题。本例以S7按键控制LE200ms为间隔D自动向左移位,S6按键控制LED200ms为间隔自动向右移位S5按键控制LED停止循环移位,S4按键关闭所有LED为例。

#include <STC15F2K60S2.H>
#include<intrins.h>

unsigned char LED = 0 ;
unsigned char S7_Flag = 0, S6_Flag = 0, S5_Flag = 0, S4_Flag = 0 ;
unsigned char LED_Flag = 0 ;
unsigned int LED_tt = 0 ;

void KeyScan(void);
void Timer0Init(void);
void Delay_MS(unsigned int MS);

void main(void)
{
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;	
	Timer0Init();
	EA=1;ET0=1;
	
	while(1)
	{
		KeyScan();
	
		if(S7_Flag == 1){ S7_Flag = 0 ; LED_Flag = 1 ; }
		if(S6_Flag == 1){ S6_Flag = 0 ; LED_Flag = 2 ; }
		if(S5_Flag == 1){ S5_Flag = 0 ; LED_Flag = 0 ; }
		if(S4_Flag == 1){ S4_Flag = 0 ; P0 = 0XFF ; }
	}
}

void Timer0(void) interrupt 1
{
	if(LED_Flag == 1)
	{
		if(++LED_tt >= 200)
		{
			LED_tt = 0 ;
			P0=~(0X01<<LED); 
			LED++;
			if(LED >= 8)LED = 0 ;
		}	
	}
	
	if(LED_Flag == 2)
	{
		if(++LED_tt >= 200)
		{
			LED_tt = 0 ;
			P0=~(0X80>>LED); 
			LED++;
			if(LED >= 8)LED = 0 ;
		}			
	}
}

void Timer0Init(void)		//1毫秒@11.0592MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xCD;		//设置定时初始值
	TH0 = 0xD4;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}


void KeyScan(void)
{
	if(P30==0)
	{
		Delay_MS(10);
		if(P30==0)S7_Flag = 1 ;		
		while(!P30);
	}
	else if(P31==0)
	{
		Delay_MS(10);
		if(P31==0)S6_Flag = 1 ;		
		while(!P31);
	}	
	else if(P32==0)
	{
		Delay_MS(10);
		if(P32==0)S5_Flag = 1 ;		
		while(!P32);
	}	
	else if(P33==0)
	{
		Delay_MS(10);
		if(P33==0)S4_Flag = 1 ;		
		while(!P33);
	}	
}

void Delay_MS(unsigned int MS)
{
	unsigned char i, j;
	while(MS--)
	{
	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}
}

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

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

相关文章

软考高级软件架构师:数字签名技术概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

【C++】多态的原理

目录 一、虚函数表 1、虚函数表的定义 2、虚函数表特性 3、虚表的打印 二、多态的原理 三、多态的相关问题 1、指针偏移问题 2、输出的程序是什么&#xff1f; 3、输出的程序是什么&#xff1f; 【前言】 上一篇我们学习了多态的基础知识&#xff0c;这一篇我将带着大…

InputStreamReader类详解

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

刷题之动态规划

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;开始刷动态规划的题目了&#xff0c;要特别注意初始化的时候给什么值。 动态规划5个步骤 状态表示 &#xff1a;dp数组中每一个下标对应值的含义是什么->dp[i]表示什么状态转移方程&#xff1a; dp[i] 等于什么1 和 2 是…

C++项目——集群聊天服务器项目(六)MySQL模块

Hello&#xff0c;大家好啊&#xff0c;最近比较忙&#xff0c;没来得及更新项目&#xff0c;实在抱歉~今天就恢复更新拉~ 在验证完网络模块与业务模块代码可以正常使用后&#xff0c;需完成的操作是与底层数据库进行交互&#xff0c;为实现各类用户查询、增删业务奠定良好的基…

C语言goto语句介绍

在C语言中&#xff0c;goto语句是一种流程控制语句&#xff0c;用于无条件地转移到程序中的特定标签位置。尽管goto语句在编程中具有一定的争议&#xff0c;但在某些情况下&#xff0c;它可以提供一种简单有效的解决方案。本文将深入介绍C语言中的goto语句&#xff0c;包括其基…

量化交易入门(二十九)布林带指标实现和回测

首先我们来看一张图&#xff0c;这张图就是拿的苹果股票2020年1月1日到2023年12月30日的历史数据进行回测后生成的。图中绿色箭头是买入点&#xff0c;红色箭头是卖出点。我们看到大部分的时候是在股价较低的时候买入&#xff0c;在股价较高的时候卖出&#xff0c;好像挺不错的…

K8s Pod亲和性、污点、容忍度、生命周期与健康探测详解(中)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 在上一章节中&#xff0c;我们详细探讨了Pod的亲和性&…

计算机网络(第八版)-第1章课后习题参考答案

计算机网络(第八版)-第1章课后习题参考答案 本文是对自己之前文章的格式化&#xff1a;https://blog.csdn.net/qq_46396470/article/details/132788972?spm1001.2014.3001.5502 T1-01 计算机网络向用户可以提供哪些服务&#xff1f; 连通性和共享 &#xff0c;例如音频&…

Lecture 1 - Introduction

Lecture 1 - Introduction MIT 6.824 Distributed Systems 1、概念预览 分布式系统需要考虑的因素&#xff1a; Parallelism &#xff1a;并行性Fault tolerence &#xff1a;容错性Physicial &#xff1a;不同系统之间物理距离引起的通信问题**Security ** &#xff1a;不…

WPF 路由事件 数据驱动 、Window 事件驱动

消息层层传递&#xff0c;遇到安装有事件侦听器的对象&#xff0c;通过事件处理器响应事件&#xff0c;并决定事件是否继续传递&#xff1b; 后置代码中使用AddHandler方法设置事件监听器&#xff0c;该方法的 第一个参数是指定监听的路由事件类型对象&#xff0c; 第二个参数…

3.29 day1 freeRTOS

1.总结keil5下载代码和编译代码需要注意的事项 注意要将魔术棒的的debug选项中的setting中的flashdownload中的reset and run 勾选上&#xff0c;同时将pack中的enable取消勾选 2.总结STM32Cubemx的使用方法和需要注意的事项 可以通过功能列表对引脚进行设置&#xff0c;并且可…

153 Linux C++ 通讯架构实战8 ,日志打印实战,设置时区,main函数中顺序调整

日志打印实战 //日志的重要性&#xff1a;供日后运行维护人员去查看、定位和解决问题&#xff1b; //新文件&#xff1a;ngx_printf.cxx以及ngx_log.cxx。 //ngx_printf.cxx&#xff1a;放和打印格式相关的函数&#xff1b; //ngx_log.cxx&#xff1a;放和日志相关…

[Python人工智能] 四十五.命名实体识别 (6)利用keras构建CNN-BiLSTM-ATT-CRF实体识别模型(注意力问题探讨)

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解融合Bert的实体识别研究,使用bert4keras和kears包来构建Bert+BiLSTM-CRF模型。这篇文章将详细结合如何利用keras和tensorflow构建基于注意力机制的CNN-BiLSTM-ATT-CRF模型,并实现中文实体识别…

bugku-web-本地管理员

在页面源码的最右段发现一个base加密数据 dGVzdDEyMw 解密后 test123 将test作为账号123为密码尝试 说这个ip被禁止访问 那么问题应该出现在ip上 这里将请求报文抓取下来 POST / HTTP/1.1 Host: 114.67.175.224:18838 Content-Length: 18 Cache-Control: max-age0 Upgrade-Ins…

CTF题型 php://filter特殊编码绕过小汇总

CTF题型 php://filter特殊编码绕过小汇总 文章目录 CTF题型 php://filter特殊编码绕过小汇总特殊编码base64编码string过滤器iconv字符集 例题1.[Newstarctf 2023 week2 include]2.[Ctfshow web 117] php://filter 是一个伪协议&#xff0c;它允许你读取经过过滤器处理的数据流…

MHA 高可用配置 及故障切换

目录 一 什么是 MHA 1, MHA 概念 2&#xff0c;MHA 架构 2,1 传统mysql 架构存在问题 2.2 MHA高可用 3&#xff0c;MHA 的组成 4&#xff0c;数据同步方式 4.1 同步复制 4.2 异步复制 ​编辑 4.3 半同步复制 5&#xff0c;MHA 的特点 6&#xff0c; MHA工作原理…

OpenAI发布Voice Engine模型!用AI合成你的声音!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

解决WSL更新速度慢的方案

在Windows上安装Docker Desktop时&#xff0c;如果选择使用WSL&#xff0c;则可能会出现在运行程序前要求升级WSL的步骤。程序会提示使用下面指令来升级 wsl.exe --update但是升级速度特别慢&#xff0c;于是在网络不稳定的情况下经常会出现下载失败的情况。 百度里一直没搜到…

shell的工作原理

本文旨在讲解shell的工作原理&#xff0c;希望读完本文&#xff0c;能使读者对shell的工作原理有一定的认识&#xff0c;废话不多说&#xff0c;开唠&#xff01; 在讲解shell的工作原理之前&#xff0c;我要首先给大家讲一下什么是操作系统&#xff0c;以Linux操作系统为例&am…