找回密码
 立即注册
查看: 191|回复: 3

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-01-17 10:51:10
已绑定手机

1

主题

1

回帖

11

积分

新手上路

积分
11
发表于 2025-1-17 09:44:42 | 显示全部楼层 |阅读模式
#include "all.h"


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

bit  AT24c02_flag_W=0;
bit  AT24c02_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;
        
        
        }
}
void  anzhuangtaipanduan()
{
        
        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();


                }

}

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-01-17 10:51:10
已绑定手机

1

主题

1

回帖

11

积分

新手上路

积分
11
发表于 2025-1-17 09:46:30 | 显示全部楼层
短时间10个小时以内 程序,运行正常, 但过15个小时后 , 外部中断0就无法进去, , 需要断电重新上电又恢复正常了,这个是啥情况, 求各路解决方法
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2025-1-17 17:21:03 | 显示全部楼层
烧录例子到芯片里试试看:
截图202501171720515233.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:199
  • 最近打卡:2025-05-02 00:28:39
已绑定手机

24

主题

345

回帖

1633

积分

金牌会员

积分
1633
发表于 2025-2-20 13:17:50 | 显示全部楼层
开了好多中断,试试设置中断优先级,或者把看门狗开起来。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:27 , Processed in 0.132257 second(s), 72 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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