51单片机学习笔记——中断

一、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的初始化和服务程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*定时器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的初始化和服务程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*计数器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、串口通信初始化和服务程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*串口中断初始化*/
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单片机学习笔记——中断
http://blog.mingxuan.xin/2020/05/12/20200512/
作者
Obscure
发布于
2020年5月12日
许可协议