zoukankan      html  css  js  c++  java
  • c语言编写51单片机中断程序,执行过程是怎样的?

    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

  • 相关阅读:
    Linux安装/卸载软件教程
    X-Window/GNOME/KDE的关系
    GNU和GPL的区别/关系
    VSS迁移详细教程
    VSS+SourceAnywhere for VSS搭建版本控制系统教程
    Windows添加用户和组命令
    Windows开启远程桌面服务(Win10)
    rdesktop安装教程
    Spring控制反转(依赖注入)的最简单说明
    TortioseSVN切换账号教程
  • 原文地址:https://www.cnblogs.com/chengqi521/p/7649105.html
Copyright © 2011-2022 走看看