定时器与中断系统(5)

定时器与中断系统(5),第1张

定时器中断系统(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位定时器/计数器(常用)

              模式2:8位自动重装模式

              模式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微秒就记一个数,加一。

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

3、定时器的配置

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

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

M1=0,M0=1,CT=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位时,还需要在下面的中断函数中重新定义TLTH端口,而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< 
#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);
	}
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5714086.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存