51单片机“上电/按键复位电路”的原理及其电容C的作用???

核心提示我认为说法1正确:51单片机是高电平复位,所以先看给单片机加5V电源(上电)启动时的情况:这时电容充电相当于短路,你可以认为RST上的电压就是VCC,这是单片机就是复位状态。随着时间推移电容两端电压升高,即造成RST上的电压降低,当低至阈值

我认为说法1正确:51单片机是高电平复位,所以先看给单片机加5V电源(上电)启动时的情况:这时电容充电相当于短路,你可以认为RST上的电压就是VCC,这是单片机就是复位状态。随着时间推移电容两端电压升高,即造成RST上的电压降低,当低至阈值电压时,即完成复位过程。

如果按下SW,的确就是按钮把C短路了,这时电容放电,两端电压都是VCC,即RST引脚电压为VCC,如果超过规定的复位时间,单片机就复位了。当按钮弹起后,RST引脚的电压为0,单片机处于运行状态。

51单片机复位要求是:RST上加高电平时间大于2个机器周期,你用的12MHz晶振,所以一个机器周期就是1us,要复位就加2us的高电平即可。

图中的RC常数是51K×1uF=51ms,即51毫秒,这个常数足够大了。

51单片机3键键盘电路图[只有三个按键,链接pc的]

你采用的是51 单片机吗?

51单片机的P0口需要接上拉电阻,P1P2P3单片机内部都只带上拉电阻了。

个人感觉,这个上拉电阻意义不大,

如果为了增加按键的可靠性,建议在开关时并联瓷片电容,防止按键抖动

关于单片机中的一键开关机电路

同学你好,我来帮你,你可以使用串口啊,比如:1:给你一个从PC发给单片机数据后,单片机再原样发给PC的参考代码:2:将51某一个(引脚)按键0,1状态,发给PC;

1::::::::::::::

#include <REG52H>

bit Flag;

unsigned int R_D,S_D;

unsigned char i;

void usart_init(void); ///串口初始化

void main (void) {

usart_init(void); ///串口初始化

while(1)

{

if (Flag==1)

{

SBUF = S_D; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)

while(!TI);// 等特数据传送(TI发送中断标志)

TI = 0;// 清除数据传送标志

Flag=0;

}

}

}

}

void ser_int (void) interrupt 4 using 1

{

if(RI == 1) //RI接受中断标志

{

RI = 0; //清除RI接受中断标志

R_D = SBUF; //SUBF接受/发送缓冲器

S_D=R_D;///////返回PC发送

Flag=1;

}

}

void usart_init(void)///串口初始化

{

SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1

TMOD|= 0x20; //定时器工作方式2

PCON|= 0x80;

TH1 = 0xF3;// //baud2 / 波特率4800、数据位8、停止位1。效验位无 (12M)

TL1 = 0xF3;

TR1 = 1;

ES = 1; //开串口中断

EA = 1; // 开总中断

}

2:::::::::::::

#include <REG52H>

sbit p34=P3^4;////////定义一个按键

bit Flag=1;

unsigned int S_D;

unsigned char i;

void usart_init(void); ///串口初始化

void delay (unsigned int Z) ; //延时程序 Z倍 MS

void key_p34(void) ; /////按键检

void main (void) {

usart_init(void); ///串口初始化

key_p34(void) ; ////上电后检测一次按键的状态

if (Flag==1)//上电后发送一次按键的状态

{

SBUF =1; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)

while(!TI);// 等特数据传送(TI发送中断标志)

TI = 0;// 清除数据传送标志

}

else

{

SBUF =0; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)

while(!TI);// 等特数据传送(TI发送中断标志)

TI = 0;// 清除数据传送标志

}

while(1)

{

key_p34(void) ;

if (Flag==1)

{

SBUF =1; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)

while(!TI);// 等特数据传送(TI发送中断标志)

TI = 0;// 清除数据传送标志

}

else

{

SBUF =0; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)

while(!TI);// 等特数据传送(TI发送中断标志)

TI = 0;// 清除数据传送标志

}

}

}

void usart_init(void)///串口初始化

{

SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1

TMOD|= 0x20; //定时器工作方式2

PCON|= 0x80;

TH1 = 0xF3;// //baud2 / 波特率4800、数据位8、停止位1。效验位无 (12M)

TL1 = 0xF3;

TR1 = 1;

ES = 1; //开串口中断

EA = 1; // 开总中断

}

void delay (unsigned int Z)//延时程序 Z倍 MS

{

unsigned int x,y;

for(x=Z;x>0;x--)

for(y=110;y>0;y--) ;

}

void key_p34(void) /////按键检测

{

if(p34==0)

{ delay(10);

if(p34==0)

{

while(!p34) ;/////等待按键松手

Flag=0;

}

}

}

对计算器、电子秤来说,不确定是题主所述的前者方案,还是后者方案。

不过对于前者的方案,也就是一键开关机电路,整个原理图是这样的:

一键开关机电路

在关机状态,按键SW1被按下,MOS管Q1会打开,VCC就有电了,并供给MCU,MCU一上电就通过GPIO-Out输出高电平,打开三极管Q2,进一步维持MOS管Q1的打开。

具体分析过程参考自“电路啊”的《软件配合实现的“一键开关机电路”》

 
友情链接
鄂ICP备19019357号-22