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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

原創(chuàng):基于89C51單片機(jī)莫爾斯電碼解碼接收程序,附完整代碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:965487 發(fā)表于 2021-10-28 16:34 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  昨天我在51論壇發(fā)布了基于89C51單片機(jī)摩爾斯電碼收發(fā)系統(tǒng)仿真,附完整代碼和仿真,還有視頻演示,帖子:http://www.zg4o1577.cn/bbs/dpj-213679-1.html  。由于接收部分沒(méi)有完善,所以主程序沒(méi)有上傳,現(xiàn)給予補(bǔ)上。
  別看程序比較短,缺費(fèi)了我好幾天時(shí)間編寫(xiě)調(diào)試修改,所以請(qǐng)大家給予多多鼓勵(lì),評(píng)論,以利我進(jìn)一步提高。



單片機(jī)源程序如下:
  1. /*----------------------------------------------------------------
  2. * 【實(shí)驗(yàn)平臺(tái)】: 89C51單片機(jī)開(kāi)發(fā)板
  3. * 【外部晶振】: 11.0592mhz        
  4. * 【主控芯片】: STC89C52
  5. * 【編譯環(huán)境】: Keil μVisio4         
  6. * 【程序編寫(xiě)】: wzqwxx 水上人家

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

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

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

  18. //MRSJS.c文件

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

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

  28. //摩爾斯碼字庫(kù) A~Z 0~9共36個(gè)  ? , . ! @ : -   共7個(gè),總共43個(gè)字節(jié)
  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[] = "?,.!@:-"; //符號(hào)庫(kù),可擴(kuò)展



  34. /*******************信號(hào)接收解碼*********************/

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


  39. /*******************處理低電平*********************/
  40.         TR0 = 1;   //啟動(dòng)time0計(jì)數(shù)產(chǎn)生中斷
  41.         if(blag == 1) //從第二個(gè)下降沿開(kāi)始處理
  42.         {  
  43.                  //按點(diǎn)平均時(shí)長(zhǎng)89ms,劃時(shí)長(zhǎng)約270ms,空格約640ms計(jì)算的范圍
  44.                 if(MRStime_L > 2 && MRStime_L < 120 ) //處理點(diǎn)和劃
  45.                 {
  46.                         MRScode <<= 1;          //發(fā)送端從高位開(kāi)始的
  47.                          if(MRStime_L > 43 )        //點(diǎn)時(shí)長(zhǎng)計(jì)數(shù)上限22,劃時(shí)長(zhǎng)計(jì)數(shù)上限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 )//處理可見(jiàn)字符;字元之間時(shí)長(zhǎng)計(jì)數(shù)是68   
  60.                    {
  61.                                 if(num<5 && num >0)          //處理字母
  62.                                 {
  63.                                         num = (8-3-num) << 5;  //得到字母前三位識(shí)別碼值
  64.                                          for(j = 0; j <= 25;j++)//字母字庫(kù)地址0~25;
  65.                                         {
  66.                                                 if( MRSZK[j] == (MRScode | num) )
  67.                                                 {
  68.                                                         strbuf[i] = j+0x41;
  69.                                                         i++;
  70.                                                         //printf("%bc",j+0x41) ;//發(fā)送到串口文本模式顯示                                       
  71.                                                         break;
  72.                                                 }
  73.                                         }
  74.                                         num = 0;                                                                        
  75.                                 }                        
  76.                                    else if(num>5)   //處理符號(hào)
  77.                                 {
  78.                                         num = 0;
  79.                                          for(j = 36; j <= 42;j++)//符號(hào)字庫(kù)地址36~42;
  80.                                         {
  81.                                                 if((MRSZK[j]&0x3F) == MRScode )        //清零高兩位
  82.                                                 {
  83.                                                         strbuf[i] = ASCIIZK[j-36];
  84.                                                         i++;
  85.                                                 //        printf("%bc",ASCIIZK[j-36]) ;//發(fā)送到串口顯示                                       
  86.                                                         break;        
  87.                                                 }
  88.                                         }                        
  89.                                 }
  90.                                 else //處理數(shù)字
  91.                                 {
  92.                                         num = 0;        
  93.                                          for(j = 26; j <= 35;j++)//數(shù)字地址26~35;
  94.                                         {
  95.                                                 if((MRSZK[j]&0x1F) == MRScode )        //清零高三位
  96.                                                 {
  97.                                                         strbuf[i] = j+0x16;
  98.                                                         i++;
  99.                                                 //        printf("%bc",j+0x16) ;//發(fā)送到串口文本模式顯示                                       
  100.                                                         break;        
  101.                                                 }
  102.                                         }
  103.                                 }
  104.                                 if(MRStime_H > 110)        //處理空格;
  105.                                 {
  106.                                         strbuf[i] = ' ';
  107.                                         i++;
  108.                                 //        printf(" ") ;
  109.                                 }

  110.                                 if(MRStime_H > 190)        //結(jié)束處理;
  111.                                 {
  112.                         //                printf("\n") ;//這里有時(shí)執(zhí)行不到 ?        
  113.                                         blag = 0;
  114.                                         TR0 = 0;
  115.                                 }
  116.                                 MRScode = 0;
  117.                                 write_com(0x01);// 清屏
  118.                                 Lcdwritestring(1,0,strbuf);//x行,Y列寫(xiě)字符串
  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;                //設(shè)置定時(shí)初值        我這是按點(diǎn)平均時(shí)長(zhǎng)90ms,劃時(shí)長(zhǎng)270ms設(shè)置的
  138.         TH0 = 0xF1;                //設(shè)置定時(shí)初值        在接收人工發(fā)送的要設(shè)計(jì)智能調(diào)整適應(yīng)
  139.         if(MRSIN)
  140.                 ++MRStime_H; //高電平延時(shí)計(jì)數(shù)
  141.         if(!MRSIN)
  142.                 ++MRStime_L; //低電平延時(shí)計(jì)數(shù)
  143.         if(MRStime_H > 250)        //這是為接收最后一個(gè)字符自己產(chǎn)生一個(gè)下降沿觸發(fā)中斷
  144.         {
  145.                 MRSIN = 1;
  146.                 MRSIN = 0;
  147.                 MRSIN = 1;                        
  148.         }
  149. }


  150. //void UART_init()
  151. //{
  152. //        TMOD |= 0x20;          //T1工作模式2  8位自動(dòng)重裝
  153. //        TH1 = 0xfd;
  154. //        TL1 = 0xfd;         //比特率9600   時(shí)鐘頻率11.0592MHZ
  155. //        TR1 = 1;                //啟動(dòng)T1定時(shí)器
  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;                //設(shè)置定時(shí)器模式
  165.         TMOD |= 0x01;                //設(shè)置定時(shí)器模式
  166.         TL0 = 0x9A;                //設(shè)置定時(shí)初值
  167.         TH0 = 0xF1;                //設(shè)置定時(shí)初值
  168.         TF0 = 0;                //清除TF0標(biāo)志
  169.         ET0 = 1;
  170.         TR0 = 0;                //定時(shí)器0開(kāi)始設(shè)為0,由外中斷啟動(dòng)計(jì)時(shí)
  171. }

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



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

復(fù)制代碼

仿真截圖




接收源碼:
摩斯碼電報(bào)接收.zip (38.24 KB, 下載次數(shù): 39)

評(píng)分

參與人數(shù) 1黑幣 +60 收起 理由
admin + 60 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:965487 發(fā)表于 2021-10-29 21:47 | 只看該作者
O(∩_∩)O謝謝admin加分鼓勵(lì)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品1区2区 | 日韩成人 | 一级免费毛片 | 粉嫩国产精品一区二区在线观看 | av毛片| 午夜影院黄 | 日本久久久久久 | 欧美自拍一区 | 韩国av网站在线观看 | 午夜精品久久久久久久星辰影院 | 黄色av网站在线免费观看 | 一区精品视频在线观看 | 一区二区三区高清 | 日本三级电影在线观看视频 | 91九色在线观看 | 亚洲欧洲色视频 | 国产不卡一区在线观看 | 黄篇网址 | 欧美日韩不卡合集视频 | 欧美日韩国产中文字幕 | 欧美亚洲国产日韩 | 日韩午夜激情 | 国产美女在线观看 | 久久久久国产精品 | 欧美日韩亚洲三区 | 久久69精品久久久久久国产越南 | 亚洲精品久久久蜜桃 | 国产馆| 成人欧美一区二区三区在线观看 | 国产精品中文字幕在线观看 | 欧美乱操 | 亚洲精品一区二区三区在线 | 亚洲精品乱码8久久久久久日本 | 国产精品3区 | 男女啪啪高潮无遮挡免费动态 | 国产日韩欧美一区二区 | 成人婷婷 | 国产区精品视频 | 日韩一区二区三区在线视频 | 精品一区二区三区av | 亚洲夜夜爽 |