单片机内部定时/计数器和中断系统
在上文中提到定时器溢出和中断,什么是定时器溢出呢?我们可以这样理解:往一个盆中滴水,水滴持续落下,盆中的水持续变满,最终会有一滴水使得盆中的水满了(这相当于计数到最大值)。这个时候如果再有一滴水落下,这时水就会漫出来,这就是“溢出”。当然,水溢出是流到地上,而定时器溢出后将使得TF0 变为“1”。一旦TF0 由0 变成1,就会产生中断。中断就是由于某个事件的发生,CPU 暂停当前正在执行的程序,转而执行处理该事件的一个程序。该程序执行完成后,CPU 接着执行被暂停的程序的这样一个过程。这正如我们本来在做某事,有人过来请求帮忙,我们停下手中的活去帮忙,完事之后回来接着做原来的事情。根据中断引发的不同,或者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 主程序和中断服务函数流程图
- FPGA的DSP性能揭秘(06-16)
- 基于单片机通用引脚的软件UART设计(10-16)
- 分时操作系统思想在单片机中的具体应用 (10-30)
- 基于AT89C51+DSP的双CPU伺服运动控制器的研究(05-26)
- 关于RTX51 TINY的分析与探讨(05-30)
- 基于MC9S12DGl28单片机的智能寻迹车设计(04-03)