一、51单片机的中断过程
1.中断的示意图


二、中断源与内部寄存器
1.中断源
52单片机共有6个中断源。
| 中断源 | 解释 | 端口线 |
|---|---|---|
| INT0 | 外部中断0,低电平或下降沿引起 | P3.2 |
| INT1 | 外部中断1,低电平或下降沿引起 | P3.3 |
| T0 | 定时器/计数器0,由T0计数器计满回零引起 | P3.4 |
| T1 | 定时器/计数器1,由T1计数器计满回零引起 | P3.5 |
| T2 | 定时器/计数器2,由T2计数器计满回零引起 | P1.0 |
| TI/RI | 串行口中断,串行端口完成一帧字符发送后引起 | P3.0/P3.1 |
| 中断源 | 中断级别 | 序号(C语言用) | 入口地址(汇编用) | 注释 |
|---|---|---|---|---|
| INT0 | 最高 | 0 | 0003H | 外部中断0 |
| T0 | 第2 | 1 | 000BH | 定时器/计数器0 |
| INT1 | 第3 | 2 | 0013H | 外部中断1 |
| T1 | 第4 | 3 | 001BH | 定时器/计数器1 |
| TI/RI | 第5 | 4 | 0023H | 串行口中断 |
| T2 | 最低 | 5 | 002BH | 定时器/计数器2 |
注:
- TI/RI串口中断中,P3.0为RXD接受中断,P3.1为TXD发送中断。
- 定时器/计数器2可作为捕获、自动重装、波特率发生器使用,且寄存器相对复杂。
- 定时器/计数器2的寄存器定义不在头文件中,需要自行定义。
- 当GATE位为1时,端口线才会决定定时器/计数器的开关。
2.定时器/计数器0和1的寄存器
(1)模式控制寄存器TMOD
| 位序号 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|---|
| 位符号 | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |
注:其中高四位设置定时器/计数器T1,低四位设置定时器/计数器T0。
- GATE为门控制位。用于控制定时器/计数器的启动与停止。
| 电平状态 | 注释 |
|---|---|
| GATE = 0 | 仅受TCON寄存器中的TR位来控制 |
| GATE = 1 | 受TCON寄存器中的TR位和外部中断引脚电平控制 |
- C/T位用于定时器/计数器模式选择。
| 电平状态 | 注释 |
|---|---|
| C/T = 0 | 定时器模式 |
| C/T = 1 | 计数器模式 |
- M1,M0位共同决定工作方式的选择。
| 电平状态 | 注释 |
|---|---|
| M1 = 0 , M0 = 0 | 工作方式0,13位定时器/计数器 |
| M1 = 0 , M0 = 1 | 工作方式1,16位定时器/计数器 |
| M1 = 1 , M0 = 0 | 工作方式2,8位初值自动重装的8位定时器/计数器 |
| M1 = 1 , M0 = 1 | 工作方式3,仅适用于T0,分成两个8位计数器,T1停止计数 |
注:常使用工作方式1,因为计数范围比较大。
(2)控制寄存器TCON
| 位序号 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|---|
| 位符号 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
| 位地址 | 8FH | 8EH | 8DH | 8CH | 8BH | 8AH | 89H | 88H |
-
TF位,定时器/计数器溢出标志位。
其中定时器/计数器0溢出标志位为TF0,定时器/计数器1溢出标志位为TF1。
当数据溢出时使TF位置1,并申请中断。进入中断服务程序后会自动清零。 -
TR位,定时器/计数器运行控制位。
其中定时器/计数器0运行控制位为TR0,定时器/计数器1运行控制位为TR1。
TR位与TMOD中的GATE位决定开关定时器/计数器,当TR位为0时关闭并清零,当TR位为1,GATE=0时,开启定时器/计数器;当TR位为1,GATE=1时,需要使INT1为高电平时才能开启定时器/计数器。 -
IT位,外部中断控制位。
其中定时器/计数器0控制位为IT0,定时器/计数器1控制位为IT1。
当IT位为0是电平触发方式,为1是跳变沿触发方式。 -
IE位,外部中断请求标志位。
其中定时器/计数器0请求标志位为IE0,定时器/计数器1请求标志位为IE1。
当IT设置为电平触发方式时,检测INT0/INT1引脚,当INT为低电平,IE位为1;当INT为高电平,IE位为0。
(3)中断允许寄存器IE
| 位序号 | 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,关闭全局中断。 - ET位,定时器/计数器中断允许位。
其中定时器/计数器0中断允许位为ET0,定时器/计数器1中断允许位为ET1,定时器/计数器2中断允许位为ET2。
ET位为1,打开定时器/计数器中断;ET=0,关闭定时器/计数器中断。 - ES位,串行口中断允许位。
ES=1,打开串行口中断;ES=0,关闭串行口中断。 - EX位,外部中断允许位。
其中定时器/计数器0外部中断允许位为EX0,定时器/计数器1外部中断允许位为EX1。
EX位为1,允许外部中断0中断;EX位为0,禁止外部中断0中断。
(4)中断优先级寄存器IP
| 位序号 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|---|
| 位符号 | – | – | – | PS | PT1 | PX1 | PT0 | PX0 |
| 位地址 | – | – | – | BCH | BBH | BAH | B9H | B8H |
- PS位,串口中断优先级控制位。PS=1时串口中断定义为高优先级。
- PT1位,定时器/计数器1中断优先级控制位。PT1=1时定时器/计数器1定义为高优先级。
- PX1位,外部中断1中断优先级控制位。PX1=1时外部中断定义为高优先级。
- PT0位,定时器/计数器0中断优先级控制位。PT0=1时定时器/计数器0定义为高优先级。
- PX0位,外部中断0中断优先级控制位。PX0=1时外部中断定义为高优先级。

三、单片机中断的代码详解
例程1、定时器0工作方式1的初始化和服务程序
/*定时器0初始化*/
void timer0_Init(void)
{
TMOD = 0X01; //选择定时器0,工作方式1,仅用TR0打开
TH0 = 0Xfc; //1ms定时,也可改为TH0 = (65535-1000)/256
TL0 = 0X18; //TL0 = (65535-1000)%256
TR0 = 1; //打开定时器0开关
ET0 = 1; //打开定时器0中断允许
EA = 1; //打开总中断
}
/*定时器0中断服务程序*/
void timer0() interrupt 1 //interrupt 1 表示使用序号1 代表使用定时器T0
{
TH0 = 0Xfc; //重新设置初值
TL0 = 0X18;
/*下面写中断服务程序*/
}
例程2、计数器0工作方式1的初始化和服务程序
/*计数器0初始化*/
void counter0_Init(void)
{
TMOD = 0x05; //选择计数器0,工作方式1,仅用TR0打开
TH0 = 255; //计数为1
TL0 = 255;
TR0 = 1; //打开定时器0开关
ET0 = 1; //打开定时器0中断允许
EA = 1; //打开总中断
}
void counter0() interrupt 1 //interrupt 1 表示使用序号1 代表使用计数器T0
{
TH0 = 255; //重新设置初值
TL0 = 255;
/*下面写中断服务程序*/
}
例程3、串口通信初始化和服务程序
/*串口中断初始化*/
void uart_Init(void)
{
SCON = 0x50; //设置工作方式1
TMOD|=0x20; //设置计数器1,工作方式2
TH1 = 0xFA; //计数器初始值设置,波特率为9600
TL1 = 0XFA;
ES = 1; //打开接受中断
EA = 1; //打开总中断
TR1 = 1; //打开计数器
PCON = 0x80; //波特率加倍
}
/*串口中断服务程序*/
void uart() interrupt 4
{
unsigned char bht; //储存用于接收的数据
bht = SBUF; //出去接受到的数据
RI = 0; //清除接受中断标志位
SBUF = bht; //将接受到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI = 0; //清除发送完成标志位
}
第一次写博客,如有错误,希望大佬们指正。
这篇博客详细介绍了51单片机的中断过程,包括6个中断源和内部寄存器,如TMOD、TCON、IE及IP寄存器的功能。还探讨了定时器/计数器0和1的工作方式,以及中断服务程序的示例。
2160

被折叠的 条评论
为什么被折叠?



