蓝桥杯单片机基础部分——2、定时器中断

一、介绍

关于蓝桥杯单片机定时器中断部分的一些代码,本期主要讲应用,就是看着题目可以写出相对应的代码,至于原理后面会详细讲,在这了解一下

二、中断

首先我们先来了解什么是中断,官方给出的是“中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的”,这里相对好理解,就比如说A在上课,这是他现在在处理进行的事件,这个时候A的班主任让A去走廊谈话,去走廊谈话这个事件就是中断事件,当A谈话结束之后,他会继续进行上课的事件对吧。上面说的就是一个中断事件。
说了这么多,中断这个东西我们搞清楚是什么后,我们就要根据手册写代码了,这里先不细讲原理
中断结构示意图
中断号
上图分别是我们在写中断部分所需要的东西,每一行中断为一个中断模式,有四个外部中断,三个定时器中断,和一个串口中断。图1中的中断允许控制寄存器,在这里都是断开的,也就是目前他们的值为0,当我们把他们置1的时候,他们就都是连通的,这时候这一个中断模式就被打开了,比如我要打开Timer 0中断,我需要写的代码就是

	ET0 = 1;
	EA = 1;

关闭只需置ET0为0即可。
只打开中断还不行,中断肯定要执行某些任务,这时候我们写一个中断函数去允许这些任务,这时候就用到图2中的中断号,我们可以看到,这些中断号是和图一的中断模式一一对应的,也就是一种中断模式对应一个中断号,废话不多说,直接上代码,就比如我打开Timer 0中断时L1点亮,代码如下:

void Timer0_Rountine() interrupt 1//此处函数名可以随便写,该函数不需要放到主函数里面被调用
{
	HC138(4);
	P0 = 0XFE;
}

上面就是中断部分的介绍和代码,下面看定时器。

三、定时器

定时器,顾名思义就是定时计数的一个模块,定时器的工作模式可以分为:定时器,计数器。因为定时器和单片机的CPU的相互独立的,所以定时器的工作都是自主完成的,不需要单片机CPU的参与,所以就可以代替长时间的delay,从而提高单片机的工作效率,并且定时器计时的精确度比delay高很多。
在定时器使用时,是靠内部震荡电路计数,每当经过一个机器周期,计数的储存器就会+1,也是该机器中最小的时间单位,通过这个时间单位的运算得到我们所需的时间长度。

现在我们讨论加1经过了多少时间?
当晶振频率是11.0592MHz的时候,我们按12MHZ算,等于12KHz = 12000000Hz
机器周期 = 12 x 时钟周期 =12 x (1/时钟频率) 秒 (周期=频率的倒数)= 12 / 时钟频率 秒= 12 / 12000000 秒 = 12 000 000/ 12000000 微秒 = 1 us
所以当使用12倍数时,每隔1us,计数器就+1

定时器/计数器有四种工作模式
(1)13位定时器/计数器,计数范围0~8191
(2)16位定时器/计数器,计数范围0~65535
(3)8位自动重装,计数范围0~255
(4)双8位定时器/计数器,计数范围0~255

1、TOMD工作模式寄存器

在这里插入图片描述


1.GATE是门控制位
	当GATE=0时:计数条件只有TR1一个(TR1=1就计数,TR1=0就不计数)。
	当GATE=1时:是否计数不仅取决于TR1还取决于INT1引脚
2.C/T :定时/计数模式选择位。C/T =0 为定时模式;C/T =1 为计数模式。
3.M1 M0:工作方式设置位。定时/计数器有四种工作方式。
M1 = 0;M0 = 0;	13位定时器/计数器,计数范围0~8191,模式0
M1 = 0;M0 = 1;	16位定时器/计数器,计数范围0~65535,模式1
M1 = 1;M0 = 0;	8位自动重装,计数范围0~255,模式2
M1 = 1;M0 = 1;	双8位定时器/计数器,计数范围0~255,模式3
由此可见 TMOD = 0x01  T0  模式1
		TMOD = 0x02  T0  模式2
		TMOD = 0x03  T0  模式3
定时器1也是一样的,大家可以推理一下

##2、 TCON控制寄存器
在这里插入图片描述

TF0 TF1:定时器TX溢出中断标志,当定时器TX开始计数时,计数到达规定的时间时,定时器产生了溢出。TFX自动由0变位1。
TR0 TR1:定时器TX的控制位,当为1时,定时器TX才能计数,相当于TX的开关

定时器的计数的个数个计数初值的关系是这样的:
计数个数=2(模式位次方)— 计数初值
计数初值由THX和TLX表示

四、实战

下面基于蓝桥杯的单片机写一段定时器中断的代码,使上面的L1每隔1秒变换一次状态

void Initdsq()
{
	TMOD = 0x01;//定时器0 模式1
	TH0 = (65535-50000) / 256;//计数50000个,即为50MS
	TL0 = (65535-50000) % 256;
	
	ET0 = 1;//使能定时器0中断
	EA = 1;//使能中断
	TR0 = 1;//定时器0开始计时
}

unsigned char count = 0;
void ShowSMG() interrupt 1//中断函数
{
	TH0 = (65535-50000) / 256;
	TL0 = (65535-50000) % 256;
	HC138(4);
	count++;//累计50ms
	if(count == 20)//计时一秒
	{
		P0= 0xfe; 
	}
	if(count == 40)
	{
		P0 = 0xff;
		count = 0;
	}
}

上述代码并非所有代码,仅为定时器中断部分代码,使代码运行许结合蓝桥杯单片机基础部分——1、基础模块代码使用

本人水平有限,所有代码都是自己的风格书写,但是大致的应该是没有什么问题,希望对大家有帮助如果有哪里出错或者有更好的解法可以与我私信或在评论区里进行讨论

上一节:蓝桥杯单片机基础部分——1、基础模块代码

下一节:蓝桥杯单片机基础部分——3、AD转换

### 蓝桥杯竞赛中定时器中断设置 在蓝桥杯竞赛以及单片机开发领域,合理配置定时器中断对于系统的稳定性和响应速度至关重要。下面是一个基于 **STC15F2K61S2** 单片机定时器0中断设置示例代码[^2]。 #### 示例代码:定时器0初始化与中断处理函数 ```c #include <reg52.h> // 定义全局变量用于计数 unsigned int count = 0; void Timer0_Init(void){ TMOD |= 0x01; // 设置T0为模式1, 16位定时器 TH0 = (65536-50000)/256;// 设定初值(假设晶振频率为12MHz) TL0 = (65536-50000)%256; ET0 = 1; // 开启T0中断使能 EA = 1; // 打开总中断开关 } void Timer0_ISR(void) interrupt 1{ static unsigned char flag=0; TH0 = (65536-50000)/256; // 重新加载初值 TL0 = (65536-50000)%256; TR0 = 1; // 启动定时器 if (++count >= 20){ // 如果达到设定次数,则执行特定操作 count = 0; // 这里可以加入需要周期性执行的任务 P1 ^= 0x01; // 切换P1口电平状态作为测试输出 } } ``` 这段代码展示了如何初始化定时器0,并设置了每大约5ms触发一次中断的服务程序,在每次进入该服务程序时都会重置定时器初值以保持固定的时间间隔。当计数值达到预设阈值时(此处为20次),则会切换P1端口的状态来模拟某种周期性的动作,比如LED闪烁等简单应用。 此外,为了确保数码管显示效果良好而不产生鬼影现象,建议采用较高频率(如2~12ms之间)进行刷新;而为了避免与其他外设(例如LED)发生冲突,可以在定时器中断部分配不同的时间段给各个设备更新其状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值