12 独立按键

2019-04-15 17:30发布

单片机STC89C52学习——12 独立按键

汇总:00 单片机STC89C52学习
参考教程:普中科技

1 工作原理

1.1 按键介绍

轻触开关是一种电子开关,按下则开关导通,松开则开关断开。距离长的初始导通,距离短的初始不导通,按下后相反。
例如,1接P20,2接GND,按下后拉低单片机管脚。 9565709-75024e133fba4573.png

1.2 独立按键原理

单片机管脚与GND是距离长的,初始不导通,按下导通。(图中,TXD是P30,RXD是P31) 9565709-3bc004dcd4cc4167.png 原理图 单片机管脚内部结构:单片机内部输出1,管脚输出1;单片机内部输出0,管脚输出0。P0要接外部上拉电阻因为本身为开漏电路,P1、P2、P3也接外部上拉电阻为了提高驱动能力 9565709-dea4dc9f7d169217.png 准双向IO口结构图 按键在闭合和断开时,触点会存在抖动现象:软件进行消抖处理(按下时延时10ms),或硬件设计消抖电路(利用RC充放电延时时间控制,一个按键就要加电阻、电容,数量多则成本高) 9565709-0cda64cfbff9dc41.png 抖动现象 9565709-5323d691d372edf2.png 硬件消抖电路

2 程序:独立按键——K1控制LED指示灯翻转

#include "reg52.h" typedef unsigned char u8; typedef unsigned int u16; sbit led = P2^0;// D1 sbit k1 = P3^1;// K1 void delay (u16 i) { while (i --); } void key() { if (k1 == 0)// 判断是否按下 { delay(1000);// 约10ms,简单的消抖方法 if (k1 == 0)// 再判断一次 { led = ~led; } while (!k1);// 直到松开按键才继续,不过一直要判断,很占CPU } } void main() { while (1) { key(); } } 效果:按下K1,LED1状态翻转。但若以较短时间间隔连续按下两次,有时第二下没反应。