您好,欢迎来到华佗健康网。
搜索
您的当前位置:首页51单片机入门零基础2.4定时器点亮LED灯

51单片机入门零基础2.4定时器点亮LED灯

来源:华佗健康网


1.1 定时器应用定时器点亮LED灯(含中断)

1.1.1 STC15L104E中断简介

中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。它是单片机最重要的功能之一,是我们学习单片机必须掌握的。

STC15L104E提供了8个中断请求源,它们分别是:外部中断0(INT0)、定时器0中断、外部中断1(INT1)、定时器1中断、低压检测(LVD)中断、外部中断2(INT2)、外部中断3(INT3)以及外部中断4(INT4)。也就是说有8种情况发生时,会使单片机去处理中断程序,在本章我们只讲解定时器中断,只要大家真正明白了中断的概念,其他几种情况便能轻松掌握。

中断是指CPU在处理某一事件A时,发生了另一件事B,请求CPU迅速去处理(中断发生);CPU暂时停止当前的工作(中断响应),转去处理事件B(中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断,其流程图如图 1.1-1所示。

图 1.1-1 中断流程图

这就像在生活中,我们洗衣服(主程序),突然电话响了(中断请求,也是断点),我们放下衣服(中断响应)去接电话(中断服务),通完电话我们继续去洗衣服(中断返回)。单片机中一旦中断产生就立即去执行中断程序。通俗的讲就是中断开启就执行中断,执行结束才返回原来中断开启的地方继续向下执行。中断允许寄存器IE(如图 1.1-2所示)和INT_CLKO寄存器控制中断的开启还是屏蔽。

图 1.1-2 中断允许寄存器IE

总中断由IE的7位EA控制,置1中断开放,置0中断屏蔽。中断源首先受EA控制,其次还受中断源自己的中断允许控制位控制。3位ET1和1位ET0分别控制定时器1、0的中断,2位EX1和0位EX0分别控制外部中断1、2。

INT_CLKO寄存器的4位、5位和6位控制外部中断2、3、4。如错误!未找到引用源。所示。

4位EX2外部中断2中断允许位,EX2=1允许中断,为0禁止中断。外部中断2下降沿触发。

5位EX3外部中断3中断允许位,EX3=1允许中断,为0禁止中断。外部中断3下降沿触发。

6位EX4外部中断4中断允许位,EX4=1允许中断,为0禁止中断。外部中断4下降沿触发。

那如果同时发生两个或多个中断的时候CPU怎样处理,这个就涉及到了优先级的问题,中断优先级寄存器IP控制着中断的优先级,如图 1.1-3所示。

图 1.1-3 中断优先级控制寄存器IP

STC15L104E中设有两个中断优先级,除外部中断2/3/4外,所有中断请求源可编程为高优先级中断和低优先级中断,可实施二级中断嵌套。所谓的二级中断嵌套就是在执行一个中断程序中里面又存在一个中断。

中断优先级的基本原则:

1. 低优先级中断可被高优先级中断所中断,反之不能。

2. 任何一种中断(不管高低优先级),一旦响应,不会再被它的同级中断所中断。

正常的中断优先级由高到低顺序(没有IP寄存器控制时)是外部中断0、定时器0、外部中断1、定时器1、LVD、外部中断2、外部中断3、外部中断4。中断优先查询顺序

如图 1.1-4所示。

图 1.1-4 中断优先查询顺序

下面我们就来讲定时器中断,定时器中断我们需要知道定时器/计数器控制寄存器TCON,如错误!未找到引用源。所示。TF为中断溢出标志,TR为定时器运行控制位,TE为外部中断请求源,IT为外部中断源触发控制位。

定时器具有计数功能,定时器中断就是当定时器定时计数到溢出时就产生中断,执行中断程序。那么拿16位定时器0来举例,它产生溢出时候的位是2^16(65536),那么我们如果要定时器定时a后产生中断,我们就要向定时器里存65536-a。如果定时器是一个水桶,满水(65536)就溢出,我们想定时器a个数就相当于我们想向水桶里放入a水

后水桶就溢出,那么水桶里原来存的水就是65536-a。这就是定时器中断,无非就是向定时器里存数开启中断,定时一周(存的数)就去做中断要做的事情。

1.1.2 硬件连接原理

详情请参见错误!未找到引用源。,本章节不做介绍。

1.1.3 原工程详解

之前我们了解了定时器,这一节我们将中断和定时器结合起来的方法驱使小灯闪烁。这一段我们采用的是定时器1中断。

第一部分 #include \"reg51.h\"

sbit BEEP =P3^4;

sfr AUXR = 0x8E; // AUXR寄存器的地址为0x8e

unsigned int count=0; // tim1计数标志

上面的代码我们已经不陌生了,头文件、定义位、定义寄存器以及声明变量并初始0。

第二部分 void TIM1_init(void) //20us @11.0592MHz

{

AUXR &= 0xdf; //定时器1为12T模式

TMOD = 0x00; //设置定时器为模式0(16位自动重装载)

TL1 = 0x22; //设置定时初值

TH1 = 0xFF; //设置定时初值

TR1 = 1; //定时器1开始计时

ET1 = 1; //使能定时器0中断

EA = 1;

}

定时器1的初始化,在上一节中出现过,无非就是通过AUXR寄存器设置定时器的周期模式,利用TMOD寄存器设置定时器工作模式,向寄存器里赋值,启动定时器。多的是后面两句ET1 = 1; EA = 1;,ET1是定时器1中断的使能(寄存器见图 1.1-2),将ET1置1我们才能开启这个中断,但是只开定时器1的中断是开启不了的,还要将总中断使能EA(寄存器见图 1.1-2)置1。所以我们要使用中断的时候设置所需的定时器后,还要将中断总使能打开,然后打开所需要的中断的使能。

接下来看非常重要的子函数,中断子函数。

void tm1() interrupt 3 //time1中断

{

while(count--==0)

{

count=1000 ;

BEEP=!BEEP;

}

首先是关于中断的写法,void 中断函数名() interrupt中断号,中断号就是中断查询顺序号(见图 1.1-4),写法可如图 1.1-5所示。

图 1.1-5 C语言中的中断函数写法

在本程序中我们的写法是void tm1() interrupt 3,函数名tim1(),一看便知是定时器1的中断,interrupt3也确实是定时器1中断。中断中的语句while(count--==0),当

count--=0时继续走while中的程序,我们count初值为0,所以一开始定时器第一次定时一周进入中断的时候进入while语句,count赋值1000,然后将BEEP取反。然后执行下一次中断,但是count--不等于0,直到执行1000次的定时才取反一次。

最后我们看一下主函数。

main() //主函数

{

TIM1_init();

while(1);

}

主函数中只有两句执行语句,第一句调用定时器1初始化子函数,第二句防止程序跑飞的while语句。我们要执行的闪烁小灯过程都已经在定时器1中断中实现了。

最后将程序烧到板子里就可看到现象了。

读者还可以试一试利用延时来使小灯闪烁。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.com 版权所有 湘ICP备2023021991号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务