单片机交流
直播中

飞毛腿452

8年用户 855经验值
擅长:电源/新能源
私信 关注
[问答]

请问c语言是如何编写51单片机中断程序的?

请问c语言是如何编写51单片机中断程序的?

回帖(1)

陈鹏

2021-10-14 11:43:51
   
  例如程序:
#include  
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取反一次。
  
}
当有中断时,这个程序的执行过程是怎样的???
   
   
   
  A1:从main开始,开放总中断,允许使用外中断,选择负跳变来触发外中断,到这时负跳变没来没就一直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语言程序详解

  

  •          利用外部中断0,定时器0从数码管到流水灯显示
       
  •             
             #include "reg52.h"//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
         #include "intrins.h"
       
                     
       
  •             
             #define uint unsigned int
         #define uchar unsigned char
       
                     
       
  •             
             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];//显示两位数码管
       
                     
       
  •             
             /******************************************************************/
         /*                    延时函数声明                                */
         /******************************************************************/
         /*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++)
           {;}
           }  
         }
       
                     
       
  •             
             /******************************************************************/
         /*                   主函数 1                                      */
         /******************************************************************/
         void main()
         {
         EA=1;//开总中断开关
         EX0=1;//打开外部中断0
         INT0=1;//触发方式为下降沿触发
         TH0=0x3c;//设置初值
         TL0=0xb0;
         ET0=1;//打开定时器中断
         TR0=1;//启动定时器
         TMOD=0x01;//设置定时器0为工作方式1
       
                     
       
  •             
             while(1)
         {
         for(i=0;i<2;i++)//数码管显示数据
         {
         P1=0xff;
         P2=sm;
         P0=smg[str];
         mdelay(5);
         }
         }
         }
       
                     
       

  •             
             void int0() interrupt 0
         {
           uchar c;
         led=0xfe;
           P2=0x00;
         for(c=0;c<8;c++)//流水灯循环一次
         {
         P1=led;
         led=_crol_(led,1);//左移函数
         mdelay(1000);
         }
         }
       
                     
       

  •             
             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;
             }
           }
         }
       
                  

  •      
举报

更多回帖

发帖
×
20
完善资料,
赚取积分