51单片机的中断系统

news/2024/11/2 0:26:52/

文章目录

  • 51单片机的中断系统
    • 一、中断系统简介
      • 程序中断
      • 中断可以实现的主要功能
      • 中断执行过程
    • 二、51单片中断系统使用
      • 中断源
      • 中断控制
      • 中断允许
      • 中断判优
      • 中断函数定义
    • 三、中断系统使用案例
      • 例一:P3.2 引脚上接了一个按键,P0口连接了8个发光二极管, 要求每次按键均能改变发光二级管的亮灭。
      • 例二:要求使用定时器T0中断实现流水灯操作,流水频率为每0.5秒钟更替一次。

51单片机的中断系统

一、中断系统简介

程序中断

CPU 执行现行程序 的过程中,出现某些急需处理的异常情况或特殊请求,CPU 暂时中止现行程序,而转去对异常情况或特殊请求进行处理,处理完毕后再返回现行程序断点处,继续执行原程序。

在这里插入图片描述

中断可以实现的主要功能

  • CPU与I/O设备并行工作。
  • CPU切换到内核态,执行系统调用。
  • 实现多道程序切换、分时操作系统。
  • 人机交互。
  • 处理硬件故障和软件错误。

中断执行过程

在这里插入图片描述
更详细的中断系统介绍可以去学习《计算机组成原理》

二、51单片中断系统使用

中断源

8051单片机系统提供5个中断源,两个外部中断源 I N T 0 ‾ \overline{INT0} INT0 I N T 1 ‾ \overline{INT1} INT1定时/计数器T0和T1一个串口中断源
每个中断源都被分配了一个编号以及相应的中断服务程序入口地址,通过该入口地址中的跳转指令转到相应的中断服务程序。中断服务程序入口地址也被称作中断向量。

在这里插入图片描述
需要熟悉五个中断源的中断优先级和中断源编号。

中断控制

在8051单片机的定时/计数实现中,了解到定时/计数控制寄存器TCON高4位控制定时/计数器 T0T1启停或者判断溢出,低4位控制外部中断 I N T 0 ‾ \overline{INT0} INT0 I N T 1 ‾ \overline{INT1} INT1的工作方式。

  • IE0IE1分别是 I N T 0 ‾ \overline{INT0} INT0 I N T 1 ‾ \overline{INT1} INT1 中断请求标志位,外部中断发生后,该位自动置1,CPU响应中断后硬件清0。
  • IT0IT1分别是 I N T 0 ‾ \overline{INT0} INT0 I N T 1 ‾ \overline{INT1} INT1 中断触发方式设置位。
    • 例 IT0=0时,低电平触发外部中断 I N T 0 ‾ \overline{INT0} INT0
    • 例 IT0=1时,负跳变(前一机器周期高电平,后一机器周期低电平) 触发外部中断 I N T 0 ‾ \overline{INT0} INT0

在这里插入图片描述

中断允许

位序D7D6D5D4D3D2D1D0
位符号EAESET1EX1ET0EX0
置1允许中断中断允许总开关串行口中断INT1中断定时/计数器T1中断INT0中断定时/计数T0中断

中断判优

中断判优:系统运行过程中,当有多个中断源同时请求中断时,根据中断排队事先规定的次序判断中断请求的响应优先次序。
8051单片机可设置中断优先级寄存器IP的值控制中断优先级,对应位置1,设置为高优先级。两种中断优先级,高优先级>低优先级,同为高优先级或者低优先级时,从高到低按照

外部中断 I N T 0 ‾ \overline{INT0} INT0 > 定时/计数器T0 > 外部中断 I N T 1 ‾ \overline{INT1} INT1 > 定时/计数器T1 > 串行口中断。

在这里插入图片描述
中断优先级寄存器IP支持位寻址。

中断函数定义

void 函数名(void) interrupt n using m
{中断函数内容//尽量精简
}
  • 编译器会把该函数转化为中断函数,interrupt n表示中断源编号为n,中断源对应一个中断入口地址,而中断入口地址的内容跳转指令,转入本函数。
  • using m 用于指定本函数内部使用的工作寄存器组,m取值为0~3。该修饰符可省略,由编译器自动分配。
    中断函数必须由中断源触发而自动调用,不得直接调用,不用提前声明。中断函数要精简,避免因执行时间过长影响其它中断的响应。

三、中断系统使用案例

例一:P3.2 引脚上接了一个按键,P0口连接了8个发光二极管, 要求每次按键均能改变发光二级管的亮灭。

在这里插入图片描述

#include <reg51.h>
#include <stdio.h>
bit flag=0;
sbit KEY = P3^2;//INT0接收void delay(){unsigned int i=0;for(;i<100;i++);
}
void main(void)
{unsigned char led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x00};unsigned char cnt=0;P0=0xff;IT0=1;//TCON  负跳变触发方式IE=0x81;//IE 中断允许IP=0x00;//IP中断优先级while(1){if(flag==1){//出现中断delay();//防止按键抖动,键帽闭合和断开瞬间会有抖动现象,如果延迟后仍然闭合那么不是抖动if(!KEY){//键帽闭合,按键接电源的取反 , 外部中断 INT0  即 P 3.2口为低电平while(!KEY);//直到松开键帽,一直按着也不行啊P0=led[cnt];cnt=(cnt+1)%8;}flag=0;EX0=1;}}
}void init1(void) interrupt 0 //定义外部中断 INT0 中断函数
{flag=1;//标明出现中断EX0=0;// 暂时不再允许出现新中断
}

例二:要求使用定时器T0中断实现流水灯操作,流水频率为每0.5秒钟更替一次。

在这里插入图片描述

#include <reg51.h>
#include <stdio.h>
unsigned char cnt=0;
unsigned char style=0;
unsigned char led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x00};
void main(void)
{P0=0xff;TMOD=0x01;//设置定时/计数器工作方式 工作方式1TH0=75;//(65536-46083)/256初值TL0=253;//(65536-46083)%256;TR0=1;//启动定时器T0IE=0x82;//IE 中断允许IP=0x00;//IP中断优先级,全部为低优先级while(1){if(cnt==10){P0=led[style];style=(style+1)%8;cnt=0;}}
}void init1(void) interrupt 1 //定义定时/计数器T0 中断函数
{cnt++;TH0=75;//方式1需要手动赋初值TL0=253; 
}

http://www.ppmy.cn/news/60498.html

相关文章

vue修饰符的使用

事件修饰符&#xff1a; 在处理事件时调用 event.preventDefault() 或 event.stopPropagation() 是很常见的。尽管我们可以直接在方法内调用&#xff0c;但如果方法能更专注于数据逻辑而不用去处理 DOM 事件的细节会更好。 为解决这一问题&#xff0c;Vue 为 v-on 提供了事件…

uni-app获取手机号-获取用户地理位置-根据位置获取经纬度跳转高德

一.获取手机号 1.获取手机号首先要先登录拿到code&#xff0c;用code去获取session_key 2.获取 code需要知道自己的AppID(小程序ID)和AppSecret(小程序密钥) 3.解密后得到手机号 登录微信公众平台拿到自己的AppID(小程序ID)和AppSecret(小程序密钥) 微信公众平台 获取sessio…

各SQL引擎的SQL转换过程对比

SQL引擎 参考文档:高级语言的解析过程—解析树 从 MySQL、Oracle、TiDB、CK,到 Hive、HBase、Spark,从关系型数据库到大数据计算引擎,他们大都可以借助 SQL 引擎,实现 “接受一条 sql 语句然后返回查询结果” 的功能。 他们核心的执行逻辑都是一样的,大致可以通过下面…

Java 基础进阶篇(十)—— Java集合详细总结

文章目录 一、集合类体系结构二、Collection系列集合2.1 Collection 集合体系2.2 Collection 集合体系特点2.3 Collection 常用API2.4 Collection 集合的遍历方式2.4.1 方式一&#xff1a;迭代器2.4.2 方式二&#xff1a;foreach&#xff08;增强for循环&#xff09;2.4.3 方式…

Spring事务失效场景

&#xff08;1&#xff09;事务方法所在的类没有加载到容器中&#xff08;未被Spring管理的Bean&#xff09; 如果一个被注解的类不是由Spring容器来创建的&#xff0c;比如手动new对象&#xff0c;那么该类的事务注解则不会生效。可以通过将该类交给Spring容器来解决此问题。 …

【Java】BitSet的使用

BitSet和boolean[]为什么不用boolean[]BitSet相关的API为什么不用boolean[]? boolean[]占用的内存比较大。 以1024个位置为例。 boolean[1024]总共占用1040 bytes,包括对象头等大小。(对象头20bytes) boolean[] bits = new boolean[1024];使用BitSet(1024)的话,总共占用…

搭建Serv-U FTP服务器共享文件外网远程访问「无公网IP」

文章目录 1. 前言2. 本地FTP搭建2.1 Serv-U下载和安装2.2 Serv-U共享网页测试2.3 Cpolar下载和安装 3. 本地FTP发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 转载自内网穿透工具的文章&#xff1a;使用Serv-U搭建FTP服务器并公网访问【内网穿透】 1. 前言…

Center-based 3D Object Detection and Tracking 论文学习

论文地址&#xff1a;Center-based 3D Object Detection and Tracking Github 地址&#xff1a;Center-based 3D Object Detection and Tracking 1. 解决了什么问题&#xff1f; 在点云中&#xff0c;3D 目标通常以 3D 框的形式表示。这个表征借鉴于 2D 图像的检测&#xff0…