一、介绍
关于蓝桥杯单片机定时器中断部分的一些代码,本期主要讲应用,就是看着题目可以写出相对应的代码,至于原理后面会详细讲,在这了解一下
二、中断
首先我们先来了解什么是中断,官方给出的是“中断系统是为使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、基础模块代码使用
本人水平有限,所有代码都是自己的风格书写,但是大致的应该是没有什么问题,希望对大家有帮助如果有哪里出错或者有更好的解法可以与我私信或在评论区里进行讨论
标签:定时器,计数,中断,代码,模式,蓝桥,单片机,计数器 From: https://blog.csdn.net/shidisy/article/details/145070334