简介:
主要介绍定时器的使用。
中断资源:
8051中断有5种:外部中断0、定时器/计数器0、外部中断1、定时器/计数器1、串口中断。
TMOD寄存器:
TMOD是定时器/计数器的模式控制寄存器。
其中高四位控制定时器1,低四位控制寄存器0。
GATE置为0,仅由TRx控制是否启动。
C/T置为0,为定时器模式。
M1和M0控制定时器的工作模式,置为01,为16位定时器。
机器周期:(以12M晶振为例,1M = 10^6)
时钟周期:1/12M = 1/12 us
机器周期:12*时钟周期 = 1us ;
注意普通单片机以12个时钟周期为一个机器周期,一些增强型单片机比如12T增强型单片机,以1个时钟周期为一个机器周期;
TH0和TL0:
T0为1个16位的寄存器,用来设置定时器0的初值,当T0加满到2^16即65536就完成了一次定时。
由于51单片机是8位的,所以T0表示为TH0和TL0.
假设要定时n个us,那么
TH0 = (65536-n)/256
TL0 = (65536-n)%256
256表示,低位的八位
中断服务程序:
void 函数名() interrupt 中断号{
//中断服务程序内容
}
中断服务程序无需主动调用。
中断号:
0:外部中断0
1:定时器/计数器0
2:外部中断1
3:定时器/计数器1
4:串口中断
如果是8052单片机,如AT89S52,还有一个定时器2,中断号为5
启动定时器:
TMOD=0x01; //设置定时器0位工作模式1
TH0=(65536-1000)/256; //定时1ms
TL0=(65536-1000)%256; //定时1ms
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
示例:
功能:用定时器0控制led以300ms的周期闪烁
#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit led1=P2^7; uint num; uint numTimer0 = 1000; //定时器定时时间1ms void main() { TMOD=0x01; //设置定时器0为16位定时器 TH0=(65536-numTimer0)/256; TL0=(65536-numTimer0)%256; EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1; //启动定时器0 while(1) { if(num==300) //num == 300,即300ms { led1=~led1; //让发光管状态取反 num=0; } } } void T0_time()interrupt 1 { TH0=(65536-numTimer0)/256; //重新装载初值 TL0=(65536-numTimer0)%256; num++; }