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

这篇博客详细介绍了51单片机的中断过程,包括6个中断源和内部寄存器,如TMOD、TCON、IE及IP寄存器的功能。还探讨了定时器/计数器0和1的工作方式,以及中断服务程序的示例。

一、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最高00003H外部中断0
T0第21000BH定时器/计数器0
INT1第320013H外部中断1
T1第43001BH定时器/计数器1
TI/RI第540023H串行口中断
T2最低5002BH定时器/计数器2

注:

  • TI/RI串口中断中,P3.0为RXD接受中断,P3.1为TXD发送中断。
  • 定时器/计数器2可作为捕获、自动重装、波特率发生器使用,且寄存器相对复杂。
  • 定时器/计数器2的寄存器定义不在头文件中,需要自行定义。
  • 当GATE位为1时,端口线才会决定定时器/计数器的开关。

2.定时器/计数器0和1的寄存器

(1)模式控制寄存器TMOD
位序号D7D6D5D4D3D2D1D0
位符号GATEC/TM1M0GATEC/TM1M0

注:其中高四位设置定时器/计数器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
位序号D7D6D5D4D3D2D1D0
位符号TF1TR1TF0TR0IE1IT1IE0IT0
位地址8FH8EH8DH8CH8BH8AH89H88H
  • 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
位序号D7D6D5D4D3D2D1D0
位符号EAET2ESET1EX1ET0EX0
位地址AFHADHACHABHAAHA9HA8H
  • 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
位序号D7D6D5D4D3D2D1D0
位符号PSPT1PX1PT0PX0
位地址BCHBBHBAHB9HB8H
  • 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;				//清除发送完成标志位				
}

第一次写博客,如有错误,希望大佬们指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值