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

一、51单片机的中断过程

1.中断的示意图

51单片机学习笔记——中断_第1张图片
51单片机学习笔记——中断_第2张图片

二、中断源与内部寄存器

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时外部中断定义为高优先级。
    51单片机学习笔记——中断_第3张图片

三、单片机中断的代码详解

例程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单片机学习笔记——中断)