树莓派作品2_莫尔斯电码
来源:互联网 发布:淘宝拍卖字画是真的吗 编辑:程序博客网 时间:2024/04/29 21:26
一、创意来源
莫尔斯电码历史悠久,我从小时候就听说过莫尔斯电码了伟大了,不过直至今日我都没有机会过过手瘾,亲手用莫尔斯电码来输出一些有意义的句子。
不过有了树莓派,一切都不成问题,只要两个按钮,就能帮我完成这个夙愿。
尤其是最后,我录了两段视频,一段是输出SOS的,另一段令人意想不到的输出的是……
二、实验内容
用树莓派做一个莫尔斯电码翻译机,实验只需要两个按钮,一个负责输入莫尔斯电码,一个负责确认输入完毕并输出结果。程序运行的过程,每当用户输入一串莫尔斯电码,并确认输入完毕时,会在shell输出电码,并且输出该编码对应字符。程序使用C/C++语言写。实验报告要画出电路图(Frizting),说明使用的库,附连线的照片,拍实际的视频上传到优酷并在报告中给出URL,要附源码。
三、主要仪器设备
1. RPI
2. 移动电源
3. Win7 PC机一台
4. 面包板
5. 面包线、杜邦线
6. 段数码管
7. 限流电阻
8. 两个按钮
四、操作方法和实验步骤
1.安装wiringPi库
使用git工具下载wiringPi
查询当前目录下的wiringPi,并进入该目录,使用build命令安装
验证,已安装!
2.电路设计
引脚文件
电路设计图
树莓派实物接线
3.实验代码
程序主要部分已注释
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#define BTN0 10 // 左键 主要用来输入莫尔斯码
#define BTN1 11 // 右键 主要点击初始化或输出当前莫尔斯码
int kh=0;
int main() {
int pin;
int m = 0, out=-1;
int run = 0;
unsigned int btime1, btime2;
if (wiringPiSetup () == -1) // 初始化
exit (1) ;
pinMode(BTN0, INPUT);
pinMode(BTN1, INPUT);
int len;
int a[10];
while (1) {
if (digitalRead(BTN1) && run == 0) { // 右键按一次初始化
len = 0;
run = 1;
}
else if (digitalRead(BTN0) && run == 1) // 左键
{
out = 0;
btime1 = millis();
while (digitalRead(BTN0)){ // 记录左键按的时间
btime2 = millis();
}
if (btime2 - btime1 > 350) // >350ms则算 - , 否则 .
out = 1;
else
out = 0;
a[len] = out;
len++;
}
else if (digitalRead(BTN1) && run == 1 && len >0) { // 输出结果
printf("%d : ",len);
for (m=0; m<len; m++)
if (a[m] == 0)
printf(".");
else
printf("-");
int number = 0;
int ss = 1;
int i = len-1;
printf(" the letter is: ");
int mychar;
for (; i>=0; i--){ // -为1,.为0,算二进制值
number = number + ss*a[i];
ss = ss*2;
}
if (len==1){ // 根据长度和二进制编码值,译码
switch (number){
case 0:
mychar = 'E';
break;
case 1:
mychar = 'T';
break;
default:
mychar = '!';
break;
}
}
else
if (len==2){
switch (number){
case 0:
mychar = 'I';
break;
case 1:
mychar = 'A';
break;
case 2:
mychar = 'N';
break;
case 3:
mychar = 'M';
break;
default:
mychar = '!';
break;
}
}
else
if (len==3){
switch (number){
case 0:
mychar = 'S';
break;
case 1:
mychar = 'U';
break;
case 2:
mychar = 'R';
break;
case 3:
mychar = 'W';
break;
case 4:
mychar = 'D';
break;
case 5:
mychar = 'K';
break;
case 6:
mychar = 'G';
break;
case 7:
mychar = 'O';
break;
default:
mychar = '!';
break;
}
}
else
if (len==4){
switch (number){
case 0:
mychar = 'H';
break;
case 1:
mychar = 'V';
break;
case 2:
mychar = 'F';
break;
case 4:
mychar = 'L';
break;
case 6:
mychar = 'P';
break;
case 7:
mychar = 'J';
break;
case 8:
mychar = 'B';
break;
case 9:
mychar = 'X';
break;
case 10:
mychar = 'C';
break;
case 11:
mychar = 'Y';
break;
case 12:
mychar = 'Z';
break;
case 13:
mychar = 'Q';
break;
default:
mychar = '!';
break;
}
}
else
if (len==5){
switch (number){
case 0:
mychar = '5';
break;
case 1:
mychar = '4';
break;
case 3:
mychar = '3';
break;
case 7:
mychar = '2';
break;
case 18:
mychar = '/';
break;
case 31:
mychar = '0';
break;
case 30:
mychar = '9';
break;
case 28:
mychar = '8';
break;
case 24:
mychar = '7';
break;
case 16:
mychar = '6';
break;
case 15:
mychar = '1';
break;
default:
mychar = '!';
break;
}
}
else
if (len==6){
switch (number){
case 12:
mychar = '?';
break;
case 21:
mychar = '.';
break;
case 31:
mychar = '-';
break;
case 45:
if (!kh){
kh = !kh;
mychar = '(';
break;
}
else{
kh = !kh;
mychar = ')';
break;
}
default:
mychar = '!';
break;
}
}
else
mychar = '!';
printf("%c\n",mychar);
len = 0;
run = 0;
}
delay(10);
}
return 0;
}
4. 实验结果
用scp把笔记本上的run2.c传入树莓派,ls查看如下
编译
运行
输入SOS
视频URL:http://v.youku.com/v_show/id_XNTczODI2MTU2.html
随便输入点东西,其中感叹号统一表示非莫尔斯编码
下面是亮点:
首先先看一个视频
视频URL:http://v.youku.com/v_show/id_XNTczODM3ODUy.html
清晰截图请看下页
/**********/
我挡
我挡
我挡
我挡挡
见下页
/**********/
熟悉莫尔斯编码的人可能一下就能读出我输入的含义,没错就是如下图所示:
I LOVE YOU 哈!
5. 实验心得
实验难度不高,但是胜在创意,用最简单的东西能做出有意义的产品才是最符合大众需求的,设计之初本想实现个莫尔斯电码玩玩,后来做出来后发现完全可以让树莓派说些内涵的话,倒是意料之外。
莫尔斯编码用C写的译码国产完全也是自己胡想的,就是先判断其长度然后再根据他的二进制编码值来确定最后字符,不知道是否有高人能有更高明的解码方式。
- 树莓派作品2_莫尔斯电码
- 莫尔斯电码
- 莫尔斯电码
- 莫尔斯电码的趣事
- [密码学外篇]莫尔斯电码
- 习题4-6 莫尔斯电码 UVa508
- uva508 莫尔斯电码(Morse Mismatches)
- 莫尔斯电码与信息传输
- UVa 508 Morse Mismatches(莫尔斯电码)
- 4-6 UVA 508 Morse Mismatches莫尔斯电码
- 算法竞赛入门经典(第2版)习题4-6 莫尔斯电码 Morse Mismatches UVa 508
- UVA 508 莫尔斯电码,map的妙用,函数的组合
- 莫尔斯电码表
- 莫尔斯电码表
- 莫尔斯码
- 莫尔斯密码
- 莫尔斯码
- 莫尔斯码
- HBase HMaster启动和停止
- 由K倍动态减法联想到的一类博弈问题 HDOJ 2580
- 树莓派实验七: 轮盘游戏机
- 软工实验报告
- Windows多线程程序设计之线程同步分析(结合互斥对象)(中)
- 树莓派作品2_莫尔斯电码
- 如何设置xcode中的Base SDK 和 iOS Deployment Target ?
- Asp.net总结(一)
- 代码和数据的拼接
- Android中有多种方法可以实现其他线程与Main线程通讯
- Linux命令之while - Bash中的While循环
- 树莓派_字母板的使用
- RDBMS 总结
- android 图片视图居中