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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3661|回復: 2
收起左側

原創:基于89C51單片機莫爾斯電碼解碼接收程序,附完整代碼

  [復制鏈接]
ID:965487 發表于 2021-10-28 16:34 | 顯示全部樓層 |閱讀模式
  昨天我在51論壇發布了基于89C51單片機摩爾斯電碼收發系統仿真,附完整代碼和仿真,還有視頻演示,帖子:http://www.zg4o1577.cn/bbs/dpj-213679-1.html  。由于接收部分沒有完善,所以主程序沒有上傳,現給予補上。
  別看程序比較短,缺費了我好幾天時間編寫調試修改,所以請大家給予多多鼓勵,評論,以利我進一步提高。



單片機源程序如下:
  1. /*----------------------------------------------------------------
  2. * 【實驗平臺】: 89C51單片機開發板
  3. * 【外部晶振】: 11.0592mhz        
  4. * 【主控芯片】: STC89C52
  5. * 【編譯環境】: Keil μVisio4         
  6. * 【程序編寫】: wzqwxx 水上人家

  7. 名稱:摩爾斯電碼接收

  8. 內容:僅供交流學習,其他用途請注明編者,不保證功能正常
  9.           本程序僅實現了短電報自動接收功能
  10.           編制程序過程本身就很有趣和充滿挑戰,如果能制作成品,
  11.           練習發報也十分有趣,這也是對古老的電訊一種紀念,致敬
  12.           充滿智慧的先輩們。
  13.       播發摩爾斯電碼的一般要求是:以一個“點”的長度為一個時間
  14.   單位,“劃”是三個點的時間長度;點劃之間的間隔是一個點的長度;
  15.   字符之間的間隔是三個點的長度;單詞之間的間隔是七個點的長度。
  16.   這樣才能被收報人識別。

  17. ------------------------------------------------------------------*/

  18. //MRSJS.c文件

  19. #include<regx52.h>   
  20. //#include <stdio.h>
  21. #include "1602.h"
  22. #define L 33 //顯存數組元素個數

  23. sbit MRSIN = P3^3;  //摩爾斯接口
  24. sbit beep = P2^3;  //蜂鳴器接口
  25. unsigned char MRScode;//暫存接收碼值
  26. unsigned char MRStime_L = 0,MRStime_H = 0; //接收摩爾斯碼計數延時
  27. unsigned char idata i,strbuf[L];//顯示緩沖

  28. //摩爾斯碼字庫 A~Z 0~9共36個  ? , . ! @ : -   共7個,總共43個字節
  29. unsigned char code MRSZK[] = { 0x61,0X28,0X2a,0x44,0x80,0x22,
  30.         0x46,0x20,0x60,0x27,0x45,0x24,0x63,0x62,0x47,0x26,0x2d,0x42,
  31.         0x40,0x81,0x41,0x21,0x43,0x29,0x2b,0x2c,/*A~Z*/0xbf,0xaf,0xa7,0xa3,
  32.         0xa1,0xa0,0xb0,0xb8,0xbc,0xbe,/*0~9*/0xcc,0xf3,0xd5,0xeb,0xda,0xf8,0xe1};

  33. unsigned char code ASCIIZK[] = "?,.!@:-"; //符號庫,可擴展



  34. /*******************信號接收解碼*********************/

  35. void EX1MRS (void) interrupt 2 //外部中斷1服務函數
  36. {
  37.         static unsigned char  num,blag;       //num為接收摩爾斯碼點劃的個數
  38.         unsigned char  j;


  39. /*******************處理低電平*********************/
  40.         TR0 = 1;   //啟動time0計數產生中斷
  41.         if(blag == 1) //從第二個下降沿開始處理
  42.         {  
  43.                  //按點平均時長89ms,劃時長約270ms,空格約640ms計算的范圍
  44.                 if(MRStime_L > 2 && MRStime_L < 120 ) //處理點和劃
  45.                 {
  46.                         MRScode <<= 1;          //發送端從高位開始的
  47.                          if(MRStime_L > 43 )        //點時長計數上限22,劃時長計數上限68
  48.                         {
  49.                                 MRScode |= 0x01;
  50.                             Lcdwritechar(0,6+num,'_');
  51.                     }
  52.                         else
  53.                         {
  54.                                 Lcdwritechar(0,6+num,'.');
  55.                         }
  56.                         num++;
  57.                         MRStime_L=0;

  58. /*******************處理高電平*********************/
  59.                    if(MRStime_H > 43 )//處理可見字符;字元之間時長計數是68   
  60.                    {
  61.                                 if(num<5 && num >0)          //處理字母
  62.                                 {
  63.                                         num = (8-3-num) << 5;  //得到字母前三位識別碼值
  64.                                          for(j = 0; j <= 25;j++)//字母字庫地址0~25;
  65.                                         {
  66.                                                 if( MRSZK[j] == (MRScode | num) )
  67.                                                 {
  68.                                                         strbuf[i] = j+0x41;
  69.                                                         i++;
  70.                                                         //printf("%bc",j+0x41) ;//發送到串口文本模式顯示                                       
  71.                                                         break;
  72.                                                 }
  73.                                         }
  74.                                         num = 0;                                                                        
  75.                                 }                        
  76.                                    else if(num>5)   //處理符號
  77.                                 {
  78.                                         num = 0;
  79.                                          for(j = 36; j <= 42;j++)//符號字庫地址36~42;
  80.                                         {
  81.                                                 if((MRSZK[j]&0x3F) == MRScode )        //清零高兩位
  82.                                                 {
  83.                                                         strbuf[i] = ASCIIZK[j-36];
  84.                                                         i++;
  85.                                                 //        printf("%bc",ASCIIZK[j-36]) ;//發送到串口顯示                                       
  86.                                                         break;        
  87.                                                 }
  88.                                         }                        
  89.                                 }
  90.                                 else //處理數字
  91.                                 {
  92.                                         num = 0;        
  93.                                          for(j = 26; j <= 35;j++)//數字地址26~35;
  94.                                         {
  95.                                                 if((MRSZK[j]&0x1F) == MRScode )        //清零高三位
  96.                                                 {
  97.                                                         strbuf[i] = j+0x16;
  98.                                                         i++;
  99.                                                 //        printf("%bc",j+0x16) ;//發送到串口文本模式顯示                                       
  100.                                                         break;        
  101.                                                 }
  102.                                         }
  103.                                 }
  104.                                 if(MRStime_H > 110)        //處理空格;
  105.                                 {
  106.                                         strbuf[i] = ' ';
  107.                                         i++;
  108.                                 //        printf(" ") ;
  109.                                 }

  110.                                 if(MRStime_H > 190)        //結束處理;
  111.                                 {
  112.                         //                printf("\n") ;//這里有時執行不到 ?        
  113.                                         blag = 0;
  114.                                         TR0 = 0;
  115.                                 }
  116.                                 MRScode = 0;
  117.                                 write_com(0x01);// 清屏
  118.                                 Lcdwritestring(1,0,strbuf);//x行,Y列寫字符串
  119.                                 num = 0;
  120.                         }
  121.                         MRStime_H=0;
  122.                 }
  123.         }
  124.         else
  125.         {
  126.                 write_com(0x01);// 清屏
  127.                 for(i = 0; i < L ;i++){strbuf[i] = 0;};         //清空顯存
  128.                 i = 0;
  129.                 num = 0;
  130.                  blag = 1;
  131.                 MRStime_H = 0;
  132.                 MRStime_L = 0;
  133.         }        
  134. }


  135. void time0_MRS (void) interrupt 1  //STC89C52 4毫秒@11.0592MHz
  136. {
  137.         TL0 = 0x9A;                //設置定時初值        我這是按點平均時長90ms,劃時長270ms設置的
  138.         TH0 = 0xF1;                //設置定時初值        在接收人工發送的要設計智能調整適應
  139.         if(MRSIN)
  140.                 ++MRStime_H; //高電平延時計數
  141.         if(!MRSIN)
  142.                 ++MRStime_L; //低電平延時計數
  143.         if(MRStime_H > 250)        //這是為接收最后一個字符自己產生一個下降沿觸發中斷
  144.         {
  145.                 MRSIN = 1;
  146.                 MRSIN = 0;
  147.                 MRSIN = 1;                        
  148.         }
  149. }


  150. //void UART_init()
  151. //{
  152. //        TMOD |= 0x20;          //T1工作模式2  8位自動重裝
  153. //        TH1 = 0xfd;
  154. //        TL1 = 0xfd;         //比特率9600   時鐘頻率11.0592MHZ
  155. //        TR1 = 1;                //啟動T1定時器
  156. //        SM0 = 0;
  157. //        SM1 = 1;                 //串口工作方式1 10位異步
  158. //        REN = 1;                //串口允許接收
  159. //        TI = 1;
  160. //}
  161. //

  162. void Timer0Init(void)                //4毫秒@11.0592MHz
  163. {
  164.         TMOD &= 0xF0;                //設置定時器模式
  165.         TMOD |= 0x01;                //設置定時器模式
  166.         TL0 = 0x9A;                //設置定時初值
  167.         TH0 = 0xF1;                //設置定時初值
  168.         TF0 = 0;                //清除TF0標志
  169.         ET0 = 1;
  170.         TR0 = 0;                //定時器0開始設為0,由外中斷啟動計時
  171. }

  172. void EX1init(void)
  173. {
  174.         IT1 = 1;   //指定外部中斷0下降沿觸發,INT0 (P3.2)
  175.         EX1 = 1;   //使能外部中斷
  176.         PX1 = 1;
  177.         EA = 1;    //開總中斷
  178. }



  179. void main(void)
  180. {
  181.         Timer0Init();//初始化定時器
  182. //        UART_init(); //初始化串口
  183.         EX1init(); //初始化外部中斷
  184.         lcd_init();//初始化液晶屏
  185.         while(1)//主循環
  186.         {
  187.                 beep = MRSIN;  //單手鍵發送功能
  188.         }
  189. }
  190.   
  191.   

復制代碼

仿真截圖

MRScode.png

51hei.png
接收源碼:
摩斯碼電報接收.zip (38.24 KB, 下載次數: 39)

評分

參與人數 1黑幣 +60 收起 理由
admin + 60 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:965487 發表于 2021-10-29 21:47 | 顯示全部樓層
O(∩_∩)O謝謝admin加分鼓勵
回復

使用道具 舉報

無效樓層,該帖已經被刪除
無效樓層,該帖已經被刪除
ID:146324 發表于 2025-6-7 19:53 | 顯示全部樓層
樓主厲害,準備做一個玩。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲第一女人av | 男女网站免费 | 色视频在线播放 | 亚洲一区免费视频 | 欧美日韩一二三区 | 欧美日韩一 | 天天综合久久网 | 视频一区二区在线观看 | 欧美久久久久 | 成年人免费看的视频 | 国产999精品久久久 精品三级在线观看 | 亚洲精品成人 | 欧洲免费毛片 | 免费的av网站 | 亚洲福利av | 国产在线一区二区三区 | 亚洲精品一区在线 | 精品粉嫩aⅴ一区二区三区四区 | 在线观看亚洲专区 | 精久久 | 日韩a视频| 一二区视频 | 综合久久久 | 365夜爽爽欧美性午夜免费视频 | 成人三区 | 黄色成人免费在线观看 | 国产精品久久久乱弄 | 欧美亚洲日本 | 国产精品久久久久久238 | 日韩波多野结衣 | 精品久久久久久久 | 2018国产精品 | 国产日韩在线观看一区 | 福利片在线 | av网站在线播放 | 国产日韩欧美在线 | 成人国产精品久久 | 九一在线观看 | 中文字幕高清免费日韩视频在线 | 亚洲精品美女视频 | 日韩免费毛片视频 |