微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机(二):单片机内部定时/计数器和中断系统

51单片机(二):单片机内部定时/计数器和中断系统

时间:07-27 来源:互联网 点击:

们停下手中的活去帮忙,完事之后回来接着做原来的事情。根据中断引发的不同,或者CPU 响应中断的不同条件,也可以把中断划分为可屏蔽中断(也就是说我们可以拒绝帮别人忙,继续做自己的事情)和不可屏蔽中断(事情做累了,必须休息)两种。

了解了中断原理之后,我们来看中断允许控制寄存器IE(见表4)和中断优先寄存器IP(见表5)。

表4 IE寄存器

EA:中断允许总控制位。EA=0,禁止所有中断;EA=1,开放所有中断,但是否允许各中断源的中断请求,还要取决于各中断源的中断允许控制位的状态。这点要注意,初学者往往容易忘了开放所有中断,从而导致没法进入中断源。

ET2 :时器/ 计数器T2 的中断允许位。

ES :串行口的中断允许位。

ET1 :定时器/ 计数器T1 的中断允许位。

EX1 :外部中断1(INT1) 的中断允许位。

ET0 :定时器/ 计数器T0 的中断允许位。

EX0 :外部中断0(INT0) 的中断允许位。

以上7 个中断允许控制位为0 时,禁止中断,为1 时允许中断。

表5 IP寄存器

PT2 :定时器/ 计数器T1 中断优先级控制位。

PS :串行口中断优先级控制位。

PT1 :定时器/ 计数器T1 中断优先级控制位。

PX1 :外部中断1 优先级控制位。

PT0 :定时器/ 计数器T0 中断控制位。

PX0 :外部中断0 中断优先级控制位。

以上6 个中断优先级控制位分别为“0”时为低级中断,为“1”时为高级中断。如果几个同一优先级的中断源同时向CPU 申请中断,CPU 通过内部顺序查询逻辑电路,按自然优先级顺序确定该响应哪个中断请求。自然优先级由硬件形成,其优先级别从高到底为外部中断0、定时器/ 计数器T0、外部中断1、定时器/ 计数器T1、串行口中断、定时器/ 计数器T2。

至此,对定时器控制相关的重要寄存器都介绍完毕了,接下来通过编写程序来进行验证实践。

二、电路详解

此讲采用和上讲一样的电路,在此不做赘述(见图1)。


图1 定时器应用实验电路图

三、程序设计

定时器0 应用测试程序( 控制D1 闪烁)。

#includeAT89X52.h> (1)

#define led P0_0 (2)

unsigned char count=0; (3)

void main(void) (4)

{

TMOD=0X01; (5)

TH0=(65536-50000)/256; (6)

TL0=(65536-50000)%256; (7)

EA=1; (8)

ET0=1; (9)

TR0=1; (10)

PT0=1; (11)

while(1) ; (12)

}

void timer0(void) interrupt 1 (13)

{

TH0=(65536-50000)/256; (14)

TL0=(65536-50000)%256; (15)

count++; (16)

if(count==10) (17)

{

count=0; (18)

led=!led; (19)

}

}

1. 程序详细说明:

(1)头文件包含。程序接下来调用的P0_0 就是该头文件中定义好的一个寄存器地址。在对单片机内部的寄存器操作之前,应申明其来处,有兴趣的读者可以看看AT89X52.h 文件中的内容。

(2)宏定义led,便于直观理解也便于程序修改,将P0_0 口命名为led,这样在程序中就可以用led代替P0_0 口进行操作。

(3)定义一个8 位的全局变量。

(4)主函数入口。主函数不传递参数也不返回值。

(5)设定定时器0 工作在模式1,为16 位的计数器。

(6)定时器高8 位赋初值。对256 取整。

(7)定时器低8 位赋初值。对256 取余。

(8)开总中断。

(9)开定时器0 中断。

(10)定时器0 启动,开始计数。

(11)设置开定时器0 中断为优先中断。

(12)死循环,等待中断。

(13)定时器0 中断服务函数入口。

(14)定时器高8 位赋初值。对256 取整。

(15)定时器低8 位赋初值。对256 取余。

(16)对变量count 进行加1 操作。

(17)如果count 增长到10。

(18)count 变量清0。

(19)led 输出取反。

2. 程序流程图与实验现象

程序流程如图2 所示。经编译下载程序到单片机内运行后,可以看到实验板上P0_0 口外接的LED 灯有规律的一亮一灭的闪烁见图3。亮灭的时间可以计算为10×50000×1.085μs=542.5ms。

实际的时间要比这稍多几个ms,这是因为没有把条件判断和程序调用的指令时间算在内。在要求非常精确的场合,应当实际微调。


图2 主程序和中断服务函数流程图


图3 实验现象效果

四、总结

本讲主要介绍了51 单片机内部定时器和中断系统以及编写第一个简单的定时器实验程序。通过该讲,大家可以发现单片机内的定时器和中断系统并不难学,只要记住应用的相关操作步骤多进行几次实践就可以很熟练的掌握这些资源的用法。鉴于本讲的理论内容较多,希望读者多*时间记下或者熟悉。下一讲,将要介绍如果单片机串口通信并给出实例,敬请期待。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top