中断系统的简单了解以及C51STC89C52单片机中断系统的详解

目录

一、中断系统简介 

 二、C51单片机的中断

 1、外部中断

2、定时器/计数器中断

三、总结


一、中断系统简介 

中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。

当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断源。微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求。

当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。

中断原理图

 二、C51单片机的中断

这里就以STC89C52单片机的的中断系统为大家做一个详解,大家学习以后可以类比一下其他的中断系统,其实都是大同小异的。

C51单片机中断原理图

 1、外部中断

与c51单片机中断相关的寄存器有:

中断允许寄存器:IE

辅助中断控制寄存器:XICON

中断优先级控制寄存器高:IPH

中断优先级控制寄存器低:IP

定时器/计数器0/1 控制寄存器:TCON

串行口控制寄存器:SCON

定时器/计数器2控制寄存器:T2CON
但是我们进行外部中断时,一般只初始化IE 和TCON 

IE

说明:

EA:CPU的总中断允许控制位。EA = 1,CPU开放中断,EA = 0,CPU屏蔽所有的中断申请。EA的作用是使中断允许形成两级控制。即各中断源首先受EA控制;其次还受各中断源自己的中断允许控制位控制。

ET2:定时器/计数器2中断允许位。ET2 = 1,允许T2中断;ET2 = 0,禁止T2中断。

ES:串口中断允许位。ES = 1,允许串行口1中断;ES = 0,禁止串行口中断。ET1:定时/计数器T1的溢出中断允许位。ET1 = 1,允许T1中断;ET1 = 0,禁止T1中断。

EX1:外部中断1中断允许位。EX1 = 1,允许外部中断1中断;EX1 = 0,禁止外部中断1中断。

ET0:T0的溢出中断允许位。ET0 = 1,允许T0中断;ET0 = 0禁止T0中断。

EX0:外部中断0中断允许位。EX0 = 1,允许中断;EX0 = 0禁止中断。


 

TCON

 TF1:T1溢出中断标志。T1被允许计数以后,从初值开始加1计数。当产生溢出时由硬件置1,向CPU请求中断,一直保持到CPU响应中断时,才由硬件清0。

TR1:定时器1的运行控制位。

TF0:T0溢出中断标志。T0被允许计数以后,从初值开始加1计数,当产生溢出时,由硬件置1,向CPU请求中断,一直保持CPU响应该中断时,才由硬件清0。

TR0:定时器0的运行控制位。

IE1:外部中断1请求源标志。IE1 = 1,外部中断向CPU请求中断,当CPU响应该中断时由硬件清0。

IT1:外部中断1中断源类型选择位。IT1 = 0,低电平信号可触发外部中断1。IT1 = 1,外部中断1为下降沿触发方式。

IE0:外部中断0请求源标志。IE0 = 1外部中断0向CPU请求中断,当CPU响应外部中断时,由硬件清0

IT0:外部中断0中断源类型选择位。IT0 = 0,低电平可触发外部中断0。IT0=1,外部中断0为下降沿触发方式。

我们了解了这两个寄存器后,再去看上面的中断原理图就能简单的了解一个外部中断的过程了。下面给大家附上一个外部中断0的例子,独立按键K3控制一个LED的亮灭。(程序为STC89C52RC单片机的,外部中断0接P3.2管脚,外部中断1接P3.3管脚)

#include"reg52.h"
//宏定义类型
typedef unsigned char u8;
typedef unsigned int u16;
//定义管脚
sbit KEY3 = P3^2;
sbit LED0 = P2^0;
//延时函数 如果传入数据为1,大概延时10us(晶振频率为11.0592mHZ)
void delay_10us(u16 ten_us)
{
	while(ten_us--);
}
//外部中断0配置
void exti0_init()
{
	IT0 = 1;//跳变沿触发方式(下降沿)
	EX0 = 1;//打开INT0的中断允许
	EA = 1;//打开总中断
}

//主函数
void main()
 {
 	exti0_init();
 	
	while(1)
	{
	
	}
 }
//外部中断0中断函数
void exit0() interrupt 0
{
	delay_10us(1000);
	if(KEY3==0)
	{
		LED0 = !LED0;
	}
}

2、定时器/计数器中断

定时器/计数器中断原理图

 TCON在外部中断时已做介绍,我们可以看到TMOD这个工作方式寄存器,其高四位控制T1定时器中断,第四位控制T0定时器中断。

TMOD

 GATE:门控位。控制定时器是否受外部中断信号的影响;GATE = 0,同时TCON中的TR0 = 1时,定时器0可以开始工作。GATE = 1,除了TR0 = 1以外,还需要给外部中断0高电平(即INT0的管脚高电平),TR1同理。

C/\bar{T}:模式选择位。0:定时器模式。1:计数器模式

M1M0:工作方式选择位。如下图

工作方式

 一般都使用方式1和方式2。给大家详细讲一下方式1,大家就可以类比其他的工作方式了

 当Tl0计数满溢出之后向TH0进位,当TH0计数满溢出时,TF0自动置1,向CPU发出中断申请。如上图。当GATE = 0(1处)时,到了非门(2处)变为1;然后经过或门(3处)(若是GATE = 1,则经过非门后就变为0,此时就要受到外部中断0(4处)的影响,即外部中断0的管脚置1,定时器才能正常工作),结果还是为1;此时就需要看TR0(5处),若中断程序允许定时器0工作,即TR0 =1,则经过与门(6处),导通开关(7处),开始定时。后面那个开关(8处)是选择工作模式为定时器还是计数器。

例子:定时器0中断方式1控制D1指示灯间隔1s闪烁

#include "reg52.h"

typedef unsigned int u16;	//对系统默认数据类型进行重定义
typedef unsigned char u8;

//定义管脚
sbit LED1=P2^0;

void delay_10us(u16 ten_us)
{
	while(ten_us--);	
}

void time0_init(void)
{
	TMOD|=0X01;//选择为定时器0模式,工作方式1
	TH0=0XFC;	//给定时器赋初值,定时1ms
	TL0=0X18;	
	ET0=1;//打开定时器0中断允许
	EA=1;//打开总中断
	TR0=1;//打开定时器		
}


void main()
{	
	time0_init();//定时器0中断配置

	while(1)
	{			
							
	}		
}

void time0() interrupt 1 //定时器0中断函数
{
	static u16 i;//定义静态变量i
	TH0=0XFC;	//给定时器赋初值,定时1ms
	TL0=0X18;
	i++;
	if(i==1000)//循环1000次,即1s
	{
		i=0;
		LED1=!LED1;	
	}						
}

三、总结

中断这一部分就主要是对寄存器的操作,重点也是各个寄存器。我们看懂了所使用的开发板的中断系统原理图,再结合相应的寄存器,其实实现中断也不是一个难题。但是对于寄存器初学的朋友可能记忆有些困难,但是使用多了就熟练了,所以自己可以尝试一下其他的中断来加深自己的理解。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340