找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4721|回复: 30
收起左侧

上传一个莫尔斯电码发生的单片机程序与Proteus仿真电路

  [复制链接]
ID:343102 发表于 2020-10-20 21:30 | 显示全部楼层 |阅读模式
短波等幅电报是无线电玩家的挚爱,其抗干扰能力是无法替代的,使用小功率就能实现远距离通联。但是人工收发电报实在是太难,也太繁琐,也因此莫尔斯码已被主流应用淘汰。如果能用单片机实现自动收发电报,就能很方便的进行远距离通联了。看到有些资深网友反对电报自动化,不过如能用单片机实现自动收发报、自动加解密,相信莫尔斯码会更有实用价值,会焕发第二春。网上这样的程序很少,找了很久终于找到一个,保存到这里,希望对需要的人有帮助。

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

单片机源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. void delay(unsigned char ms);
  4. void delay2(int i);
  5. void lcd_wcmd(unsigned char cmd);
  6. void lcd_pos(unsigned char pos);
  7. void lcd_wdat(unsigned char dat);
  8. void lcd_init();
  9. void xianshi();
  10. void KeyDown();
  11. void la_ba();
  12. sbit rs= P2^6;
  13. sbit rw = P2^5;
  14. sbit ep = P2^7;
  15. sbit d=P3^0;
  16. sbit d1=P3^1;
  17. sbit lb=P3^2;
  18. int b,c,s=0,q=0,w=0;
  19. #define GPIO_KEY P1
  20. unsigned char dis1[32];
  21. unsigned char dis2[9]={',','A','D','G','J','M','P','T','W'};
  22. unsigned char dis3[9]={'1','2','3','4','5','6','7','8','9'};
  23. unsigned int code laba[36][5]={
  24.         1,2,3,3,3,//A
  25.         2,1,1,1,3,//B
  26.         2,1,2,1,3,//C
  27.         2,1,1,3,3,//D
  28.         1,3,3,3,3,//E
  29.         1,1,2,1,3,//F
  30.         2,2,1,3,3,//G
  31.         1,1,1,1,3,//H
  32.         1,1,3,3,3,//I
  33.         1,2,2,2,3,//J
  34.         2,1,2,3,3,//K
  35.         1,2,1,1,3,//L
  36.         2,2,3,3,3,//M
  37.         2,1,3,3,3,//N
  38.         2,2,2,3,3,//0
  39.         1,2,2,1,3,//P
  40.         2,2,1,2,3,//Q
  41.         1,2,1,3,3,//R
  42.         1,1,1,3,3,//S
  43.         2,3,3,3,3,//T
  44.         1,1,2,3,3,//U
  45.         1,1,1,2,3,//V
  46.         1,2,2,3,3,//W
  47.         2,1,1,2,3,//X
  48.         2,1,2,2,3,//Y
  49.         2,2,1,1,3,//Z
  50.         2,2,2,2,2,//0
  51.         1,2,2,2,2,//1
  52.         1,1,2,2,2,//2
  53.         1,1,1,2,2,//3
  54.         1,1,1,1,2,//4
  55.         1,1,1,1,1,//5
  56.         2,1,1,1,1,//6
  57.         2,2,1,1,1,//7
  58.         2,2,2,1,1,//8
  59.         2,2,2,2,1,//9
  60. };
  61. void delay(unsigned char ms)
  62. {
  63.         unsigned char i;
  64.         while(ms--)
  65.         {
  66.                 for(i = 0; i< 250; i++)
  67.                 {
  68.                         _nop_();
  69.                         _nop_();
  70.                         _nop_();
  71.                         _nop_();
  72.                 }
  73.         }
  74. }
  75. void delay2(int i)
  76. {
  77.         while(i--);       
  78. }
  79. bit lcd_bz()
  80. {
  81.         bit result;
  82.         rs = 0;
  83.         rw = 1;
  84.         ep = 1;
  85.         _nop_();
  86.         _nop_();
  87.         _nop_();
  88.         _nop_();
  89.         result = (bit)(P0 & 0x80);
  90.         ep = 0;
  91.         return result;
  92. }
  93. void lcd_wcmd(unsigned char cmd)
  94. {
  95.         while(lcd_bz());//判断LCD是否忙碌
  96.         rs = 0;
  97.         rw = 0;
  98.         ep = 0;
  99.         _nop_();
  100.         _nop_();
  101.         P0 = cmd;
  102.         _nop_();
  103.         _nop_();
  104.         _nop_();
  105.         _nop_();
  106.         ep = 1;
  107.         _nop_();
  108.         _nop_();
  109.         _nop_();
  110.         _nop_();
  111.         ep = 0;
  112. }
  113. void lcd_pos(unsigned char pos)
  114. {
  115.         lcd_wcmd(pos | 0x80);
  116. }
  117. void lcd_wdat(unsigned char dat)
  118. {
  119.         while(lcd_bz());//判断LCD是否忙碌
  120.         rs = 1;
  121.         rw = 0;
  122.         ep = 0;
  123.         P0 = dat;
  124.         _nop_();
  125.         _nop_();
  126.         _nop_();
  127.         _nop_();
  128.         ep = 1;
  129.         _nop_();
  130.         _nop_();
  131.         _nop_();
  132.         _nop_();
  133.         ep = 0;
  134. }
  135. void lcd_init()
  136. {
  137.         lcd_wcmd(0x38);
  138.         delay(1);
  139.         lcd_wcmd(0x0c);
  140.         delay(1);
  141.         lcd_wcmd(0x06);
  142.         delay(1);
  143.         lcd_wcmd(0x01);
  144.         delay(1);
  145. }
  146. void xianshi()
  147. {
  148.         int i=0,j=1,n=0;
  149.         while(dis1[i] != '\0')
  150.         {
  151.                 lcd_pos(0x00);//设置显示位置
  152.                 while(j!=0&&dis1[i] != '\0')
  153.                 {
  154.                         lcd_wdat(dis1[i]);//显示字符
  155.                         i++;
  156.                         j=i%16;
  157.                 }
  158.                 lcd_pos(0x40);// 设置显示位置
  159.                 j=1;
  160.                 while(j!=0&&dis1[i] != '\0')
  161.                 {
  162.                         lcd_wdat(dis1[i]);// 显示字符
  163.                         i++;
  164.                         j=i%16;
  165.                 }
  166.                 j=1;
  167.                 if(dis1[i] != '\0')
  168.                 i-=16;
  169.         }
  170.         i=0;
  171. }
  172. void KeyDown()
  173. {
  174.         int KeyValue=0;
  175.         GPIO_KEY=0x0f;
  176.         if(GPIO_KEY!=0x0f)
  177.         {
  178.                 delay(5);
  179.                 if(GPIO_KEY!=0x0f)
  180.                 {       
  181.                         GPIO_KEY=0X0F;
  182.                         switch(GPIO_KEY)
  183.                         {
  184.                                 case(0X07):        KeyValue=0;break;
  185.                                 case(0X0b):        KeyValue=1;break;
  186.                                 case(0X0d): KeyValue=2;break;
  187.                                 case(0X0e):        KeyValue=12;break;
  188.                         }
  189.                 }
  190.                         GPIO_KEY=0XF0;
  191.                         switch(GPIO_KEY)
  192.                         {
  193.                                 case(0X70):        KeyValue=KeyValue;break;
  194.                                 case(0Xb0):        KeyValue=KeyValue+3;break;
  195.                                 case(0Xd0): KeyValue=KeyValue+6;break;
  196.                                 case(0Xe0):        KeyValue=KeyValue+9;break;
  197.                         }
  198.                 while(GPIO_KEY!=0xf0);
  199.                 if(KeyValue!=c&&dis1[w]!='\0')
  200.                         {b=0;w++;}
  201.                
  202.                 if(KeyValue<=8&&s==0)
  203.                 {
  204.                         if(c==12||c==15)w--;
  205.                         dis1[w]=dis2[KeyValue]+b;
  206.                         d=0;delay(25);d=1;delay(25);
  207.                 }
  208.                 else if(KeyValue<=8&&s==1)
  209.                 {
  210.                         if(c==12||c==15)w--;
  211.                         dis1[w]=dis3[KeyValue];
  212.                         d=0;delay(25);d=1;delay(25);
  213.                 }
  214.                 else if(KeyValue==12)
  215.                 {
  216.                         if(w>0)
  217.                         {
  218.                                 w--;
  219.                                 dis1[w]=' ';
  220.                         }
  221.                         else
  222.                         {
  223.                                 dis1[w]=' ';
  224.                         }
  225.                         d1=0;delay(25);d1=1;delay(25);
  226.                 }
  227.                 else if(KeyValue==15)
  228.                 {
  229.                         while(w!=0)
  230.                         {
  231.                                 w--;
  232.                                 dis1[w]=' ';
  233.                         }
  234.                 }
  235.                 else if(KeyValue==9)
  236.                 {
  237.                                 q++;
  238.                                 s=q%2;
  239.                         if(c==12||c==15)w-=2;
  240.                 }
  241.                 else if(KeyValue==10)
  242.                 {
  243.                         if(s==0)
  244.                                 dis1[w]=' ';
  245.                         else
  246.                                 dis1[w]='0';
  247.                 }
  248.                 else if(KeyValue==11)
  249.                 {
  250.                                 dis1[w]=' ';
  251.                 }
  252.                 else if(KeyValue==18)
  253.                 {
  254.                         dis1[w]=' ';
  255.                         w--;
  256.                 }
  257.                 else if(KeyValue==21)
  258.                 {
  259.                         la_ba();
  260.                 }
  261.                 b++;
  262.                 if(b==3)b=0;
  263.                 c=KeyValue;
  264.         }
  265. }
  266. void la_ba()
  267. {
  268.         int i,j,t;
  269.         for(i=0;dis1[i]!='\0';i++)
  270.         {
  271.                 if(dis1[i]>=65&&dis1[i]<=90)
  272.                 {
  273.                 d1=0;delay(25);d1=1;delay(25);
  274.                 for(j=0;laba[dis1[i]-65][j]!=3;j++)
  275.                 {
  276.                         if(laba[dis1[i]-65][j]==1)
  277.                         {
  278.                                 t=100;
  279.                                 while(t--)
  280.                                 {
  281.                                         lb=~lb;
  282.                                         delay2(70);
  283.                                 }
  284.                                         delay(50);
  285.                         }
  286.                         if(laba[dis1[i]-65][j]==2)
  287.                         {
  288.                                         t=300;
  289.                                         while(t--)
  290.                                 {
  291.                                         lb=~lb;
  292.                                         delay2(70);
  293.                                 }
  294.                                 delay(50);
  295.                         }
  296.                         if(laba[dis1[i]-65][j+1]==3)
  297.                         {
  298.                                 delay(100);
  299.                         }
  300.                 }
  301.         }       
  302.                 if(dis1[i]>=48&&dis1[i]<=57)
  303.                 {
  304.                         d=0;delay(25);d=1;delay(25);
  305.                         for(j=0;j<5;j++)
  306.                         {
  307.                                 if(laba[dis1[i]-22][j]==1)
  308.                                 {
  309. ……………………

  310. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
51hei.png
所有资料51hei提供下载:
莫尔斯电码发生器.zip (91.17 KB, 下载次数: 62)

评分

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

查看全部评分

回复

使用道具 举报

ID:98926 发表于 2020-10-20 22:33 | 显示全部楼层
这个只有无线电爱好者才有兴趣,打破零评论
回复

使用道具 举报

ID:343102 发表于 2020-10-20 22:50 | 显示全部楼层
经检查该程序键盘部分少设置了两个字母,可以重新设置增加上。
利用空闲的io口可以增加一个手动发报按钮,如果你喜欢手动发报。按下时让喇叭发声即可。
在喇叭输出端连接一个三极管,再连接到短波发射电路,就能模拟电键实现单片机自动发报。喇叭的声音是io口通过0、1变化实现的,这也意味着声音载波是100%调制的,接收时声音信号不怕限幅,还能通过音调识别来提高抗干扰能力。
回复

使用道具 举报

ID:66377 发表于 2020-10-21 05:05 | 显示全部楼层
发报部份不难,有难度的是收报。怎样才能适应不同人的手速?
回复

使用道具 举报

ID:343102 发表于 2020-10-21 12:59 | 显示全部楼层
wbz0508 发表于 2020-10-21 05:05
发报部份不难,有难度的是收报。怎样才能适应不同人的手速?

这个确实是难点,我正在解决。考虑采用聚类分析算法,但是程序太大,要想法精简。
不过,采用单片机发报后,再采用单片机收报就很容易了。单片机对单片机通讯按键时间可以非常精准。使用单片机还可以缩短按键时间,提高发报速度。所以说采用单片机发报前途光明。
回复

使用道具 举报

ID:468878 发表于 2020-10-23 12:16 | 显示全部楼层
自动发报的早就有了,但还是喜欢用手动的。我问相关人员为什么坚持手动电键,他说,熟练后,手动电键比自动发报的速度还要快!
回复

使用道具 举报

ID:343102 发表于 2020-10-24 09:40 | 显示全部楼层
rsx9583 发表于 2020-10-23 12:16
自动发报的早就有了,但还是喜欢用手动的。我问通信兵为什么坚持手动电键,通信兵说,熟练后,手动电键 ...

现在已经很少用电报了,原因就是速度太慢、加解密太繁琐,毕竟人的操作速度是很有限的。
但是,如果收发报都用单片机,收发报速度就会大大加快,如果不考虑抗干扰,发报速度几乎可以直追数字通讯。况且,用单片机收发报,还可以自动加解密,这样就解决了人工收发报加解密时的繁琐问题。
如果用单片机实现自动收发报、自动加解密,相信会普及电报,甚至在前线可以做到人手一台。因为短波电报无论是抗干扰能力还是抗击打能力,都是无可替代的。在这两个方面,中继站、卫星通讯都不如短波电报。
回复

使用道具 举报

ID:965487 发表于 2021-10-21 08:34 | 显示全部楼层
风158 发表于 2020-10-24 09:40
现在已经很少用电报了,原因就是速度太慢、加解密太繁琐,毕竟人的操作速度是很有限的。
但是,如果收发 ...

哇,我也在搞这个,已经弄了四五天了,快完成了,没有想到你也在弄,并发表了。
回复

使用道具 举报

ID:965487 发表于 2021-10-21 09:46 | 显示全部楼层
风158 发表于 2020-10-24 09:40
现在已经很少用电报了,原因就是速度太慢、加解密太繁琐,毕竟人的操作速度是很有限的。
但是,如果收发 ...

哈哈,时间看错了,2020年10月20日,我以为是昨天。昨天正好是2021年10月20日。搜集资料竟然没有找到你这个帖子。估计关键字写错了,我是摩尔斯电码。
回复

使用道具 举报

ID:1000797 发表于 2022-1-13 11:16 来自手机 | 显示全部楼层
风158 发表于 2020-10-20 22:50
经检查该程序键盘部分少设置了两个字母,可以重新设置增加上。
利用空闲的io口可以增加一个手动发报按钮, ...

大佬这个咋搞嘞手动的
回复

使用道具 举报

ID:1000797 发表于 2022-1-13 16:24 来自手机 | 显示全部楼层
wzqwxx 发表于 2021-10-21 09:46
哈哈,时间看错了,2020年10月20日,我以为是昨天。昨天正好是2021年10月20日。搜集资料竟然没有找到你这 ...

你知道咋用这16个按键输入26个字母和0-9嘛,我看不懂那个代码
回复

使用道具 举报

ID:1000797 发表于 2022-1-13 16:48 来自手机 | 显示全部楼层
wzqwxx 发表于 2021-10-21 08:34
哇,我也在搞这个,已经弄了四五天了,快完成了,没有想到你也在弄,并发表了。

你知道咋用这16个按键输入26个字母和0-9嘛,我看不懂那个代码
回复

使用道具 举报

ID:1000797 发表于 2022-1-13 17:29 来自手机 | 显示全部楼层
wzqwxx 发表于 2021-10-21 09:46
哈哈,时间看错了,2020年10月20日,我以为是昨天。昨天正好是2021年10月20日。搜集资料竟然没有找到你这 ...

这个咋用按键输入字母那些呐
回复

使用道具 举报

ID:46320 发表于 2022-1-13 18:15 | 显示全部楼层
看来楼主对现代无线通信了解不多
1 早就有自动收发报系统
2 虽然还在培养报务员但早停止了cw通信模式,手键发报只作为紧急备用最后手段
3 现在早有了更先进的数字报技术,比如ASK,PSK,FSK。特别是fsk中的ft8通信,弱信号比cw优势明显
不过,手键的优势依然明显,比如报务员手法像指纹一样是独一无二的。所以早期的报务员配有保护人员
回复

使用道具 举报

ID:343102 发表于 2022-1-14 14:51 | 显示全部楼层
1 可能是我孤陋寡闻,但我在网上真的没有找到自动收发报软件,包括万能的某一个宝。这个程序是我找到的比较好的了,改进后收发报就像收发短信一样容易。而且利用单片机很容易进行加密,不能自动加密的系统基本上只能玩玩,没大用。
2 你能知道cw通信是紧急备用最后手段就行,我说的也是这个意思。现代战场上电磁干扰会很常见,没有cw通信做最后保障是很糟糕的。
3 单片机不仅能高速准确地模拟手键,还能很容易地控制激光、红外线、超声波、次声波进行通信,比手动强多了。
回复

使用道具 举报

ID:46320 发表于 2022-1-14 20:59 | 显示全部楼层
风158 发表于 2022-1-14 14:51
1 可能是我孤陋寡闻,但我在网上真的没有找到自动收发报软件,包括万能的某一个宝。这个程序是我找到的比较 ...

好吧,我只是想说还是往识别人工手法方面都研究一下,现在玩手键的只有业余无线电爱好者了,业余无线电只允许明码明语通讯。至于模拟手键技术,军队几十年前就淘汰了,现在的跳频加数字调制技术各方面都碾压传统模拟无线通信,别说cw,现代军队语音通信都是数字加密。况且,现代战争是信息化战争,cw的传递速率,呵呵吧。
回复

使用道具 举报

ID:343102 发表于 2022-1-15 09:21 | 显示全部楼层
让我们再看看CW通信有哪些过人之处,就会发现淘汰CW通信是不明智的。传统方法自有传统方法的优点,据说海上的就又开始装备利用恒星定位的仪器了。这是从最坏处着想,向最好处努力的基本决策原则。以下来自网络:

CW通讯的优缺点

    摩斯电码(Morse Code)是一种相当古老的通讯方法,早在有线电话发明前的有线电报时代即已存在。由于它具有精简、低成本、高效率的优点,所以在通讯科技发达的今天,它仍然占有相当重要的地位。

    CW为Continue Wave的缩写,它并不是指连续发射的信号(那不成为干扰了吗?)而是指频率固定、振辐固定,有别于FM的频率、AM的振辐随时间改变而改变。由于没有调制,所以只能借着信号的有无来传递信号,想当然尔,当然是用Morse Code这种全球皆知的方式来编码。在此要特别说明的是Morse Code是一种编码方式,而CW是一种电波型式,两者并不相同,只不过我们在运用CW时通常是用Morse Code来沟通,两者虽有极高的关联,但并不表示全等,不可混淆。

优点:

1.CW的频宽甚窄:
    FM的频宽一般要10KHz以上,AM要6KHz以上,SSB要3KHz以上,而CW通常只要1KHz。实际上只要频率相差100Hz即可轻易分辨两个信号的不同。CW是能在有限频宽中容纳最多组信号的通信方法。

2.S/N比高:
    这里指的不是无线电机上的S/N比,而是人耳对声音的辨识能力。CW由于声音单调,很容易在噪声之中突显出来,在相同的条件下,如果要分辩CW的信号已经有点困难,这个时候用话务通讯则几乎不可能达成通讯。

3.CW传播较远:
    由于CW频宽最窄,以相同的功率来发讯则单位频宽内的功率密度较其它调制方式为高,所以可以传得较远。打个比方来说,FM就好像没有灯罩的灯泡,而CW就像是加了聚光灯罩的聚光灯,虽然用的都是同一个灯泡,但效果则是大大的不同。

4.CW可用较低的功率通讯:
    综合1,2,3点,这是必然的结论。在紧急且电力供给受到限制的状况下,使用CW是最佳的解决方法。

5.CW收发机的结构最简单:
    CW只要能分辨得出信号有无即可,即使频率不是非常稳定或非常准确也没关系。CW的发射机不需要调制,就像是一部信号产生器。而接收机只要有振荡、放大、混频、滤波等功能即可,结构很简单、制做容易。

6.CW的信号容易做滤波处理:
    因为它的频宽窄,我们容易将不想收到的信号滤除以增加信号的可读性。

7.CW是安静的通讯方式:
    戴上耳机操作电键,即使是夜深人静也不会吵到左右邻居及枕边人,而话务通信必须要开口说话就没有这个优点。

缺点:

    我几乎想不到CW有什么缺点,如果有的话,那就是CW用Morse Code来编码,而报务通信和话务通信相比,本来就有下列缺点:
    同样的时间内,难以详细描述事情:虽然报务通信大量使用简语及Q Code来提升传递讯息的速度,不过若要用报务详细描述事情的确是比较费时费力。
    Morse Code需要一定的训练才能熟习使用,而话务通讯可说是人人都会,不需要特别训练。
回复

使用道具 举报

ID:343102 发表于 2022-1-15 12:41 | 显示全部楼层
本帖最后由 风158 于 2022-1-15 17:42 编辑

单片机自动收发报系统体积小,又省电,也很便宜,而且速度很快,不容易出错,在很大程度上弥补了CW通信的缺点。有了单片机自动收发报系统,相信手动收发基本上只用于爱好了。
回复

使用道具 举报

ID:343102 发表于 2022-1-16 22:03 | 显示全部楼层
妹妹妹妹 发表于 2022-1-13 11:16
大佬这个咋搞嘞手动的

看电路图:
单片机收发报电路.png
回复

使用道具 举报

ID:343102 发表于 2022-1-16 22:06 | 显示全部楼层
妹妹妹妹 发表于 2022-1-13 16:24
你知道咋用这16个按键输入26个字母和0-9嘛,我看不懂那个代码

指定某个按键与哪几个字符关联就行。就像多功能电话键盘一样。
回复

使用道具 举报

ID:1000797 发表于 2022-1-18 20:36 来自手机 | 显示全部楼层
风158 发表于 2022-1-16 22:06
指定某个按键与哪几个字符关联就行。就像多功能电话键盘一样。

太太太感谢了 我好好研究研究
回复

使用道具 举报

ID:1000797 发表于 2022-1-18 21:01 来自手机 | 显示全部楼层
风158 发表于 2022-1-16 22:03
看电路图:

我我还有一个问题就是现在咋把这个断断续续的信号发射出去呢,具体咋实现
回复

使用道具 举报

ID:1000797 发表于 2022-1-18 21:22 来自手机 | 显示全部楼层
风158 发表于 2022-1-16 22:06
指定某个按键与哪几个字符关联就行。就像多功能电话键盘一样。

那那这个咋做成无线发射的呐 俺不会
回复

使用道具 举报

ID:343102 发表于 2022-1-19 21:09 | 显示全部楼层
妹妹妹妹 发表于 2022-1-18 21:22
那那这个咋做成无线发射的呐 俺不会

这个需要一定的电路知识,可以先玩玩无线发射电路,例如无线遥控、无线话筒等。
回复

使用道具 举报

ID:1000797 发表于 2022-1-19 22:51 来自手机 | 显示全部楼层
风158 发表于 2022-1-19 21:09
这个需要一定的电路知识,可以先玩玩无线发射电路,例如无线遥控、无线话筒等。

就是如果我现在想做一个实物,那在这个的基础上需要什么来发射呐,固定的433Mhz或者315Mhz
回复

使用道具 举报

ID:1023972 发表于 2022-5-5 11:44 | 显示全部楼层
这个怎么演示啊,搞不懂
回复

使用道具 举报

ID:1023972 发表于 2022-5-12 11:38 | 显示全部楼层
哪位大佬可以解答一下这个程序的思想吗,理解不了程序
回复

使用道具 举报

ID:99525 发表于 2022-5-12 12:50 | 显示全部楼层
有意思!这儿还有HAM!73!de BH4TXN!
回复

使用道具 举报

ID:343102 发表于 2022-5-16 12:29 | 显示全部楼层
w4589 发表于 2022-1-14 20:59
好吧,我只是想说还是往识别人工手法方面都研究一下,现在玩手键的只有业余无线电爱好者了,业余无线电只 ...

我看了一下ft8的通信原理,发现有两个地方不如cw通信。一是不完全调幅,接收时就不能通过限幅方法抗干扰。二是功耗仍然较大,因为ft8是连续波。cw通信在抗干扰和省电方面(省电在野外很重要)是最好的。ft8号称灵敏度高于cw,因此可以减少发射功率,其实主要是用声卡代替人耳带来的优势。采用单片机接收cw同样能大幅提高灵敏度,也可因此减少发射功率。而且单片机可以使用音频脉冲发射,又比常规的cw通信减少一半功率消耗。由于音频脉冲也是等幅脉冲,接收时还可以对音频进行二次限幅,使抗干扰能力进一步增强。
只要能收到信号,脉冲信号就比连续信号抗干扰能力强。
单片机CW脉冲图示.PNG
回复

使用道具 举报

ID:343102 发表于 2022-5-16 15:00 | 显示全部楼层
关于通信速率问题要看使用环境。单片机解码速度很快,理论上可以缩短脉宽提高速率,可以直逼数字通信。但是cw通信的特点决定了其更强调抗干扰,能联通。一般在极端环境下使用。在利用月亮反射通信时,每分钟只能发送10-15个字符。ft8通信为了提高灵敏度,发送速率也不高。
至于采用跳频抗干扰,其实属于发射技术。单片机cw信号同样可以采用跳频发射,而且由于单片机cw信号采用的是单一音频,接收时更容易选择、辨识,抗干扰能力更强。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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