OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4577|回复: 4

中断程序的调用

[复制链接]

18

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2013-11-5
在线时间
0 小时
发表于 2013-11-13 13:39:33 | 显示全部楼层 |阅读模式

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//#define _DEVICEFLAG_
sbit key0=P3^2;
sbit key1=P3^3;
sbit key2=P3^4;
sbit key3=P0^3;
sbit b1=P0^4;
sbit k1=P2^4;
sbit k2=P2^3;
sbit k3=P2^2;
sbit k4=P2^1;
sbit k5=P2^0;
void delay_ms (uint z)
{
 uint x,y;
 for (x=z;x>0;x--)
  for (y=110;y>0;y--);
}
void init()
{
 TMOD=0x01;
 TH0=0xfc;
 TL0=0x66;
 ET0=1;
 TR0=1;
 EA=1;
 TMOD|=0x01;    //定时器T0,工作方式1
   TH0=0xC3;
   TL0=0xC7;     //这两个寄存器存的是计数器的计数开始的值,这两个值累加至溢出后正好是50ms
   ET0=1;        //使T0中断可以溢出
   EA=1;         //开启总中断
   TF0=0;        //溢出位清零
   TR0=1;        //开启T0
}
uchar ControlFlag=0;
void timer0(void)interrupt 1

  static uchar i,count=0;
 
 TH0=0xfc;
    TL0=0x66;
 count++;
 if(key0 == 0)
 {
#ifndef _DEVICEFLAG_    
  
 for(i=0;i<2;i++)
 {
  delay_ms(100);
 }
 if(key0 == 0)  //按键2
 {
  ControlFlag = 2;
 }
 else if(key0 == 1)
 {
  ControlFlag = 1;
 }  
#else
 if(key0 == 1)
 {
  ControlFlag = 1;
 }
#endif
}
}
//外部中断2服务程序  复位开关2
void timer1(void)interrupt 2

    static uchar i,count=0;
  
 TH0=0xfc;
    TL0=0x66;
 count++;
 if(key1 == 1)
 {
 for(i=0;i<2;i++)
 {
  delay_ms(100);
 }
 if(key1 == 0)
 {
  ControlFlag = 6;
 }
 else if (key1 == 1)
 {
  ControlFlag = 5; 
 }
 }
}
//外部中断3服务程序 复位开关1
void it_timer3(void)interrupt 3
{
 static uchar i,count=0;
//    TMOD&=0xF0;
// TH0=0x00;
// TL0=0x00;
// ET0=1;
// EA=1;
// TR0=1;
  TH0=0xC3;
   TL0=0xC7;
   count++;
 if(key2 == 1)
 {
 for(i=0;i<2;i++)
 {
  delay_ms(100);
 }
 if(key2 == 0)
 {
  ControlFlag = 4;
 }
 else if(key2 == 1)
 {
  ControlFlag = 3;
 }
  }
}
main()
{
    k1=0;
    k2=0;
    k3=0;
    k4=0;
    k5=0;
 key3=0;
 init(); 
 while(1)
 {
#ifndef _DEVICEFLAG_           
 if((b1==1)||(key3 == 1))
 {
  k5 = 1;
 }
 else if ((b1 == 0)&&(key3 == 0))
 {
  k5 = 0;
 }
#endif
/*************************************************************
*************************************************************/
#ifndef _DEVICEFLAG_
      switch(ControlFlag)  
   { 
       case 1:         //机器总开关长按
       if(key3 == 0)      //服务器+5V为0时
     {
         if(b1 == 0)     //K1断开时
      {
       k1 = 1;
       k4 = 1;
       delay_ms(1000);
       k4 = 0;
      }
        else if (b1== 1)                   //K1闭合时
        {
          k1 = 0;
        }
     }
     else if(key3 ==1)       //服务器+5V为1时
     {
        if(b1 == 0)                    //K1断开时
        {
          k4 =1;
        delay_ms(1000);
       delay_ms(1000);
       delay_ms(1000);
       delay_ms(1000);
       k4 = 0;

        }
        else if(b1 ==1)                         //K1闭合时  
        {
          k4 = 1;
       delay_ms(1000);
       delay_ms(1000);
       delay_ms(1000);
       k1= 0;
       delay_ms(1000);
       k4 = 0; 
        }
     }
     ControlFlag = 0;          
     break;
   case 2:                //机器总开关短按
     if(key3 == 0)      //服务器+5V为0时
     {
      if(b1 ==0)     //K1为断开时
      {
       k1 = 1;
       k4 = 1;
       delay_ms(1000);
       k4 = 0;
      }
        else if (b1 == 1)                  //K1为闭合时
        {
          k4 = 1;
       delay_ms(1000);
       k4 = 0;
        }
     }
     else if(key3 ==1)      //服务器+5V为1时
     {
        if(b1 == 0)                   //K1断开时
        {
          k1 = 1;                 

        }
        else if(b1 ==1)                       //K1闭合时                
        {
       ; 
        }
     }
     ControlFlag = 0;
     break;
   case 3:              //复位开关1长按
     if(b1 == 1)                             //K1闭合时
     {
      k2 = 1;
      delay_ms(1000);
      delay_ms(1000);
      delay_ms(1000);
      k2 = 0;   
     }
     ControlFlag = 0;
     break;
   case 4:               //复位开关1短按
     if(b1 == 1)                              //K1闭合时
     {
      k1 = 0;
      delay_ms(1000);
      k1 = 1;
     }
     ControlFlag = 0;
     break;
   case 5:                            //复位开关2长按
     if(key3== 1)
     {
      k3= 1;
      delay_ms(1000);
      k3 = 0;
     }
     ControlFlag = 0;       
     break;
   case 6:                                                //复位开关2短按
           if(key3 == 1)
     {
      k3 = 1;
      delay_ms(1000);
      k3 = 0;
     }
     ControlFlag = 0;
     break;
#endif
   default:
     break;

  }    
  delay_ms(10);
 } 
}

为什么我的中断只是第一个被调用了,另外两个怎么没调用,求教

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-11-13 20:54:42 | 显示全部楼层
回复 支持 反对

使用道具 举报

14

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2013-6-15
在线时间
15 小时
发表于 2013-11-13 21:14:22 | 显示全部楼层
第二个和第三个中断没响应么,是初始化里没写这两个中断没打开吧....
回复 支持 反对

使用道具 举报

18

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2013-11-5
在线时间
0 小时
 楼主| 发表于 2013-11-14 08:51:59 | 显示全部楼层
回复【3楼】as564335sa:
---------------------------------
我知道了,是中断没初始化,也没有中断结束标志
回复 支持 反对

使用道具 举报

14

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2013-6-15
在线时间
15 小时
发表于 2013-11-14 10:21:19 | 显示全部楼层
回复【4楼】我的世界123:
---------------------------------
51的中断响应中断程序后中断标志自动清了,不用程序管
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表