辛苦幾天編寫了基于89C52單片機的摩爾斯電碼自動(手動)收發報程序,核心代碼都已實現,并仿真通過,其它功能正在完善。
自認為是首創,沒想到今天早上在閱讀貼子時,已有大神在昨天發表了相關程序,很是慚愧,本人太寡聞了。
本人由于知識和水平有限,加之書本和網上沒有現成的源代碼可參考,辛苦了幾天,設計了自認比較合理高效占用資源少的數據結構和算法。現發表出來,供大家評論,指出不足,讓我加以改進,學習提高。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (98.21 KB, 下載次數: 103)
下載附件
2021-10-21 17:13 上傳
1.png (40.9 KB, 下載次數: 106)
下載附件
2021-10-21 17:14 上傳
程序編譯后占用的內存
搜狗截圖20211021093928.png (24.03 KB, 下載次數: 92)
下載附件
2021-10-21 09:39 上傳
單片機源程序如下:
- /*-----------------------------------------------
- * 【實驗平臺】: QX-MCS51 單片機開發板
- * 【外部晶振】: 11.0592mhz
- * 【主控芯片】: STC89C52
- * 【編譯環境】: Keil μVisio4
- * 【程序編寫】: wzqwxx 水上人家
- 名稱:摩爾斯電碼發送
- 內容:……
- ------------------------------------------------*/
- #include <REGX52.H>
- #include <stdio.H>
- #include "1602.h"
- #include "MRScode.h"
- unsigned char *showbuffer;//顯示緩沖
- // //常用短語庫
- //unsigned char code *phrase[] = {"ok","NO", "hello","thank you","receive",
- // /*好,不,你好,謝謝你,收到,*/
- //"retransmission","Goodbye", "Help me!", "my location:"
- ///*重復,再見,救我或幫我,我的位置:后面寫兩組數字 東經和北緯*/
- //
- ///******其它可再添加*****/ } ;
- //
- void UART_init()
- {
- TMOD |= 0x20; //T1工作模式2 8位自動重裝
- TH1 = 0xfd;
- TL1 = 0xfd; //比特率9600 時鐘頻率11.0592MHZ
- TR1 = 1; //啟動T1定時器
- SM0 = 0;
- SM1 = 1; //串口工作方式1 10位異步
- REN = 1; //串口允許接收
- TI = 1;
- }
- void main()
- {
- unsigned char inputbufstr[26],k,num;
- UART_init();
- lcd_init();
- showbuffer = "Hello! 51hei.com"; //測試文本
- Lcdwritestring(0,0,showbuffer);
- send_mrs_code_TEXT(showbuffer); //發送字符串
- while(1)
- {
- scanf("%s",inputbufstr); //運行后在仿真終端輸入英文字符串
-
- showbuffer = "";
- showbuffer = inputbufstr+'\n';
- Lcdwritestring(0,0,inputbufstr);
- send_mrs_code_TEXT(inputbufstr);
-
- };
- }
復制代碼- /******本函數ASCII碼轉摩爾斯碼字符串發送*****/
- void send_mrs_code_TEXT(unsigned char *p)
- {
- unsigned char i; //i即摩爾斯碼字庫數組下標
- while(*p)
- {
- if(*p != 0x20)//是否是空格
- {
- if(*p >= 0x41 && *p <= 0x5A )//大寫字母A~Z
- {
- i = *p-0x41; //i取字母字庫 ,0x00地址開始
- }
- else if(*p >= 0x61 && *p <= 0x7A) //小寫字母a~z
- {
- i = *p-0x61; //i取字母字庫 ,0x00地址開始 ,摩斯碼字母不區分大小寫
- }
- else if(*p >= 0x30 && *p <= 0x39) //數字0~9
- {
- i = *p-0x16; //i取數字字庫 ,0x1A地址開始
- }
- else
- {
- switch (*p)
- {
- case '?': i =36; //即字庫數組下標
- break;
- case ',': i =37;
- break;
- case '.': i =38;
- break;
- case '!': i =39;
- break;
- case '@': i =40;
- break;
- case ':': i =41;
- break;
- case '-': i =42;
- break;
- default:goto AAA;//其它字符當空格處理
- break;
- }
- }
- count = 0;//清摩爾碼顯示位置
- write_com(0x01);// 清屏
- Lcdwritestring(0,0,showbuffer); //第一行顯示待發字符串
- Lcdwritechar(1,3,*p);//第二行顯示待發字符
- p++;
- MRS_code_send(MRSZK[i]); //發送一個摩爾碼
- }
- else
- {
- AAA: p++;
- J4_beep(); // 是空格,單詞間隔3+4=7個點靜音
- }
- }
- }
復制代碼 接收部分代碼中午在另貼發布
仿真文件和源碼
摩斯碼自動收發程序4.zip
(449.37 KB, 下載次數: 31)
2021-10-21 09:27 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|