0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详细介绍定时器和定时器中断

GReq_mcu168 2018-02-09 14:00 次阅读

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

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

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的具体仿真,将在下一章为大家解说。

详细介绍定时器和定时器中断

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 仿真
    +关注

    关注

    50

    文章

    3872

    浏览量

    132143
  • 中断
    +关注

    关注

    5

    文章

    884

    浏览量

    41020
  • 定时器
    +关注

    关注

    23

    文章

    3146

    浏览量

    112019

原文标题:从定时器开始说中断

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32定时器(二)定时器中断

    常规定时器:基本定时器TIM6&TIM7)、通用定时器(TIM2~TIM5,TIM9~TIM14)、高级定时器(TIM1&TIM8)
    的头像 发表于 07-21 14:54 1830次阅读
    STM32<b class='flag-5'>定时器</b>(二)<b class='flag-5'>定时器</b><b class='flag-5'>中断</b>

    定时器中断是什么意思

    51单片机入门教程(5)——定时器中断一、中断的概念二、定时器中断2.1 软件延时的不足2.2 中断寄存
    发表于 07-15 08:46

    stm32基本定时器介绍

    以使用其他的时钟源进行计数,在高级定时器和通用定时器中会详细介绍。在基本定时器框架中可知时基单元包含如下三个部分:
    发表于 08-18 06:15

    定时器T1中断实验

    定时器T1中断实验。 1、定时器中断实验。定时器产生10mS周期中断,通过计数让P
    发表于 06-30 11:39 4330次阅读

    定时器中断应用

    定时器中断应用。
    发表于 03-15 14:56 3次下载

    stm32定时器中断程序

    STM32的定时器是个强大的模块,定时器使用的频率也是很高的,定时器可以做一些基本的定时,还可以做PWM输出或者输入捕获功能。 以下是进行stm32
    发表于 10-12 16:59 1.3w次阅读

    介绍中断定时器特点及应用

    中断定时器
    的头像 发表于 07-10 03:51 5211次阅读
    <b class='flag-5'>介绍</b><b class='flag-5'>中断</b>与<b class='flag-5'>定时器</b>特点及应用

    介绍什么是中断定时器?作用是什么?

    lesson7-1中断定时器
    的头像 发表于 07-09 03:36 8167次阅读
    <b class='flag-5'>介绍</b>什么是<b class='flag-5'>中断定时器</b>?作用是什么?

    51单片机:开启中断定时器

    51单片机:开启中断定时器关于中断,需要用到中断允许寄存器:定时器中断需要的是:总
    发表于 11-22 12:06 12次下载
    51单片机:开启<b class='flag-5'>中断</b>和<b class='flag-5'>定时器</b>

    51单片机定时器中断详细理解

    char uint i,j; main(){i=0;j=0;EA=1; //中断总开关开 ET0=1;//定时器T0中断允许 ET1=1;//定时器T1
    发表于 11-22 12:36 10次下载
    51单片机<b class='flag-5'>定时器</b><b class='flag-5'>中断</b>的<b class='flag-5'>详细</b>理解

    定时器中断实验

    定时器中断实验定时器中断实验一:51单片机定时器原理(1)51单片机定时/计数器结构T0,T1引
    发表于 11-24 17:21 12次下载
    <b class='flag-5'>定时器</b><b class='flag-5'>中断</b>实验

    五、【中级篇】时钟树、定时器中断

    三、定时器中断在STM32芯片中提供了非常丰富的定时器资源:普通定时器和其他定时器普通定时器
    发表于 01-14 15:44 6次下载
    五、【中级篇】时钟树、<b class='flag-5'>定时器</b>、<b class='flag-5'>中断</b>

    STM32定时器的分类及中断原理

    本文主要介绍常规定时器中的TIM3,实现定时器中断的功能。STM32定时器的分类在其中一篇文章中已经介绍
    的头像 发表于 01-12 17:29 5772次阅读
    STM32<b class='flag-5'>定时器</b>的分类及<b class='flag-5'>中断</b>原理

    定时器中断是什么意思,定时器中断的工作原理

    定时器中断是由单片机中的定时器溢出而申请的中断。51单片机中有两个定时器T0和T1。STM32中共有11个
    的头像 发表于 07-23 09:45 3622次阅读

    定时器中断程序怎么写

    达到预定的定时时间时,它会产生一个中断信号,称为定时器中断。在本文中,我们将详细了解如何编写定时器
    的头像 发表于 09-01 10:17 1144次阅读