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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7171|回復: 1
打印 上一主題 下一主題
收起左側

arduino摩爾斯電報譯碼器制作

[復制鏈接]
跳轉到指定樓層
樓主

工作流程

自適應傳輸速率以及譯碼
傳輸速率:
M /--/
         MO的電碼
O /---/


↓下圖為MO的電碼片段


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

譯碼:
由上文可知,我們獲取到了信號長短的延遲,并且能夠對比長短和電平來識別出數據
當檢測到數據頭后假如存在上一個字符的緩存會進行翻譯。
翻譯過程就是根據LS,HS,HL狀態分為0,1,2 然后對比碼庫

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

電路圖



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

  5.   重要 開機的時候信號口必須有信號然后在開機,因為開機后會自動學習和分析信號并自動調整速率,否則輸出會與發送的不符
  6.   =========================================================*/
  7. #include "U8glib.h"//引用U8G頭文件
  8. U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);//設置設備名稱: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; //數據接收口
  16. byte RXB[10];  //接收緩沖區  0為中間間隔 1為短高 2為長高
  17. int SA[10]; //初始數據平均值
  18. int DA;
  19. int HH[10]; //平滑數據 最高的長度
  20. int AH, AL; //平滑后的數據
  21. byte TH, TT, TRX, MT; //位置
  22. bool ET = false; //電平是否變化
  23. byte BootOk = 0; //初始化階段  0為學習通訊速率 1為計算基準值 2為完成通訊速率學習 3為檢測到數據起始符 4為工作狀態
  24. byte DFT = 35; //數據正方向容錯值
  25. bool WI = false; //工作狀態
  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,}; //信息顯示區
  69. /*=========================================================
  70.                      只循環一次
  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.                      不停循環
  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.                      清除數據緩沖
  108.   =========================================================*/
  109. void CM() {
  110.   for (int i = 0; i < 10; i++) RXB[i] = 0;
  111. }
  112. /*=========================================================
  113.                      起始符處理
  114.   =========================================================*/
  115. void Tse() {
  116.   //檢測到數據起始符
  117.   String TXT;
  118.   for (int i = 0; i < 10; i++) {   //把接收區緩存合成字符串
  119.     TXT = TXT + RXB[i];
  120.   }
  121.   Serial.println(TXT);
  122.   for (int i = 0; i < 35; i++) {    //匹配數據庫信號
  123.     if (String(MH[i]) == TXT) {
  124.       MS[MT] = ME[i]; //把信息寫入 顯示緩沖 區
  125.       MT++;
  126.       if (MT > 31) MT = 0;   //如果顯示區溢出,覆蓋舊的信息
  127.       Draw();
  128.     }
  129.   }
  130.   CM();   //清除接收區緩存
  131.   TRX = 0;  //接收區緩存地址重置
  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;  //數據接收錯誤  初始化
  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) {  //電平發生改變
  165.     Time = 0;  //重置計時
  166.     ET = digitalRead(DPin); //重置電平狀態
  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.         //可能是通訊結尾 并且不會再有數據傳送
  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.       //學習波形
  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.           //計算信號基準值
  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. }
復制代碼

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


評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色综合欧美 | 成人精品视频 | 国产高清在线精品 | 一区二区三区四区在线播放 | 欧美一区二区三区在线观看 | 欧美在线一区二区三区四区 | 久久综合影院 | 国产亚洲一区二区三区 | 日韩在线观看视频一区 | 免费激情 | 日韩网站免费观看 | 亚洲欧美一区二区三区国产精品 | 欧美精品乱码久久久久久按摩 | 91资源在线 | 亚洲精品乱码久久久久久久久 | 国产女人第一次做爰毛片 | 国产一区二区三区四区区 | 成人在线亚洲 | 色综合一区二区 | 91福利网址 | 久久男人 | 91精品国产综合久久久亚洲 | 久久久久网站 | 国产一区二区观看 | 日韩电影在线一区 | 欧洲一区二区三区 | 成人黄色在线视频 | 久久精品毛片 | 夜夜草天天草 | 久久久久久久久一区 | 国内精品一区二区三区 | 久久一| 手机av网 | 国产一区二区电影网 | 91网在线观看 | 日韩图区 | 中文字幕av在线 | 国产综合精品一区二区三区 | 欧美视频在线观看 | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 亚洲成人一区二区三区 |