用STC12C5616AD做了一个时钟,想法是让单片机定时进入掉电模式,然后利用DS3231的INT/SQW定时输出通过单片机的外总中断0(P3.2)来唤醒掉电的单片机而使时钟继续正常工作。现在的问题是:能进入掉电模式,也参通过外总中断唤醒,但只是一闪就又停了。如果把中断子程序中的“I2CWrite(DS3231_STATUS,0x00);”去掉就能够正常唤醒工作。求助:问题出在哪?如何解决?
......
while (1) //主循环
{
if(ReadTimeFlag==1) //读取时间
{
ReadTimeFlag=0;
Readtime();
}
Scan_Key();
}
}
......
/*------------------------------------------------
中断0开启 初始化
------------------------------------------------*/
void Alarm_Int0_Init() //中断0开启
{
EA = 1;
EX0 = 1;
IT0 = 0;//0电平的触发方式,1下降沿触发
}
/*------------------------------------------------
中断子程序
------------------------------------------------*/
void Alarm_Int0() interrupt 0
{
PCON = 0x00;
I2CWrite(DS3231_STATUS,0x00); //清DS3231内部闹钟标志位.状态寄存器
}
......
if(hour==23&&min==00&&sec==00) //关机
{
PCON = 0X02;
}
......
void InitDS3231() //初始化
{
SCL=1;
delayus(5);
SDA=1;
delayus(5);
I2CWrite(DS3231_AL1DAY,0x81); //A1M4置位,时分秒匹配时闹钟响应
I2CWrite(DS3231_AL2DAY,0x81); //A2M4置位,时分匹配时闹钟响应
I2CWrite(DS3231_STATUS,0x00); //32KHZ输出禁止,闹钟标志位清零
I2CWrite(DS3231_CONTROL,0x07); //中断允许,闹钟1和2打开
I2CWrite(DS3231_AL1HOUR,0x06); //开机一:时
I2CWrite(DS3231_AL1MIN,0x00); //开机一:分
I2CWrite(DS3231_Al1SEC,0x00); //开机一:秒
I2CWrite(DS3231_AL2HOUR,0x17); //开机二:时
I2CWrite(DS3231_AL2MIN,0x30); //开机二:分
}
|