在写单片机的定时器程序时,在程序开始处需要对定时器及中断寄存器做初始化设置:
【1】对TMOD赋值,以确定T0和T1的工作方式 【2】计算初值,并将值写入TH0、TL0和TH1、TL1
【3】中断方式时,则对IE赋值,开放中断
【4】使TR0或TR1置位,启动定时器/计数器定时或计数
51单片机一般有两个定时器/计数器T0和T1,每个定时器由两个8位的寄存器(高8位和低8位)组成,分别为TH0/TL0和TH1和TL0
定时器/计数器有4种工作方式
M1 | M0 | 工作方式 |
0 | 0 | 方式0,为13位定时器/计数器 |
0 | 1 | 方式1,为16位定时器/计数器 |
1 | 0 | 方式2,8位初值自动重装的8位定时器/计数器 |
1 | 1 | 方式3,仅适用于T0,分成两个8位计数器,T1停止计数 |
其中M1、M0由TMOD寄存器控制
TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。—-> 控制哪个定时器工作 TF1/TF0 : 定时器1或0溢出标志位 —> 中断发生
TR1/TR0 : 定时器1或0运行控制 —> 控制哪个定时器运行
中断允许寄存器IE: 用来设定各个中断源的打开和关闭 EA:全局中断允许位
ET2:定时器2中断允许位
ES:串口中断允许位
ET1:定时器1中断允许位
EX1:外部中断1中断允许位
ET0:定时器0中断允许位
EX0:外部中断0中断允许位
中断流程的具体代码:
void main() { TMOD = 0x01; // 设定定时器0工作方式1 TH0 = (65535-45872)/256; // 装初值 11.0592M晶振定时50ms数为45872 TL0 = (65525-45872)%256; EA = 1; // 开总中断 ET0 = 1; // 开定时器0中断 TR0 = 1; // 启动定时器0 while(1); }
中断服务程序
void FunName() interrupt 中断号 { // coding .... }