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

  • 相关阅读:
    算法----(1)冒泡排序
    淘宝爬虫
    爬虫_豆瓣电影top250 (正则表达式)
    爬虫_猫眼电影top100(正则表达式)
    Android 简单调用摄像头
    Android 简单天气预报
    思维模型
    This view is not constrained, it only has designtime positions, so it will jump to (0,0) unless you
    Android studio preview界面无法预览,报错render problem
    Android studio 3.1.2报错,no target device found
  • 原文地址:https://www.cnblogs.com/chengqi521/p/7649105.html
Copyright © 2011-2022 走看看