久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7208|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

arduino摩爾斯電報譯碼器制作

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:277903 發(fā)表于 2018-5-19 07:34 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

工作流程

自適應(yīng)傳輸速率以及譯碼
傳輸速率:
M /--/
         MO的電碼
O /---/


↓下圖為MO的電碼片段


由圖可見字母M是由 LL HL  LS  HL 組成,而LL是所謂的數(shù)據(jù)頭(時間比較長的低電平狀態(tài))
為了識別出信號的長短,我們首先需要知道信號長短的時間,于是乎我們可以在開機(jī)時進(jìn)行一定量的數(shù)據(jù)采樣,因為每個完整的信號短都包含了長和短的情況,可以計算出長和短信號時間的平均值,根據(jù)這個平均值對長短信號分兩個數(shù)列存儲,最后用平滑算法算出大概的延遲時間,這樣就做到自動確定通訊速率!

譯碼:
由上文可知,我們獲取到了信號長短的延遲,并且能夠?qū)Ρ乳L短和電平來識別出數(shù)據(jù)
當(dāng)檢測到數(shù)據(jù)頭后假如存在上一個字符的緩存會進(jìn)行翻譯。
翻譯過程就是根據(jù)LS,HS,HL狀態(tài)分為0,1,2 然后對比碼庫

如果沒有存在緩存,那么進(jìn)行從檢測到數(shù)據(jù)頭開始把接收到的信號存儲在緩存里

電路圖



源碼:
  1. /*=========================================================
  2.                          LHW開發(fā)
  3.     oled下半部分是留空的,計劃用于顯示數(shù)據(jù)圖表,不過現(xiàn)在優(yōu)化做的不太好,如果實時刷新數(shù)據(jù)圖表會導(dǎo)致系統(tǒng)資源緊張,做不到實時采樣,導(dǎo)致無法抄收完整數(shù)據(jù),我很頭疼,現(xiàn)在通訊速率收到這個限制,搞到每個字符傳輸速度不得快于60ms
  4.   如果有好的優(yōu)化方案,歡迎聯(lián)系

  5.   重要 開機(jī)的時候信號口必須有信號然后在開機(jī),因為開機(jī)后會自動學(xué)習(xí)和分析信號并自動調(diào)整速率,否則輸出會與發(fā)送的不符
  6.   =========================================================*/
  7. #include "U8glib.h"//引用U8G頭文件
  8. U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);//設(shè)置設(shè)備名稱:I2C-SSD1306-128*64(OLED)
  9. //如果屏幕不同請自行修改 如果第一次使用u8glib并且遇到顯示不正確,請自行修改u8g配置
  10. /*=========================================================
  11.                          變量
  12.   =========================================================*/
  13. int x, y; int Buffer[128]; //
  14. int Time = 0; //計時
  15. int DPin = A0; //數(shù)據(jù)接收口
  16. byte RXB[10];  //接收緩沖區(qū)  0為中間間隔 1為短高 2為長高
  17. int SA[10]; //初始數(shù)據(jù)平均值
  18. int DA;
  19. int HH[10]; //平滑數(shù)據(jù) 最高的長度
  20. int AH, AL; //平滑后的數(shù)據(jù)
  21. byte TH, TT, TRX, MT; //位置
  22. bool ET = false; //電平是否變化
  23. byte BootOk = 0; //初始化階段  0為學(xué)習(xí)通訊速率 1為計算基準(zhǔn)值 2為完成通訊速率學(xué)習(xí) 3為檢測到數(shù)據(jù)起始符 4為工作狀態(tài)
  24. byte DFT = 35; //數(shù)據(jù)正方向容錯值
  25. bool WI = false; //工作狀態(tài)
  26. //碼庫
  27. long MH[36] = {
  28.   1020202020,
  29.   1010202020,
  30.   1010102020,
  31.   1010101020,
  32.   1010101010,
  33.   2010101010,
  34.   2020101010,
  35.   2020201010,
  36.   2020202010,
  37.   2020202020,
  38.   1020000000,
  39.   2010101000,
  40.   2010201000,
  41.   2010100000,
  42.   1000000000,
  43.   1010201000,
  44.   2020100000,
  45.   1010101000,
  46.   1010000000,
  47.   1020202000,
  48.   2010200000,
  49.   1020101000,
  50.   2020000000,
  51.   2010000000,
  52.   2020200000,
  53.   1020201000,
  54.   2020102000,
  55.   1020100000,
  56.   1010100000,
  57.   2000000000,
  58.   1010200000,
  59.   1010102000,
  60.   1020200000,
  61.   2010102000,
  62.   2010202000,
  63.   2020101000
  64. };
  65. char ME[36] = {
  66.   49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 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,
  67. };
  68. char MS[32] = {49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,}; //信息顯示區(qū)
  69. /*=========================================================
  70.                      只循環(huán)一次
  71.   =========================================================*/
  72. void setup()
  73. {
  74.   pinMode(DPin, INPUT); //初始化接收pin口
  75.   Serial.begin(115200);   //初始化串口比特率
  76.   u8g.setFont(u8g_font_04b_03r);
  77.   u8g.firstPage();
  78.   do {
  79.     u8g.setPrintPos(13, 33);
  80.     u8g.print("Automatic detection rate");
  81.   } while ( u8g.nextPage() );
  82. }

  83. /*=========================================================
  84.                      不停循環(huán)
  85.   =========================================================*/
  86. void loop()
  87. {
  88.   scanning(); //掃描

  89. }
  90. /*=========================================================
  91.                      顯示
  92.   =========================================================*/
  93. void Draw() {
  94.   u8g.firstPage();
  95.   do {
  96.     int i = 0;
  97.     for (int py = 0; py < 2; py++) {
  98.       for (int px = 0; px < 16; px++) {
  99.         u8g.setPrintPos(px * 8 + 2, py * 8 + 6);
  100.         u8g.print((char)MS[i]);
  101.         i++;
  102.       }
  103.     }
  104.   } while ( u8g.nextPage() );
  105. }
  106. /*=========================================================
  107.                      清除數(shù)據(jù)緩沖
  108.   =========================================================*/
  109. void CM() {
  110.   for (int i = 0; i < 10; i++) RXB[i] = 0;
  111. }
  112. /*=========================================================
  113.                      起始符處理
  114.   =========================================================*/
  115. void Tse() {
  116.   //檢測到數(shù)據(jù)起始符
  117.   String TXT;
  118.   for (int i = 0; i < 10; i++) {   //把接收區(qū)緩存合成字符串
  119.     TXT = TXT + RXB[i];
  120.   }
  121.   Serial.println(TXT);
  122.   for (int i = 0; i < 35; i++) {    //匹配數(shù)據(jù)庫信號
  123.     if (String(MH[i]) == TXT) {
  124.       MS[MT] = ME[i]; //把信息寫入 顯示緩沖 區(qū)
  125.       MT++;
  126.       if (MT > 31) MT = 0;   //如果顯示區(qū)溢出,覆蓋舊的信息
  127.       Draw();
  128.     }
  129.   }
  130.   CM();   //清除接收區(qū)緩存
  131.   TRX = 0;  //接收區(qū)緩存地址重置
  132. }
  133. /*=========================================================
  134.                      譯碼
  135.   =========================================================*/
  136. void translation()
  137. {
  138.   if (Time >= AH - DFT && Time <= AH + DFT && !ET) {
  139.     Tse();

  140.   } else {
  141.     if (TRX > 9) TRX = 0;  //數(shù)據(jù)接收錯誤  初始化
  142.     if (!ET) { //低電平
  143.       if (Time >= AL - DFT && Time <= AL + DFT) {
  144.         RXB[TRX] = 0;
  145.         TRX++;
  146.       }
  147.     } else {
  148.       if (Time >= AL - DFT && Time <= AL + DFT) {
  149.         RXB[TRX] = 1;
  150.         TRX++;
  151.       } else {
  152.         if (Time >= AL + DFT && Time <= AH + DFT) {
  153.           RXB[TRX] = 2;
  154.           TRX++;
  155.         }
  156.       }
  157.     }
  158.   }



  159. }
  160. /*=========================================================
  161.                      掃描
  162.   =========================================================*/
  163. void scanning() {
  164.   if (digitalRead(DPin) != ET) {  //電平發(fā)生改變
  165.     Time = 0;  //重置計時
  166.     ET = digitalRead(DPin); //重置電平狀態(tài)
  167.     while (digitalRead(DPin) == ET) { //檢測電平是否再次改變
  168.       if (Time >= 10000) {   //大于10秒接收超時
  169.         /*    Serial.print(millis());
  170.             Serial.println(" : TimeOut !");*/
  171.         goto EndRx;  //超時
  172.       }
  173.       if (RXB[TRX - 1] != 0 && Time >= AH + 30) {
  174.         //可能是通訊結(jié)尾 并且不會再有數(shù)據(jù)傳送
  175.         Tse();
  176.       }
  177.       Time++;  //增加計時
  178.       delay(1);  //延時1ms
  179.     }
  180. EndRx:
  181.     if (Time < 10000) {
  182.       //如果沒有超時
  183.       Serial.print(millis());
  184.       Serial.print(" : ");
  185.       Serial.print(ET);
  186.       Serial.print(" ");
  187.       Serial.println(Time);
  188.       //學(xué)習(xí)波形
  189.       if (BootOk == 0) {
  190.         SA[TH] = Time;
  191.         if (TH > 8) {
  192.           BootOk = 1;
  193.         } else {
  194.           TH++;
  195.         }
  196.       } else {
  197.         if (BootOk == 1) {
  198.           //計算信號基準(zhǔn)值
  199.           for (int i = 0; i < 10; i++) DA = DA + SA[i]; //相加
  200.           DA = float(DA / 10); //獲取平均值
  201.           BootOk++;
  202.         } else {
  203.           if (BootOk == 2) {
  204.             if (Time > DA) {
  205.               HH[TT] = Time; //寫入最高平滑
  206.               TT++;
  207.               if (TT > 9) {
  208.                 TT = 0;
  209.                 AH = 0;
  210.                 for (int i = 0; i < 10; i++) AH = AH + HH[i]; //相加
  211.                 AH = float(AH / 10); //獲取平均值
  212.                 AL = float(AH / 3); //獲取平均值
  213.                 BootOk++;
  214.               }
  215.             }
  216.           } else {
  217.             translation(); //譯碼
  218.           }
  219.         }
  220.       }
  221.     }
  222.   }
  223. }
復(fù)制代碼

全部資料51hei下載地址:
RX.zip (2.6 KB, 下載次數(shù): 39)


評分

參與人數(shù) 3黑幣 +120 收起 理由
YJGG + 12 很給力!
wjwjwjwjwj + 8 很給力!
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:369694 發(fā)表于 2018-11-9 16:00 | 只看該作者
謝謝樓主分享
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 午夜一区二区三区 | 亚洲精品成人网 | 日韩亚洲一区二区 | 国产精品视频一二三区 | 无码一区二区三区视频 | 国产精品久久久亚洲 | 黄视频网站免费观看 | 国内精品久久影院 | 亚洲国产精品视频 | h在线播放| 91精品国产欧美一区二区 | 国产精品视频一 | 日韩欧美手机在线 | 欧美精品在线一区二区三区 | 成人在线观看亚洲 | 精精国产xxxx视频在线播放7 | aⅴ色国产 欧美 | 国产精品美女久久久 | 日本高清视频在线播放 | 亚洲最大的黄色网址 | 午夜av电影院 | 免费v片在线观看 | 国产高清在线精品一区二区三区 | 国产精品久久久久久久久图文区 | 久久精品国产亚洲a | 国产成人一区二区三区精 | 国产一区二区成人 | 婷婷亚洲综合 | 成年人精品视频在线观看 | 观看av| 99亚洲| 国产精品国产精品国产专区不片 | japanhd成人| 日韩av一区二区在线观看 | 欧美精品日韩精品 | 91影院在线观看 | 成人福利视频网站 | www.久久 | 国产偷录视频叫床高潮对白 | 日韩免费高清视频 | 欧美成人专区 |