zhang32568 发表于 2025-3-31 08:03:52

请教大家一个问题。按键开关机。

没有使用过休眠唤醒功能。

单片机STC32G128
现在做一个电路。电源控制用的是普通开关。但是由于电路板高度限制。合适的开关不容易找到。准备使用MOS管。
GPIO口外接一个按键。(带外部不中断的GPIO)
想法是长按这个按键3秒 开机。MOS管导通。后级供电开始工作。
长按3秒 关机。MOS管截止,单片机休眠。
看了几个例子没有整明白。
比方说我长按按键进入休眠了然后长按按键3秒如何唤醒?

国芯人工智能 发表于 2025-3-31 08:08:00

在STC32G单片机上实现按键开关机功能,确实是一个常见的需求。针对您的问题,我将从硬件设计和软件实现两个方面进行详细说明。

硬件设计

1. MOS管选择与连接:
   选择适合的N-MOS管(如IRF540N)作为电源控制开关。MOS管的栅极(Gate)连接到单片机的GPIO口,源极(Source)接地,漏极(Drain)连接到电源输入端。通过控制GPIO口的高低电平来控制MOS管的导通与截止,从而实现电源的开关。

2. 按键电路设计:
   按键的一端接地,另一端连接到单片机的GPIO口,并通过上拉电阻(如10kΩ)连接到VCC。这样,按键未按下时,GPIO口为高电平;按键按下时,GPIO口为低电平。

软件实现

1. 开机逻辑:
   单片机在初始状态下处于休眠模式,MOS管截止,后级电路无电。当检测到按键长按3秒时,单片机从休眠模式唤醒,并控制MOS管导通,后级电路开始供电。

2. 关机逻辑:
   当系统处于工作状态时,再次检测到按键长按3秒,单片机控制MOS管截止,后级电路断电,并进入休眠模式。

3. 按键检测与计时:
   使用定时器中断或软件延时来检测按键的按下时间。具体步骤如下:
检测按键是否按下(GPIO口为低电平)。
开始计时,持续检测按键状态。
如果按键持续按下3秒,执行相应的开关机操作。
如果按键在3秒内释放,则取消操作。

4. 休眠与唤醒:
   STC32G单片机支持多种低功耗模式,包括休眠模式。在休眠模式下,大部分外设和时钟停止工作,但可以通过外部中断或特定GPIO口唤醒。具体步骤如下:
在关机时,配置单片机进入休眠模式。
在开机时,通过按键触发外部中断或GPIO口状态变化唤醒单片机。

示例代码

以下是一个简单的示例代码,展示如何实现按键开关机功能:

c
include

define BUTTONPIN P32
define MOSPIN P10

void delayms(unsigned int ms) {
    // 实现毫秒级延时
}

void entersleepmode() {
    // 配置单片机进入休眠模式
    PCON |= 0x01; // 进入休眠模式
}

void wakeup() {
    // 配置单片机唤醒
    // 例如配置外部中断
}

void poweron() {
    MOSPIN = 1; // MOS管导通,后级供电
}

void poweroff() {
    MOSPIN = 0; // MOS管截止,后级断电
    entersleepmode();
}

void checkbutton() {
    unsigned int presstime = 0;
    while (BUTTONPIN == 0) { // 按键按下
      delayms(100);
      presstime += 100;
      if (presstime >= 3000) { // 长按3秒
            if (MOSPIN == 0) { // 当前为关机状态
                poweron();
            } else { // 当前为开机状态
                poweroff();
            }
            break;
      }
    }
}

void main() {
    // 初始化
    MOSPIN = 0; // 初始状态为关机
    entersleepmode();

    while (1) {
      if (BUTTONPIN == 0) { // 检测按键按下
            checkbutton();
      }
    }
}

总结

通过合理的硬件设计和软件实现,可以在STC32G单片机上实现按键开关机功能。关键在于按键的检测与计时,以及休眠与唤醒的控制。希望以上内容能帮助您顺利完成电路设计。如有进一步问题,欢迎继续讨论。

[本文内容由国芯人工智能辅助生成,仅供参考]

DebugLab 发表于 2025-3-31 08:32:30

按下后立即唤醒,开始计时,不足3s就继续休眠

zhang32568 发表于 2025-3-31 08:40:41

DebugLab 发表于 2025-3-31 08:32
按下后立即唤醒,开始计时,不足3s就继续休眠

主要不明白执行PCON = 0X02的时候单片机休眠。在休眠前设置外中断GPIO管脚比如下降沿检测。
在休眠中。当这个GPIO管脚低电平的时候单片机就自动唤醒了吗?还是当检测到GPIO低电平执行那个指令再唤醒?
我理解你的意思就是当检测外部低电平的时候单片机唤醒。(不用执行单独的唤醒指令)这个时候启动定时器 计时。当超过3秒后 MOS管导通。每超过3秒 继续休眠

DebugLab 发表于 2025-3-31 09:50:59

zhang32568 发表于 2025-3-31 08:40
主要不明白执行PCON = 0X02的时候单片机休眠。在休眠前设置外中断GPIO管脚比如下降沿检测。
在休眠中。 ...

由中断源唤醒
下降沿就是由高变低时唤醒

xiaocake 发表于 2025-3-31 09:57:18

伪指令,供参考

main()
{
//选取某个支持外部中断的引脚接个按键到GND,如果该按键需要短按也有效,可能需要在按键上并接个瓷片电容(消抖)。

设置按键对应引脚的IO口模式,准双向IO(或开漏输出+启用内部上拉电阻)
设置MOS控制脚的IO模式,(根据需要)准双向IO或强推挽输出。

   xx外部中断设置为下降沿触发(按键引脚对应的中断)
允许xx外部中断
允许全局中断

while(1)
{
   进入休眠/掉电模式    //这句执行完成后,本句后面的代码就暂停执行了,等唤醒后自动继续。
   延时3秒
    if(按键按下)
    {
      翻转MOS输出脚    //在休眠或掉电模式,IO口的状态会保持不变。
    }
}
}

xx外部中断服务函数()
{
   //里面可以不写任何代码,但是这个函数必须存在。
   //如果是简单的几句指令,可以在中断服务函数里面直接写。
   //如果是比较耗时的动作,比如较长的延时,就不要写在中断服务函数里面。
}

daybeen 发表于 2025-3-31 10:41:02

最好用mos管也控制单片机自己的供电,这样就不用休眠了,更省电,上电延时3秒,在把MOS管导通,关机时检测到按键超过3秒断开mos,单片机没电

zhang32568 发表于 2025-3-31 19:14:07

谢谢楼上几位的答复。我现在基本明白了。准备用一个实验班做几个实验然后再画图纸

vb2002 发表于 2025-3-31 23:28:05

我现在的休眠是到某一个状态,然后定时2秒后自动休眠

xxkj2010 发表于 2025-4-1 07:58:58

进来学习一下
页: [1]
查看完整版本: 请教大家一个问题。按键开关机。