外观
五、软件开发
开发板开源工程链接:https://oshwhub.com/course-examples/dan-pian-ji-51-dan-pian-ji-he-xin-ban
1 流水灯
1.1 硬件电路
流水灯共有8个LED组成,LED2~9,由STC89C52RC单片机的P0端口所控制。STC89C52RC单片机的P0口内部无上拉电阻,所以作I/O口必须外接4.7K-10KΩ的上拉电阻,这里,接一个10KΩ排阻与单片机P0相连接。
LED灯的正极中间接入了一个1K的限流电阻防止LED灯烧坏,再与+5V相连接,负极与单片机IO引脚连接。
当将对应单片机IO引脚配置为高电平时(1),单片机引脚高电平输出(5V),此时没有电压差,没有电流流过,不能点亮LED灯。
当将对应单片机IO引脚配置为低电平时(0),单片机引脚低电平输出(0V),此时有电压差,有电流流过,能点亮LED灯。
1.2 软件代码
C
#include "led.h"
#include "delay.h"
void openAllLed(void)
{
P0 = 0X00; //0000 0000,单片机P00~P07引脚输出低电平,LED2~LED9全亮;
}
void closeAllLed(void)
{
P0 = 0xff; //1111 1111,单片机P00~P07引脚输出高电平,LED2~LED9全灭;
}
void waterFallLight(void)
{
P0 = 0xFE; //1111 1110
Delay500ms();//延时500ms
P0 = 0XFD; //1111 1101
Delay500ms();//延时500ms
P0 = 0XFB; //1111 1011
Delay500ms();
P0 = 0XF7; //1111 0111
Delay500ms();//延时500ms
P0 = 0XEF; //1110 1111
Delay500ms();//延时500ms
P0 = 0XDF; //1101 1111
Delay500ms();//延时500ms
P0 = 0XBF; //1011 1111
Delay500ms();//延时500ms
P0 = 0X7F; //0111 1111
Delay500ms();//延时500ms
}
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
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
h
#ifndef __LED_H
#define __LED_H
#include <REGX52.H>
#include <INTRINS.H>
void openAllLed(void);
void closeAllLed(void);
void waterFallLight(void);
#endif
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
c
#include "delay.h"
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
void Delay10ms() //@11.0592MHz
{
unsigned char i, j;
i = 18;
j = 235;
do
{
while (--j);
} while (--i);
}
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
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
h
#ifndef __DELAY_H
#define __DELAY_H
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms(); //@11.0592MHz
void Delay1ms(); //@11.0592MHz
void Delay10ms(); //@11.0592MHz
#endif
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
c
#include <REGX52.H>
#include <INTRINS.H>
#include "delay.h"
#include "led.h"
void main()
{
closeAllLed();
while(1)
{
waterFallLight();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
2 蜂鸣器
2.1 硬件电路
由于单片机的 IO 口驱动电流太小,不能直接驱动无源蜂鸣器,所以需要专门设计一个驱动电路,NPN三极管Q1起开关作用,在三极管基极前串联个限流电阻再与单片机P10口相连接,当P10配置为高电平输出时,三极管导通,蜂鸣器发声。
2.2 软件代码
C
#include "beep.h"
void openBeep(void)
{
P1_0 = 1;
}
void closeBeep(void)
{
P1_0 = 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
h
#ifndef __BEEP_H
#define __BEEP_H
#include <REGX52.H>
#include <INTRINS.H>
void openBeep(void);
void closeBeep(void);
#endif
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
3 数码管
3.1 硬件电路
数码管选用1位0.56寸共阳极,数码管G1,G2与+5V相连接,在数码管的段选引脚上接限流电阻再与单片机的P2口相连接。当P2口的引脚配置为低电平时,对应数码管的段位点亮,配置为低电平时,对应数码管的段位灭。
3.2 软件代码
C
#include "smg.h"
unsigned char NixieTable[] = {0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09};
void smgShow(int Number)
{
P2 = NixieTable[Number];
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
h
#ifndef __SMG_H
#define __SMG_H
#include <REGX52.H>
#include <INTRINS.H>
void smgShow(int Number);
#endif
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
4 按键
4.1 硬件电路
按键电路共有4个6*6直插封装按键所组成,3个独立功能按键KEY1~KEY3,与单片机P32,P33,P34引脚相连接;1个复位按键RST1,与单片机RST引脚相连接。
独立按键一端与单片机IO引脚相连接,另一端与GND相连接。可以先将单片机IO引脚配置为高电平,当按键按下时,单片机IO引脚与GND相连,端口电平变为低电平,从而检测按键是否被按下。
4.2 软件代码
C
#include "key.h"
#include "led.h"
#include "delay.h"
int scanfKey(void)
{
if(P3_2 == 0)
{
Delay10ms();
if(P3_2 == 0)
{
while(P3_2 == 0);
return 1;
}
}
else if(P3_3 == 0)
{
Delay10ms();
if(P3_3 == 0)
{
while(P3_3 == 0);
return 2;
}
}
else if(P3_4 == 0)
{
Delay10ms();
if(P3_4 ==0)
{
while(P3_4 == 0);
return 3;
}
}
else
{
return 0;
}
return 0;
}
void keyHandle(int keyValue)
{
static int key1Num =0;
static int key2Num =0;
static int key3Num =0;
switch(keyValue)
{
case 1:
key1Num++;
if(key1Num ==1)
{
openAllLed();
}
else
{
key1Num =0;
closeAllLed();
}
break;
case 2:
key2Num++;
if(key2Num ==1)
{
openBeep();
}
else
{
key2Num =0;
closeBeep();
}
break;
case 3:
smgShow(key3Num);
key3Num++;
if(key3Num > 9)
{
key3Num =0;
}
break;
default:
break;
}
}
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
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
h
#ifndef __KEY_H
#define __KEY_H
#include <REGX52.H>
#include <INTRINS.H>
int scanfKey(void);
void keyHandle(int keyValue);
#endif
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
h
#ifndef __LED_H
#define __LED_H
#include <REGX52.H>
#include <INTRINS.H>
void openAllLed(void);
void closeAllLed(void);
void waterFallLight(void);
#endif
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
h
#ifndef __DELAY_H
#define __DELAY_H
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms(); //@11.0592MHz
void Delay1ms(); //@11.0592MHz
void Delay10ms(); //@11.0592MHz
#endif
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
h
#ifndef __BEEP_H
#define __BEEP_H
#include <REGX52.H>
#include <INTRINS.H>
void openBeep(void);
void closeBeep(void);
#endif
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
h
#ifndef __SMG_H
#define __SMG_H
#include <REGX52.H>
#include <INTRINS.H>
void smgShow(int Number);
#endif
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
c
#include <REGX52.H>
#include <INTRINS.H>
#include "delay.h"
#include "led.h"
#include "key.h"
#include "beep.h"
#include "smg.h"
void main()
{
int keyValue=0;
closeBeep();
while(1)
{
keyValue = scanfKey();
keyHandle(keyValue);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18