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
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!