精华内容
下载资源
问答
  • 本文主要讲了PIC单片机中断程序实例,希望对你的学习有所帮助。
  • 51单片机 中断程序

    2013-04-21 18:49:14
    51单片机 中断程序 讲述的是51单片机中的中断程序的简单例子,
  • 文章介绍了PIC单片机中断程序的设计技巧。
  • 任务三单片机中断程序设计 西安航空职业技术学院 自动化教研室王曙霞 任务三单片机中断程序设计 中断处理过程 中断处理过程分为三个阶段:中断响应中断 处理和中断返回 中断响应 中断处理(又称中断服务) 三中断返回 ...
  • 51单片机中断程序

    2011-10-21 22:10:23
    51单片机中断程序,走时与电脑走时一样,非常准确,不行你可以下载看看。
  • 所有的中档系列PIC单片机,PORTB端口最高的4个引脚(RB7~RB4)在设为输入模式时,当输入电平由高到低或由低到高发生变化时,可以让单片机产生中断。这就是通常所说的引脚状态变化中断
  • 单片机中断程序(简单版),仅供参考:#include int0()interrupt 0 { P1; if(P1==0x00) P1=0x01; }
  • 经典的单片机中断程序使用,适用于初学者,串行通信,流水灯,电子时钟等
  • 点击数码管加一,再次点击,数码管清零。还有0-999999计数效果,
  • c语言编写51单片机中断程序,执行过程是怎样的?

    千次阅读 多人点赞 2017-10-11 09:53:00
    Q:c语言编写51单片机中断程序,执行过程是怎样的?   例如程序:#include<reg52.h> void main(void) { EA=1; //开放总中断 EX0=1; //允许使用外中断 IT0=1; //选择负跳变来触发外中断 P0=0...

    Qc语言编写51单片机中断程序,执行过程是怎样的?

     

    例如程序:
    #include<reg52.h>  
    void main(void)
      {
       EA=1;      //开放总中断
       EX0=1;     //允许使用外中断
       IT0=1;    //选择负跳变来触发外中断 
       P0=0xff;         //关闭所有P0口的LED灯
            while(1); //无限循环,
    }
    void it0(void) interrupt 0 using 0 //外中断0的中断编号为0
    {

      P0=~P0;  //每产生一次中断请求,P0取反一次。
      
    }
    当有中断时,这个程序的执行过程是怎样的???

     

     

     

    A1main开始,开放总中断,允许使用外中断,选择负跳变来触发外中断,到这时负跳变没来没就一直while(1),等待。来了后执行
    void it0(void) interrupt 0 using 0 //外中断0的中断编号为0
    {

      P0=~P0;  //每产生一次中断请求,P0取反一次。
      
    }

     

     

     

     

    A2有中断时直接跑到中断服务去

     

     

     

    A3:CPU会一直在检测是否有中断请求的。当收到中断请求EX 时,进行软件设置,开启总中断EA ,再设置中断的触发方式IT。

    转载自:http://bbs.elecfans.com/forum.php?mod=viewthread&tid=220199

     

     

     

     

    外部中断定时器c语言程序详解

    1. 利用外部中断0,定时器0从数码管到流水灯显示

    2.  

      #include "reg52.h"//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

      #include "intrins.h"

      外部中断定时器c语言程序详解(1)
    3.  

      #define uint unsigned int

      #define uchar unsigned char

      外部中断定时器c语言程序详解(1)
    4.  

      uchar led,n,i,count=0;

      uchar smg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f

                ,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F

      uchar sm[]={0x00,0x01};//数码管扫描

      uchar str[2];//显示两位数码管

      外部中断定时器c语言程序详解(1)
    5.  

      /******************************************************************/

      /*                    延时函数声明                                */

      /******************************************************************/

      /*void mdelay(uint t)

      {

        uchar n;

      for(;t>0;t--)

       for(n=0;n<125;n++)

        {;}

      }*/

      /*大约一毫秒的延时函数*/

      void mdelay(uint t)

      {

        uchar n;

      while(t--)

      {

      for(n=0;n<123;n++)

        {;}

        }  

      }

      外部中断定时器c语言程序详解(1)
    6.  

      /******************************************************************/

      /*                   主函数 1                                      */

      /******************************************************************/

      void main()

      {

      EA=1;//开总中断开关

      EX0=1;//打开外部中断0

      INT0=1;//触发方式为下降沿触发

      TH0=0x3c;//设置初值

      TL0=0xb0;

      ET0=1;//打开定时器中断

      TR0=1;//启动定时器

      TMOD=0x01;//设置定时器0为工作方式1

      外部中断定时器c语言程序详解(1)
    7.  

      while(1)

      {

      for(i=0;i<2;i++)//数码管显示数据

      {

      P1=0xff;

      P2=sm[i];

      P0=smg[str[i]];

      mdelay(5);

      }

      }

      }

      外部中断定时器c语言程序详解(1)
    8.  

      void int0() interrupt 0

      {

        uchar c; 

      led=0xfe;

        P2=0x00;

      for(c=0;c<8;c++)//流水灯循环一次

      {

      P1=led;

      led=_crol_(led,1);//左移函数

      mdelay(1000);

      }

      }

      外部中断定时器c语言程序详解(1)
    9.  

      void time0() interrupt 1

      {

      TH0=0x3c;

      TL0=0xb0;

      count++;

        if(count==20)//延时一秒0-60显示

        {

      count=0;

      str[0]=n/10;

      str[1]=n%10;

      n++;

      if(n==60)

      {

       n=0;

          }

        }

      }

    10. 10

      本经验只供参考,如有不足,还请见谅。。。

       

      转载自:https://jingyan.baidu.com/article/870c6fc304cff6b03ee4be45.html

    展开全文
  • 单片机中断程序详解(转)

    万次阅读 多人点赞 2017-07-29 10:21:41
    比如小七我现在正在电脑前写帖子,突然老妈叫我帮她下楼拿点东西,于是我就收到了老妈给我的一个中断(可以叫做外部中断),当我去拿东西时,突然尿急(内部中断,尿袋快要撑爆了),这又是一个中断,!我们把引起中断...

    来源:http://www.51hei.com/mcu/2477.html

    什么是中断?就是打断当前要做的事,转而去执行别的事情。比如小七我现在正在电脑前写帖子,突然老妈叫我帮她下楼拿点东西,于是我就收到了老妈给我的一个中断(可以叫做外部中断),当我去拿东西时,突然尿急(内部中断,尿袋快要撑爆了),这又是一个中断,!我们把引起中断的事件叫做中断源(如老妈给我的任务,以及我的尿意。。。外部引起的叫外部中断,内部引起的叫内部中断),产生中断后就要去处理它,这称为中断的响应

        由于尿急这个内部中断的优先级比老妈给我的外部中断还要高,尿急了,我总得先去撒尿吧?所以我就先去执行撒尿这个语句(小七:怎么我觉得这个比喻很别扭呢?!)。当我撒完尿后(还是觉得很别扭。。。)我会返回来帮老妈拿东西(高优先级的中断处理完后返回执行优先级较低的中断),拿完东西了我再回到电脑前继续写帖子(全部中断处理完后继续接手中断前的工作)。这个就叫做中断的返回。这么通俗的比喻,大家对中断的概念应该都明白了吧,那么在单片机里面,中断有什么用呢?


        当单片机正在执行程序的时候,突然某个按键按下了(产生外部中断),单片机就必须得去处理那个按键(中断的响应),看看是发生了什么事,按键处理完后继续回来执行程序(中断的返回)。

        同样,单片机正在执行程序的时候,内部的定时器溢出(定时器后面会单独讲到),或者检测到单片机的电压低于正常值等等(单片机内部产生的中断叫内部中断),单片机就得去处理这些事情,然后再返回来。

    在单片机里面,中断是有特殊的功能寄存器控制的,单片机里面一共有两个中断,一个是中断0,一个是中断1 ,和两个定时器T0,T1,定时器就是你打开它后,它会自动数数,当数到你给它限定的值时,它就会溢出,产生中断让CPU处理(就像一个桶,你打开水龙头后,水越来越多,当达到你需要的水位时,就会产生中断叫你去处理它)。这些我们先不深入了解他是什么东西,我们只需知道中断是用下面这几个关键词控制的就行了:

    IT0      声明外部中断0的类型,IT0=1是边沿触发,0是电平触发
    边沿触发就是当检测到外部电平发生变化,即由低变高,或者由高变低时,就会产生一个中断
    电平触发就是检测到高电平或者低电平时,产生中断

    IE0     外部边沿触发产生中断后,它的值会变1,当CPU响应后,会自动变为0

    IT1      和IT0一样的含义
    IE1     和IT0一样的含义


    EX0    外部中断0控制器,EX0=1是允许外部中断,0是禁止外部中断,也就是不理会外部中断
    ET0    这个是定时器中断控制器,ET1=1是允许定时器产生中断,0是禁止
    EX1,ET1的含义跟上面的都一样。
    EA      总中断控制器,1是允许有中断产生,0是禁止所有中断,就算天打雷劈也不理会

        另外,还有一个中断优先级的控制器,就是控制是去帮妈妈拿东西的优先级高还是去撒尿的优先级高。


    PX0 外部中断0的优先级控制,假如内外都产生了中断,1就是优先处理外部中断,0就是优先处理内部中断

    PT0 定时器0优先级控制器,1就是优先相应定时器0

    PT1 定时器1优先级控制器,1就是优先相应定时器1

    另外还有串口的RI,TI,PS等我们先不学习了,不然大伙该乱了
    (众人:其实我们早已凌乱了。。。一头雾水!)

        还有个概念,就是中断请求的撤销,也就是说,产生中断后,会产生一个中断请求,为1,当CPU处理完中断后,必须清除这个请求,不然CPU又会认为这个中断没有处理又跑去处理它……

        对于两个定时器产生的中断,当CPU响应后,会自动清除TF0,TF1这两个定制器中断请求,处理完后就跳出来,回到原来的地方继续执行。

        对于外部中断INT0,INT1,如果中断类型是边沿触发,单片机会自动清除中断请求IE0,IE1
    若是电平触发,如果有一个电平,使中断产生后,这个电平仍然还保持着,那么这个电平还会触发中断,这样CPU就死在中断的石榴裙下出不来了。。。

    (众人:说了那么多,没例子你说个J8)

    例子来啦!用外部中断来控制一个LED的亮灭。对了,外部中断并不是单片机的每个引脚都能产生,标有INT0或INT1的才行,我们看看11F02E的引脚图





        中断的引脚是INT0:P3^2和 INT1:P3^3,我们用边沿触发(由高电平变成低电平时,就会触发)的中断方式来控制LED,


        当我们没按下按键的时候,由于上拉电阻(不懂的问百度姐姐哦~)的原因,P3^2是高电平,当我们按下按键后,P3^2的电平就会变低,这个从高变低的过程就会产生一个中断(边沿触发),CPU会第一时间来相应这个中断,看看是谁看帖不回贴,看完帖子不评分,然后根据小七写的中断处理程序去处理他!


    O(∩_∩)O 。

    程序怎么写呢?

     #include <reg52.h> 
    sbit led=P1^7;  //定义LED 
    void zhongduan() interrupt 0 using 1       //声明中断处理函数,由于是外部中断,所以 interrupt X 里X的值是 0 

      led=!led;  //CPU响应中断后会跑来这里执行(让led的状态取反) 

    void main()      //主函数,程序执行的起点 

      EA=1;              //允许CPU响应所有中断 
      IT0=1;             //设外部中断0的响应模式为边沿触发 
      EX0=1;             //允许中断0产生中断 
      while(1);         //CPU不断在这里死循环,中断产生后放下工作去响应中断,处理完后然后再返回来继续死循环 
    }

    按下按键,CPU会跑去中断处理函数执行,执行完中断处理后返回原处继续执行




    (众人:这个中断跟我们前面学习的按键有什么区别么?)


        当然有区别啦!虽然都是控制LED,但是按键是当CPU执行到按键检测如 if(key==0) 语句后,才去改变LED的状态,如果没有执行到,那么即使你按下按键单片机也不会响应的,也就是CPU主动去问按键有没有被按下。而中断呢,就是无论CPU在干嘛,只要触发中断后,CPU就会放下手中的活,第一时间赶回来处理,也就是按键被按下后主动告诉CPU。。。就像windows 系统的 ctrl+alt+del 组合键,你一按下这个组合键,无论系统在做什么,都会弹出任务管理器。


        另外中断的处理函数是这样声明的


    void abc() interrupt X using n
    {
        处理语句;



    我们看到,只是普通的函数 加上了 interrupt X using Y 了而已,X 的取值是有规定的:


    如果是外部中断0的中断处理函数,则X为0 即void abc() interrupt 0 using n


    若是定时器0的中断处理函数,则 X 为1


    若是外部中断1的中断处理函数,则 X 为2


    若是定时器1的中断处理函数,则 X 为3 


    若是串口中断的中断处理函数,则 X 为4

    n 是中断号,取值范围为 0 - 31




    关于中断的学习,也到此告一段落了,当然还有一些问题没解决.......

    Q1: 为什么count==40的时候数码管也不能闪烁???



     
    /*
    实现目的:
    让LED灯以1000ms(即1s)产生流水灯效果,并用定时器0让数码管以500ms从0~F闪烁
    */
    #include<reg52.h>
    #include<intrins.h>
    #define uint unsigned int
    #define uchar unsigned char
    sbit d1=P2^1;
    uchar weixuan=0x00;//位选全开
    uchar code table[]={
    0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71};//段选
    uchar temp,count,num;
    void delay(uint z)
    {
        uint x,y;
        for(x=z;x>0;x--)
    {
    for(y=0;y<113;y++)
    {
    }
    }
    }
    void main()
    {
    count=0;
    num=0;
    P1=weixuan;
    P0=table[num];
    temp=0xfe;
    P2=temp;
    TMOD=0x01;
    TH0=(65535-50000)/256;
    TL0=(65535-50000)%256;
    EA=1;
    ET0=1;
    TR0=1;
    while(1)
    {
    delay(1000);
    temp=_crol_(temp,1);
    P2=temp;
    /*
    if(count==10)
    {
    count=0;
    num++;
    if(num==16)
    {
    num=0;
    }
    P0=table[num];
    } */
    }
    }
    void time0() interrupt 1
    {
    TH0=(65535-50000)/256;
    TL0=(65535-50000)%256;
    count++;
    if(count==10)
    {
    count=0;
    num++;
    if(num==16)
    {
    num=0;
    }
    P0=table[num];
    }  
    }

     

     
    /*
    PS:我们不能把数码管500ms闪烁时间是否到达的语句写在主程序中,
    若写在主程序中,有可能发生如下错误情况:当主程序在LED灯显示语句当中时,
    此时恰好定时器0进入中断并且count刚好加到了10,当定时器0中断再次进入时,
    主程序仍未退出LED流水灯的显示程序,那么此时count的值便变成了11,
    这样的话,count==10这个点永远检测不到,因此数码管闪烁失去了控制


    在调试代码当中发现delay(uint z)函数与中断是同时执行的。。。 
    */  
    展开全文
  • 单片机中断程序(C语言版),是学习单片机中断必看的源代码。
  • 本文主要介绍了单片机中断服务程序中的变量应该如何使用。
  • 实现51单片机的外部中断,下降沿触发中断,实现中断功能。
  • 单片机红外中断程序

    2012-04-25 10:53:59
    目前网上有许多关于单片机红外中断的代码,都是都有一个缺陷,就是代码加入红外中断后,不能退出,主要的问题是对单片机中断标志的清零上。我特上传该代码,希望给后来者有个帮助。 代码是一个基于红外中断的遥控...
  • PIC单片机引脚中断程序的设计技巧 PIC单片机引脚中断程序的设计技巧 PIC单片机引脚中断程序的设计技巧
  • 主要介绍PIC 单片机引脚中断程序的设计技巧, 这样设计的引脚变化程序,CPU开销小,效率高,不会出现堆浅溢出的问题,提高了系统的实时性。
  • PIC单片机中断程序

    2010-05-24 10:42:54
    基于pic单片机中断程序,主控芯片是pic16f873,已经调调试成功了,一定好用。
  • PIC单片机中断服务程序

    千次阅读 2017-08-03 20:48:55
    中断服务程序有一个特殊的定义方法: void interrupt ISR(void);其中的函数名“ISR”可以改成任意合法的字母或数字组合,但其入口参数和返回参数类型必须是“void”型,亦即没有入口参数和返回参数,且中间必须有一...
    中断服务程序有一个特殊的定义方法: void interrupt ISR(void);其中的函数名“ISR”可以改成任意合法的字母或数字组合,但其入口参数和返回参数类型必须是“void”型,亦即没有入口参数和返回参数,且中间必须有一个关键词“interrupt”。
           中断函数可以被放置在原程序的任意位置。因为已有关键词“interrupt”声明,PICC 在最后进行代码连接时会自动将其定位到0x0004 中断入口处,实现中断服务响应。编译器也会实现中断函数的返回指令“retfie”。
     
            一个简单的中断服务示范函数如下:

    void interrupt ISR(void) //中断服务程序

    if (T0IE && T0IF)//判TMR0 中断

    {  

    T0IF = 0; //清除TMR0 中断标志 //在此加入TMR0 中断服务
      }

    if (TMR1IE && TMR1IF)//判TMR1 中断  T

    MR1IF = 0; //清除TMR1 中断标志
                     //在此加入TMR1 中断服务
            }
    } //中断结束并返回
     
    PICC 会自动加入代码实现中断现场的保护,并在中断结束时自动恢复现场,所以编程员无需像编写汇编程序那样加入中断现场保护和恢复的额外指令语句。
    但如果在中断服务程序中需要修改某些全局变量时,是否需要保护这些变量的初值将由编程员自己决定和实施。
    用C 语言编写中断服务程序必须遵循高效的原则:
    1. 代码尽量简短,中断服务强调的是一个“快”字。
    2.避免在中断内使用函数调用。虽然PICC 允许在中断里调用其它函数,但为了解决递归调用的问题,此函数必须为中断服务独家专用。既如此,不妨把原本要写在其它函数内的代码直接写在中断服务程序中。
    3.避免在中断内进行数学运算。数学运算将很有可能用到库函数和许多中间变量,就算不出现递归调用的问题,光在中断入口和出口处为了保护和恢复这些中间临时变量就需要大量的开销,严重影响中断服务的效率。
     
    中档系列PIC 单片机的中断入口只有一个,因此整个程序中只能有一个中断服务函数。
    展开全文
  • 理解单片机中断的proteus程序,其中包括图像说明和源码
  •  在设计引脚中断程序时,有三个需要特别注意的地方。一是,在清除P0RTB中断标志位RBIF之前,必须安排一条必不可少的,以PORTB端口数据寄存器PORTB为源寄存器的读操作指令。放置这一指令的目的有时并不只是为了读取...
  • AT89X51单片机中断嵌套程序,定时器1与外部中断0相互嵌套
  • 程序表现工具为keil4,主要涉及 16X16点阵多种显示方式,定时器,串口,中断,modbus通讯等
  • 单片机外部中断程序

    2012-05-25 10:41:37
    经过验证,已经实现了的成功代码 汇编程序语言,实验四实验内容
  • 单片机 中断

    万次阅读 多人点赞 2018-05-30 23:03:30
    单片机 中断一、简述 中断,即CPU在正常执行程序的过程中,遇到外部/内部的紧急事件需要处理,暂时中断(中止)当前程序的执行,而转去为事件服务,待服务完毕,再返回到暂停处(断点)继续执行原来的程序。二、中断...

    单片机 中断

    一、简述

        中断,即CPU在正常执行程序的过程中,遇到外部/内部的紧急事件需要处理,暂时中断(中止)当前程序的执行,而转去为事件服务,待服务完毕,再返回到暂停处(断点)继续执行原来的程序。


    二、中断请求标志控制寄存器TCON


    三、中断请求标志控制寄存器SCON


    四、中断允许寄存器IE


    五、中断函数

    中断函数定义的格式为:
    函数类型 函数名 interrupt   n  using  m
    其中:
        interrupt 后面的n 是中断号。

        关键字using 后的m 是所选择的寄存器组,取值范围是0~3。

    using m这部分通常可以省略,由编译器自动选择一个寄存组。

    举例:

    void int0rupt() interrupt 0    
    {		
    	beep=0;//开蜂鸣器	
    	while(P3_2!=1);//当P3^2口一直是低电平时,就一直告警
    	beep=1;//关蜂鸣器
    }
    
    void 是函数类型表示空类型
    int0rupt是函数名

    interrupt 0中的0表示该函数是为外部中断0服务的处理函数(当外部申请中断0服务时调用此函数)

    六、完整例子

    文件打包:链接: https://pan.baidu.com/s/1Zuo1-bGvJV5YJU1Kq1Xh9w 密码: 195s

    1、效果:当按键按下时,蜂鸣器就会响,不松开就一直响,松开关闭。

        (主程序死循环,通过CPU中断可以暂时中断,先执行其他任务,然后再回来继续执行被中断的任务。例子中开启外部中断0,中断方式为下降沿触发,比如控制端口原来是高电平的,按下按钮使控制端口变为低电平,高电平到低电平有个下降过程,下降沿触发中断0,调用中断服务处理函数,蜂鸣器响。中断服务处理函数有个循环检测直到按钮释放才关闭蜂鸣器,退出中断服务处理函数,控制端口恢复为高电平。)

    2、Keil文件结构


    3、仿真电路


    4、alarm.c文件

    #include<reg51.h>
    #define uint unsigned int
    #define uchar unsigned char
    sbit P3_2=P3^2;//将P3^2定义为中断0控制口
    sbit beep=P3^3;//将P3^3定义为蜂鸣器控制口
    void main()
    {
    	EA=1;//开许总中断
      	EX0=1;//开外部中断0
     	IT0=0;//中断触发方式为低电平触发
    	while(1)  //主程序一直在死循环,外部中断可以暂时执行中断处理函数
    	{}
    }
    /**********************************************************/
    //函数名:int0rupt() interrupt 0
    //功能:外部中断0中断响应程序 
    //调用函数:
    //输入参数:
    //输出参数:
    //说明:当P3^2口为低电平时进入响应程序 
    /**********************************************************/
    void int0rupt() interrupt 0//当P3^2键口为低电平时
    {
    	beep=0;//开蜂鸣器
    	while(P3_2!=1);//当P3^2口置高检测,就是按钮不释放蜂鸣器就一直响
    	beep=1;//关蜂鸣器
    }
    展开全文
  • 单片机中断优先级,含C语言及汇编程序 单片机中断优先级,含C语言及汇编程序
  • PIC单片机按键中断程序的设计技巧,内含按键 长按键代码及注释!
  • 51/52单片机外部中断实验程序 伟福试验箱专用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,208
精华内容 14,483
关键字:

单片机中断程序