应用场景
在我们实际的项目中,我们做的设备或者自己的DIY一个东西的时候,经常要实现的一个功能是:通过一个按键实现短按开机,长按关机。下面我就给大家简单介绍一下其中一种的实现方法,包含电路和代码的实现
电路功能及其说明
首先是电路图:
先给大家介绍一下上面几个网络标号的意义:文章来源:https://www.toymoban.com/news/detail-525806.html
Power_In:电源的输入正极,电路主要是通过开关电源的正极实现开关机的
MCU_Power:接在MOS管的漏极,可以是MCU的供电段,也可以是接在 DCDC的输入端,这个主要是看Power_In的代表的是哪里的供电端。
GPIO_Ctl:单片机的一个IO口,主要控制QV1这个三极管的开关从而控制电源的PMOS的开关
GPIO_Det:单片机的一个IO口,主要是用来检测的按键是否按下
电路实现原理:文章来源地址https://www.toymoban.com/news/detail-525806.html
- 首先我们的电源输入正极Power_In通过MOS管来流向MCU_Power,这里的MCU_Power可以直接是我们的单片机的VCC,也可以是一个DCDC芯片,然后转出的电源再来给单片机供电,具体情况具体对待。
-
短按开机:
当我们按下按键K1的时候,MOS管的栅极和源极有了压差(通过电阻比可调节压差在mos管的承受范围),MOS管导通。从而MCU供电开始运行,MCU控制GPIO_Ctl脚输入高电平将三极管QV1导通,此时即便松开按键,MOS管也扔可导通,从而实现短按开机的效果。 -
长按关机:
当我们MCU已经正常供电开始运行后,我们想要实现长按关机,就要用到GPIO_Det引脚,GPIO_Det脚由于有上拉电阻,默认运行状态都是高电平,当我们按键按下的时候GPIO_Det由高电平变成低电平,然后我们便可以通过单片机检测到按键时间长短,达到我们关机的阈值便可关闭GPIO_Ctl,这样再松开按键的时候便可以让整个系统断电关机。
代码及其说明
首先是单片机IO口的初始化,我这里检测脚是PC1 控制脚是PC2:
void initPowerKey() {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// POWER_KEY input mode
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
然后是主函数的实现,这里我就简单写一下供大家参考:
int main()
{
unsigned char TimeCount=0;
initPowerKey();//初始化IO口
GPIO_SetBits(GPIOC, GPIO_Pin_2)://打开控制电源开关
while(1)
{
if(time200ms)//time200ms是我一个定时器中断 200ms触发一次
{
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1) == RESET)//按键按下
{
TimeCount++;
if(TimeCount>=15)//15*200ms=3S 长按3秒关机
{
GPIO_ResetBits(GPIOC, GPIO_Pin_2)://关闭控制电源开关
}
}
else
{
TimeCount=0;
}
}
}
}
如果对大家有帮助的话,欢迎帮忙点个赞,如果想一起学习进步,也可以直接找我哦~!
到了这里,关于短按开机/长按关机的电路和代码实现思路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!