|
昨天我在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ī)源程序如下:
- /*----------------------------------------------------------------
- * 【實(shí)驗(yàn)平臺(tái)】: 89C51單片機(jī)開(kāi)發(fā)板
- * 【外部晶振】: 11.0592mhz
- * 【主控芯片】: STC89C52
- * 【編譯環(huán)境】: Keil μVisio4
- * 【程序編寫(xiě)】: wzqwxx 水上人家
- 名稱:摩爾斯電碼接收
- 內(nèi)容:僅供交流學(xué)習(xí),其他用途請(qǐng)注明編者,不保證功能正常
- 本程序僅實(shí)現(xiàn)了短電報(bào)自動(dòng)接收功能
- 編制程序過(guò)程本身就很有趣和充滿挑戰(zhàn),如果能制作成品,
- 練習(xí)發(fā)報(bào)也十分有趣,這也是對(duì)古老的電訊一種紀(jì)念,致敬
- 充滿智慧的先輩們。
- 播發(fā)摩爾斯電碼的一般要求是:以一個(gè)“點(diǎn)”的長(zhǎng)度為一個(gè)時(shí)間
- 單位,“劃”是三個(gè)點(diǎn)的時(shí)間長(zhǎng)度;點(diǎn)劃之間的間隔是一個(gè)點(diǎn)的長(zhǎng)度;
- 字符之間的間隔是三個(gè)點(diǎn)的長(zhǎng)度;單詞之間的間隔是七個(gè)點(diǎn)的長(zhǎng)度。
- 這樣才能被收?qǐng)?bào)人識(shí)別。
- ------------------------------------------------------------------*/
- //MRSJS.c文件
- #include<regx52.h>
- //#include <stdio.h>
- #include "1602.h"
- #define L 33 //顯存數(shù)組元素個(gè)數(shù)
- sbit MRSIN = P3^3; //摩爾斯接口
- sbit beep = P2^3; //蜂鳴器接口
- unsigned char MRScode;//暫存接收碼值
- unsigned char MRStime_L = 0,MRStime_H = 0; //接收摩爾斯碼計(jì)數(shù)延時(shí)
- unsigned char idata i,strbuf[L];//顯示緩沖
-
- //摩爾斯碼字庫(kù) A~Z 0~9共36個(gè) ? , . ! @ : - 共7個(gè),總共43個(gè)字節(jié)
- unsigned char code MRSZK[] = { 0x61,0X28,0X2a,0x44,0x80,0x22,
- 0x46,0x20,0x60,0x27,0x45,0x24,0x63,0x62,0x47,0x26,0x2d,0x42,
- 0x40,0x81,0x41,0x21,0x43,0x29,0x2b,0x2c,/*A~Z*/0xbf,0xaf,0xa7,0xa3,
- 0xa1,0xa0,0xb0,0xb8,0xbc,0xbe,/*0~9*/0xcc,0xf3,0xd5,0xeb,0xda,0xf8,0xe1};
- unsigned char code ASCIIZK[] = "?,.!@:-"; //符號(hào)庫(kù),可擴(kuò)展
- /*******************信號(hào)接收解碼*********************/
- void EX1MRS (void) interrupt 2 //外部中斷1服務(wù)函數(shù)
- {
- static unsigned char num,blag; //num為接收摩爾斯碼點(diǎn)劃的個(gè)數(shù)
- unsigned char j;
- /*******************處理低電平*********************/
- TR0 = 1; //啟動(dòng)time0計(jì)數(shù)產(chǎn)生中斷
- if(blag == 1) //從第二個(gè)下降沿開(kāi)始處理
- {
- //按點(diǎn)平均時(shí)長(zhǎng)89ms,劃時(shí)長(zhǎng)約270ms,空格約640ms計(jì)算的范圍
- if(MRStime_L > 2 && MRStime_L < 120 ) //處理點(diǎn)和劃
- {
- MRScode <<= 1; //發(fā)送端從高位開(kāi)始的
- if(MRStime_L > 43 ) //點(diǎn)時(shí)長(zhǎng)計(jì)數(shù)上限22,劃時(shí)長(zhǎng)計(jì)數(shù)上限68
- {
- MRScode |= 0x01;
- Lcdwritechar(0,6+num,'_');
- }
- else
- {
- Lcdwritechar(0,6+num,'.');
- }
- num++;
- MRStime_L=0;
- /*******************處理高電平*********************/
- if(MRStime_H > 43 )//處理可見(jiàn)字符;字元之間時(shí)長(zhǎng)計(jì)數(shù)是68
- {
- if(num<5 && num >0) //處理字母
- {
- num = (8-3-num) << 5; //得到字母前三位識(shí)別碼值
- for(j = 0; j <= 25;j++)//字母字庫(kù)地址0~25;
- {
- if( MRSZK[j] == (MRScode | num) )
- {
- strbuf[i] = j+0x41;
- i++;
- //printf("%bc",j+0x41) ;//發(fā)送到串口文本模式顯示
- break;
- }
- }
- num = 0;
- }
- else if(num>5) //處理符號(hào)
- {
- num = 0;
- for(j = 36; j <= 42;j++)//符號(hào)字庫(kù)地址36~42;
- {
- if((MRSZK[j]&0x3F) == MRScode ) //清零高兩位
- {
- strbuf[i] = ASCIIZK[j-36];
- i++;
- // printf("%bc",ASCIIZK[j-36]) ;//發(fā)送到串口顯示
- break;
- }
- }
- }
- else //處理數(shù)字
- {
- num = 0;
- for(j = 26; j <= 35;j++)//數(shù)字地址26~35;
- {
- if((MRSZK[j]&0x1F) == MRScode ) //清零高三位
- {
- strbuf[i] = j+0x16;
- i++;
- // printf("%bc",j+0x16) ;//發(fā)送到串口文本模式顯示
- break;
- }
- }
- }
- if(MRStime_H > 110) //處理空格;
- {
- strbuf[i] = ' ';
- i++;
- // printf(" ") ;
- }
- if(MRStime_H > 190) //結(jié)束處理;
- {
- // printf("\n") ;//這里有時(shí)執(zhí)行不到 ?
- blag = 0;
- TR0 = 0;
- }
- MRScode = 0;
- write_com(0x01);// 清屏
- Lcdwritestring(1,0,strbuf);//x行,Y列寫(xiě)字符串
- num = 0;
- }
- MRStime_H=0;
- }
- }
- else
- {
- write_com(0x01);// 清屏
- for(i = 0; i < L ;i++){strbuf[i] = 0;}; //清空顯存
- i = 0;
- num = 0;
- blag = 1;
- MRStime_H = 0;
- MRStime_L = 0;
- }
- }
- void time0_MRS (void) interrupt 1 //STC89C52 4毫秒@11.0592MHz
- {
- TL0 = 0x9A; //設(shè)置定時(shí)初值 我這是按點(diǎn)平均時(shí)長(zhǎng)90ms,劃時(shí)長(zhǎng)270ms設(shè)置的
- TH0 = 0xF1; //設(shè)置定時(shí)初值 在接收人工發(fā)送的要設(shè)計(jì)智能調(diào)整適應(yīng)
- if(MRSIN)
- ++MRStime_H; //高電平延時(shí)計(jì)數(shù)
- if(!MRSIN)
- ++MRStime_L; //低電平延時(shí)計(jì)數(shù)
- if(MRStime_H > 250) //這是為接收最后一個(gè)字符自己產(chǎn)生一個(gè)下降沿觸發(fā)中斷
- {
- MRSIN = 1;
- MRSIN = 0;
- MRSIN = 1;
- }
- }
- //void UART_init()
- //{
- // TMOD |= 0x20; //T1工作模式2 8位自動(dòng)重裝
- // TH1 = 0xfd;
- // TL1 = 0xfd; //比特率9600 時(shí)鐘頻率11.0592MHZ
- // TR1 = 1; //啟動(dòng)T1定時(shí)器
- // SM0 = 0;
- // SM1 = 1; //串口工作方式1 10位異步
- // REN = 1; //串口允許接收
- // TI = 1;
- //}
- //
- void Timer0Init(void) //4毫秒@11.0592MHz
- {
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TMOD |= 0x01; //設(shè)置定時(shí)器模式
- TL0 = 0x9A; //設(shè)置定時(shí)初值
- TH0 = 0xF1; //設(shè)置定時(shí)初值
- TF0 = 0; //清除TF0標(biāo)志
- ET0 = 1;
- TR0 = 0; //定時(shí)器0開(kāi)始設(shè)為0,由外中斷啟動(dòng)計(jì)時(shí)
- }
- void EX1init(void)
- {
- IT1 = 1; //指定外部中斷0下降沿觸發(fā),INT0 (P3.2)
- EX1 = 1; //使能外部中斷
- PX1 = 1;
- EA = 1; //開(kāi)總中斷
- }
- void main(void)
- {
- Timer0Init();//初始化定時(shí)器
- // UART_init(); //初始化串口
- EX1init(); //初始化外部中斷
- lcd_init();//初始化液晶屏
- while(1)//主循環(huán)
- {
- beep = MRSIN; //單手鍵發(fā)送功能
- }
- }
-
-
復(fù)制代碼
仿真截圖
MRScode.png (122.15 KB, 下載次數(shù): 55)
下載附件
2021-10-28 16:30 上傳
51hei.png (5.33 KB, 下載次數(shù): 69)
下載附件
2021-10-28 23:59 上傳
接收源碼:
摩斯碼電報(bào)接收.zip
(38.24 KB, 下載次數(shù): 39)
2021-10-28 16:31 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|