辛苦几天编写了基于89C52单片机的摩尔斯电码自动(手动)收发报程序,核心代码都已实现,并仿真通过,其它功能正在完善。
自认为是首创,没想到今天早上在阅读贴子时,已有大神在昨天发表了相关程序,很是惭愧,本人太寡闻了。
本人由于知识和水平有限,加之书本和网上没有现成的源代码可参考,辛苦了几天,设计了自认比较合理高效占用资源少的数据结构和算法。现发表出来,供大家评论,指出不足,让我加以改进,学习提高。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
程序编译后占用的内存
单片机源程序如下:
- /*-----------------------------------------------
- * 【实验平台】: 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)
|