中断系统的简单了解以及C51(STC89C52)单片机中断系统的详解
目录
一、中断系统简介
二、C51单片机的中断
1、外部中断
2、定时器/计数器中断
三、总结
一、中断系统简介
中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。
当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断源。微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求。
当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。
二、C51单片机的中断
这里就以STC89C52单片机的的中断系统为大家做一个详解,大家学习以后可以类比一下其他的中断系统,其实都是大同小异的。
1、外部中断
与c51单片机中断相关的寄存器有:
中断允许寄存器:IE
辅助中断控制寄存器:XICON
中断优先级控制寄存器高:IPH
中断优先级控制寄存器低:IP
定时器/计数器0/1 控制寄存器:TCON
串行口控制寄存器:SCON
定时器/计数器2控制寄存器:T2CON
但是我们进行外部中断时,一般只初始化IE 和TCON
说明:
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禁止中断。
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定时器中断。
GATE:门控位。控制定时器是否受外部中断信号的影响;GATE = 0,同时TCON中的TR0 = 1时,定时器0可以开始工作。GATE = 1,除了TR0 = 1以外,还需要给外部中断0高电平(即INT0的管脚高电平),TR1同理。
C/:模式选择位。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模式,工作方式1TH0=0XFC; //给定时器赋初值,定时1msTL0=0X18; ET0=1;//打开定时器0中断允许EA=1;//打开总中断TR0=1;//打开定时器
}void main()
{ time0_init();//定时器0中断配置while(1){ }
}void time0() interrupt 1 //定时器0中断函数
{static u16 i;//定义静态变量iTH0=0XFC; //给定时器赋初值,定时1msTL0=0X18;i++;if(i==1000)//循环1000次,即1s{i=0;LED1=!LED1; }
}
三、总结
中断这一部分就主要是对寄存器的操作,重点也是各个寄存器。我们看懂了所使用的开发板的中断系统原理图,再结合相应的寄存器,其实实现中断也不是一个难题。但是对于寄存器初学的朋友可能记忆有些困难,但是使用多了就熟练了,所以自己可以尝试一下其他的中断来加深自己的理解。
中断系统的简单了解以及C51(STC89C52)单片机中断系统的详解相关推荐
- Linux系统与网络、磁盘参数和日志监控等命令详解二
创作人QQ:851301776,邮箱:lfr890207@163.com, 欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点! 个人座右铭: 1.没有横空出世,只要厚积一定发. ...
- Linux系统强制位u+s、g+s、o+t 详解
Linux系统强制位u+s.g+s.o+t 详解 u+s:一个命令,给与用户s权限,则此用户暂时获得这个命令的属主权限 (例chmod u+s /usr/bin/touch或者chmod 4755 / ...
- java语言say方法,简单了解Java方法的定义和使用实现详解
简单了解Java方法的定义和使用实现详解 发布时间:2020-09-25 11:36:07 来源:脚本之家 阅读:78 作者:OLIVER_QIN 这篇文章主要介绍了简单了解Java方法的定义和使用实 ...
- 【mcuclub】STC89C52单片机最小系统讲解
1.实物图 2.原理图 3.介绍 3.1.主芯片 STC89C52是STC公司生产的一种低功耗.高性能8位微控制器 器件参数: 1.增强型8051单片机,指令代码完全兼容传统8051 2.工作电压:5 ...
- 老毛桃电脑重装linux系统,如何简单快速用U盘装Win10系统,小白也能变装系统达人...
原标题:如何简单快速用U盘装Win10系统,小白也能变装系统达人 飚王出品,必属精品! 电脑作为家庭必备,虽然大部分时候都不需要我们自己装系统,但万一遇到电脑中毒系统崩溃或者买回一台笔记本预装linu ...
- linux 文件 字符集设置,Linux字符集和系统语言设置-LANG,locale,LC_ALL,POSIX等命令及参数详解...
博文说明[前言]: 本文将通过个人口吻介绍Linux字符集和系统语言设置,包括LANG,locale,LC_ALL,POSIX等命令及参数详解的相关知识,在目前时间点[2017年6月21号]下,所掌握 ...
- keil c语言中断怎么写,如何利用keil C实现单片机中断功能
直接访问寄存器和端口 定义 sfr P0 0x80 sfr P1 0x81 sfr ADCON; 0xDE sbit EA 0x9F 操作 ADCON = 0x08; P1 = 0xFF; io_s ...
- zynq开发系列5:通过AXI GPIO的中断实现PL端按键控制PS端LED(SDK开发详解)
axi_gpio是PL端gpio(FPGA资源搭建的软核),ps7_gpio是ps端gpio(硬核).打开Documentation的示例Examples,可知第二个是关于中断的示例.导入示例impo ...
- 嵌入式linux智能家居系统,以Arm-Linux为平台的智能家居控制系统的设计详解
嵌入式系统以其占用资源少.专用性强.功耗低的特点使其广泛应用在移动通信.工业生产.安全监控等领域.针对人们对高效.舒适.安全.便利.环保的居住环境的要求,提出了以Arm-Linux为平台的智能家居控制 ...
最新文章
- 负载均衡策略关键因素
- ionic ajax 跨域,解决 ionic 中的 CORS(跨域) 问题
- spring boot validated的使用
- 向fedora虚拟机中复制文件_Unraid虚拟机中Dockers下搭建WebDAV共享文件服务器
- boost::geometry::select_most_precise用法的测试程序
- css浮动(float)及清除浮动的几种实用方法
- 点火提前角的修正方式有哪些_“天问一号”完成第二次轨道中途修正:精度很高,本次修正量很小...
- 5919. 所有子字符串中的元音
- Java调用.NET webservice方法的几种方式
- 95-138-010-源码-Function-AggregateFunction
- 年薪201万!华中科大AI博士生入选华为天才少年计划!
- easyUI datagrid 重复发送URL请求
- NumPy 官方 中文文档 开发手册
- cmmi实践访谈测试ppt_CMMI3_实践篇.ppt
- Orcad allegro 安装补丁
- 使用python实现往手机发短信(基于twilio)
- css文本属性 首行缩进
- Improving Few-Shot Learning with Auxiliary Self-Supervised Pretext Tasks(论文解读)
- 北大计算机录取分数线2017,北大2017年高考在全国31省市录取分数线人数对比
- 分布式事务(6)-分布式事务处理技术之RocketMQ