- 打卡等级:以坛为家II
- 打卡总天数:592
- 最近打卡:2025-07-31 14:47:44
高级会员
- 积分
- 549
|
STC8H8K64U 开天斧实验板;
定时10秒让单片机掉电(PCON|=0X02),设置P35,P36IO中断唤醒,,首次可以正常唤醒 ,一切正常,
第二轮定时10秒掉电后,P35按键不能唤醒(设置为下降沿或上升沿皆不能唤醒),这时按下P34按钮,可以唤醒.
我想让P35按钮每次都可以唤醒 ,请问是哪里设置错了呢?为什么,P34按键连续掉电后都可以唤醒,为什么?
代码如下:
#include "stc8h.h"
#include "stc32_stc8_usb.h"
#include "delay.h"
sbit LED=P1^0;//led指示灯
unsigned int tim0ms; // 定时器计时变量
unsigned char Tim0H, Tim0M, Tim0S; // 定时器计时变量
unsigned char SleepTime;
BOOL SleepFlag; // 超过多少时间以后单片机待机标志 由按键来唤醒
void PortInt_Init(void); // IO中断初始化
void usb_uninit();//休眠时关闭USBCDC中断
void main()
{
unsigned int keyjishi;
keyjishi = 0;
tim0ms = 0;
Tim0S = 0;
Tim0M = 0;
SleepFlag = 0; // 待机标志
zhendong_flag = 0;
SleepTime = 1;//分钟
P_SW2 |= 0x80;
P0M1 = 0x00;
P0M0 = 0x00;
P1M1 = 0x00;
P1M0 = 0x00;
P2M1 = 0x00;
P2M0 = 0x00;
P3M1 = 0x00;
P3M0 = 0x00;
P4M1 = 0x00;
P4M0 = 0x00;
P5M1 = 0x00;
P5M0 = 0x00;
P6M1 = 0x00;
P6M0 = 0x00;
P7M1 = 0x00;
P7M0 = 0x00;
usb_init(); // USB CDC 接口配置
Timer0_Init(); // 开定时器
EA = 1;
while (1)
{
if (bUsbOutReady)
{
// USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
if (UsbOutBuffer[0] == 'A') //'A'
{
printf("OK." ); // 接收串口信息 应答
}
else if ((UsbOutBuffer[0] == 'I' || UsbOutBuffer[0] == 'i') && (UsbOutBuffer[1] == 'D' || UsbOutBuffer[1] == 'd')) //"ID"
{
UsbInBuffer[0] = CHIPID0;
UsbInBuffer[1] = CHIPID1;
UsbInBuffer[2] = CHIPID2;
UsbInBuffer[3] = CHIPID3;
UsbInBuffer[4] = CHIPID4;
UsbInBuffer[5] = CHIPID5;
UsbInBuffer[6] = CHIPID6;
USB_SendData(UsbInBuffer, 7); // 发送ID
}
usb_OUT_done();
}
if(SleepFlag)//掉电标志
{
SleepFlag = 0;
TR0 = 0;
usb_uninit() ; //休眠前关闭USBCDC中断
LED = 1;//关闭LED
PortInt_Init();//开按键中断
delayms(1);
PCON |= 0x02; // MCU进入掉电模式 由按键来唤醒
delayms(10);
//恢复P30P31数字输入
P3IE = 0xFF;
delayms(10);
tim0ms = 0;
Tim0S = 0;
Tim0M = 0;
usb_init(); // USB CDC 接口配置
TR0 = 1;
}
}
}
void TIM0interrupt() interrupt TMR0_VECTOR
{
tim0ms++;
if (tim0ms >= 1000) // 振动后PWM输出延时时间
{
tim0ms = 0;
zhendong_flag = 0;
LED = !LED;//DEBUG
Tim0S++;
if(Tim0S>10)
{
SleepFlag = 1;//掉电标志置位
}
if (Tim0S >= 60)
{
Tim0S = 0;
Tim0M++;
if (Tim0M >= SleepTime)
{
Tim0M = 0;
// SleepFlag = 1;
}
}
}
}
void Port3_Isr(void) interrupt 40
{
P3INTE = 0x00; // 禁止P3口中断
}
void PortInt_Init(void)
{
P3INTE = 0x60; // 使能P3口中断 P35 P36
P3IM0 = 0x60; // 设置P3口中断模式 (00:下降沿, 01:上升沿) P35 P36
P3IM1 = 0x00; // 设置P3口中断模式 (10:低电平, 11:高电平)
P3WKUE = 0x60; // 设置P3口中断唤醒省电模式 P35 P36
}
//休眠时需要关闭USB中断否则 不能进入
void usb_uninit()
{
USBCON &= 0x7F;
// USBCLK = 0x00; //不注释掉此处两行,唤醒后USBCDC重启失败,什么原因还不知道
// IRC48MCR = 0x00;
//P30 P31关闭数字输入
P3IE = 0xfc;
}
|
|