找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2181|回复: 3
打印 上一主题 下一主题
收起左侧

自编的基于89C52单片机的摩尔斯电码自动(手动)收发报程序 附仿真和源码

[复制链接]
跳转到指定楼层
楼主
  辛苦几天编写了基于89C52单片机的摩尔斯电码自动(手动)收发报程序,核心代码都已实现,并仿真通过,其它功能正在完善。
  自认为是首创,没想到今天早上在阅读贴子时,已有大神在昨天发表了相关程序,很是惭愧,本人太寡闻了。
  本人由于知识和水平有限,加之书本和网上没有现成的源代码可参考,辛苦了几天,设计了自认比较合理高效占用资源少的数据结构和算法。现发表出来,供大家评论,指出不足,让我加以改进,学习提高。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


程序编译后占用的内存


单片机源程序如下:
  1. /*-----------------------------------------------
  2. * 【实验平台】: QX-MCS51 单片机开发板
  3. * 【外部晶振】: 11.0592mhz        
  4. * 【主控芯片】: STC89C52
  5. * 【编译环境】: Keil μVisio4         
  6. * 【程序编写】: wzqwxx 水上人家

  7. 名称:摩尔斯电码发送
  8. 内容:……

  9. ------------------------------------------------*/

  10. #include <REGX52.H>
  11. #include <stdio.H>
  12. #include "1602.h"
  13. #include "MRScode.h"

  14. unsigned char *showbuffer;//显示缓冲

  15. // //常用短语库
  16. //unsigned char code *phrase[] = {"ok","NO", "hello","thank you","receive",
  17. //                                                                /*好,不,你好,谢谢你,收到,*/
  18. //"retransmission","Goodbye",        "Help me!", "my location:"
  19. ///*重复,再见,救我或帮我,我的位置:后面写两组数字 东经和北纬*/
  20. //
  21. ///******其它可再添加*****/                                                                                        } ;
  22. //

  23. void UART_init()
  24. {
  25.         TMOD |= 0x20;          //T1工作模式2  8位自动重装
  26.         TH1 = 0xfd;
  27.         TL1 = 0xfd;         //比特率9600   时钟频率11.0592MHZ
  28.         TR1 = 1;                //启动T1定时器
  29.         SM0 = 0;
  30.         SM1 = 1;                 //串口工作方式1 10位异步
  31.         REN = 1;                //串口允许接收
  32.         TI = 1;
  33. }

  34. void main()
  35. {
  36.         unsigned char inputbufstr[26],k,num;
  37.         UART_init();
  38.          lcd_init();
  39.         showbuffer = "Hello! 51hei.com"; //测试文本
  40.         Lcdwritestring(0,0,showbuffer);
  41.         send_mrs_code_TEXT(showbuffer); //发送字符串
  42.         while(1)
  43.         {
  44.                 scanf("%s",inputbufstr); //运行后在仿真终端输入英文字符串
  45.                
  46.                 showbuffer = "";
  47.                 showbuffer = inputbufstr+'\n';
  48.                 Lcdwritestring(0,0,inputbufstr);
  49.                 send_mrs_code_TEXT(inputbufstr);
  50.                                 
  51.         };        
  52. }
复制代码
  1. /******本函数ASCII码转摩尔斯码字符串发送*****/
  2. void send_mrs_code_TEXT(unsigned char *p)
  3. {
  4.         unsigned char i; //i即摩尔斯码字库数组下标
  5.         while(*p)
  6.         {
  7.                 if(*p != 0x20)//是否是空格
  8.                 {
  9.                         if(*p >= 0x41 && *p <= 0x5A )//大写字母A~Z        
  10.                         {
  11.                                 i = *p-0x41;  //i取字母字库 ,0x00地址开始
  12.                         }
  13.                         else if(*p >= 0x61 && *p <= 0x7A) //小写字母a~z
  14.                         {
  15.                                 i = *p-0x61;  //i取字母字库 ,0x00地址开始 ,摩斯码字母不区分大小写
  16.                         }
  17.                         else if(*p >= 0x30 && *p <= 0x39) //数字0~9
  18.                         {
  19.                                 i = *p-0x16;  //i取数字字库 ,0x1A地址开始                                
  20.                         }
  21.                         else
  22.                         {
  23.                                 switch (*p)
  24.                                 {
  25.                                         case '?': i =36;  //即字库数组下标
  26.                                                 break;
  27.                                         case ',': i =37;
  28.                                                 break;
  29.                                         case '.': i =38;
  30.                                                 break;
  31.                                         case '!': i =39;
  32.                                                 break;
  33.                                         case '@': i =40;
  34.                                                 break;
  35.                                         case ':': i =41;
  36.                                                 break;
  37.                                         case '-': i =42;
  38.                                                 break;
  39.                                         default:goto AAA;//其它字符当空格处理
  40.                                                 break;
  41.                                 }
  42.                         }
  43.                         count = 0;//清摩尔码显示位置
  44.                         write_com(0x01);// 清屏
  45.                         Lcdwritestring(0,0,showbuffer);        //第一行显示待发字符串
  46.                         Lcdwritechar(1,3,*p);//第二行显示待发字符
  47.                         p++;
  48.                         MRS_code_send(MRSZK[i]); //发送一个摩尔码
  49.                 }
  50.                 else
  51.                 {
  52.         AAA:        p++;
  53.                         J4_beep(); // 是空格,单词间隔3+4=7个点静音                        
  54.                 }
  55.         }
  56. }
复制代码
接收部分代码中午在另贴发布

仿真文件和源码
摩斯码自动收发程序4.zip (449.37 KB, 下载次数: 31)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:98926 发表于 2021-10-25 10:25 | 只看该作者
期待你的接收c程序
回复

使用道具 举报

板凳
ID:962243 发表于 2021-10-25 19:47 | 只看该作者
期待你的接收c程序
回复

使用道具 举报

地板
ID:965487 发表于 2021-11-2 09:25 | 只看该作者
xingzhe8 发表于 2021-10-25 10:25
期待你的接收c程序

谢谢你的鼓励,请查看这个帖子:http://www.51hei.com/bbs/dpj-213705-1.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表