先整理记录外部中断和定时器中断(っ・Д・)っ。
单片机: STC89C52
开发板: HC6800-MS



相关的特殊功能寄存器
定时器控制寄存器TCON
位 |
符号 |
说明 |
0 |
IT0 |
外部中断0触发方式选择位。置0,则为低电平触发;置1,则为负跳变触发。 |
1 |
IE0 |
外部中断0请求标志位。 |
2 |
IT1 |
外部中断1触发方式选择位。置0,则为低电平触发;置1,则为负跳变触发。 |
3 |
IE1 |
外部中断1请求标志位。 |
4 |
TR0 |
定时器0运行控制位。软件置1来启动定时器;软件清零来停止定时器。 |
5 |
TF0 |
定时器0中断标志位。 |
6 |
TR1 |
定时器1运行控制位。软件置1来启动定时器;软件清零来停止定时器。 |
7 |
TF1 |
定时器1中断标志位。 |
中断允许寄存器IE
位 |
符号 |
说明 |
0 |
EX0 |
外部中断0允许位。 |
1 |
ET0 |
定时器中断0允许位。 |
2 |
EX1 |
外部中断1允许位。 |
3 |
ET1 |
定时器中断1允许位。 |
4 |
ES |
串口中断允许位。 |
5 |
/ |
/ |
6 |
/ |
/ |
7 |
EA |
中断总允许位。 |
定时器模式寄存器TMOD
TMOD的位分配
注:标有T1
的符号表示控制定时器T1
的位,标有T0
的符号表示控制定时器T0
的位。
位 |
符号 |
复位值 |
7 |
GATE(T1) |
0 |
6 |
C/T(T1) |
0 |
5 |
M1(T1) |
0 |
4 |
M0(T1) |
0 |
3 |
GATE(T0) |
0 |
2 |
C/T(T0) |
0 |
1 |
M1(T0) |
0 |
0 |
M0(T0) |
0 |
TMOD的位描述
符号 |
描述 |
GATE |
门控位。当GATE=0时,只要TCON中的TR0或TR1为1,就能启动相应的定时器/计数器;当GATE=1时,只要TCON中的TR0或TR1为1,且外部中断引脚INT0或INT1为高电平时,才能启动相应的定时器/计数器。 |
C/T |
定时器/计数器模式选择位。C/T=0为定时器模式;C/T=1为计数器模式。 |
TMOD的M1、M0和工作模式
M1 |
M0 |
工作模式 |
描述 |
0 |
0 |
0 |
兼容8048单片机的13位定时器。 |
0 |
1 |
1 |
THn和TLn组成一个16位的定时器。 |
1 |
0 |
2 |
8位自动重装载模式,定时器溢出后把THn重装载到TLn。 |
1 |
1 |
3 |
禁用定时器T1 ,定时器T0 变成两个8位定时器。 |
外部中断
STC89C52有两个外部中断源——外部中断0和外部中断1,分别由引脚INT0(P3.2)
和INT1(P3.3)
的低电平或负跳变触发。

用法
要使用外部中断,需要对IE和TCON这两个特殊功能寄存器进行初始化操作:
1. 开启中断总允许位EA 2. 开启外部中断允许位EX 3. 设置外部中断触发方式
|
举个栗子
#include<reg51.h> sbit D8=P2^7; sbit K5=P3^5; sbit x=P3^2; void Delay10ms() { unsigned char i=20,j=113; do { while(--j); } while(--i); }
void Interrupt() { EA=1; EX0=1; IT0=1; } void Int0() interrupt 0 { D8=~D8; } void main() { int Key=0; Interrupt(); while(1) { if(K5==0&&Key==0) { Delay10ms(); Key=1; if(K5==0) { x=1; x=0; } } else if(K5==1) { Key=0; } } }
|
运行结果:初次按下独立按键K5
,LEDD8
亮;再次按下独立按键K5
,LEDD8
灭。
定时器中断
当定时器的计数值溢出时,就能够触发定时器中断。
用法
要使用定时器中断,需要对TCON、IE和TMOD这三个特殊功能寄存器进行初始化操作:
1. 开启中断总允许位EA 2. 开启定时器中断允许位ET 3. 设置定时器的工作模式 4. 确定THn和TLn的初值 5. 开启定时器
|
举个栗子
#include<reg51.h> sbit D8=P2^7; void Time0() { EA=1; ET0=1; TMOD=1; TH0=0xB8; TL0=0x00; TR0=1; } void Timeinterrupt0() interrupt 1 { int i; TH0=0xB8; TL0=0x00; i++; if(i==50) { D8=~D8; i=0; } } void main() { Time0(); while(1); }
|
运行结果:开发板上编号为D8
的LED以先点亮1秒后熄灭1秒的规律来循环亮灭。
附注
中断源 |
中断号 |
外部中断0 |
0 |
定时器中断0 |
1 |
外部中断1 |
2 |
定时器中断1 |
3 |
串口中断 |
4 |