52单片机
- 52单片机共有6个中断源:
INT0-外部中断0,P3.2端口,低电平或者下降沿引起。
INT1-外部中断1,P3.3端口,低电平或者下降沿引起。
T0-定时器0/计数器0中断,T0计数器计满回零引起。
T1-定时器1/计数器1中断,T1计数器计满回零引起。
T2-定时器2/计数器2中断,T2计数器计满回零引起。
TI/RI-串行口中断,串行端口完成一帧字符发送/接收引起。

中断允许寄存器IE
- 中断允许寄存器IE用于设定各个中断源的打开和关闭,IE在特殊功能寄存器中,字节地址为A8H,位地址分别为A8H-AFH,可进行位寻址,即可以对寄存器的每一位进行单独操作。单片机复位时IE全部被清0。
| 位序号 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|---|
| 位符号 | EA | - | ET2 | ES | ET1 | EX1 | ET0 | EX0 |
| 位地址 | AFH | - | ADH | ACH | ABH | AAH | A9H | A8H |
EA:全局中断允许位
- EA=1:打开全局中断控制。
- EA=0:关闭全部中断。
ET2:定时器/计数器2中断允许位
- ET2=1:打开T2中断。
- ET2=0:关闭T2中断。
ES:串行口中断允许位
- ES=1:打开串行口中断。
- ES=0:关闭串行口中断。
ET1:定时器/计数器1中断允许位
- ET1=1:打开T1中断。
- ET1=0:关闭T1中断。
EX1:外部中断1中断允许位
- EX1=1:打开外部中断1中断。
- EX1=0:关闭外部中断1中断。
ET0:定时器/计数器0中断允许位
- ET1=1:打开T0中断。
- ET1=0:关闭T0中断。
EX0:外部中断0中断允许位
- EX0=1:打开外部中断0中断。
- EX0=0:关闭外部中断0中断。
中断优先级寄存器IP
中断优先级寄存器IP在特殊功能寄存器中,字节地址为B8H,位地址为B8H-BFH,IP用来设定各个中断源属于两级中断中的哪一级,该寄存器可以进行位寻址。单片机复位时IP全部被清0.
| 位序号 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|---|
| 位符号 | - | - | - | PS | PT1 | PX | PT0 | PX0 |
| 位地址 | - | - | - | BCH | BBH | BAH | B9H | B8H |
PS:串行口中断优先级控制位
- PS=1:串行口中断定义为高优先级中断。
- PS=0:串行口中断定义为低优先级中断。
PT1:定时器/计数器1中断优先级控制位
- PT1=1:定时器/计数器1中断定义为高优先级中断。
- PT1=0:定时器/计数器1中断定义为低优先级中断。
PX1:外部中断1中断优先级控制位
- PX1=1:外部中断1定义为高优先级中断。
- PX1=0:外部中断1定义为低优先级中断。
PT0:定时器/计数器0中断优先级控制位
- PT0=1:定时器/计数器0中断定义为高优先级中断。
- PT0=0:定时器/计数器0中断定义为低优先级中断。
PX0:外部中断1中断优先级控制位
- PX0=1:外部中断0定义为高优先级中断。
- PX0=0:外部中断0定义为低优先级中断。
定时器/计数器工作方式寄存器TMOD
字节地址为89H,不能位寻址,单片机复位时全被清0。
| 位序号 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|---|
| 位符号 | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |
TMOD的高四位用于设定定时器1,低四位用于设定定时器0。
GATE:门控制位
- GATE=0:定时器/计数器启动与停止仅受TCON寄存器中TRX来控制
- GATE=1:定时器/计数器启动与停止仅受TCON寄存器中TRX和外部中断INTX上的电平状态控制。
C/T:定时器/计数器模式选择位
- C/T=1:计数器模式。
- C/T=0:定时器模式。
M1M0:工作方式选择
| M1 | M0 | ----- |
|---|---|---|
| 0 | 0 | 方式0:13位定时器/计数器 |
| 0 | 1 | 方式1:16位定时器/计数器 |
| 1 | 0 | 方式2:8位初值自动重装的定时器/计数器 |
| 1 | 1 | 方式3:仅用于T0,分成两个8位计数器,T1停止计数 |
定时器/计数器控制寄存器TCON
字节地址为88H,位地址为88H-8FH,可进行位寻址,单片机复位全部清0。
| 位序号 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|---|
| 位符号 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
| 位地址 | 8FH | 8EH | 8DH | 8CH | 8BH | 8AH | 89H | 88H |
TF1:定时器1溢出标志位
- TF=1:定时器计数溢出后,由硬件使TF1置1,并且申请中断,进入中断服务程序后,由硬件自动清0。
TR1:定时器1运行控制位
- 由软件清0关闭定时器1,当GATE=1时,且INT1为高电平时,TR1置1启动定时器1;当GATE=0时,TR1置1,启动定时器1。
IE1:外部中断1请求标志
- 置1表示外部中断1向CPU申请中断。
IT1:外部中断1触发方式选择位 - IT1=0:电平触发模式。
- IT1=1:跳变沿触发。
#定时器0-工作方式1
- 逻辑结构图:


- 定时器初始化过程:
1、对TMOD赋值:(定时器/计数器工作方式寄存器)
2、计算初值,给THX TLX赋值
3、对中断允许寄存器IE进行赋值,开放中断
4、使定时器/计数器控制寄存器TCON中的TRX置位,启动定时器/计数器
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^0;
uchar num;
void main()
{
TMOD=0x01; //定时器0,工作方式1,0000 0001
TH0=(65536-45872)/256; //定时50ms=50000us,50000/1.09=45872
TL0=(65536-45872)%256;
EA=1; //中断允许寄存器打开全局中断允许位
ET0=1; //中断允许寄存器打开T0中断允许位
TR0=1; //定时器/计数器控制寄存器TCON启动定时器T0
while(1) //程序停止在这里等待中断发生
{
if(num==20)
{
num=0;
led1=~led1;
}
}
}
void T0_time() interrupt 1
{
TH0=(65536-45872)/256; //定时50ms=50000us,50000/1.09=45872
TL0=(65536-45872)%256;
num++;
}