STC89C52学习笔记(六)
综述:本文讲述了51单片机的定时器和中断,还讲述了如何初始化定时器、编写中断服务函数和完成定时器控制LED闪烁。
一、定时器
1. 作用
①用于计时
②替代长时间的Delay。因为在Delay下,单片机的MCU也被占用着不能执行其他工作,按键检测和其他工作会不灵敏。
2. 数目
不同单片机有不同数目的定时器和操作方式,在使用前可以先查一下数据手册。
STC89C52有三个定时器:T0、T1、T2,T0、T1是所有51单片机都有的。
3. 定时器的工作模式
(1)STC89C52的T0和T1均有四种工作模式:模式0:13位定时器/计数器;模式1:16位定时器/计数器(常用);模式2:8位自动重装模式;模式3:两个8位计数器。
(2)工作模式包括:时钟(SySclk是系统时钟,也即是晶振周期,在本单片机上,晶振是12MHz)、计数(最大能计数到65535)、中断。定时器T0和T1工作模式1的框图如下:
思路:定时器→计数→中断。定时器≈小闹钟,当时钟输出信号每隔一秒,计数加一,当加到指定时间,计数单元向中断系统发送申请,产生中断,程序跳转到中断服务程序中,执行完再回到原来的程序。
二、中断
1.定义
中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。
2.数目
一般51单片机有8个中断源:外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、外部中断2、外部中断3,其中外部中断2、外部中断3不是每个51单片机都有的。
3.优先级
每一个中断源有一个优先级别,CPU总是先响应优先级别最高的中断请求,51单片机共有4个中断优先级。
4.中断号
三、定时器控制LED闪烁
1. 初始化定时器0
初始化定时器0,需要对以下寄存器进行赋值,使之实现以下通道。
①配置TMOD寄存器。
使定时器工作在定时器0(T0),所以,TMOD寄存器应配置为0000 0001,
②配置TCOD寄存器。
当TF为1时,会产生中断,于是应该将TF0配置为0。配置TR0为1,使T0开始计数,IE0和IT0控制外部中断引脚。
③给计时器赋初值。
由于计时器可以计数2^16-1=65535次,每次1us,总共65535us。这里给高位TH0=x/256,低位TL0=x%256,x是需要计数的值。
④配置ET0=1,EA=1,PT0=0。
代码如下:
void Timer0_Init()
{TMOD=0x01;TF=0;TR0=1;TH0=65535/256;TL0=65535%256;ET0=1;EA=1;PT0=0;
}
2. 编写中断程序
①查询定时器0的中断号为interrupt 0。
②计算计时时间,编写中断程序。若是每隔1sLED状态取反一次,即可使计数器0达成1ms的计数,再在函数中循环1000次,达成1s的时间。由于65535-64535=1000us=1ms,即可使“TH0=64535/256;TL0=64535%256;”。程序如下:
void Timer0_Routine() interrupt 1
{TH0=64535/256;//1000us,也即是1msTL0=64535%256;T0Count++;if(T0Count>=1000)//每隔一秒P2_0取反一次{T0Count=0;P2_0=~P2_0;}
}
拓展:
①修改TMOD的配置函数。
以上的程序虽然可以完成相应的要求,但是TMOD寄存是不可位寻址,也即是,在这种配置下(TMOD=0x01),只能实现寄存器0这种模式,寄存器1没办法使用。所以这里可以用与或式赋值法,将TMOD配置为TMOD=TMOD&0xF0,保留高4位的值,把第四位清零;TMOD=TMOD|0xF0,保留高七位的值,将最后一位置1。
所以,可以把初始化的代码更改位
void Timer0_Init()
{TMOD=TMOD&0xf0;TMOD=TMOD|0x01;TF0=0;TR0=1;TH0=64535/256;//1000us,也即是1msTL0=64535%256;ET0=1;EA=1;PT0=0;
}
②简便版配置计数器初始化。
运用“stc-isp”软件,点击“定时器计数器”,按照以下配置,再加上ET0=1,EA=1,PT0=0,即可生成1ms的定时器0计数初始化。
void Timer0_Init()
{TMOD &= 0xF0; //设置定时器模式TMOD |= 0x01; //设置定时器模式TL0 = 0x18; //设置定时初值TH0 = 0xFC; //设置定时初值TF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时ET0=1;EA=1;PT0=0;
}
四、模块化定时器0
将定时器模块化可以方便日后的使用。建立.c和.h文件,将定时器0初始化函数和定时器0中断函数赋值到.c文件中,并添加函数相应说明。在.h文件中,添加防重复定义和函数的声明。
参考视频:51单片机学习视频
侵权联系删除!