51单片机-(中断系统)

news2024/11/15 8:22:37

51单片机-(中断系统)

了解51单片机中断系统、中断源、中断响应条件和优先级等,通过外部中断0实现按键控制LED亮灭为例理解中断工作原理和编程实现过程。

1.中断系统结构

89C51/52的中断系统有5个中断源 ,2个优先级,可实现二级中断嵌套 。
在这里插入图片描述

1.1.外部中断0 (P3.2)

INT0: 通过TCOM中的IT0来选择其为下降沿有效还是低电平有效。

1.2.定时计数器中断T0

T0: 定时计数溢出中断标志TF0置1

1.3.外部中断1 INT1(P3.3)

INT1: 通过TCOM中的IT1来选择其为下降沿有效还是低电平有效。

1.4.定时计数器中断T1

T1: 定时计数溢出中断标志TF1置1

1.5. RI(SCON.0)或TI(SCON.1)

串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。

2.中断请求标志TCON

76543210
字节地址:88HTF1TR1TF0TR0IE1IT1IE0IT0
  • IT0 (TCON.0),外部中断0触发方式控制位。
    当IT0=0时,为电平触发方式。
    当IT0=1时,为边沿触发方式(下降沿有效)。
  • IE0 (TCON.1) :外部中断0中断请求标志位。
  • IT1 (TCON.2):外部中断1触发方式控制位。
  • IE1 (TCON.3):外部中断1中断请求标志位。

  • TR0(TCON.4):T0运行控制位,其功能与TR1类同。
  • TF0 (TCON.5):定时/计数器T0溢出中断请求标志位。
  • TR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。
  • TF1 (TCON.7),定时/计数器T1溢出中断请求标志位。

3.中断允许控制(IE)

CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。

76543210
字节地址:A8HEAESET1EX1ET0EX0
  • EXO(IE.0),外部中断0允许位;
  • ETO(IE.1),定时/计数器T0中断允许位;
  • EX1(IE.2),外部中断0允许位;
  • ETI(IE.3),定时/计数器T1中断允许位;
  • ES(IE.4),串行口中断允许位;
  • EA (IE.7),CPU中断允许(总允许)位。

4.各中断源响应

4.1.中断优先级

有时同一优先级中的中断申请不止一个,则有中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示
在这里插入图片描述
中断优先级有三条原则:

  • CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。
  • 正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。
  • 正在进行的低优先级中断服务,能被高优先级中断请求所中断。

为了实现上述后两条原则,中断系统内部设有两个用户不能寻址的优先级状态触发器。其中一个置1,表示正在响应高优先级的中断,它将阻断后来所有的中断请求;另一个置1,表示正在响应低优先级中断,它将阻断后来所有的低优先级中断请求。

4.2.中断号

在这里插入图片描述

4.3.中断响应条件

  • 中断源有中断请求;
  • 此中断源的中断允许位为1;
  • CPU开中断(即EA=1)。

以上三条同时满足时,CPU才有可能响应中断。

4.4.开发中使用中断

你想使用的中断是哪个?选择相应的中断号;
你所希望的触发条件是什么?
你希望在中断之后干什么?

5.中断样例

5.1.外部中断0为例

通过按键按下出发外部中断0来控制LED反转亮灭。
在这里插入图片描述
(对照这张图好理解)

使用外部中断0的代码:
默认按键为高电平,选择用下降沿触发中断

#include "reg52.h"	
typedef unsigned int u16;
typedef unsigned char u8;

sbit led=P2^0;
sbit key3=P3^2;

//delay函数功能: 延时函数,i=1时,大约延时10us
void delay(u16 i)
{
	while(i--);	
}
//Int0Init函数功能:
void Int0Init()
{
	IT0=1//设置外部中断的触发方式下降沿触发
	EX0=1//开外部中断0允许位
	EA=1//打开总中断开关
}
//
void main()
{
	Int0Init();
	while(1);
}

//中断服务函数int0:
void int0 ()  interrupt 0
{
	delay(1000);
	if(key3==0)
	{
		led =~led;
	}
}

不使用中断的代码:

//实现现象:下载程序后按下K1按键可以对D11小灯状态取反。
#include "reg52.h"//此文件中定义了单片机的特殊功能寄存器
typedef unsigned int u16;//对数据类型进行声明定义
typedef unsigned char u8;

sbit k1=P1^0;	 //定义P10口是k1
sbit led=P0^0;	 //定义P00口是led

//函数名 : delay
//函数功能: 延时函数,i=1时,大约延时10us,用定时器延时更精确
void delay(u16 i)
{
	while(i--);	
}

//函数名 : keypros
//函数功能: 按键处理函数,判断按键K1是否按下
void keypros()
{
	if(k1==0)		  	//检测按键K1是否按下
	{	
		delay(1000);   	//消除抖动 一般大约10ms
		if(k1==0)	 	//再次判断按键是否按下
		{
			led=~led;	//led状态取反
		}
		while(!k1);	 	//检测按键是否松开
	}		
}

//主函数: main
void main()
{	
	led=0;
	while(1)       
	{	
		keypros();  //按键处理函数	
	}		
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1486809.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Elasticsearch:如何创建搜索引擎

作者:Jessica Taylor 搜索引擎是生活中我们认为理所当然的事情之一。 每当我们寻找某些东西时,我们都会将一个单词或短语放入搜索引擎,就像魔术一样,它会为我们提供一个匹配结果列表。 现在可能感觉不那么神奇了,因为这…

linux-fork习题

通过fork产生子进程后,在以下子进程中发生改变的时候不会引起父进程中相应的改变的有() A 文件指针 B 局部变量 C 全局变量 D 静态变量 答案应该是无答案 linux下父进程创建子进程后,子进程会复制父进程的用户层空间的数据…

安装Docker及DockerCompose

0.安装Docker Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。 Docker CE 分为 stable test 和 nightly 三个更新频道…

1. vue3-环境准备

1、安装node.js 如果开发环境上面没有安装node.js,需要到node.js官方网站下载node.js。下载安装后,可以通过npm --version查看nodejs版本 2. 开发工具 开发工具建议使用vscode

word使用bib添加参考文献

文章目录 安装TexLive安装bibtex4word使用在word中添加参考文献使用bibtex4word在word中添加参考文献设置参考文献格式为毕业论文格式 参考 安装TexLive 从下载地址下载镜像iso文件texlive2023.iso双击打开iso镜像文件运行 install-tl-windows.bat点击安装非常非常非常耐心地安…

一个教材上的CMS网站源码在Linux服务器上登录时验证码正常,但在windows下不能正常显示

一个教材上的CMS网站源码在Linux服务器上登录时验证码正常,但在windows下不能正常显示。 在linux服务器上能正常显示。显示界面如下所示:

第十篇:复习maven

文章目录 一、什么是Maven1. 依赖管理2. 统一项目结构3. 项目构建4. 依赖的仓库 二、IDEA集成Maven1. Maven简单的安装和配置2. 配置Maven环境3. 创建Maven项目4. Maven坐标4. 导入Maven项目 三、依赖管理1. 依赖配置2. 依赖传递3. 依赖范围4. 生命周期 四、小结 一、什么是Mav…

机器学习-面经

经历了2023年的秋招,现在也已经入职半年了,空闲时间将面试中可能遇到的机器学习问题整理了一下,可能答案也会有错误的,希望大家能指出!另外,不论是实习,还是校招,都祝福大家能够拿到…

《UE5_C++多人TPS完整教程》学习笔记25 ——《P26 游戏项目创建(Project Creation)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P26 游戏项目创建(Project Creation)》 的学习笔记,该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版,UP主(也是译者…

【Linux信号】

目录 信号是什么Linux通过kill -l查看指令 信号的产生signal系统调用捕捉信号键盘产生信号系统调用产生信号进程异常产生信号软件条件发送信号 Code Dump信号保存信号抵达信号产生到信号抵达之间的状态叫信号未决。进程可以对信号进行阻塞使用sigprocmask()系统调用接口阻塞blo…

设计模式(九)模版方法模式

请直接看原文:设计模式(九)模版方法模式_模板方法模式的优缺点-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- 1.模版方法模式简介 模版方法模式介…

【架构笔记2】设计不足和过度设计

复杂系统问题设计中有两类现象需要引起关注:设计不足和过度设计,通常第一种比较常见,第二种则也是一种灾难。当然我认为他们都可以被优化,如果用正确的流程引导,在框架模板的限定下放飞,就像教养孩子有个观…

Git实战(1)

一, git log 查看提交日志情况 根据 commitId进行版本回退 git reset --hard commitId(commitId可以是一部分,不用完整的ID) 只输出一行信息: git log --pretty=oneline 快速回退: git reset --hard HEAD^ 回退到上一个版本 git reset --hard HEAD^^ 回退到上上个版本 如果…

力扣74. 搜索二维矩阵(二分查找)

Problem: 74. 搜索二维矩阵 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1:映射为一维数组二分查找 1.由于题目矩阵中的元素整体是升序的,我们可以将其放置在一个大小为 m n m \times n mn的一维数组array中进行二分查找 2.对应的映射关系是ar…

蓝桥杯备赛 day1 | 1. 门牌制作, 2. 迷宫, 3. 乘积尾零

最近正好在刷算法题&#xff0c;报了一个蓝桥杯体验一下&#xff0c;但是钱都交了&#xff0c;高低混个奖好吧&#xff0c;今天做的都是一些填空推理题&#xff0c;相当于用程序写下正解&#xff0c;代码是在Dev C上面写的 #include<iostream> #include<bits/stdc.h&g…

HikariCP与Spring Boot的完美集成,让您的应用更高效、更可靠!

随着Spring Boot的流行&#xff0c;越来越多的开发者选择使用它来构建高效、可扩展的应用程序。然而&#xff0c;在构建应用程序的过程中&#xff0c;数据库连接的管理也是一个非常重要的环节。在这篇文章中&#xff0c;我们将介绍如何将HikariCP这一高效的数据库连接池与Sprin…

性能对比:mysql 5.7-8.0-TiDB 7.5-OceanBase 4.2-MariaDB 10.11-机械硬盘-固态硬盘-

1.mysql 5.7-8.0 5.7比8.0优秀 结果&#xff1a;5.7比8.0优秀 10% 2.机械硬盘和固态硬盘 影响不大&#xff0c;主要是CPU 3. JAVA MYSQL 分开 4.『直属 MySQL 』vs 『Docker MySQL』 vs 『Podman MySQL』 直属最好 &#xff0c;其次是Podman&#xff0c;最后是DOCKER 5.MySQL …

Python光速入门 - Flask轻量级框架

FlASK是一个轻量级的WSGI Web应用程序框架&#xff0c;Flask的核心包括Werkzeug工具箱和Jinja2模板引擎&#xff0c;它没有默认使用的数据库或窗体验证工具&#xff0c;这意味着用户可以根据自己的需求选择不同的数据库和验证工具。Flask的设计理念是保持核心简单&#xff0c…

Qt/事件分发器/事件过滤器

事件分发器 //事件分发器bool event(QEvent* e); //事件分发器&#xff1a;&#xff1a;用途 分发事件 bool MyLabel::event(QEvent* e) {if(e->type() QEvent::MouseButtonPress){//如果是鼠标摁下 拦截事件 不向下分发QMouseEvent* ev static_cast<QMouseEvent*>…

【JS 算法题: 将 json 转换为字符串】

题目简介 其实就是手撕 JSON.stringfy()。 算法实现 输入 原则上来说&#xff0c;输入的是一个 json 对象。但需要考虑到异常情况&#xff0c;即输入了其它类型的数据&#xff0c;比如&#xff1a;12, true, ‘abc’, [‘red’, ‘green’], null, undefined 等。 输出 …