IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 定时器与中断系统(5) -> 正文阅读

[嵌入式]定时器与中断系统(5)

目录

定时器

????????1、简介

??????? 2、工作原理

??????? 3、定时器的配置

??????? 4、设置定时器初始值

中断系统:

??????? 1、简介?

??????? 2、配置中断端口

??????? 3、调用中断

?运用计时器中断使LED以500ms为周期依次亮起

?????????????????? 利用定时器中断使数码管显示666


定时器

1、简介

??????? 定时器:CT107D型号单片机的定时器使用单片机的内部资源,就是说把芯片卸下来也可以使用。

??????? 定时器作用:①用于计时系统,可实现软件计时等等。

????????????????????????????? ②替代场时间的Delay,提高CPU的运行效率和处理速度。

???????? 注意:CT107D单片机内部共有3个定时器,T0、T1、T2,没有的定时器就无法使用,现在的单片机使用的计数器都是向下兼容的,越到后期,单片机的定时器就越多。

2、工作原理

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

?CT107D????????单片机的定时器工作模式有四种:

????????????? 模式0:13位定时器/计数器

????????????? 模式1:16位定时器/计数器(常用)

????????????? 模式28位自动重装模式

????????????? 模式3:两个8位计数器

????????????? 但是本节我们只研究模式1,下图为工作模式1的电路图。

????????????????

?我们将定时器分为三部分:时钟、计数单元、中断系统。

???????? 计数单元上图中的TL0、TH0为计数系统,TH为高字节,TL为低字节,这两个字节一共可以存65535个数,只能数到65535。左边的时钟(SYSclk)提供一个脉冲给计时器,每来一个脉冲,计时器里面的计数值就会加一,当加到65535时就会溢出,计时器重新回到0,并向中断系统申请中断。

???????? 时钟时钟有两个来源,一是系统的SYSclk(计时器),而是T0 Pin(外部接口——计数器)本节只研究SYSclk计时器。

???????? SYSclk系统时钟,即晶振周期,本开发板上的晶振为12MHz。晶振的含义为:在单片机芯片旁边有一个振动的元器件,其频率为12MHz(系统时钟频率就为12MHz),我们就用振动来产生给计数单元的脉冲(常用将方波信号作为脉冲信号)。这个12MHz的脉冲信号在进入计数单元前会进行一个分频(上图左上方的),即÷12÷1(÷12为12T模式,÷1为1T模式)要是开关连到12分频的话,输出的就是1MHz,那么一个周期就有1M个脉冲,每个脉冲的时间就是1微秒,其含义为计数单元每隔1微秒就记一个数,加一。

??????? 在上图中有C\T字样,这是选择模式开关,给低电平0的话就选择定时器模式(上面部分)给高电平就选择计数器模式(下面部分)。

3、定时器的配置

??????? 下图是有关定时器的串口图,我们将以下图为基准配置定时器的串口。

首先,我们规定计时器的工作模式。这个由工作模式寄存器TMOD来确定。计时器有1、0两种工作模式。高四位用于配置计数器1,第四位用于配置计数器0。我们现在需要的是配置计数器0,所以M1、M2就给0,1.为什么给0、1,因为我们需要计时器工作在方式一下面,所以给0,1.。下面配置C\T,这个是选择定时器模式还是计数器模式。当C\T=1时,工作在计数器模式下。C\T=0时,工作在定时器模式下。GATE是用来测脉冲信号的宽度的,正常情况下都是为0.

M1=0,M0=1,C\T=1,GATE=0。这样我们的TMOD低四位就配置好了为0110.

故TMOD &= 0xF0,在读的时候我们是从低位往高位读。

?下图为定时器控制寄存器TCON及其控制的端口。

TF1:计数器1溢出标志位。溢出1,未溢出0。TR1:计数器1运行控制位。1启动计数,0禁止计数。

TF0:计数器0溢出标志位。供查询或产生中断请求。TR0:计数器0运行控制位。

我们配置的是计数器0,所以只要配置有关计数器0的端口就行了。

4、设置定时器初始值

??????? 我们知道定时器的最大值是65535,溢出值是65536。

?由上图可知,我们若是想设置定时器的初值,即控制上图中的端口即可,经典举例:延时2ms时(晶振选择1T),设置计数器0的最低位TL0=0x40,最高位TH0=0xA2。

了解了设置定时器的原理后,我们就可以直接运用STC-ISP软件直接设置我们想要的定时器以及其模式。

?设置时,我们将系统频率固定为12MHz,定时长度由自生遇到的情况决定,定时器自己选择使用0还是1,定时器模式的话一般选择16位自动重载或者16位。二者的区别在于选择16位时,还需要在下面的中断函数中重新定义TL\TH端口,而16位自动重载则不需要。定时器时钟选择1T的话,计数脉冲的频率就更高,精度就高,依次类推。

中断系统:

??????? 1、简介

简单来说中断系统就是在当单片机执行命令时,发生一个事件,中断系统直接发动时停——The World!!!!停下来吧单片机的时间!!

举例:当定时器溢出时,我们的中断系统就点亮一个LED灯。定时器溢出是出发时停的条件,然后就点亮LED,点亮LED后我们就回到触发时停之前,继续执行主函数。这就是中断系统的作用。

2、配置中断端口

????????

?在配置中断时,我们就以上图为标准即可,举例:我们IE允许计数器0请求中断,那么就需要先打开总的中断开关EA,然后就是打开允许计数器0请求中断的开关ET1。

即 EA=1,ET0=1。

?中断的配置仅仅是这么多。

3、调用中断

运用计时器中断使LED以500ms为周期依次亮起

下列使用的自定义函数全已模块化,关于模块化还请浏览之前的文章

#include "STC15F2K60S2.H"//定时器的模块化

void Timer0Init(void)		//2毫秒@12.000MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x30;		//设置定时初始值
	TH0 = 0xF8;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	EA=1;           //中断总开关打开
	ET0=1;			//允许计时器0申请中断
}
#include "STC15F2K60S2.H"
#include "Close.h"
#include "Time0.h"
#include "HC138.h"
#include "intrins.h"

void main()
{
	Close_Init();//关闭外设
	Timer0Init();//初始化或者使调用定时器
	while(1);
}

void Timer0_Rountine() interrupt 1//调用中断函数
{	
	unsigned int count;//定义一个count来计数
	TL0 = 0x30;		//设置定时初始值
	TH0 = 0xF8;		//设置定时初始值
	count++;//当每次脉冲过来时(2ms)count++
	if(count==250)//当count==250次也就是500ms时,执行if语句并将count初始化为0
	{	
		unsigned int i;
		count=0;
		HC138(4);
		for(i=1;i<9;i++)
		{
			P0=0xFF<<i;
		}
	}
}
#include "STC15F2K60S2.H"//关闭外设的模块化函数
#include "intrins.h"


void Close_Init()
{
	P2=((P2 & 0x1F) | 0xA0);
	P0 &=0xAF;
	P2 = 0x1F;
}
#include "STC15F2K60S2.H"//138译码器的模块化
#include "intrins.h"

void HC138(unsigned char n)
{
	switch(n)
	{
		case 4:P2=((P2&0x1f)|0x8F);break;
		case 5:P2=((P2&0x1f)|0xA0);break;
		case 6:P2=((P2&0x1f)|0xC0);break;
		case 7:P2=((P2&0x1f)|0xE0);break;
	}
}

利用定时器中断使数码管显示666

void Timer0_Rountine() interrupt 1
{	
	unsigned int count;
	TL0 = 0x30;		//设置定时初始值
	TH0 = 0xF8;		//设置定时初始值
	count++;
	if(count==250)
	{	
		Show_Num(0,6);
	}
	if(count==500)
	{
		Show_Num(1,6);
	}
	if(count==750)
	{
		count=0;
		Show_Num(2,6);
	}
}

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-01-25 10:45:17  更:2022-01-25 10:45:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:43:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码