1.独立按键的原理

  • 一般的独立按键有四个脚,无论按键是否被按下,1和2总是相通的,3和4也是相通的。当按键按下时,1、2脚与3、4脚接通,按住不放则保持接通状态
    在这里插入图片描述
  • 按键通断过程的抖动:当按键按下时(释放时)输出的理想波形是标准的矩形波,但是,由于机械触点的弹性作用,闭合时电路不会马上稳定的接通,这中间会出现一连串的抖动,如图所示,抖动时间一般为5~10ms
    在这里插入图片描述
  • 按键的消抖:按键的抖动会造成一次按下被误认为多次按下,所以要进行消抖处理,一般分为硬件消抖和软件消抖,这里讨论软件消抖,方法是当单片机检测到按键闭合时,采用延时程序产生5~10ms的延时,等抖动消失后,再判断是否处于闭合状态,同理释放的时候,也要给延时。
  • 按键给单片机传达指令的基本原理:按键的一端接地,另一断接单片机的任意一个I/O口,当按键没被按下时,单片机的I/O口是高电平,当按键被按下时,就变成低电平,此时单片机就认为按键被按下了。
    在这里插入图片描述

2.独立按键控制蜂鸣器响

  • 蜂鸣器的特点:蜂鸣器按内部是否有震荡器可分为有源蜂鸣器和无源蜂鸣器(声音频率可控,可以控制发出音节)
  • 蜂鸣器的驱动电路:
  • 在这里插入图片描述
  • 图中是PNP型三极管Q2,当P1.5输出低电平时,三极管饱和导通,蜂鸣器鸣响,反之,输出高电平时,三极管截止,蜂鸣器不响。
  • 下面编写按键控制蜂鸣器的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<reg52.h>
#define uint unsigned int //用uint替换unsigned int
#define uchar unsigned char //用uchar替换unsigned char
sbit bell = P1^5; //用P1.5监听蜂鸣器
sbit S1 = P3^7; //用P3.7来检测按键是否被按下
void delay(uint z); //延时函数
void main()
{
uchar i;
uint k;
if(S1 == 0) //第一次检测按键被按下
{
delay(8); //延时8ms进行消抖
if(S1 == 0) //再次检测按键被按下,说明确实被按下了
{
for(i=0;i<3;i++) //for循环控制蜂鸣器响3声
{
for(k=0;k<50000;k++);//延时500ms
bell = 0; //输出低电平,使蜂鸣器鸣叫
for(k=0;k<50000;k++); //延时500ms
bell = 1; //输出高电平,使蜂鸣器停止
}
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}

3.独立按键对流水灯的控制

  • 编程思路:根据前面按键的基本原理,只需要检测到相应按键按下时,将对应得流水灯点亮(其引脚输出低电平),这样就可以通过按键控制流水灯了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include<reg52.h>
#define uint unsigned int //用uint替换unsigned int
#define uchar unsigned char //用uchar替换unsigned char
sbit bell = P1^5; //用P1.5监听蜂鸣器
sbit S1 = P3^7; //用P3.7来检测按键是否被按下
sbit S2 = P3^6;
sbit S3 = P3^5;
sbit S4 = P3^4;
sbit S5 = P3^3;
sbit S6 = P3^2;
sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;
sbit LED5 = P2^4;
sbit LED6 = P2^5;
sbit LED7 = P2^6;
sbit LED8 = P2^7;
void delay(uint z);
void main()
{
uchar i;
uint k;
if(S1 == 0) //第一次检测按键被按下
{
delay(8); //延时8ms进行消抖
if(S1 == 0) //再次检测按键被按下,说明确实被按下了
{
for(i=0;i<3;i++) //for循环控制蜂鸣器响3声
{
for(k=0;k<5000;k++);//延时500ms
bell = 0; //输出低电平,使蜂鸣器鸣叫
for(k=0;k<10000;k++); //延时500ms
bell = 1; //输出高电平,使蜂鸣器停止
}
}
}
if(S2 == 0) //第一次检测按键被按下
{
delay(8); //延时8ms进行消抖
if(S2 == 0) //再次检测按键被按下,说明确实被按下了
{
LED1 = 0; //正向流动
delay(500);
LED1 = 1;

LED2 = 0;
delay(500);
LED2 = 1;

LED3 = 0;
delay(500);
LED3 = 1;

LED4 = 0;
delay(500);
LED4 = 1;

LED5 = 0;
delay(500);
LED5 = 1;

LED6 = 0;
delay(500);
LED6 = 1;

LED7 = 0;
delay(500);
LED7 = 1;

LED8 = 0;
delay(500);
LED8 = 1;
}
}
if(S3 == 0) //第一次检测按键被按下
{
delay(8); //延时8ms进行消抖
if(S3 == 0) //再次检测按键被按下,说明确实被按下了
{
LED8 = 0; //反向流动
delay(500);
LED8 = 1;

LED7 = 0;
delay(500);
LED7 = 1;

LED6 = 0;
delay(500);
LED6 = 1;

LED5 = 0;
delay(500);
LED5 = 1;

LED4 = 0;
delay(500);
LED4 = 1;

LED3 = 0;
delay(500);
LED3 = 1;

LED2 = 0;
delay(500);
LED2 = 1;

LED1 = 0;
delay(500);
LED1 = 1;
}
}
if(S4 == 0) //第一次检测按键被按下
{
delay(8); //延时8ms进行消抖
if(S4 == 0) //再次检测按键被按下,说明确实被按下了
{
LED1 = 0; //1、3、5、7亮
LED2 = 1;
LED3 = 0;
LED4 = 1;
LED5 = 0;
LED6 = 1;
LED7 = 0;
LED8 = 1;
}
}
if(S5 == 0) //第一次检测按键被按下
{
delay(8); //延时8ms进行消抖
if(S5 == 0) //再次检测按键被按下,说明确实被按下了
{
LED1 = 1; //2、4、6、8亮
LED2 = 0;
LED3 = 1;
LED4 = 0;
LED5 = 1;
LED6 = 0;
LED7 = 1;
LED8 = 0;
}
}
if(S6 == 0) //第一次检测按键被按下
{
delay(8); //延时8ms进行消抖
if(S6 == 0) //再次检测按键被按下,说明确实被按下了
{
LED1 = 1; //全部灯灭
LED2 = 1;
LED3 = 1;
LED4 = 1;
LED5 = 1;
LED6 = 1;
LED7 = 1;
LED8 = 1;
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}