C语言面试之旅:掌握基础,探索深度(面试实战之单片机80C51单片机中断)

news2024/11/16 4:46:43

一、中断概念

        中断是计算机科学中的一个重要概念,指当出现某些特殊情况时,处理器暂停正在执行的程序,转而执行另一段特定的程序处理完之后再返回到原程序继续执行。这个特殊的情况就叫做中断。

        在80C51单片机中,当某些事件(例如定时器溢出、外部中断等)发生时,单片机会暂停当前正在执行的程序,保存现场,然后跳转到相应的中断服务程序(ISR)去处理这个事件。处理完毕后,再返回到原程序继续执行。

 

二、80C51单片机的中断系统

80C51单片机的中断系统主要包括以下几个部分:

  1. 中断源:指能够引起中断的事件,例如定时器溢出、外部中断等。
  2. 中断标志:当某个中断源发生时,相应的中断标志会被置位。
  3. 中断优先级:多个中断源同时发生时,处理器会优先处理优先级高的中断源。
  4. 中断向量:指跳转到相应的中断服务程序(ISR)的入口地址。

80C51中断系统结构:

 

三、80C51单片机的中断处理过程

80C51单片机的中断处理过程可以分为以下几个步骤:

  1. 中断源检测:在每个指令执行结束时,单片机会检查是否有中断源发生。如果有,相应的中断标志会被置位。
  2. 中断优先级判断:如果有多个中断源同时发生,单片机会根据中断优先级来判断先处理哪个中断源。
  3. 中断向量计算:根据中断源的类型,计算出相应的中断向量。
  4. 保存现场:在处理中断之前,单片机会保存当前的程序状态(包括堆栈指针、程序计数器等)。
  5. 跳转到ISR:根据计算出的中断向量,跳转到相应的中断服务程序(ISR)。
  6. ISR执行:在ISR中执行相应的处理代码。
  7. 恢复现场:ISR执行完毕后,单片机会恢复之前保存的程序状态。
  8. 返回原程序:返回到原程序中继续执行。

四、代码案例

#include <reg51.h>  
  
void timer0_init(); // 定时器0初始化函数声明  
void timer0_isr() interrupt 1; // 定时器0中断服务程序声明  
  
void main() {  
    timer0_init(); // 初始化定时器0  
    while(1) { // 主循环  
        // 这里写你的主程序代码  
    }  
}  
  
void timer0_init() {  
    TMOD = 0x01; // 设置定时器模式,这里使用模式1(16位定时器)  
    TH0 = 0xFC; // 设置定时器初始值,这里设置为FC(即0xFC)  
    TL0 = 0x18; // 设置定时器初值(低8位)  
    ET0 = 1; // 打开定时器0中断使能  
    TR0 = 1; // 启动定时器0  
}  
  
void timer0_isr() interrupt 1 {  
    TH0 = 0xFC; // 重新加载定时器初始值  
    TL0 = 0x18; // 重新加载定时器初值(低8位)  
    // 这里写你的中断服务代码  
}

        在timer0_init函数中,我们设置了定时器的模式和初始值,并打开了定时器中断使能。在timer0_isr函数中,我们实现了定时器中断服务程序,每次定时器溢出时,这个函数会被调用。在主循环中,我们可以编写主程序代码。当定时器溢出时,会打断正在执行的程序,转而执行timer0_isr函数中的代码。处理完之后,会返回到主循环中的代码继续执行。

五、总结

        80C51单片机的中断系统是一个非常重要的功能,使得单片机能够及时响应和处理外部或者内部的事件。通过配置相应的寄存器,可以设置中断源、中断优先级以及中断向量,从而实现不同的中断处理需求。在编程时,需要注意保存现场和恢复现场,以防止中断服务程序执行过程中被打断。通过使用中断,可以实现单片机的实时控制和数据处理等功能。

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

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

相关文章

uniapp实战 —— 自定义顶部导航栏

效果预览 下图中的红框区域 范例代码 src\pages.json 配置隐藏默认顶部导航栏 "navigationStyle": "custom", // 隐藏默认顶部导航src\pages\index\components\CustomNavbar.vue 封装自定义顶部导航栏的组件&#xff08;要点在于&#xff1a;获取屏幕边界…

从零开始的C++(二十一)

C11 1.列表初始化&#xff1a; //允许以下代码正确运行int a[]{1,2,3};//效果与int a[]{1,2,3}一致 即允许省略等于号。同时&#xff0c;允许用花括号对所有自定义类型和内置类型进行初始化&#xff0c;而非以前花括号只能对数组进行初始化。利用花括号对自定义类型初始化时…

基于opencv和tensorflow实现人脸识别项目源码+可执行文件,采用python中的tkinter库做可视化

项目名称: 基于OpenCv和tensorflow的人脸识别 完整代码下载地址&#xff1a;基于OpenCv和tensorflow的人脸识别 环境配置: Pythontensorflow2OpenCv categories: 人工智能 description: Opencv是一个开源的的跨平台计算机视觉库&#xff0c;内部实现了图像处理和计算机视觉方…

(env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序

应公司需求&#xff0c;在特定情况下需要修改ip 在开发过程中出现的小插曲 1、第一种情况&#xff1a;重复声明 2、第二种情况&#xff1a; 应官方要求&#xff0c;需要跳转的 tabBar 页面的路径&#xff08;需在 pages.json 的 tabBar 字段定义的页面&#xff09;&#xff0…

pytorch serve开始-Getting started

官网链接 Getting started — PyTorch/Serve master documentation 安装TorchServe和torch-model-archiver 安装依赖 注意::对于Conda&#xff0c;运行Torchserve需要Python >3.8。 对于基于Debian的系统/ MacOS CPU python ./ts_scripts/install_dependencies.py 对…

C语言----文件操作(一)

一&#xff1a;C语言中文件的概念 对于文件想必大家都很熟悉&#xff0c;无论在windows上还是Linux中&#xff0c;我们用文件去存储资料&#xff0c;记录笔记&#xff0c;常见的如txt文件&#xff0c;word文档&#xff0c;log文件等。那么&#xff0c;在C语言中文件是什么样的存…

err_connect_length_mismatch错误

原因: 官网解释为&#xff1a;err_content_length_mismatch:错误的内容长度不匹配&#xff08;请求的Heather 里content-length长度与返回的content-length不一致&#xff09; 问题截图: 分析: 由截图可见,静态资源加载错误,提示err_content_length_mismatch,经排查,网络页签…

基于 Linux 内核驱动模块的简介

基于 Linux 内核驱动模块的简介 最简内核驱动原理 内核编程的最简单表现就是内核模块&#xff0c; 它可以作为一段可动态加载的成熟的内核级的代码使用。使用时一般不限制模块个数和类型&#xff0c;即插即用&#xff0c; 高效快捷、 性能稳定。缺点为性能和内存利用缺失&#…

计算机考研408-计算机网络、操作系统整书知识点脑图

计算机网络、操作系统整书知识点脑图 今天突然想起来考研期间为了方便记忆&#xff0c;费了很大力气整理了计算机网络、操作系统两本书知识点的脑图&#xff0c;想着放着也没啥用&#xff0c;分享出来给大家看看 但是思维导图格式的东西好像没法直接发成文章&#xff0c;上传…

菜鸟学习日记(python)——循环语句

python中的循环语句包括for循环语句和while循环语句&#xff0c;但是python中是没有do...while循环语句的。 while循环语句 while循环语句的一般格式为; while condition:loop body condition是循环判断条件&#xff0c;loop body是循环体。 当循环条件成立时&#xff0c;…

【知识】如何区分图论中的点分割和边分割

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 以下两个概念在现有中文博客下非常容易混淆&#xff1a; edge-cut(边切割) vertex-partition(点分割)vertex-cut(点切割) edge-partition(边分割) 实际上&#xff0c;初看中文时&#xff0c;真的会搞不清楚。但…

滑动窗口练习(三)— 加油站问题

题目 测试链接 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。 给定两个整数数组…

调新浪分享

前端写一个按钮,通过按钮来调出新浪界面, window.location.href http://service.weibo.com/share/share.php?url 这行代码调出新浪分享界面,要是想要添加一些图片和文字 使用: window.location.href http://service.weibo.com/share/share.php?url encodeURIComponent…

软件设计不是CRUD(7):低耦合模块设计实战——组织机构模块(中)

接上文《软件设计不是CRUD&#xff08;6&#xff09;&#xff1a;低耦合模块设计实战——组织机构模块&#xff08;上&#xff09;》 组织机构功能是应用系统中常见的业务功能之一&#xff0c;但是不同性质、不同行业背景、不同使用场景的应用系统对组织机构功能的要求可能完全…

[CTFshow 红包挑战] 刷题记录

文章目录 红包挑战7红包挑战8红包挑战9 红包挑战7 考点&#xff1a;xdebug拓展 源码 <?php highlight_file(__FILE__); error_reporting(2);extract($_GET); ini_set($name,$value);system("ls ".filter($_GET[1])."" );function filter($cmd){$cmd s…

visual studio code 好用的插件

vscode-icons Better comments 该插件对不同类型的注释会附加了不同的颜色&#xff0c;更加方便区分&#xff0c;帮助我们在代码中创建更人性化的注释。 Error Lens Error Lens插件是一款可以检测你编写的代码的语法错误&#xff0c;并且会显示出对语法错误的诊断信息…

中科院分区和JCR分区有什么区别

文章目录 名词解释学科划分不同参考的影响因子不同期刊分区不同期刊分区阈值不同 名词解释 中科院分区&#xff1a;又称“中科院JCR分区”&#xff0c;是中国科学院文献情报中心世界科学前沿分析中心的科学研究成果&#xff0c;期刊分区表数据每年底&#xff08;每年12月中下旬…

基于c++版数据结构基于数组栈改-Python思维总结

##栈部分-&#xff08;叠猫猫&#xff09; ##抽象数据类型栈的定义&#xff1a;是一种遵循先入后出的逻辑的线性数据结构。 换种方式去理解这种数据结构如果我们在一摞盘子中取到下面的盘子&#xff0c;我们首先要把最上面的盘子依次拿走&#xff0c;才可以继续拿下面的盘子&…

Java8流式编程详解

简介 java8提供的流式编程使得我们对于集合的处理不再是临时集合加上各种还能for循环&#xff0c;取而代之的是更加简洁高效的流水线操作&#xff0c;所以笔者就以这篇文章总结一下流式编程中常见的操作。 前置铺垫 后文示例操作中&#xff0c;我们都会基于这个菜肴类的集合…

BUUCTF crypto做题记录(3)新手向

目录 一、Rabbit 二、篱笆墙的影子 三、丢失的MD5 四、Alice与Bob 一、Rabbit 得到的密文&#xff1a;U2FsdGVkX1/ydnDPowGbjjJXhZxm2MP2AgI 依旧是看不懂是什么编码&#xff0c;上网搜索&#xff0c;在侧栏发现Rabbit解码&#xff0c;直接搜索就能有在线解码网站 二、篱笆…