找回密码
 立即注册
查看: 133|回复: 9

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:385
  • 最近打卡:2025-05-01 08:05:45

25

主题

113

回帖

725

积分

高级会员

积分
725
发表于 2025-3-31 08:03:52 | 显示全部楼层 |阅读模式
没有使用过休眠唤醒功能。

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

回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 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口状态变化唤醒单片机。

示例代码

以下是一个简单的示例代码,展示如何实现按键开关机功能:
  1. c
  2. include
  3. define BUTTONPIN P32
  4. define MOSPIN P10
  5. void delayms(unsigned int ms) {
  6.     // 实现毫秒级延时
  7. }
  8. void entersleepmode() {
  9.     // 配置单片机进入休眠模式
  10.     PCON |= 0x01; // 进入休眠模式
  11. }
  12. void wakeup() {
  13.     // 配置单片机唤醒
  14.     // 例如配置外部中断
  15. }
  16. void poweron() {
  17.     MOSPIN = 1; // MOS管导通,后级供电
  18. }
  19. void poweroff() {
  20.     MOSPIN = 0; // MOS管截止,后级断电
  21.     entersleepmode();
  22. }
  23. void checkbutton() {
  24.     unsigned int presstime = 0;
  25.     while (BUTTONPIN == 0) { // 按键按下
  26.         delayms(100);
  27.         presstime += 100;
  28.         if (presstime >= 3000) { // 长按3秒
  29.             if (MOSPIN == 0) { // 当前为关机状态
  30.                 poweron();
  31.             } else { // 当前为开机状态
  32.                 poweroff();
  33.             }
  34.             break;
  35.         }
  36.     }
  37. }
  38. void main() {
  39.     // 初始化
  40.     MOSPIN = 0; // 初始状态为关机
  41.     entersleepmode();
  42.     while (1) {
  43.         if (BUTTONPIN == 0) { // 检测按键按下
  44.             checkbutton();
  45.         }
  46.     }
  47. }
复制代码

总结

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

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-3-31 08:32:30 | 显示全部楼层
按下后立即唤醒,开始计时,不足3s就继续休眠
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:385
  • 最近打卡:2025-05-01 08:05:45

25

主题

113

回帖

725

积分

高级会员

积分
725
发表于 2025-3-31 08:40:41 | 显示全部楼层
Debu*** 发表于 2025-3-31 08:32
按下后立即唤醒,开始计时,不足3s就继续休眠

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

点评

由中断源唤醒 下降沿就是由高变低时唤醒  详情 回复 发表于 2025-3-31 09:50
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-3-31 09:50:59 | 显示全部楼层
zhang*** 发表于 2025-3-31 08:40
主要不明白  执行PCON = 0X02的时候单片机休眠。在休眠前设置外中断GPIO管脚比如下降沿检测。
在休眠中。 ...

由中断源唤醒
下降沿就是由高变低时唤醒
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:46
  • 最近打卡:2025-05-02 00:10:57
已绑定手机

0

主题

6

回帖

197

积分

注册会员

积分
197
发表于 2025-3-31 09:57:18 | 显示全部楼层
伪指令,供参考

main()
{
  //选取某个支持外部中断的引脚接个按键到GND,如果该按键需要短按也有效,可能需要在按键上并接个瓷片电容(消抖)。
  
  设置按键对应引脚的IO口模式,准双向IO(或开漏输出+启用内部上拉电阻)
  设置MOS控制脚的IO模式,(根据需要)准双向IO或强推挽输出。
  
   xx外部中断设置为下降沿触发(按键引脚对应的中断)
  允许xx外部中断
  允许全局中断

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

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:182
  • 最近打卡:2025-04-30 08:33:07

0

主题

48

回帖

748

积分

高级会员

积分
748
发表于 2025-3-31 10:41:02 | 显示全部楼层
最好用mos管也控制单片机自己的供电,这样就不用休眠了,更省电,上电延时3秒,在把MOS管导通,关机时检测到按键超过3秒断开mos,单片机没电
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:385
  • 最近打卡:2025-05-01 08:05:45

25

主题

113

回帖

725

积分

高级会员

积分
725
发表于 2025-3-31 19:14:07 | 显示全部楼层
谢谢楼上几位的答复。我现在基本明白了。准备用一个实验班做几个实验然后再画图纸
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2025-3-31 23:28:05 | 显示全部楼层
我现在的休眠是到某一个状态,然后定时2秒后自动休眠
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2025-4-1 07:58:58 | 显示全部楼层
进来学习一下
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 01:58 , Processed in 0.172431 second(s), 109 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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