Arduino与Proteus仿真实例-摩斯码(声音和LED闪烁)仿真

摩斯码(声音和LED闪烁)仿真

本文将介绍如何通过LED闪烁和声音形式发送摩斯码。本文将分为两部分演示:

  • 将文本输入解析为摩斯码,并以LED闪烁形式呈现
  • 使用一段文本,比如SOS,通过LED闪烁和蜂鸣器来呈现

1、摩斯码介绍

摩尔斯电码是一种用于电信的方法,将文本字符编码为两种不同信号持续时间的标准化序列,称为点和破折号,或滴和哒。摩尔斯电码是以电报的发明者之一塞缪尔·莫尔斯的名字命名的。

国际摩尔斯电码对 26 个基本拉丁字母 a 到 z、一个带重音的拉丁字母 (é)、阿拉伯数字和一小组标点符号和程序信号(prosigns)进行编码。 不区分大小写字母。 每个摩尔斯电码符号都由一系列“滴”和“哒”组成。 嘀嗒持续时间是摩尔斯电码传输中的基本时间测量单位。 哒的持续时间是滴的持续时间的三倍。 编码字符中的每个“嘀”或“哒”后跟一段信号缺失期,称为空格,等于“嘀”的持续时间。 单词的字母由等于三个点的持续时间间隔分隔,单词由等于七个点的间隔分隔。

摩尔斯电码可以以人类感官可感知的形式记忆和发送,例如通过声波或可见光,以便受过该技能培训的人员可以直接解释。摩尔斯电码通常通过电流、无线电波、可见光或声波等信息载体的开关键控传输。 电流或波在滴或哒的时间段内存在,而在滴和哒之间的时间段内不存在。

由于许多自然语言使用超过 26 个拉丁字母表的字母,摩尔斯字母表已经为这些语言开发,主要是通过现有代码的音译。

为了提高编码效率,最初设计摩尔斯电码时,每个符号的长度与它所代表的字符在英语文本中出现的频率大致成反比。 因此,英语中最常见的字母,即字母 e,具有最短的代码——一个单一的“嘀”。 因为摩尔斯电码元素是按比例而不是特定的持续时间指定的,所以代码通常以接收器能够解码的最高速率传输。 摩尔斯电码传输速率(速度)以每分钟组为单位指定,通常称为每分钟字数。

摩斯码码表如下:

在这里插入图片描述

2、将文本输入与解析为摩斯码

2.1 仿真电路原理图

在这里插入图片描述

在仿真电路原理图中,LED连接到IO2,虚拟串口仿真器接收文本输入。

2.2 仿真代码实现

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
166
167
168
// LED引脚
#define PIN\_LED 2

// 摩斯码延时
#define MORSE\_DELAY 200
// 点延时
#define MORSE\_DELAY\_DOT (MORSE\_DELAY \* 1)
// 破折号延时
#define MORSE\_DELAY\_DASH (MORSE\_DELAY \* 3)
// 空格延时
#define MORSE\_DELAY\_SPACE (MORSE\_DELAY \* 7)

// 摩斯码字符
#define MORSE\_DOT '.'
#define MORSE\_DASH '-'



/\*\*
\* 所有摩斯码字母码表
\* @var \*char[]
\*/
char\* MORSE_LETTERS[] = {
".-", // A
"-...", // B
"-.-.", // C
"-..", // D
".", // E
"..-.", // F
"--.", // G
"....", // H
"..", // I
".---", // J
"-.-", // K
".-..", // L
"--", // M
"-.", // N
"---", // O
".--.", // P
"--.-", // Q
".-.", // R
"...", // S
"-", // T
"..-", // U
"...-", // V
".--", // W
"-..-", // X
"-.--", // Y
"--.." // Z
};



/\*\*
\* 所有摩斯码数字码表
\* @var \*char[]
\*/
char\* MORSE_NUMBERS[] = {
"-----", // 0
".----", // 1
"..---", // 2
"...--", // 3
"....-", // 4
".....", // 5
"-....", // 6
"--...", // 7
"---..", // 8
"----." // 9
};

void setup() {
// 初始化LED
pinMode(PIN_LED, OUTPUT);
// 初始化串口
Serial.begin(9600);
}


void loop() {

// 当前输入字符
char current;


// 等待输入
if (Serial.available()) {

// 读取单个字符
current = Serial.read();


// 小写字符
if (current >= 'a' && current <= 'z') {
// 闪烁
flashSequence(MORSE_LETTERS[current - 'a']);
}

// 大写字符
else if (current >= 'A' && current <= 'Z') {
flashSequence(MORSE_LETTERS[current - 'A']);
}

// 数字
else if (current >= '0' && current <= '9') {
flashSequence(MORSE_NUMBERS[current - '0']);
}

// 空格 (3500 ms)
else if (current == ' ') {
delay(MORSE_DELAY_SPACE);
}


// 输入完成
if (current == '\0') {
Serial.println("");
} else {
Serial.print(current);
}
}
}



/\*\*
\* 闪烁字符串
\* @param char\* sequence
\* @returns void
\*/
void flashSequence (char\* sequence) {

int i = 0;

while (sequence[i] != '\0') {
flashDotOrDash(sequence[i]);
i++;
}

// 延时
delay(MORSE_DELAY \* 3);
}

/\*\*
\* 闪烁单个字符
\* @param char
\* @returns void
\*/
void flashDotOrDash (char unit) {

// 点亮LED
digitalWrite(PIN_LED, HIGH);

// 点 (500 ms)
if (unit == MORSE_DOT) {
delay(MORSE_DELAY_DOT);
}

// 破折号(1500 ms)
if (unit == MORSE_DASH) {
delay(MORSE_DELAY_DASH);
}

// 点和破折号之间延时
digitalWrite(PIN_LED, LOW);
delay(MORSE_DELAY);
}


在示例代码中,将单个输入字符转换为LED闪烁频率:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void flashDotOrDash (char unit) {

// 点亮LED
digitalWrite(PIN_LED, HIGH);

// 点 (500 ms)
if (unit == MORSE_DOT) {
delay(MORSE_DELAY_DOT);
}

// 破折号(1500 ms)
if (unit == MORSE_DASH) {
delay(MORSE_DELAY_DASH);
}

// 点和破折号之间延时
digitalWrite(PIN_LED, LOW);
delay(MORSE_DELAY);
}

2.3 仿真结果

在这里插入图片描述

3、通过LED闪烁和声音呈现

3.1 仿真电路图如下

在这里插入图片描述

3.2 仿真代码实现

下面将演示显示SOS字符的摩斯码的LED闪烁和声音输出

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
int led = 3; // LED引脚
int buzzer = 12; //蜂鸣器引脚

int unit = 200; // 摩斯码延时
int tonefreq = 262; // 蜂鸣器声音频率,相当于中央C音符频率

void setup() {
// 初始化LED和蜂鸣器
pinMode(led, OUTPUT);
pinMode(buzzer, OUTPUT);
}

void loop() {

// S字符的摩斯码
//dot
digitalWrite(led, HIGH);
tone(buzzer, tonefreq);
delay(unit);
digitalWrite(led, LOW);
noTone(buzzer);
delay(unit);
//dot
digitalWrite(led, HIGH);
tone(buzzer, tonefreq);
delay(unit);
digitalWrite(led, LOW);
noTone(buzzer);
delay(unit);
//dot
digitalWrite(led, HIGH);
tone(buzzer, tonefreq);
delay(unit);
digitalWrite(led, LOW);
noTone(buzzer);
delay(unit\*3);
//O字符的摩斯码
//dash
digitalWrite(led, HIGH);
tone(buzzer, tonefreq);
delay(unit\*3);
digitalWrite(led, LOW);
noTone(buzzer);
delay(unit);
//dash
digitalWrite(led, HIGH);
tone(buzzer, tonefreq);
delay(unit\*3);
digitalWrite(led, LOW);
noTone(buzzer);
delay(unit);
//dash
digitalWrite(led, HIGH);
tone(buzzer, tonefreq);
delay(unit\*3);
digitalWrite(led, LOW);
noTone(buzzer);
delay(unit\*3);
//S字符的摩斯码
//dot
digitalWrite(led, HIGH);
tone(buzzer, tonefreq);
delay(unit);
digitalWrite(led, LOW);
noTone(buzzer);
delay(unit);
//dot
digitalWrite(led, HIGH);
tone(buzzer, tonefreq);
delay(unit);
digitalWrite(led, LOW);
noTone(buzzer);
delay(unit);
//dot
digitalWrite(led, HIGH);
tone(buzzer, tonefreq);
delay(unit);
digitalWrite(led, LOW);
noTone(buzzer);
delay(unit\*7);

}

3.3 仿真结果

在这里插入图片描述

参考

文章来源: https://iotsmart.blog.csdn.net/article/details/128520108