打印
[STC单片机]

STC单片机外部中断0的问题求助

[复制链接]
2064|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lxr21|  楼主 | 2017-11-9 10:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题是程序进入掉电模式后,外部上电后,本来灯要闪的,现在不闪,要按下开关才会闪,是不是外部上电时外部中断没起作用?请大家多多指教
#include"STC15.H"
#include "intrins.h"

sbit LED1 = P3^0;  //主LED
sbit LED2 = P3^1;  //副LED
sbit SDKZ = P3^4;  //充电指示控制
sbit key  = P3^5;  //轻触开关
sbit CDZS = P3^3;  //充电指示变化取样
sbit vin  = P3^2;  //充电取样
void MCU_down(void)
{
        PCON=0X02; //进入掉电模式
        _nop_();
  _nop_();
  _nop_();
}
void Timer0Init(void)                //10毫秒@11.0592MHz
{
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0x00;                //设置定时初值
        TH0 = 0xDC;                //设置定时初值
        TF0 = 0;                //清除TF0标志
       
}
void Delay10ms()                //@11.0592MHz
{
        unsigned char i, j;

        i = 108;
        j = 145;
        do
        {
                while (--j);
        } while (--i);
}
void LED1_SD(void)  //闪灯1Hz
{
        unsigned char a;
        TR0=1;
        if(TF0==1)
        {
                TF0=0;
                a++;
                if(a==50)
                {
                        a=0;
                        LED1=~LED1;
                }
        }
}
void CDZSD(void)  //充电指示控制
{
        unsigned char a;
        if(vin==1)         //上电
        {
                LED1=0;
                LED2=0;
        if(CDZS==0)      //充电
        {
        TR0=1;
        if(TF0==1)
        {
                TF0=0;
                a++;
                if(a==50)
                {
                        a=0;
                        SDKZ=~SDKZ;
                }
        }
  }
        if(CDZS==1)           //充好电
        {
                TR0=0;
                SDKZ=1;
        }
  }
        if(vin==0)
        {
                SDKZ=0;
                INT_CLKO |= 0x20;  //开外中断3
        }
}
void keydown(void)    //按钮开关控制
{
        unsigned char ID;
        if(vin==0)
        {
        if(key==0)
        {
                Delay10ms();
                if(key==0)
                {
                        ID++;
                if(ID==4)
                {
                        ID=0;
                }
                while(key==0);
        }
}
                switch(ID)
                {
                        case 0:
                        LED1=0;
                        LED2=0;
                        TR0=0;
                        INT_CLKO |= 0x20;  //开外中断3
                        EX0=1;
                        MCU_down();
                        break;
                        case 1:
                        LED1=1;
                        break;
                        case 2:
                        LED2=1;
                        LED1=0;
                        break;
                        case 3:
                         LED2=0;
                         LED1_SD();
                }
}
}
void main(void)   //主函数
{
        LED1=0;
        LED2=0;
        SDKZ=0;
        P3M1 = 0x0C;   //设置P32,P33为高阻,其它为推挽输口
        P3M0 = 0x13;
        Timer0Init();
        IT0 = 0;   //设置INT0的中断类型:1为下降沿,0为上升和下降
        EA = 1;
        WDT_CONTR=0x37;       //设置看门狗分频,并启动
        while(1)
        {
                keydown();
          CDZSD();
                WDT_CONTR |=0x10;          //清零看门狗
               
        }
}
//外部中断服务程序
void exint3() interrupt 11 //INT3中断入口
{
  INT_CLKO = 0x00;  //关外中断3
}
void exint0() interrupt 0 //INT0中断入
{
        EX0=0;
}
       







相关帖子

沙发
ningling_21| | 2017-11-9 12:10 | 只看该作者
可以通过增加调试功能例如,指示灯(或其它显示设备或串口都可以)判断MCU程序的运行状态

使用特权

评论回复
板凳
coody| | 2017-11-9 20:27 | 只看该作者
中断检测是硬件自动进行的,不会出现检测不到的情况,只要你的电平满足要求。

使用特权

评论回复
地板
dukecheng| | 2018-5-17 11:05 | 只看该作者
学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

13

帖子

1

粉丝