当前位置:首页 > 单片机 > 单片机
[导读]从定时器开始说中断什么叫中断?这个对于刚进入MCU界的人来说是一个难以了解的问题,因为我第一次学单片机的时候就不完全不了解什么叫中断。后来慢慢来知道原来中断是单片机运行到一半突然飞到某个地方运行某些东西运

定时器开始说中断什么叫中断?这个对于刚进入MCU界的人来说是一个难以了解的问题,因为我第一次学单片机的时候就不完全不了解什么叫中断。后来慢慢来知道原来中断是单片机运行到一半突然飞到某个地方运行某些东西运行后又飞回来而已。

后来学着学着就了解到中断的意义了,不过对于第一次接触单片机的人来说,还是很难解说的清楚的。

所以这里我做个比喻吧。假设你客厅的电话来电时,有铃声和闪光提示,而你在房间看书,那么有电话来的时候,你听到铃声,然后放下手上的书,并用书签记录你的页数,再出去听电话。听完后,回到房间,从书签标记的位置继续看你的书。

OK,分析上面的几个动作,电话响并被你听到,那是中断来了;你用书签标记位置,那是现场保护;听电话,就是执行中断咯;听完电话,你要从你刚才标记的地方继续看书,那就是中断执行完毕后回到原中断处继续执行程序。这个就是中断的过程了。

假设没有了中断的话,你会如何?你会用扫描法:电话不会响铃了,只有闪光,但你必须在房间看书,那你只能每看几段,就跑出去看看是否有电话到,如果没有,就跑回去看书,如果有了,那你就听电话吧。很明显,扫描法效率非常低,因为你每看一会书就得花时间看看电话的闪光以判断是否有电话的到来,这样你看书的效率就大大减低了。而且扫描法还有个最大的缺点,就是中断丢失,试想如果你扫描的间隔过大(就是看很久书才去看一下电话),那你极有可能丢了几个重要的来电。

其实上面的比喻,正能很好地表现中断的作用——其实中断就是为了处理突发事件。

对于单片机来说,突发的事情实在太多了,例如用户对单片机输入数据,按键,那都是单片机本身无法估计的事情。外来数据的突然进入,也属于突发事件。这些外部来的突发信号,一般就由单片机的外部中断来处理。外部中断其实就是一个管脚的状态改变引起的中断,在之后会说。

这里先介绍定时器和定时器中断:

在测量控制系统中,常常需要实时时钟,以实现定时控制、定时测量或定时中断等。也常需要计数器以实现对外部事件的计数。MCS-51单片机中有两个(增强型有三个)十六位的定时计数器T0,T1,简称定时器0和定时器1,两者均为可编程定时计数器。

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

其实你问清楚什么叫定时器,我真的不知道用什么言语来说。刚学的时候,听过这样一句话“定时器是单片机上的宝贵资源”,当时不了解,为什么这个资源是宝贵的呢??后来才慢慢知道定时器的伟大所在。当然这个是需要一定的时间来领悟的咯,在这里你还是踏踏实实地往下看吧:)

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

单片机方式0是13位的,从来就没用过,有16位不用你用13位?真浪费也~~~

然后是计算装入值,16位啊,就是16位2进制,2的16次方,就是65536了。16位定时器就是从某个所谓的装入值开始自加,加到65536就计满,如果你允许定时器中断,那就有中断来临。所以16位方式装入值的计算很简单:

65536-你要计算的脉冲数=装入值

但我们一般是要定时时间的,而不是单单计多少个脉冲,所以你要计算的脉冲数要转化为时间,跟你说,一个脉冲的时间就是一个机器周期,51的机器周期就是12/晶振值。如果你的晶振是12M那么这样一除就是1US咯。1US整数,算什么都好算,所以你现在知道为什么这么多12M,24M的晶振买了吧,都是为51准备的咯。

#i nclude "reg51.h"

void initTimer(void)

{

TMOD=0x1;

TH0=0xd8;

TL0=0xf0;

}

void timer0(void) interrupt 1

{

TH0=0xd8;

TL0=0xf0;

//add your code here.

}

void main(void)

{

initTimer();

TR0=1;

ET0=1;

EA=1;

while(1);

}

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

10000US在12M晶振下就是100000个机器周期了,65536-100000=55536=D8F0(十六进制),所以上面就是TH0=0xd8;TL0=0xf0;

void timer0(void) interrupt 1就是定时器0中断函数,我们不需要理会汇编的中断先,只需要知道当中断来临的时候,程序就自动跳到timer0(void)这个函数运行了,运行完后就会回到原来中断处继续执行原先的程序。

interrupt是C51中的关键字,后面跟有interrupt的函数都是中断函数,那么对应哪个中断呢?请大家参考:一开始为大家介绍的 Keil Software –Cx51 编译器用户手册 中文完整版,(名字太长了,以后叫KEIL手册)的第125页。

中断号 中断地址

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 00FBH

看到了吧,中断号就是对应中断进入地址的,至于什么是中断进入地址?那就是发生某个中断的时候单片机自动跳进的一个地址段了.

对于定时器0来说,就是000BH,所以对应中断号1。其他中断地址看看书就知道了。由上面的表可以看出,KEILC支持32个中断,不过到现在为止,我还没看到过有51单片机有32个中断的:)

好了,进入调试实践中了,把上面的代码敲进去吧,又或者直接下载我这个编译好的工程:

timer0

进入工程后,你需要设置点东西:

Debug Information是调试信息,你选择这个东西,才可以在C语言上进行仿真(不管是软还是硬仿真),否则你的仿真环境是汇编的!

软仿真设置:

Go till main()就是在仿真的时候直接跳到MAIN函数上。如果没有选,那就由0地址开始运行。这里说个概念,在C51中,mian()函数并不代表0地址的,要知道,keilc在一开始的时候是需要经过比较多的初始化,例如清空RAM内容,设置堆栈等东西,这些都是不需要你做的,你的用户程序也不包括这些,做完这些初始化后,KEIL才自动跳到你的mian进行处理.

软件仿真是可以选晶振的,我们选的12M。下面的这些东西你就按图中的来选吧,具体内容以后再说。

如果编译成功的话,那么我们就开始第一次的软件仿真咯:

上面的是已经进入仿真状态的了,因为我们选择了Debug Information所以可以在C下面调试,也因为选择了Go till main()我们可以看到一开始就有个箭头指着main()的第一句话。而程序旁深色的东东,也就是我圈着的东西,就是有效代码段,程序只会在那里跑,也就是那个黄色箭头只会在那个区域跑。现在你已经可以仿真的了,可以选单步,全速来运行了。关于KEIL的具体仿真,将在下一章为大家解说。

扩展阅读:51单片机中断系统详解

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭