定时器中断是什么_详细介绍定时器和定时器中断

后来我学会了理解中断的含义,但对于第一次接触单片机的人来说还是很难讲清楚。

所以我在这里打个比喻。假设你家客厅的电话打过来的时候,有铃声和闪烁的提示,而你正在房间里看书,那么电话打过来的时候,你听到铃声,然后放下手里的书,用书签记录你的书页,然后出去接电话。听完之后,回到你的房间,从书签标记的位置继续阅读你的书。

好了,分析一下上面的动作。当电话铃响,你听到它,它被打断。你书签位置,就是现场保护;听电话是执行中断;听完电话后要从刚才标记的地方继续读,也就是中断完成后回到原来的中断地方继续执行程序。这就是中断的过程。

假设没有干扰,你会怎么做?你可以用扫描法:手机不会响,只会闪,但是你要在房间里看书,所以你只能每隔几段就出去看看有没有电话,如果没有,就跑回来看,如果有,那就接电话。很明显,扫描的方式效率很低,因为每次看书都要花时间看手机的闪光灯来判断是否有电话打来,大大降低了你的阅读效率。而且扫描法最大的缺点是中断丢失。试想一下,如果扫描间隔太大(也就是你看了很久的书才去看手机),你很可能会丢失几个重要的电话。

其实上面的比喻很能说明打断的作用。其实中断是为了应对突发事件。

对于单片机来说,意想不到的事情太多了,比如用户给单片机输入数据,按键,这些都是单片机本身无法估计的事情。外来数据的突然输入也是突发事件。这些外部突发信号一般由单片机的外部中断来处理。外部中断实际上是一个管脚的状态变化引起的中断,后面会讲到。

下面是定时器和定时器中断:

在测控系统中,经常需要实时时钟来实现定时控制、定时测量或定时中断。通常需要一个计数器来计数外部事件。MCS-51单片机中有两个(增强型三个)十六位定时计数器T0和T1,都是可编程定时计数器。

——以上p字抄袭《单片微型计算机与接口技术》-_ #第94页第一段!

其实你要问定时器是什么,我还真不知道用什么词。刚学的时候,听到过“定时器是单片机上很有价值的资源”这句话,但当时并不理解。为什么这种资源很有价值?后来我慢慢了解到定时器的伟大。当然,理解这个需要一定的时间,所以你最好在这里脚踏实地的读下来:)

我在开头说过,看这本教材的时候,你至少需要一本单片机基础书。随便买什么书都行。反正现在的单片机书都是抄你我的。都是一样的。最重要的是例子。拿起你的书,看看单片机的中断寄存器和定时器寄存器。我们要开始写程序了,时间不等人D~~~~ ~

单片机模式0是13位,没用过。有16位不需要用13位?太浪费了~ ~ ~

然后计算加载值,16位,也就是16位二进制,2的16次方,也就是65536。16位定时器从一个所谓的load值开始计时,到了65536就满了。如果你允许定时器中断,中断就会到来。所以16位加载值的计算很简单:

65536-想要计算的脉冲数=负载值

但是,我们通常计算的是时间,而不仅仅是多少次脉冲,所以你要计算的脉冲数要换算成时间。我告诉你,一个脉冲的时间是一个机器周期,51的机器周期是12/晶振值。如果你的晶振是12M,那么这个除法就是1US。1US整数,什么都好算,所以现在你知道为什么买那么多12M和24M的晶振了吧,都是为了51。

#i包括' reg51.h '

void initTimer(void)

{

TMOD=0x 1;

TH0=0xd8

TL0=0xf0

}

无效定时器0(无效)中断1

{

TH0=0xd8

TL0=0xf0

//在此添加您的代码。

}

无效总管(无效)

{

init timer();

TR0=1;

ET0=1;

EA=1;

while(1);

}

上面的代码是一个12M晶振下10000US定时的程序,也就是10MS发生一次中断。InitTimer()是一个初始化函数,用于设置计时值和中断。

10000US是10万个机器周期用12M的晶振,65536-10万=55536=D8F0(十六进制),所以上面是TH0=0xd8TL0=0xf0

无效定时器0(void)中断1是定时器0的中断功能。我们不需要先关注汇编中断。我们只需要知道,当中断来临时,程序会自动跳转到定时器0(void)运行。运行后会回到原来的中断,继续执行原来的程序。

中断是C51中的一个关键字,中断后面的函数都是中断函数,那么它对应的是哪个中断呢?请参考《Keil软件-Cx51编译器用户手册》第125页(名字太长,以后就叫KEIL手册了)。

中断号中断地址

0 0003H

1 000BH

2 0013H

3 001BH

4 0023H

5 002BH

6 0033H

7 003BH

8 0043H

9 004BH

10 0053H

11 005BH

12 0063H

13 006BH

14 0073H

15 007BH

16 0083H

17 008BH

18 0093H

19 009BH

20 00A3H

21 00ABH

22 00B3H

23 00BBH

24 00C3H

25 00CBH

26 00D3H

27 00DBH

28 00E3H

29 00EBH

30 00F3H

31 000英尺/小时

看,中断号对应于中断入口地址。中断入口地址是什么?那是一个当中断发生时,单片机自动跳转到的地址段。

对于定时器0,它是000BH,因此它对应于中断号1。其他中断地址可以看书找。从上表可以看出,KEILC支持32个中断,但是到目前为止,我还没见过51单片机有32个中断:)

好了,我们在进行调试练习。输入上面的代码,或者直接下载我编译的项目:

定时器0

进入项目后,需要设置一些东西:

调试信息是调试信息。只有选择了这个东西,才能用C语言进行仿真(不管是软仿真还是硬仿真),否则你的仿真环境就是组装的!

软模拟设置:

Go till MAIN()在模拟过程中直接跳转到主函数。如果未选中,将从地址0开始。这里有个概念。在C51中,mian()函数不代表地址0。要知道,keilc在开始的时候需要进行大量的初始化,比如清除RAM内容,设置堆栈,这些你都不需要做,你的用户程序也不包括这些。在这些初始化之后,KEIL会自动跳转到您的mian进行处理。

软件仿真可以选择晶振,我们选择12M。可以根据图片选择以下的东西,具体内容后面再谈。

如果编译成功,那么我们将开始第一次软件模拟:

上面已经进入模拟状态,因为我们选择了调试信息,所以可以在C下调试,而且因为我们选择了Go till main(),所以可以看到从一开始就有一个箭头指向main()的第一句话。程序旁边深色的东西,也就是我圈出来的,是有效代码段,程序只会在那里运行,也就是黄色箭头只会在那个区域运行。现在可以模拟了,一步就可以全速跑了。KEIL的具体模拟将在下一章说明。