蓝桥杯单片机比赛学习:6、中断系统之定时器中断的基本原理

2023-05-16

上节我们讲了中断的外部中断,基本的了解了一下中断,这一节我们继续来学习中断系统的定时器中断基本原理,本节很重要无论是在比赛中还是在单片机、嵌入式等的学习上都有着很重要的地位。如对本作者有兴趣可以去我主页看其他章节Do My Best的博客_CSDN博客-蓝桥杯单片机比赛学习,sim800c模块领域博主。

定时器中断的基本概念

定时器中断就是根据系统时钟频率自行设置中断时间(多长时间进一次定时器中断),在中断服务函数里写自己想做的程序。定时器有着定时、计数、精准延时、小车速度调节等重要的作用,而且在模拟生成PWM时很方便可以更好的调节小车的速度,而且定时器中断节省了CPU资源。比如,如果要想使LED灯以1s为间隔闪烁,原始思想我们可以加个1s延迟程序使LED闪烁,这样会消耗很多CPU资源;但是现在有了定时器就可以节约CPU负载,我们可以根据系统频率调节好定时器中断时间,这样就可以在不打断CPU执行其他程序时也可以实现LED灯的闪烁,这样就节约了CPU资源。因为定时器有着这样的好处,所以在单片机领域有着重要的地位。

定时器的使用

如下图,我们使用烧写软件STC-ISP生成时钟12T模式、定时长度为1ms的定时器。我们可以看到在初始化定时器的时候我们使用到了AUXR、TMOD、TL/TH、TCON(TF、TR)、IE寄存器,这几个寄存器在初始化的时候很重要,在这里我们务必熟练的掌握。下面我们也会讲其内部结构和使用原理。

定时器时钟模式:

        12T模式(将系统时钟进行12分频)是指12个时钟周期执行一条语句。

        1T模式(将系统时钟进行1分频)是指1个时钟周期执行一条语句。

定时器定时长度:

        定时长度由加法计数器( TH 和 TL)控制,给TH 和 TL不同的值定时器的定时长度不同。这里我们不要求掌握,因为在考试中我们可以借助烧写软件STC-ISP生成任意定时长度的定时器。

void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x18;		    //设置定时初值
	TH0 = 0xFC;		    //设置定时初值
	TF0 = 0;		    //清除TF0标志
	TR0 = 1;		    //定时器0开始计时
    ET0 = 1;            //允许定时器0中断
    EA = 1;             //允许系统总中断
}

定时器内部结构及其寄存器 

如下图,IAP15F2K61S2 单片机内部集成了 3 个 16 位的定时/计数器 T0、 T1 和 T2,其核心部件是一个加法计数器( TH 和 TL),对输入脉冲进行计数,当发生溢出时进入中断。若计数脉冲来自系统时钟,则为定时器方式;若计数脉冲来自 T0( P34)、 T1( P35)或 T2( P31)引脚,则为计数器方式。

 1、定时器/计数器0/1的控制寄存器TCON

TCON为定时器/计数器T0、T1的控制寄存器,同时也锁存T0、T1溢出中断源和外部请求中断源等,TCON格式如下:

TF1:定时器T1溢出中断标志。T1被允许计数以后,从初值开始加1计数。当产生溢出时TF1置 “1”,向CPU请求中断,一直保持到CPU响应中断时,才由硬件清“0”(也可由软件清“0”)。

TR1:定时器T1的运行控制位。该位由软件置位和清零。当GATE=0,TR1=1时就允许T1开始计数,TR1=0时禁止T1计数。当GATE=1,TR1=1且INT1输入高电平时,才允许T1计数。

TF0、TR0和TF1、TR1类似,这里就不再解释。

IE1:外部中断1请求源(INT1/P3.3)标志。IE1=1,外部中断向CPU请求中断,当CPU响应该中断时由硬件使IE1清“0”。

IT1:外部中断源1触发控制位。IT1=0,外部中断1 上升沿或下降沿均可触发。IT1=1,外部中断1为下降沿触发。

IE0、IT0和IE1、IT1类似,这里就不再解释。

 2、定时器/计数器的工作模式寄存器TMOD

定时/计数器 T0 和 T1 具有四种工作方式,由特殊功能寄存器 TMOD 中的 M1 和 M0 位决定,
如下图1所示。我们这里只讲定时器0,定时器1的工作模式与定时器0的类似,这里就不再讲定时器1了。要看定时器0首先我们先看低4位

图1

第3位 GATE:当GATE=0,TR1=1时就允许T1开始计数,TR1=0时禁止T1计数。当GATE=1,TR1=1且INT1输入高电平时,才允许T1计数。我们一般默认为“0”

第2位 C/T:当C/T=0,为定时模式。当C/T=1,为计数模式。

第1位和第0位我们合并在一起来表示4种工作方式:M1 M0如下图2所示

图2

        这里的工作方式我们要注意:定时器0/1有上述4种工作方式,但是定时器2只有16 位自动重装初值这1种工作方式

 3、辅助寄存器AUXR

由于STC15系列的的单片机都是1T的8051单片机,为了更好的兼容传统12T的51单片机设置了此寄存器。此寄存器可以通过分频(12分频和1分频)设置单片机的时钟频率。如下图所示,这里我们只讲图中框出的几位

T0x12:定时器的速度控制位。T0x12=0,定时器采用12分频;T0x12=1,定时器采用1分频。

其它两位也是类似。

4、中断允许寄存器 IE

EA:控制系统总中断。EA=1,打开总中断;EA=0,关闭总中断。

ET1:控制定时器1的中断。ET1=1,打开定时器1中断;ET1=0,关闭定时器1中断。

ET0:控制定时器0的中断。ET0=1,打开定时器0中断;ET0=0,关闭定时器0中断。

以上就是使用定时器时所要了解的全部寄存器。下面我们来详细说一下在比赛中使用定时器的步骤。

使用定时器的步骤: 

(1)确定工作方式(这里只能设置定时器0/1的工作方式,定时器2有固定的的工作方式),给工作模式寄存器 TMOD 写入控制字。

例:TMOD=0x42,我们对照上述寄存器,可以看到此寄存器为8位寄存器高4位设置定时器1的工作模式,低4位设置定时器0的工作模式。我们将16进制的0x42化为2进制的0100 0010,就很容易看出寄存器写入的值,进而推出定时器的工作方式。这里为了让大家更好的理解我画了草图,如下图

(2)通过设置AUXR的值 确定是采用 1T 还是采用 12T 方式,计算定时/计数器的初值,并将初值写入寄存器 TH和 TL。

例:我们在比赛中一般题目都是要求单片机内部振荡器频率设定为 12MHz。如下图3所示
AUXR &= 0x7F; 这里就是设置定时器时钟12T模式,(这里的 “&=” 如有不理解请去(1条消息) 蓝桥杯单片机比赛学习:2、蜂鸣器和继电器的使用和基本原理_Do My Best的博客-CSDN博客有详细解释)这里将16进制0x7F化为2进制0111 1111就可以看出定时器0为12T(12分频),分频后的频率为1MHz,则加法计数器每加1都需要耗时1us,此时我们通过设置TH、TL的初始值就可以精确的设置每进一次中断的时间,详细解释如图4所示。

图3
图4

(3)根据需要设置中断控制寄存器 IE 和 IE2 的初值,决定是否开放定时器中断(ET0/ET1/EA=1打开中断)。
(4)将控制寄存器 TCON 中的 TR0、 TR1 和 TR2 位置 1 ,启动定时/计数器。

代码实现:

运用定时器中断,L1以500ms为间隔闪烁,L8以1s为间隔闪烁。

#include "stc15f2k60s2.h"
#include "intrins.h"

sbit L1=P0^0;

/* 选择通道并且输入数据 */
void slect_138_573(unsigned char channel, unsigned char dat)
{
	P0 = 0x00;
	P0 = dat;										/* 这里用P0而不用其他端口是因为我们操作LED、数码管、继电器、蜂鸣器都是对P0进行操作 */
	switch(channel)							        /* 选择通道 */
	{
		case 4:										/* 使Y4输出低电平0,也就是操作LED */
			P2 = (P2 & 0x1f) | 0x80;                /* (P2 & 0x1f)就是将前3位清0,再操作前3位。将0x80转为2进制1000 0000,这里只看前3位100就是Y4 */
		break;
		case 5:										/* 使Y5输出低电平0,也就是操作继电器和蜂鸣器 */
			P2 = (P2 & 0x1f) | 0xa0;
		break;
		case 6:										/* 使Y6输出低电平0,也就是操作8个数码管 */
			P2 = (P2 & 0x1f) | 0xc0;
		break;
		case 7:										/* 使Y7输出低电平0,也就是操作8个数码管中的1个数码管显示值 */
			P2 = (P2 & 0x1f) | 0xe0;
		break;
		case 0:										/* 关闭所有通道 */
			P2 = (P2 & 0x1f) | 0x00;
		break;
	}
	P2 = (P2 & 0x1f) | 0x00;		/* 使用后,关闭所有通道 */
	
}

void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x18;		    //设置定时初值
	TH0 = 0xFC;		    //设置定时初值
	TF0 = 0;			//清除TF0标志
	TR0 = 1;			//定时器0开始计时
	ET0=1;				//定时器0中断使能
	EA=1;				//使能总中断 
}

unsigned int count=0;
unsigned char led_stat=0xff;
void Timer0Service(void)  interrupt 1
{
	count++;
	if(count%500==0)        /* 500ms为间隔 */
	{
		if((led_stat&0x01)==0x01)    /* 检查第0位是否为1 */
				led_stat &= ~(0x01); /* 第0位为1,则清0(0x01取反为0xfe,0xfe再与上0x01,将第0位清0)*/ 
		else
				led_stat |= (0x01);  /* 第0位为0,则置1 */
		slect_138_573(4,led_stat);
	}
	if(count%1000==0)
	{
		count=0;
		if((led_stat&0x80)==0x80)
				led_stat &= ~(0x80);
		else
				led_stat |= (0x80);
		slect_138_573(4,led_stat);
	}
}



void System_init(void)
{
	slect_138_573(4,0xff);
	slect_138_573(5,0x00);
	Timer0Init();
}

void main(void)
{
	System_init();
	while(1)
	{
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蓝桥杯单片机比赛学习:6、中断系统之定时器中断的基本原理 的相关文章

随机推荐

  • 【VScode远程连接虚拟机(ubuntu)】

    VScode远程连接虚拟机 前言一 安装VScode二 安装中文插件三 安装其他远程连接插件1 C C 43 43 Extension Pack2 Live Preview3 Live Server4 Remote Development
  • (错误都已改正)AS608指纹+STM32串口通信录入或删除指纹

    目录 一 硬件使用分类 1 整体图展示 2 STM32F103RCT6单片机 3 AS608指纹模块 4 USB转TTL 二 软件设计 1 接线设计 2 程序设计 一 硬件使用分类 1 整体图展示 采用STM32F103RCT6作为主控制器
  • 基于Maix IDE的编程环境 K21O人脸识别+串口输出

    如果你想进行人脸识别首先要进行对K210的模型以及固件的配置 xff0c 在你去Maix官网去下载模型以及固件 目录 一 如何申请机械码 1 前往这个网站 xff0c 也就是Maix的官网 xff08 需要提前申请账号 xff09 2 要进
  • K210模型训练(物体分类)

    目录 一 打开Maix IDE 的官网找到需要训练模型的平台Maix Hub 模型训练的分类 xff1a 二 如何使用Maix Hub模型训练平台 数据集的采集 三 训练模型后的文件分类 一 打开Maix IDE 的官网找到需要训练模型的平
  • Openstack Swift 安装部署总结

    环境 硬件 这里只使用了一台服务器 xff0c 既作为Controller Node xff0c 也作为Storage Node 主机名IPOS磁盘文件系统sf dev10 202 127 4Centos 7 4 dev sdb dev s
  • 针对于esp8266-01的刷AT固件

    目录 1 esp8266 01的结构与引脚分布 1 1对应各引脚的功能分布 2 如何与USB转TTL接线进行刷固件 3 使用 FLASH Download Tool刷固件 3 1打开该文件 3 2按照此选项进行选择 3 3接着进行选择 3
  • 阿里云物联网平台如何进行云产品流转

    一 什么是云产品流转 简单来说就是如何将数据从这个设备发送到另一个设备中 二 如何在同一产品上的俩个设备之间进行数据转移 1 创建一个产品 xff0c 并添加两个设备 可以看到RP DPJ 与RP WX 都是属于RP WXX 产品上的俩个设
  • 本地包含与远程包含

    注意 xff1a 仅用于本人学习的笔记记录 xff0c 禁止进行传播分享 xff0c 一旦造成严重后果与本人无关 xff01 xff01 xff01 一 什么是文件包含漏洞 文件包含 xff1a 就是去其他的php文件读取源码来运行 xff
  • Linux下的shell

    NC反向shell 1 查看shell类型 echo SHELL chsh s 需要修改shell的类型 cat etc shells 查看存在哪些shell 然后反弹对应的shell xff08 正向连接 xff09 被控制端 nc lv
  • 单片机之步进电机驱动篇(一)

    步进电机的简介 xff1a 步进电机是一种将电脉冲转化为角位移的执行机构 当步进电机驱动器接收到一个脉冲信号 xff0c 它就驱动步进电机按设定的方向转动一个步距角 通过控制脉冲来控制角位移量 xff0c 也可以实现对电机的加减速和正反转的
  • ROS使用Python编写的步骤

    第一步 xff1a 和C 43 43 编写一样 xff0c 配置好工作空间 第二步 xff1a 在功能包下面建立一个scripts文件夹 第三步 xff1a 在scripts文件里面建立一个 py文件 第四步 编写python文件 注意 x
  • 解决js脚本加载失败的问题

    当我们在运行某一个项目时 xff0c 它的某些JavaScript脚本可能加载不出来 xff0c 报错 像现在单页界面应用基本上都是通过js来构建 xff0c 一旦加载不出 xff0c 这个项目就不能运行了 xff0c 那怎么办 xff1f
  • 能在 Switch 中使用 String 吗?

    答 xff1a 从 Java 7 开始 xff0c 我们可以在 switch case 中使用字符串 xff0c 但这仅仅是一个语法糖 内部实现在 switch 中使用字符串的 hashCode 补充 xff1a 在JDK7以前 xff0c
  • C语言基础编程练习(精选例题+题解)

    目录 1 求最大公约数和最小公倍数 2 打印图形 3 质数因子 4 数字排序 5 十进制数转换为八进制数 xff08 进制转换 xff09 6 寻找完数 1 求最大公约数和最小公倍数 题目描述 xff1a 输入两个正整数m和n xff0c
  • 判断字符向量是否为回文

    回文是指正读反读均相同的字符序列 xff0c 如 34 abba 34 和 34 abdba 34 均是回文 xff0c 但 34 good 34 不是回文 试写一个算法判定给定的字符向量是否为回文 xff08 提示 xff1a 将一般字符
  • 【matlab】记一次微信聊天文字记录导出到Excel工作

    其实一直想把我和她的微信聊天记录导出到文本 xff0c 整理出来拿出来翻翻 xff0c 然后再查阅了大量网络资料后 xff0c 我成功的将我和她的聊天记录整理成excel的形式 xff0c 如下所示 xff1a 那么我们开始 一 工具准备
  • C语言实现选择排序算法

    选择排序 算法步骤 1 从0索引开始 xff0c 跟后面的元素一一比较 2 小的放前面 xff0c 大的放后面 3 第一次循环结束后 xff0c 最小的数据已经确定 4 第二次循环从一索引开始以此内推 整体代码块在最下方 xff0c 有需要
  • DVWA靶场搭建

    1 靶场是什么 xff0c 靶场的搭建 在学习web安全的过程中 xff0c 靶场是必不可少的 xff0c 毕竟在计算机界 xff0c 任何理论知识都不如实操 靶场就是人为提供的带有安全漏洞的服务 xff0c 每一个学习者都可以在本地快速搭
  • 用HTML+bootstrap制作个人简历

    用HTML bootstrap制作个人简历 nbsp index html lt DOCTYPE html gt lt html lang en gt lt head gt lt meta charset UTF 8 gt lt meta
  • 蓝桥杯单片机比赛学习:6、中断系统之定时器中断的基本原理

    上节我们讲了中断的外部中断 xff0c 基本的了解了一下中断 xff0c 这一节我们继续来学习中断系统的定时器中断基本原理 xff0c 本节很重要 无论是在比赛中还是在单片机 嵌入式等的学习上都有着很重要的地位 如对本作者有兴趣可以去我主页