按键介绍
实物图 VS 原理图:
独立按键
独立按键原理
四个按键的一端全部供地。默认状态下(按键未按下时),按键的各个管脚并非完全导通(参见按键原理图);按下按键后,相应的单片机端口都会被拉低(因为P3口是准双向IO口)。
如下图,为准双向IO结构图:
由上图可得,NPN三极管发射极接地,基极连着非门,集电极连接着一个上拉电阻R,这便是其内部结构图。
而单片机IO口则是从集电极引出:当按键按下,低电平就会通过IO口,通过内部输入,进入单片机使其拉低;默认情况下(即按键未被按下,IO口默认为高电平),通过外部的4.7K的上拉电阻,输出高电平,即使没有该外部的上拉电阻,也仍为高电平,因为其内部有上拉电阻接在VCC上。
注:P1、P2、P3口都是准双向IO口,即内部都具有上拉电阻,而P0口是漏极开路,内部无上拉,直接通过集电极接到单片机IO口。因此P0口全部都要加上拉,而P1、P2、P3口加上拉是为了提高单片机IO口的驱动能力。
分析一下如何输出高低电平:
1.针对P1、P2、P3口,即内部有上拉。
假设内部输出为1,通过非门后变为0,此时三极管不会导通(发射极接地也为低电平,无电压差),由于内部有上拉,则电源从VCC出来,到IO口会输出高电平。即内部输出为高电平,IO口输出也为高电平。
假设内部输出为0,通过非门后则为1,此时三极管导通(发射极与集电极连通),由于发射极接地,故输出为低电平。即内部输出为低电平,这=则IO口输出也为低电平。
2.针对P0口,即内部无上拉。
假设内部输出为1,通过非门后变为0,同理三极管不会导通,由于内部无上拉,则IO口无法输出,若要让其输出,则需要在外部加上一个上拉电阻,此时才会输出一个高电平。内部输出为0则同理。
下面来说一说关于按键抖动现象。
按键在闭合和断开时,触电会存在抖动现象——一般可通过软件消抖的方法解决即延时后再次判断按键是否按下。(也可通过硬件电路消抖)
源程序–独立按键
按下按键K1,点亮led1,再次按下,led1被熄灭。
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit L1=P2^0;
sbit K1=P3^1;
void delay(u16 i)
{
while(i--);
}
void keypros