当前位置: 首页 > news >正文

【C51单片机】中断系统之单一外中断应用

为了直接使用C51语言编写申断服务程序,C51讲言中定义了中断函数。

由于C51编译器在编译时对声明为中断服务程序的函数自动添加了相应的现场保护、阻断其他中断、返回时自动恢复现场等处理的程序段,因而在编写中断函数时可不必考虑这些问题,减小了用户编写中断函数的烦琐程度。

一般形式

中断服务函数的一般形式为:

函数类型函数名( 形式参数表)interrupt n using n


关键字interrupt 后面的n是中断号,对于AT89S52单片机,n的取值为0-5,编译器从8xn+3处产生中断向量。

单一外中断

下面介绍单一外中断的应用

【例】 在单片机的P1口上接有8只LED。 在外部中断0输人引脚\overline{INTO}(P3.2)接有一只按钮开关K1。要求将外部中断O设置为电平触发。程序启动时,PI口上的8只LED全亮。每按一次按钮开关 K1,使引脚\overline{INTO}接地,产生一个低电平触发的外中断请求,在中断函数中,让低4位的LED与高4位的LED交替闪烁5次。然后从中断返回,控制8只LED再次全亮。原理电路及仿真结果如下。

 

下面我们就一步一步的完成我们的代码。

头文件

实现头文件必不可少。

#include <reg51. h>

#define uchar unsigned char

 延时函数

加入延时函数,主要是可以观察的变化。

void Delay( unsigned int i)    //延时函数Delay( ),i 为形式参数、

                                //不能赋初值

{
    unsigned int j;for(;i> 0;i--)

    for(j=0;j<333;j++)            //晶振为12 MHz,j 的选择与晶振频

                                    //率有关

        {
            1;
        }                            //空函数
}

中断函数

接下来就加入我们的中断函数。可以相比之下,中断函数的区别。

void int0( ) interupt 0 using 0        //外中断0的中断函数

{
    uchar m;

    EX0=0;                            //禁止外部中断0中断



    for(m=0;m<5;m++)                //交替闪烁5次

    {

         P1 =0xOf;                    //低4位LED灭,高4位//LED亮



          Delay(400) ;                //延时



            P1= 0xf0;                //高4位LED灭,低4位//LED亮



            Delay( 400);                //延时



            EX0= 1 ;                    //中断返回前,允许外部//中断0中断
    }
}


主函数


void main( )        //主函数

{

    EA=1:        //总中断允许



    EX0=1:        //允许外部中断0中断


    IT0=l;        //选择外部中断0为跳//沿触发方式



    while(1)        //循环

    {

       P1=0;        //PI口的8只LED全亮
    }

}

本例包含两部分,一部分是主程序段,完成了中断系统的初始化,并把8只LED全部点亮。另一部分是中断函数,控制8只LED分两组交替闪烁5次,然后从中断返回。
 

今天单片机关于中断系统之单一外中断就介绍到这里。

相关文章:

  • 2.2 Linux系统的目录结构与文件类型
  • jedis:使用事务开启watch监控
  • 【趣学算法】第一章 算法之美(上)
  • 以MapBox为核心构建Vue地图组件库教程
  • Web链接测试如何做?
  • 【不是问题的问题】为什么复位中断服务程序里面直接调用的main函数,难道所有程序都在复位中断里面执行的?
  • 【ViT 微调时关于position embedding如何插值(interpolate)的详解】
  • 动态内存管理(malloc free calloc realloc)
  • C语言/C++内存管理
  • 【FPGA】什么是串行通信?
  • c语言必背100代码,C语言代码大全(c语言必背项目代码)
  • JavaEE——No.2 套接字编程(TCP)
  • MacOS(M1)交叉编译安卓版本OpenCV(附带FFmpeg)
  • LSTM -长短期记忆网络(RNN循环神经网络)
  • 【老生谈算法】matlab实现频谱分析算法源码——频谱分析
  • ----------
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【附node操作实例】redis简明入门系列—字符串类型
  • C++入门教程(10):for 语句
  • in typeof instanceof ===这些运算符有什么作用
  • Java的Interrupt与线程中断
  • Mybatis初体验
  • PermissionScope Swift4 兼容问题
  • unity如何实现一个固定宽度的orthagraphic相机
  • 闭包--闭包之tab栏切换(四)
  • 前端面试总结(at, md)
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 写给高年级小学生看的《Bash 指南》
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • $.each()与$(selector).each()
  • $refs 、$nextTic、动态组件、name的使用
  • (145)光线追踪距离场柔和阴影
  • (42)STM32——LCD显示屏实验笔记
  • (C语言)fgets与fputs函数详解
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .gitignore文件设置了忽略但不生效
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .net 获取url的方法
  • .NET 设计模式初探
  • .Net中wcf服务生成及调用
  • .NET中统一的存储过程调用方法(收藏)
  • [\u4e00-\u9fa5] //匹配中文字符
  • [2010-8-30]
  • [Codeforces] combinatorics (R1600) Part.2
  • [C语言][C++][时间复杂度详解分析]二分查找——杨氏矩阵查找数字详解!!!
  • [Hibernate] - Fetching strategies
  • [Kubernetes]9. K8s ingress讲解借助ingress配置http,https访问k8s集群应用
  • [leetcode] Balanced Binary Tree
  • [LeetCode]-283. 移动零-1089. 复写零
  • [nginx] 网上最全面nginx教程(近100篇文章整理)
  • [nlp] tokenizer