STC15系列单片机学习6:外部中断

这篇具有很好参考价值的文章主要介绍了STC15系列单片机学习6:外部中断。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、什么是外部中断

外部中断,就是通过单片机IO引脚电平的变化触发的中断。

二、STC15系列单片机有哪些外部中断

STC15系列单片机的外部中断源一共有5个,分别是外部中断0(INT0)、外部中断1(INT1)、外部中断2(INT2)、外部中断3(INT3)、外部中断4(INT4);当然不是所有的STC15系列单片机都有着5个外部中断。

三、外部中断的触发方式

中断源 触发行为
外部中断0(INT0) IT0 = 1:下降沿;IT0 = 0:上升沿和下降沿均可
外部中断1(INT1) IT1 = 1:下降沿;IT1 = 0:上升沿和下降沿均可
外部中断2(INT2) 仅下降沿
外部中断3(INT3) 仅下降沿
外部中断4(INT4) 仅下降沿

INT0和INT1:既可以上升沿触发,又可以下降沿触发,可以设置中断优先级

stc外部中断,STC15系列单片机,单片机,学习,嵌入式硬件

 

INT2、INT3、INT4:只能下降沿触发,不能设置中断优先级,优先级固定为0

stc外部中断,STC15系列单片机,单片机,学习,嵌入式硬件

四、外部中断的中断入口地址、查询次序、优先级、请求标志、允许位

中断源 中断向量地址 相同优先级内的查询次序 中断优先级设置 优先级0(最低) 优先级1(最高) 中断请求标志位 中断允许控制位
INT0 0003H 0(最高) PX0 0 1 IE0 EX0、EA
INT1 0013H 2 PX1 0 1 IE1 EX1、EA
INT2 0053H 10 0 0 EX2、EA
INT3 005BH 11 0 0 EX3、EA
INT4 0083H 16 0 0 EX4、EA

五、与外部中断相关的寄存器(红框的部分是用得上的)

stc外部中断,STC15系列单片机,单片机,学习,嵌入式硬件 

 

中断允许寄存器IE

STC15系列单片机CPU对中断源的开放和屏蔽,是通过内部的中断允许寄存器IE来控制的。针对外部中断,IE寄存器里面能用到的位分别是EA、EX1、EX0。

EA:CPU的中断总开关,EA=1,CPU开放中断;EA=0,CPU屏蔽所有中断;

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

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

按道理外部中断2、外部中断3、外部中断4的中断允许也在这个IE寄存器里面设置吧,再怎么也得在IE2寄存器里面设置吧;这是因为STC15系列单片机是一个加强型的单片机,在intel原始的51内核上添加了太多功能,又要兼容原始的51内核,只能扩充更多的寄存器了,接下来的INT_CLKO(AUXR2)寄存器就是STC15系列单片机扩充出来的。就好比买了一艘破船,装修一下,乱七八糟什么武器都往上面装,搞得功能超级强大。

外部中断允许和时钟输出寄存器INT_CLKO(AUXR2)

前面说过INT_CLKO(AUXR2)寄存器是STC15系列单片机扩充出来的,外部中断2/3/4的中断允许为就放在这个寄存器里面,分别是EX2/EX3/EX4。

EX4:外部中断4中断允许位,EX4=1,允许外部中断4中断;EX4=0,禁止外部中断4中断;

EX3:外部中断3中断允许位,EX3=1,允许外部中断3中断;EX3=0,禁止外部中断3中断;

EX2:外部中断2中断允许位,EX2=1,允许外部中断2中断;EX2=0,禁止外部中断4中断;

中断优先级控制寄存器IP

STC15系列单片机的中断有两个中断优先等级,优先级0(低优先级)和优先级1(高优先级),外部中断0(INT0)和外部中断1(INT1)可以设置在这两个等级中的一个,外部中断2/3/4就只能设置在等级0,也不用设置,单片机设计的时候就已经设置好了。所以IP寄存器里面能用到的就两个位PX1和PX0。

PX1:外部中断1优先级控制位;

        当PX1 = 0时,外部中断1为最低优先级中断(优先级0);

        当PX1 = 1时,外部中断1为最高优先级中断(优先级1);

PX0:外部中断0优先级控制位;

        当PX0 = 0时,外部中断0为最低优先级中断(优先级0);

        当PX0 = 1时,外部中断0为最高优先级中断(优先级1);

定时器/计数器控制寄存器TCON

TCON是定时器/计数器T0和T1的控制寄存器,估计STC公司也是想节约资源,把外部中断0和外部中断1的请求中断源和中断状态标志位也放在这个寄存器里面。前面说过外部中断0和外部中断1可以设置成上升沿还活着下降沿触发外部中断,需要用到的寄存器就是TCON,对应的位是IT1和IT0,还有对应的中断状态标志位分别是IE1和IE0。

IE1:外部中断1的中断请求标志,IE1=1,外部中断向CPU请求中断,当CPU响应改中断时,由硬件清零IE1;

IT1:外部中断1中断源类型选择位。IT1=0,P3.3(INT1)引脚上只要有电平变化,不管是上升沿还是下降沿,都可触发外部中断1。IT1=1时,只有下降沿可以触发外部中断1。

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

IT0:外部中断0中断源类型选择位。IT0=0,P3.2(INT0)引脚上只要有电平变化,不管是上升沿还是下降沿,都可触发外部中断0。IT0=1时,只有下降沿可以触发外部中断0。

六、外部中断的应用

在Keil C中声明中断函数

void Int0_Routine(void)        interrupt0;
void Int1_Routine(void)        interrupt2;
void Int2_Routine(void)        interrupt10;
void Int3_Routine(void)        interrupt11;
void Int4_Routine(void)        interrupt16;

stc外部中断,STC15系列单片机,单片机,学习,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-839080.html

七、外部中断的C语言实现

外部中断0(上升沿与下降沿都触发)

#include "STC15.h" 
#include "intrins.h"

bit FLAG;//中断边沿的类型的判断

sbit	P10	= P1^0; //随便定义一个测试引脚,用于检验中断是否发生


void main()
{
	/*INT0在STC15.h头文件中有定义 sbit INT0 = P3^2;*/
	INT0	= 1; //将外部中断0的引脚INT0,也就是P3^2初始电平设置为高电平
	IT0 	= 0; //IT0 = 0,表示上升沿和下降沿都可以触发中断
	EX0 	= 1; //外部中断0的使能位打开
	EA 		= 1; //中断总开关打开
	
	/*至此,只要P3^2引脚的电平边沿有变化,就会触发外部中断0,
	程序就会跳转到中断服务程序*/
	
	while(1);
}

/*外部中断0 的中断服务程序*/
void Int0_Routine(void)        interrupt0
{
	P10 = !P10; //将测试引脚电平翻转
	
	/*FLAG用于记录中断引脚的电平;
	INT0 = 0,电平从1变成0,是下降沿;
	INT0 = 1,电平从0变成1,是上升沿;*/
	FLAG = INT0; 
}

外部中断0(下降沿触发)

#include "STC15.h" 
#include "intrins.h"


sbit	P10	= P1^0; //随便定义一个测试引脚,用于检验中断是否发生


void main()
{
	/*INT0在STC15.h头文件中有定义 sbit INT0 = P3^2;*/
	INT0	= 1; //将外部中断0的引脚INT0,也就是P3^2初始电平设置为高电平
	IT0 	= 1; //IT0 = 1,表示下降沿触发中断
	EX0 	= 1; //外部中断0的使能位打开
	EA 		= 1; //中断总开关打开
	
	/*至此,只要P3^2引脚的电平边沿有变化,就会触发外部中断0,
	程序就会跳转到中断服务程序*/
	
	while(1);
}

/*外部中断0 的中断服务程序*/
void Int0_Routine(void)        interrupt0
{
	P10 = !P10; //将测试引脚电平翻转
}

外部中断1(上升沿与下降沿都触发)

#include "STC15.h" 
#include "intrins.h"

bit FLAG;//中断边沿的类型的判断

sbit	P10	= P1^0; //随便定义一个测试引脚,用于检验中断是否发生


void main()
{
	/*INT1在STC15.h头文件中有定义 sbit INT1 = P3^3;*/
	INT1	= 1; //将外部中断1的引脚INT1,也就是P3^3初始电平设置为高电平
	IT1 	= 0; //IT1 = 0,表示上升沿和下降沿都可以触发中断
	EX1 	= 1; //外部中断1的使能位打开
	EA 		= 1; //中断总开关打开
	
	/*至此,只要P3^3引脚的电平边沿有变化,就会触发外部中断1,
	程序就会跳转到中断服务程序*/
	
	while(1);
}

/*外部中断1 的中断服务程序*/
void Int1_Routine(void)        interrupt2
{
	P10 = !P10; //将测试引脚电平翻转
	
	/*FLAG用于记录中断引脚的电平;
	INT1 = 0,电平从1变成0,是下降沿;
	INT1 = 1,电平从0变成1,是上升沿;*/
	FLAG = INT1; 
}

外部中断1(下降沿触发)

#include "STC15.h" 
#include "intrins.h"


sbit	P10	= P1^0; //随便定义一个测试引脚,用于检验中断是否发生


void main()
{
	/*INT1在STC15.h头文件中有定义 sbit INT1 = P3^3;*/
	INT1	= 1; //将外部中断0的引脚INT0,也就是P3^2初始电平设置为高电平
	IT0 	= 1; //IT0 = 1,表示下降沿触发中断
	EX0 	= 1; //外部中断0的使能位打开
	EA 		= 1; //中断总开关打开
	
	/*至此,只要P3^2引脚的电平边沿有变化,就会触发外部中断0,
	程序就会跳转到中断服务程序*/
	
	while(1);
}

/*外部中断1 的中断服务程序*/
void Int1_Routine(void)        interrupt2
{
	P10 = !P10; //将测试引脚电平翻转
}

外部中断2(下降沿触发)

#include "STC15.h" 
#include "intrins.h"

/*一般sfr INT_CLKO = 0x8F;这条语句在STC15.h中有,在程序中就不用再写了*/
sfr		INT_CLKO = 0x8F; //外部中断与时钟输出控制寄存器

sbit	P10	= P1^0; //随便定义一个测试引脚,用于检验中断是否发生


void main()
{
	INT_CLKO	|= 0x10; //相当于EX2=1,使能外部中断2
	
	EA 		= 1; //中断总开关打开
	
	/*至此,只要INT2引脚有下降沿,就会触发外部中断2,
	程序就会跳转到中断服务程序*/
	
	while(1);
}

/*外部中断2 的中断服务程序*/
void Int2_Routine(void)        interrupt10
{
	P10 = !P10; //将测试引脚电平翻转
	
	/*如果需要手动清除中断标志位,先关闭中断,系统会自动清除内部的中断标志;
	再重新开启中断*/
	//INT_CLKO &= 0xEF;
	//INT_CLKO |= 0x10;
}

外部中断3(下降沿触发)

#include "STC15.h" 
#include "intrins.h"

/*一般sfr INT_CLKO = 0x8F;这条语句在STC15.h中有,在程序中就不用再写了*/
sfr		INT_CLKO = 0x8F; //外部中断与时钟输出控制寄存器

sbit	P10	= P1^0; //随便定义一个测试引脚,用于检验中断是否发生


void main()
{
	INT_CLKO	|= 0x20; //相当于EX3=1,使能外部中断3
	
	EA 		= 1; //中断总开关打开
	
	/*至此,只要INT3引脚的有下降沿,就会触发外部中断3,
	程序就会跳转到中断服务程序*/
	
	while(1);
}

/*外部中断3 的中断服务程序*/
void Int3_Routine(void)        interrupt11
{
	P10 = !P10; //将测试引脚电平翻转
	
	/*如果需要手动清除中断标志位,先关闭中断,系统会自动清除内部的中断标志;
	再重新开启中断*/
	//INT_CLKO &= 0xDF;
	//INT_CLKO |= 0x20;
}

外部中断4(下降沿触发)

#include "STC15.h" 
#include "intrins.h"

/*一般sfr INT_CLKO = 0x8F;这条语句在STC15.h中有,在程序中就不用再写了*/
sfr		INT_CLKO = 0x8F; //外部中断与时钟输出控制寄存器

sbit	P10	= P1^0; //随便定义一个测试引脚,用于检验中断是否发生


void main()
{
	INT_CLKO	|= 0x40; //相当于EX4=1,使能外部中断4
	
	EA 		= 1; //中断总开关打开
	
	/*至此,只要INT4引脚的有下降沿,就会触发外部中断4,
	程序就会跳转到中断服务程序*/
	
	while(1);
}

/*外部中断4 的中断服务程序*/
void Int4_Routine(void)        interrupt16
{
	P10 = !P10; //将测试引脚电平翻转
	
	/*如果需要手动清除中断标志位,先关闭中断,系统会自动清除内部的中断标志;
	再重新开启中断*/
	//INT_CLKO &= 0xBF;
	//INT_CLKO |= 0x40;
}

到了这里,关于STC15系列单片机学习6:外部中断的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单片机学习笔记---红外遥控(外部中断)

    目录 红外遥控简介 硬件电路 基本发送与接收 NEC编码​​​​​​​ 遥控器键码 复习外部中断和定时器 红外遥控是利用红外光进行通信的设备,由红外LED将调制后的信号发出,由专用的红外接收头进行解调输出 通信方式:单工,异步 红外LED波长:940nm 通信协议标准:NEC标

    2024年02月22日
    浏览(41)
  • 51单片机——中断系统之外部中断实验,小白讲解,相互学习

     中断介绍         中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。它也是单片机最重要的功能之一,是我们学些单片机必须要掌握的。         为了更容易的理解中断概

    2024年02月07日
    浏览(49)
  • 学习笔记|定时器|STC中断|定时器时间计算|STC32G单片机视频开发教程(冲哥)|第十一集:定时器的作用和意义

    什么是定时器:定时器-与非网 上节课的一段代码: TimeCount++然后一个延时1毫秒,每运行1ms,变量就会加一。 系统已经运行了多少个毫秒。 实际使用时的代码如下, 判断按键有沿有按下的时候,我们等待按键松开,还有一个while循环。 如果没有松开,会一直死在这一行。所以,

    2024年02月09日
    浏览(65)
  • STC15单片机-低功耗设计

    STC15省电模式(数据手册有介绍) STC15系列单片机可以运行3种省电模式以降低功耗,它们分别是: 低速模式 , 空闲模式 和 掉电模式 。 正常工作模式下,STC15系列单片机的典型功耗是2.7mA ~7mA,而掉电模式下的典型功耗是0.1uA,空闲模式下的典型功耗是1.8mA 低速模式由时钟分

    2024年02月05日
    浏览(84)
  • 【STC15单片机】动态数码管

    目录 点亮一位数码管 动态数码管 100s倒计时 动态数码管封装代码 段选:选中哪一位数码管 位选:选中的数码管要显示的内容 这是我对段选位选的理解,就是选中某个位置,赋值字形码,显示想要的图形 如果只想让第一个数码管显示,就只需要让com1 = 1即可,其他comx都=0 如

    2024年02月13日
    浏览(46)
  • 【51单片机——————外部中断】

    中断是指单片机主程序运行过程中,出现某些意外情况需要单片机处理,单片机能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。 在实际应用开发中,单片机不可能一直轮询查看按键是否按下,单片机还需要去执行其他任务,

    2024年02月06日
    浏览(48)
  • 【51单片机】外部中断

    51的 外部中断 与 定时器(内部中断) 有一个共同特点,那就是与主程序是 并行 工作的,就是主程序在运行的时候,中断也在等待触发条件,当 中断被触发的时候会暂停主程序 转而执行中断服务程序,只有中断服务程序执行完后,才会继续执行主程序。 这里的触发条件是指:

    2024年02月02日
    浏览(67)
  • 【STC15单片机】简单的矩阵键盘代码

    单片机型号说明:IAP15F2K61S2 新建工程时单片机型号选择 STC15F2K60S2 51单片机矩阵键盘代码 本程序烧写到51单片机应该是正常使用的,手头没有51开发板了,暂时没测试 这个程序烧写到15单片机,前两列按键不能正常使用 只需要在判断第一列按键那部分程序,前面加上P42 = 0;

    2024年02月05日
    浏览(79)
  • 蓝桥杯STC15F2K60S2单片机 CCP/PCA/PWM模块的学习与使用

    有道是 “一花独放不是春,万紫千红春满园” 我们不能只满足于 眼前所谓的 “够用、能用” 的少量知识,而不去深入学习探究,进而不慎封锁了自己的见识 和 更多 创新开发上的可能性。 曾经仅满足于学习了蓝桥杯单片机的三个外部晶振 定时器: 定时器0、1、2. 就认为完

    2024年02月08日
    浏览(52)
  • 51单片机 | 外部中断实验

       51 单片机外部中断有 2 个,外部中断 0 和外部中断 1 ,它们的使用方法是一样的,所以只要学会一个即可掌握所有外部中断使用。本节所要实现的功能是:使用独立按键 K3 控制 LED 亮灭, K3 连接外部中断 0 ( P3.2 )管脚。   上一节我们介绍了 51 单片机的中断系统,我

    2023年04月26日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包