51单片机的中断系统及编程(附案例)

本文简单粗暴地阐述了中断的一些概念、中断源、中断寄存器各位的作用,并写出了编写一个中断函数的流程/要点。不在意细节时,可直接查看照搬“三、中断程序的编程”。

一、中断概念

中断定义(比喻):

​ A同学得知B同学今天会送一本书过来给他,但是不知道B什么时候来。所以A会一直做自己的事情,直到B发信息告诉他“我来了”才下楼拿书,而后又回去做自己的事情。

​ 如此便是中断的好处——可以让程序进行自己的工作,当有中断请求时再去执行中断服务程序,完成后继续自己的原工作。

中断的主要名词:

  1. 中断源:即何种事件可以引发中断。

  2. 中断请求:即告诉处理器,有一个中断事件出现了。

    • 发生中断后,微处理器要识别中断请求来自哪个中断源。
  3. 中断优先级:先执行哪个中断呢。

    • 同时出现多个中断请求时,处理器会按优先级从高到低依次执行中断服务程序。
  4. 中断响应:处理器接受中断至执行用户设置的程序的此段时间内发生的事情。

    • 先完成当前正在执行的指令,并保存下一条指令的地址(断点);
    • 暂停主程序的执行后,将程序执行的地址接入到中断入口地址;
    • 一般此时会在找中断入口地址的单元内写一条无条件转移指令(因为该地址仅8字节),使得程序跳转到中断服务程序中执行。
  5. 中断处理:执行中断服务程序。

  6. 中断嵌套:当前正在进行的中断服务程序,可以被更高优先级的中断请求打断。

  7. 中断返回:程序回到断点处,继续执行主程序。

二、51的中断系统

中断系统的结构:

在这里插入图片描述

中断源:

1)中断源种类:

​ 51的中断系统共有5个中断源

  • 外部中断0(INT0):由P3.2引脚输入的中断请求信号。
  • 外部中断1(INT1):由P3.3引脚输入的中断请求信号。
  • 定时器T0中断(T0):由定时器/计数器T0的定时、计数溢出产生的中断请求。
  • 定时器T1中断(T0):由定时器/计数器T1的定时、计数溢出产生的中断请求。
  • 串行口中断(ES):由串行数据发生完成(TI)或串行数据接收完成(RI)产生的中断请求。
2)中断地址入口:

​ 5个中断源有其固定的中断地址入口,编写中断服务程序时要附带对应的中断序号,以控制程序进行对应的中断响应。

中断源中断入口地址中断序号
外部中断00003H0
定时器T0000BH1
外部中断10013H2
定时器T1001BH3
串行口中断ES0023H4

中断的寄存器:

注:在<reg51.h>和<reg52.h>中,各寄存器对应的位已被定义,意味着无需宏定义便可直接进行“EA=1”之类的编程。

1)中断请求标志:

1.TCON寄存器

位:76543210
字节地址:88HTF1TR1TF0TR0IE1IT1IE0IT0

各标志位功能如下:

  1. TF0——定时器T0的溢出中断请求标志位。溢出时由硬件置1,即开始发送中断请求;单片机响应中断后,重新由硬件清0。
  2. TR0——定时器/计数器0的启动控制。功能详见定时器知识。
  3. IE0——外部中断0的中断请求标志位。触发中断时由硬件置1,即开始发送中断请求;单片机响应中断后,重新由硬件清0。
  4. IT0——外部中断0的触发方式选择位。令它为1,则对应引脚为下降沿触发中断;令它为0,则对应引脚为低电平触发方式。
  5. TF1、TR1,IE1、IT1则为定时器1、外部中断1的相关标志位,功能与上述相同。

2.SCON寄存器

位:76543210
字节地址:98HSMDSM1SM2RENTB8RB8T1R1

各标志位功能如下:

  1. TI——串行口发送完成中断请求标志位。串行口发送数据后,TI位被硬件置1;单片机响应串行口中断后,必须在服务程序中将TI手动清0。
  2. RI——串行口接收完成中断请求标志位。串行口接收数据后,TI位被硬件置1;单片机响应串行口中断后,必须在服务程序中将TI手动清0。
2)中断控制:

1.中断允许寄存器IE

位:76543210
字节地址:A8HEA--ESET1EX1ET0EX0

各位的功能如下:

  1. EA——总中断允许控制位。用来开启或屏蔽所有的中断请求,令它为1,则开放中断请求,可以响应中断;令它为0,则屏蔽所有中断请求。
  2. ES——串行口中断允许控制位。为1时开放串行口中断请求,为0时屏蔽。
  3. ET1——定时器/计数器T1中断允许控制位。为1时开放TI的中断请求,为0时屏蔽。
  4. EX1——外部中断1中断允许控制位。为1时开放外部中断1的中断请求,为0时屏蔽。
  5. ET0、EX0则为T0、外部中断0的中断允许控制位。功能与上述相同。

2.中断优先级寄存器IR

位:76543210
字节地址:B8H---PSPT1PX1PT0PX0

各位的功能如下:

  1. PS——串行口中断优先级控制位。
  2. PT1——TI中断优先级控制位。
  3. PX1——外部中断1中断优先级控制位。
  4. PT0、PX0则为T0、外部中断0的中断优先级控制位。功能与上述相同。

中断响应的条件:

  • 中断源发出有效的中断请求,相应的中断请求标志位被置1;
  • 中断允许寄存器IE中的EA=1;
  • 相应中断源的中断请求被开放,即IE中相应位被置1。

三、中断系统的编程

中断初始化:

使用中断前,必须打开中断。

EA=1;	//打开总中断,必备。
ET0=1;	//根据中断源打开相应的中断允许位,必备。

TR0=1//如果使用定时器,则记得打开定时器
EX0=1;	//如果检测外部中断,则记得选择中断触发方式

中断优先级的设置:

非必需,需要则设置寄存器IP。

中断服务程序:

void name() interrupt 1
{
    中断服务程序
}

// name是自定义的中断名字;
// interrupt必须有,表明此为中断服务程序;
// 1是中断序号,必须有。(51中有0~4号中断源)

四、应用实例

下面是使用中断控制LCD显示按键操作次数的源码,其中有关于LCD的函数、定义已被忽略。

▲重点在全局变量的应用、服务程序的编写、中断初始化函数

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char

sbit LCD=……			//LCD的有关定义
sbit key=P3^2;		//按键S4

uint num=0;		//记录按下的次数

/*函数功能:粗略延时*/
void delay(uint ms){
	uint i=0,j=0;
	for(;i<=ms;i++){
		for(;j<=110;j++);
	}
}

/*函数功能:LCD写入指令*/
void write_com(uchar command)/*函数功能:LCD写入数据*/
void write_datas(uchar datas)/*函数功能:初始化LCD*/
void init()/*函数功能:中断初始化-下降沿触发*/
void interr(){
	 EA=1;		//开总中断
	 EX0=1;		//开外部中断0
	 IT0=1;		//设定外部中断0为下降沿触发
}

void main()
{
	init();
	interr();
	while(1){
		write_com(0x80);	//将数值的显示位置固定在此
		delay(5);
		write_datas(num);		//显示按键操作次数
		delay(5);
	}
}

void key_num() interrupt 0
{
	delay(100);		//延时消抖
	if(key==0){
		if(num==4) num=0;	 /*注:先if再++,则按下超过4次*/
		num++;				 /*		后,会复位为1		 */	
	}	
}
51单片机中断是指在程序执行过程中,当某个特定的事件发生时,CPU会暂时中断正在执行的程序,转而执行一个特定的中断服务程序,处理完中断后再返回原程序继续执行。下面是一个51单片机中断使用案例: ```c #include <reg51.h> // 中断服务函数 void timer0_isr() interrupt 1 { static unsigned char count = 0; TH0 = 0xFC; // 设置定时器初值 TL0 = 0x67; count++; if (count == 20) { // 计数到20,即1秒 count = 0; P0++; // P0引脚加1 } } void main() { TMOD = 0x01; // 定时器0,工作方式1 TH0 = 0xFC; // 设置定时器初值 TL0 = 0x67; ET0 = 1; // 允许定时器0中断 EA = 1; // 允许总中断 TR0 = 1; // 启动定时器0 while (1) { // 程序主循环,可以进行其他操作 } } ``` 该程序通过定时器0中断实现了每隔1秒钟P0引脚加1的功能。在main函数中,首先设置定时器0的工作方式为1,然后设置定时器初值,并允许定时器0中断和总中断,最后启动定时器0。在timer0_isr函数中,每当定时器0中断发生时,就将计数器count加1,当计数器count累加到20时,即1秒钟,就将计数器count清零,并将P0引脚加1。程序主循环中可以进行其他操作,不影响定时器中断的执行。 这是一个简单的51单片机中断使用案例,通过中断可以实现更加复杂的功能,如外部中断、串口中断等。中断可以提高程序效率,降低CPU的负载,是51单片机编程中常用的技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值