小明同学0706 发表于 2025-1-17 09:44:42

15W4K 单片机长时间运行 外部中断0无法进去求解决方法

#include "all.h"


#define LVDF    0x20                //PCON.5,低压检测中断标志位

bitAT24c02_flag_W=0;
bitAT24c02_flag_R=0;

uint t_data=0;
volatile uchar anjiangzhuantai_flag=0;//按键状态标志
void Timer0_Isr(void) interrupt 1//定时0 中断
{

      t_data++;
      if(t_data>999)
      {
                P02=~P02;
                t_data=0;
                aa++;
                if(aa>59)
                {
                        aa=0;
                        time++;
                }
      
      
      }
}

void Timer0_Init(void)                //1毫秒@11.0592MHz
{
      AUXR |= 0x80;                        //定时器时钟1T模式
      TMOD &= 0xF0;                        //设置定时器模式
      TL0 = 0xCD;                              //设置定时初始值
      TH0 = 0xD4;                              //设置定时初始值
      TF0 = 0;                              //清除TF0标志
      
}
void INT0_Init(void)                //1毫秒@11.0592MHz
{
      
          IT0 = 1;                  //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
    EX0 = 1;                  //使能INT0中断
    EA = 1;
}
void INT1_Init(void)                //1毫秒@11.0592MHz
{
      
         
    IT1 = 1;                  //设置INT1的中断类型 (1:仅下降沿 0:上升沿和下降沿)
    EX1 = 1;                  //使能INT1中断
    EA = 1;

}

void INT2_Init(void)                //1毫秒@11.0592MHz
{
      
         
    INT_CLKO |= 0x10;               //(EX2 = 1)使能INT2中断
    EA = 1;

}
void INT3_Init(void)                //1毫秒@11.0592MHz
{
      
         
    INT_CLKO |= 0x20;               //(EX3 = 1)使能INT3中断
    EA = 1;

}
void exint3() interrupt 11          //INT3中断入口
{
   anjiangzhuantai_flag=0;         
}


void exint2() interrupt 10          //INT2中断入口, 显示数据--
{

         if(anjiangzhuantai_flag==1)
      {
            
                if(dingshi3<1)
                {
                        dingshi3=0;
                }
                else
                {
                dingshi3--;
                }
      }
if(anjiangzhuantai_flag==2)
      {
             if(dingshi2<1)
                {
                        dingshi2=0;
                }
                else
                {
                dingshi2--;
                }
      }
if(anjiangzhuantai_flag==3)
      {
            if(dingshi1<1)
                {
                        dingshi1=0;
                }
                else
                {
                dingshi1--;
                }
      }
if(anjiangzhuantai_flag==4)
      {
            if(dingshi0<1)
                {
                        dingshi0=0;
                }
                else
                {
                dingshi0--;
                }
      
      
}
}

void LVD_ISR() interrupt 6 //低压中断函数, 当单片机发生断电的情况下对数据进行保存处理, 中断主函数运行
                {
                                                PCON &= ~LVDF;                  //向PCON.5写0清LVD中断
                        AT24c02_flag_W=1;
                                                write24c02(0,aa);//将显示数据分别存到那24c02中
//                                                write24c02(1,TmData);//将显示数据分别存到那24c02中
                              write24c02(2,time);//将显示数据分别存到那24c02中
                              
//                                                 AT24C02Write(1,num1);      //存贮当前数值
//                               AT24C02Write(2,num2);      //存贮当前数值
                               P2M0 = 0x00; //将tm1620通讯端口设置为高阻, 关掉数码管,省电,延长24c02保存数据时间
                               P2M1 = 0xff;//将tm1620通讯端口设置为高阻, 关掉数码管,省电,延长24c02保存数据时间      
                                        AT24c02_flag_W=0;                        
                }

void exint0() interrupt 0       //INT0中断入口,控制数码管闪烁
{
anjiangzhuantai_flag++;
      if(anjiangzhuantai_flag>4)
      {
      anjiangzhuantai_flag=0;
      
      
      }
}
voidanzhuangtaipanduan()
{
      
      if(anjiangzhuantai_flag==0)
      {
            display4();
      }
if(anjiangzhuantai_flag==1)
      {
            display0();
      }
if(anjiangzhuantai_flag==2)
      {
            display1();
      }
if(anjiangzhuantai_flag==3)
      {
            display2();
      }
if(anjiangzhuantai_flag==4)
      {
            display3();
      }

}
void exint1() interrupt 2       //INT1中断入口,显示数据++
{
   if(anjiangzhuantai_flag==1)
      {
            dingshi3++;
                if(dingshi3>9)
                {
                        dingshi3=0;
                }
      }
if(anjiangzhuantai_flag==2)
      {
            dingshi2++;
                if(dingshi2>9)
                {
                        dingshi2=0;
                }
      }
if(anjiangzhuantai_flag==3)
      {
             dingshi1++;
                if(dingshi1>9)
                {
                        dingshi1=0;
                }
      }
if(anjiangzhuantai_flag==4)
      {
            dingshi0++;
                if(dingshi0>9)
                {
                        dingshi0=0;
                }
      }      
}

void main()
{
    P0M0 = 0x00; P0M1 = 0x00;
    P1M0 = 0x00; P1M1 = 0x00;
    P2M0 = 0x00; P2M1 = 0x00;
    P3M0 = 0x00; P3M1 = 0x00;
    P4M0 = 0x00; P4M1 = 0x00;
                                                aa=read24c02(0);      //上电开始用地址0单元存储num十六进制表示时的低两位, 读取24c02中的数据
                                                      //    TmData=read24c02(1);      //用地址0单元存储num十六进制表示时的高
                                                      time=read24c02(2);      //用地址0单元存储num十六进制表示时的高      
P02=0;
      Timer0_Init()      ;
         INT0_Init();
                        EA=1;
                INT1_Init();
                INT2_Init();
                INT3_Init();
                while (1)
                {
                        ET0 = 1;                              //使能定时器0中断
                        TR0 = 1;                              //定时器0开始计时
                         anzhuangtaipanduan();
                        
                        display();


                }

}

小明同学0706 发表于 2025-1-17 09:46:30

短时间10个小时以内 程序,运行正常, 但过15个小时后 , 外部中断0就无法进去, , 需要断电重新上电又恢复正常了,这个是啥情况, 求各路解决方法

乘风飞扬 发表于 2025-1-17 17:21:03

烧录例子到芯片里试试看:

angalp 发表于 2025-2-20 13:17:50

开了好多中断,试试设置中断优先级,或者把看门狗开起来。
页: [1]
查看完整版本: 15W4K 单片机长时间运行 外部中断0无法进去求解决方法