51单片机入门教程(6)——外部中断

发布者:TranquilMind88最新更新时间:2020-06-14 来源: eefocus关键字:51单片机  外部中断  中断源优先级 手机看文章 扫描二维码
随时随地手机看文章

一、外部中断

1.1 中断

关于中断的概念在上一篇博客中已经提到了。(传送门:51单片机入门教程(5)——定时器中断


中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。


51单片机的中断源优先级与向量号如下表:


中断源 优先级 中断向量号

INT0 – 外部中断0 最高 0

T0 – 定时器/计数器0中断 第2 1

INT1 – 外部中断1 第3 2

T1 – 定时器/计数器1中断 第4 3

串口中断 第5 4

T2 – 定时器/计数器2中断 最低 5


1.2 外部中断

除了定时器中断外,51单片机还有两个外部中断源——外部中断0、外部中断1。分别由单片机的12号引脚(INT0/P3.2)、13号(INT1/P3.3)引脚的低电平/负跳变触发。

在这里插入图片描述

和定时器中断一样,要使用这两个外部中断,首先要进行初始化操作,即写入相关的寄存器。初始化外部中断需要写入下面两个寄存器。


1、IE – 中断允许控制寄存器

2、TCON – 控制寄存器


以初始化0号外部中断为例,说明寄存器的设置方法。


IE 中断允许控制寄存器

序号 D7 D6 D5 D4 D3 D2 D1 D0

符号 EA – ET2 ES ET1 EX1 ET0 EX0

说明:

EA 全局中断允许位,当此位是1时中断可用。(重要)

ET2 定时器/计数器2中断允许位

ES 串口中断允许位

ET1 定时器/计数器1中断允许位

EX1 外部中断1允许位

ET0 定时器/计数器0中断允许位

EX0 外部中断0允许位 (重要)

和定时器中断类似,使用外部中断需要开启全局中断允许位EA,以及开启外部中断0允许位EX0


EA = 1;     //开启总中断

EX0 = 1; //开启0号外部中断


TCON 控制寄存器

序号 D7 D6 D5 D4 D3 D2 D1 D0

符号 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

说明:

TF1 定时器1溢出标志位

TR1 定时器1运行控制位

TF0 定时器0溢出标志位

TR0 定时器0运行控制位

IE1 外部中断1请求标志 IE1=1则外部中断1在向CPU请求中断,当CPU响应中断时硬件清0。一般不用手动设置。

IT1 外部中断1触发方式选择位 该位为0时INT1引脚上的低电平信号可触发外部中断1。该位为1时INT1引脚上的负跳变信号可触发外部中断1。

IE0 外部中断0请求标志 IE0=1则外部中断0在向CPU请求中断,当CPU响应中断时硬件清0。一般不用手动设置。

IT0 外部中断0触发方式选择位 该位为0时INT0引脚上的低电平信号可触发外部中断1。该位为1时INT1引脚上的负跳变信号可触发外部中断1。(重要)


IE1和IE0为状态位,即表示CPU对当前的中断执行状态,一般无需手动设置。需要设置的寄存器位是IT0,以选择低电平信号触发还是负跳变信号触发。


低电平信号 :即该引脚电平信号为0时有效。

负跳变信号 :意思是电平从高跳至低时有效,即1→0的信号,而一直维持低电平则不会触发中断。


IT0 = 1; //设置外部中断触发方式 


由以上内容可知,如果要使用外部中断0,并设置为负跳变信号触发,程序写法如下:


void initEx0() {

  //中断允许寄存器IE

  EA = 1; //开启总中断

  EX0 = 1; //开启0号外部中断

  //控制寄存器TCON

  IT0 = 1; //设置外部中断触发方式 

             //0 - 低电平触发

             //1 - 负跳变触发

}


假如要实现以下功能:


按键与INT0引脚相连,按下按键触发外部中断。

每触发一次外部中断,计数加一,并将次数显示在一位数码管上。


搭建仿真电路如下:

在这里插入图片描述

代码如下:


# include

# define uchar unsigned char

# define uint unsigned int


//共阳数码管编码表

uchar code table[] =

{0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e};


//初始化0号外部中断

void initEx0();


//计数变量

uint count = 0;


void main()

{

  initEx0();

  while(1){

    P2 = table[count];   //在数码管上显示中断次数

  }

}


void initEx0() {

  EA = 1; //开启总中断

  EX0 = 1; //开启0号外部中断

  IT0 = 1; //设置外部中断触发方式 

             //0 - 低电平触发

             //1 - 负跳变触发

}


void ex0_intr() interrupt 0 { 

  //每进入一次中断,则次数加一

  count = count + 1;

  if(count == 10)

    count = 0;

}


二、中断优先级

51单片机的中断系统有6个中断源,可实现二级中断嵌套 。


再次放出这张表


中断源 优先级 中断向量号

INT0 – 外部中断0 最高 0

T0 – 定时器/计数器0中断 第2 1

INT1 – 外部中断1 第3 2

T1 – 定时器/计数器1中断 第4 3

串口中断 第5 4

T2 – 定时器/计数器2中断 最低 5

假设外部中断0、1同时向CPU申请中断,由上表可知,优先执行0号外部中断的服务程序。

修改仿真电路如下(按键同时连接INT0与INT1)。按键按下,则CPU同时收到两个中断请求:

在这里插入图片描述

修改程序功能如下:


在0号外部中断服务程序中数码管显示0

在1号外部中断服务程序中数码管显示1


代码如下


# include

# define uchar unsigned char

# define uint unsigned int


//共阳数码管编码表

uchar code table[] =

{0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e};


//初始化0、1号外部中断

void init();


void main()

{

  init();

  while(1);  //等待中断发生

}


void init() {

  EA = 1; //开启总中断

  EX0 = 1; //开启0号外部中断

  IT0 = 1; //设置外部中断触发方式 

  EX1 = 1;   //1号外部中断

  IT1 = 1;

}


void ex0_intr() interrupt 0 { 

  P2 = table[0];  //显示0

}


void ex1_intr() interrupt 2 { 

  P2 = table[1];  //显示1

}


编译程序,并下载进仿真.按下按键即可看到数码管显示1,说明当两个外部中断同时向CPU请求中断时,CPU优先处理中断优先级高的那个,即0号外部中断。

在这里插入图片描述

关键字:51单片机  外部中断  中断源优先级 引用地址:51单片机入门教程(6)——外部中断

上一篇:51单片机入门教程(4)——按键控制
下一篇:51单片机C语言延时函数怎么定义和使用

推荐阅读最新更新时间:2024-11-04 18:46

51单片机学习笔记2.动态数码管的使用
原理图 内容 74HC138译码器 数码管 公共端 - 位选线 连在一起的段线 - 段选线 通过控制在不同位选线 不同的段选线通电(段选数据不同)以达到在不同位置显示不同数字的目的 具体看单片机原理图即可 动态显示其实一个时刻只点亮一个数字,在24ms内点亮下一个就会看成是同时亮的 代码 首先是一段转码用的 u8 code smgduan ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//最高位为小数点,如果需要点亮小数点只需 | (0x80)或是 | 128 然后是显示用的函数
[单片机]
<font color='red'>51单片机</font>学习笔记2.动态数码管的使用
8051单片机(STC89C52)倒计时器
#include STC89C5xRC.H void delay()//用定时器0实现10ms精准定时 { TMOD = 0x01; TH0 = 0xd8; TL0 = 0xf0;//65536 - 10000 = 55536 TF0 = 0;//置溢出标志位为0 TR0 = 1;//开启定时器0 while(TF0 == 0); TR0 = 0;//暂停定时器0 } void disp_digit(int d) { unsigned char code DIG_CODE = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x
[单片机]
80<font color='red'>51单片机</font>(STC89C52)倒计时器
51单片机按键控制数码管
一、 设计目的与要求 设计目的:通过设计,培养运用已学知识解决实际问题的能力、查阅资料的能力、自学能力和独立分析问题、解决问题的能力和能通过独立思考。 设计要求:设计一个时、分可调的数字电子钟、断电后将数据保存,开启后时间将从断电后时间继续行走。 二、 设计内容与方案制定 具有校时功能,按键控制电路其中时键、分键六个键分别控制时、分时间的调整。按下小时数实现对小时数加减,按下分钟数实现对分钟数进行加减,并设置有复位键,启始键。 以AT89C51单片机进行实现秒、分、时上的正常显示和进位,其中显示功能由单片机控制共阴极数码管来实现,数码管进行动态显示。 通过AT24C02分别写入时、分、秒数据在断电后实现保存,在下次通电
[单片机]
<font color='red'>51单片机</font>按键控制数码管
51单片机驱动蜂鸣器发声的实验
  在单片机系统中,除了显示器件外经常用到发声器件,最常见的发声器件就是蜂鸣器。蜂鸣器一般用于一些要求不高的声音报警及发出按键操作提示音等。   虽然蜂鸣器也有自己固有的频率,但是也可以对其施加不同频率的方波,使之发出一些简单的乐曲。   1.实例功能   使蜂鸣器发声。通过本实验,能熟练掌握蜂鸣器的应用方法。   2.器件和原理   蜂鸣器最重要的特点是只要按照极性要求加上合适的直流电压就可以发出固有频率的声音,使用起来比扬声器简单。   由此可见,其控制与LED的控制是没有区别的。   3.硬件电路   虽然单片机对蜂鸣器的控制和对LED的控制是一样的,但硬件电路却有所不同。因为蜂鸣器是感性负载,一般不建议用单
[单片机]
<font color='red'>51单片机</font>驱动蜂鸣器发声的实验
51单片机STC89C52】LCD1602液晶屏的使用
一、LCD1602模块 1、引脚说明 第 3 脚: VL 为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度 过高时会产生“鬼影”,使用时可以通过一个 10K 的电位器调整对比度。 第 4 脚: RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第 5 脚:R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。当 RS 和 R/W 共同为低电平时可以写入指令或者显示地址,当 RS 为低电平 R/W 为高电平时可以读忙信号,当 RS 为高电平 R/W 为低电平时可以写入数据。 第 6 脚:E 端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。 第 7-14 脚:D
[单片机]
【<font color='red'>51单片机</font>STC89C52】LCD1602液晶屏的使用
51单片机中断初始化及子程序模板
/************************************************************ *51单片机各中断初始化及子程序模板,几乎包括了传统51单片机的全部中断 *1、外部中断0 *2、定时器中断0 *3、外部中断1 *4、定时器中断1 *5、串行中断 *6、定时器中断2---本中断在52时才有 *以上所有中断已经在Keil软件环境上经过测试,工作正常 *在使用定时中断的时候需要根据实际需要重设定时器的初值和工作方式 *在串行通讯中,使用11.0592M晶振,通讯波特率为9600bps *为了保证文件的单一和方便保存,本项目只用了一个文件, 没有进
[单片机]
51单片机学习笔记(三)_定时器和计数器
注:定时器与计数器原理与使用方法相似、此处计数器知识为基础普及、后面详讲 2个定时器(寄存器)、定时器0、定时器1、(计数器0、计数器1) TMOD:定时器/计数器模式控制寄存器 详见百度百科TMOD 每经过一个机器周期、寄存器+1 TF:定时器溢出标志。溢出时自动置1。中断时硬件清零否则必须软件清零。 TR:定时器运行控制位。置1开始计时、清零停止计时。 C/T:该位为0时用作计时器、该位为1时用作计数器。 溢出时时间-开始计时时间=预设定时时间 一个机器周期共有12个振荡脉冲周期 若设定时为0.02s,则: 12*(65535-X)/11059200=0.02s 定时器作 加1 次数:X=471
[单片机]
利用51单片机的电子琴设计
利用51单片机的电子琴设计 声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单片机某个口线不断的输出“高”“低”电平,则在该口线上就能产生一定频率的方波,将该方波接上喇叭就能发出一定频率的声音,若再利用程序控制“高”“低”电平的持续时间,就能改变输出波形的频率,从而改变音调。         乐曲中,每一音符对应着确定的频率,表1给出C调时各音符频率。如果单片机某个口线输出“高”“低”电平的频率和某个音符的频率一样,那么将此口线接上喇叭就可以发出此音符的声音。   本系统就是根据此原理设计,对于AT89C2051单片机来说要产生一定频率的方波大致是先将某口线输出高电平然后延时一段时间再输出低电平,如此循环的
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved