標(biāo)題: 上傳一個莫爾斯電碼發(fā)生的單片機(jī)程序與Proteus仿真電路 [打印本頁]

作者: 風(fēng)158    時間: 2020-10-20 21:30
標(biāo)題: 上傳一個莫爾斯電碼發(fā)生的單片機(jī)程序與Proteus仿真電路
短波等幅電報是無線電玩家的摯愛,其抗干擾能力是無法替代的,使用小功率就能實現(xiàn)遠(yuǎn)距離通聯(lián)。但是人工收發(fā)電報實在是太難,也太繁瑣,也因此莫爾斯碼已被主流應(yīng)用淘汰。如果能用單片機(jī)實現(xiàn)自動收發(fā)電報,就能很方便的進(jìn)行遠(yuǎn)距離通聯(lián)了?吹接行┵Y深網(wǎng)友反對電報自動化,不過如能用單片機(jī)實現(xiàn)自動收發(fā)報、自動加解密,相信莫爾斯碼會更有實用價值,會煥發(fā)第二春。網(wǎng)上這樣的程序很少,找了很久終于找到一個,保存到這里,希望對需要的人有幫助。

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


單片機(jī)源程序如下:
  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);//設(shè)置顯示位置
  152.                 while(j!=0&&dis1[i] != '\0')
  153.                 {
  154.                         lcd_wdat(dis1[i]);//顯示字符
  155.                         i++;
  156.                         j=i%16;
  157.                 }
  158.                 lcd_pos(0x40);// 設(shè)置顯示位置
  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黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
莫爾斯電碼發(fā)生器.zip (91.17 KB, 下載次數(shù): 62)




作者: xingzhe8    時間: 2020-10-20 22:33
這個只有無線電愛好者才有興趣,打破零評論
作者: 風(fēng)158    時間: 2020-10-20 22:50
經(jīng)檢查該程序鍵盤部分少設(shè)置了兩個字母,可以重新設(shè)置增加上。
利用空閑的io口可以增加一個手動發(fā)報按鈕,如果你喜歡手動發(fā)報。按下時讓喇叭發(fā)聲即可。
在喇叭輸出端連接一個三極管,再連接到短波發(fā)射電路,就能模擬電鍵實現(xiàn)單片機(jī)自動發(fā)報。喇叭的聲音是io口通過0、1變化實現(xiàn)的,這也意味著聲音載波是100%調(diào)制的,接收時聲音信號不怕限幅,還能通過音調(diào)識別來提高抗干擾能力。
作者: wbz0508    時間: 2020-10-21 05:05
發(fā)報部份不難,有難度的是收報。怎樣才能適應(yīng)不同人的手速?
作者: 風(fēng)158    時間: 2020-10-21 12:59
wbz0508 發(fā)表于 2020-10-21 05:05
發(fā)報部份不難,有難度的是收報。怎樣才能適應(yīng)不同人的手速?

這個確實是難點,我正在解決?紤]采用聚類分析算法,但是程序太大,要想法精簡。
不過,采用單片機(jī)發(fā)報后,再采用單片機(jī)收報就很容易了。單片機(jī)對單片機(jī)通訊按鍵時間可以非常精準(zhǔn)。使用單片機(jī)還可以縮短按鍵時間,提高發(fā)報速度。所以說采用單片機(jī)發(fā)報前途光明。
作者: rsx9583    時間: 2020-10-23 12:16
自動發(fā)報的早就有了,但還是喜歡用手動的。我問相關(guān)人員為什么堅持手動電鍵,他說,熟練后,手動電鍵比自動發(fā)報的速度還要快!
作者: 風(fēng)158    時間: 2020-10-24 09:40
rsx9583 發(fā)表于 2020-10-23 12:16
自動發(fā)報的早就有了,但還是喜歡用手動的。我問通信兵為什么堅持手動電鍵,通信兵說,熟練后,手動電鍵 ...

現(xiàn)在已經(jīng)很少用電報了,原因就是速度太慢、加解密太繁瑣,畢竟人的操作速度是很有限的。
但是,如果收發(fā)報都用單片機(jī),收發(fā)報速度就會大大加快,如果不考慮抗干擾,發(fā)報速度幾乎可以直追數(shù)字通訊。況且,用單片機(jī)收發(fā)報,還可以自動加解密,這樣就解決了人工收發(fā)報加解密時的繁瑣問題。
如果用單片機(jī)實現(xiàn)自動收發(fā)報、自動加解密,相信會普及電報,甚至在前線可以做到人手一臺。因為短波電報無論是抗干擾能力還是抗擊打能力,都是無可替代的。在這兩個方面,中繼站、衛(wèi)星通訊都不如短波電報。
作者: wzqwxx    時間: 2021-10-21 08:34
風(fēng)158 發(fā)表于 2020-10-24 09:40
現(xiàn)在已經(jīng)很少用電報了,原因就是速度太慢、加解密太繁瑣,畢竟人的操作速度是很有限的。
但是,如果收發(fā) ...

哇,我也在搞這個,已經(jīng)弄了四五天了,快完成了,沒有想到你也在弄,并發(fā)表了。
作者: wzqwxx    時間: 2021-10-21 09:46
風(fēng)158 發(fā)表于 2020-10-24 09:40
現(xiàn)在已經(jīng)很少用電報了,原因就是速度太慢、加解密太繁瑣,畢竟人的操作速度是很有限的。
但是,如果收發(fā) ...

哈哈,時間看錯了,2020年10月20日,我以為是昨天。昨天正好是2021年10月20日。搜集資料竟然沒有找到你這個帖子。估計關(guān)鍵字寫錯了,我是摩爾斯電碼。
作者: 妹妹妹妹    時間: 2022-1-13 11:16
風(fēng)158 發(fā)表于 2020-10-20 22:50
經(jīng)檢查該程序鍵盤部分少設(shè)置了兩個字母,可以重新設(shè)置增加上。
利用空閑的io口可以增加一個手動發(fā)報按鈕, ...

大佬這個咋搞嘞手動的
作者: 妹妹妹妹    時間: 2022-1-13 16:24
wzqwxx 發(fā)表于 2021-10-21 09:46
哈哈,時間看錯了,2020年10月20日,我以為是昨天。昨天正好是2021年10月20日。搜集資料竟然沒有找到你這 ...

你知道咋用這16個按鍵輸入26個字母和0-9嘛,我看不懂那個代碼

作者: 妹妹妹妹    時間: 2022-1-13 16:48
wzqwxx 發(fā)表于 2021-10-21 08:34
哇,我也在搞這個,已經(jīng)弄了四五天了,快完成了,沒有想到你也在弄,并發(fā)表了。

你知道咋用這16個按鍵輸入26個字母和0-9嘛,我看不懂那個代碼
作者: 妹妹妹妹    時間: 2022-1-13 17:29
wzqwxx 發(fā)表于 2021-10-21 09:46
哈哈,時間看錯了,2020年10月20日,我以為是昨天。昨天正好是2021年10月20日。搜集資料竟然沒有找到你這 ...

這個咋用按鍵輸入字母那些吶
作者: w4589    時間: 2022-1-13 18:15
看來樓主對現(xiàn)代無線通信了解不多
1 早就有自動收發(fā)報系統(tǒng)
2 雖然還在培養(yǎng)報務(wù)員但早停止了cw通信模式,手鍵發(fā)報只作為緊急備用最后手段
3 現(xiàn)在早有了更先進(jìn)的數(shù)字報技術(shù),比如ASK,PSK,FSK。特別是fsk中的ft8通信,弱信號比cw優(yōu)勢明顯
不過,手鍵的優(yōu)勢依然明顯,比如報務(wù)員手法像指紋一樣是獨一無二的。所以早期的報務(wù)員配有保護(hù)人員
作者: 風(fēng)158    時間: 2022-1-14 14:51
1 可能是我孤陋寡聞,但我在網(wǎng)上真的沒有找到自動收發(fā)報軟件,包括萬能的某一個寶。這個程序是我找到的比較好的了,改進(jìn)后收發(fā)報就像收發(fā)短信一樣容易。而且利用單片機(jī)很容易進(jìn)行加密,不能自動加密的系統(tǒng)基本上只能玩玩,沒大用。
2 你能知道cw通信是緊急備用最后手段就行,我說的也是這個意思,F(xiàn)代戰(zhàn)場上電磁干擾會很常見,沒有cw通信做最后保障是很糟糕的。
3 單片機(jī)不僅能高速準(zhǔn)確地模擬手鍵,還能很容易地控制激光、紅外線、超聲波、次聲波進(jìn)行通信,比手動強(qiáng)多了。
作者: w4589    時間: 2022-1-14 20:59
風(fēng)158 發(fā)表于 2022-1-14 14:51
1 可能是我孤陋寡聞,但我在網(wǎng)上真的沒有找到自動收發(fā)報軟件,包括萬能的某一個寶。這個程序是我找到的比較 ...

好吧,我只是想說還是往識別人工手法方面都研究一下,現(xiàn)在玩手鍵的只有業(yè)余無線電愛好者了,業(yè)余無線電只允許明碼明語通訊。至于模擬手鍵技術(shù),軍隊幾十年前就淘汰了,現(xiàn)在的跳頻加數(shù)字調(diào)制技術(shù)各方面都碾壓傳統(tǒng)模擬無線通信,別說cw,現(xiàn)代軍隊語音通信都是數(shù)字加密。況且,現(xiàn)代戰(zhàn)爭是信息化戰(zhàn)爭,cw的傳遞速率,呵呵吧。
作者: 風(fēng)158    時間: 2022-1-15 09:21
讓我們再看看CW通信有哪些過人之處,就會發(fā)現(xiàn)淘汰CW通信是不明智的。傳統(tǒng)方法自有傳統(tǒng)方法的優(yōu)點,據(jù)說海上的就又開始裝備利用恒星定位的儀器了。這是從最壞處著想,向最好處努力的基本決策原則。以下來自網(wǎng)絡(luò):

CW通訊的優(yōu)缺點

    摩斯電碼(Morse Code)是一種相當(dāng)古老的通訊方法,早在有線電話發(fā)明前的有線電報時代即已存在。由于它具有精簡、低成本、高效率的優(yōu)點,所以在通訊科技發(fā)達(dá)的今天,它仍然占有相當(dāng)重要的地位。

    CW為Continue Wave的縮寫,它并不是指連續(xù)發(fā)射的信號(那不成為干擾了嗎?)而是指頻率固定、振輻固定,有別于FM的頻率、AM的振輻隨時間改變而改變。由于沒有調(diào)制,所以只能借著信號的有無來傳遞信號,想當(dāng)然爾,當(dāng)然是用Morse Code這種全球皆知的方式來編碼。在此要特別說明的是Morse Code是一種編碼方式,而CW是一種電波型式,兩者并不相同,只不過我們在運用CW時通常是用Morse Code來溝通,兩者雖有極高的關(guān)聯(lián),但并不表示全等,不可混淆。

優(yōu)點:

1.CW的頻寬甚窄:
    FM的頻寬一般要10KHz以上,AM要6KHz以上,SSB要3KHz以上,而CW通常只要1KHz。實際上只要頻率相差100Hz即可輕易分辨兩個信號的不同。CW是能在有限頻寬中容納最多組信號的通信方法。

2.S/N比高:
    這里指的不是無線電機(jī)上的S/N比,而是人耳對聲音的辨識能力。CW由于聲音單調(diào),很容易在噪聲之中突顯出來,在相同的條件下,如果要分辯CW的信號已經(jīng)有點困難,這個時候用話務(wù)通訊則幾乎不可能達(dá)成通訊。

3.CW傳播較遠(yuǎn):
    由于CW頻寬最窄,以相同的功率來發(fā)訊則單位頻寬內(nèi)的功率密度較其它調(diào)制方式為高,所以可以傳得較遠(yuǎn)。打個比方來說,F(xiàn)M就好像沒有燈罩的燈泡,而CW就像是加了聚光燈罩的聚光燈,雖然用的都是同一個燈泡,但效果則是大大的不同。

4.CW可用較低的功率通訊:
    綜合1,2,3點,這是必然的結(jié)論。在緊急且電力供給受到限制的狀況下,使用CW是最佳的解決方法。

5.CW收發(fā)機(jī)的結(jié)構(gòu)最簡單:
    CW只要能分辨得出信號有無即可,即使頻率不是非常穩(wěn)定或非常準(zhǔn)確也沒關(guān)系。CW的發(fā)射機(jī)不需要調(diào)制,就像是一部信號產(chǎn)生器。而接收機(jī)只要有振蕩、放大、混頻、濾波等功能即可,結(jié)構(gòu)很簡單、制做容易。

6.CW的信號容易做濾波處理:
    因為它的頻寬窄,我們?nèi)菀讓⒉幌胧盏降男盘枮V除以增加信號的可讀性。

7.CW是安靜的通訊方式:
    戴上耳機(jī)操作電鍵,即使是夜深人靜也不會吵到左右鄰居及枕邊人,而話務(wù)通信必須要開口說話就沒有這個優(yōu)點。

缺點:

    我?guī)缀跸氩坏紺W有什么缺點,如果有的話,那就是CW用Morse Code來編碼,而報務(wù)通信和話務(wù)通信相比,本來就有下列缺點:
    同樣的時間內(nèi),難以詳細(xì)描述事情:雖然報務(wù)通信大量使用簡語及Q Code來提升傳遞訊息的速度,不過若要用報務(wù)詳細(xì)描述事情的確是比較費時費力。
    Morse Code需要一定的訓(xùn)練才能熟習(xí)使用,而話務(wù)通訊可說是人人都會,不需要特別訓(xùn)練。
作者: 風(fēng)158    時間: 2022-1-15 12:41
本帖最后由 風(fēng)158 于 2022-1-15 17:42 編輯

單片機(jī)自動收發(fā)報系統(tǒng)體積小,又省電,也很便宜,而且速度很快,不容易出錯,在很大程度上彌補(bǔ)了CW通信的缺點。有了單片機(jī)自動收發(fā)報系統(tǒng),相信手動收發(fā)基本上只用于愛好了。
作者: 風(fēng)158    時間: 2022-1-16 22:03
妹妹妹妹 發(fā)表于 2022-1-13 11:16
大佬這個咋搞嘞手動的

看電路圖:

單片機(jī)收發(fā)報電路.png (94.35 KB, 下載次數(shù): 157)

單片機(jī)收發(fā)報電路.png

作者: 風(fēng)158    時間: 2022-1-16 22:06
妹妹妹妹 發(fā)表于 2022-1-13 16:24
你知道咋用這16個按鍵輸入26個字母和0-9嘛,我看不懂那個代碼

指定某個按鍵與哪幾個字符關(guān)聯(lián)就行。就像多功能電話鍵盤一樣。
作者: 妹妹妹妹    時間: 2022-1-18 20:36
風(fēng)158 發(fā)表于 2022-1-16 22:06
指定某個按鍵與哪幾個字符關(guān)聯(lián)就行。就像多功能電話鍵盤一樣。

太太太感謝了 我好好研究研究
作者: 妹妹妹妹    時間: 2022-1-18 21:01
風(fēng)158 發(fā)表于 2022-1-16 22:03
看電路圖:

我我還有一個問題就是現(xiàn)在咋把這個斷斷續(xù)續(xù)的信號發(fā)射出去呢,具體咋實現(xiàn)
作者: 妹妹妹妹    時間: 2022-1-18 21:22
風(fēng)158 發(fā)表于 2022-1-16 22:06
指定某個按鍵與哪幾個字符關(guān)聯(lián)就行。就像多功能電話鍵盤一樣。

那那這個咋做成無線發(fā)射的吶 俺不會
作者: 風(fēng)158    時間: 2022-1-19 21:09
妹妹妹妹 發(fā)表于 2022-1-18 21:22
那那這個咋做成無線發(fā)射的吶 俺不會

這個需要一定的電路知識,可以先玩玩無線發(fā)射電路,例如無線遙控、無線話筒等。
作者: 妹妹妹妹    時間: 2022-1-19 22:51
風(fēng)158 發(fā)表于 2022-1-19 21:09
這個需要一定的電路知識,可以先玩玩無線發(fā)射電路,例如無線遙控、無線話筒等。

就是如果我現(xiàn)在想做一個實物,那在這個的基礎(chǔ)上需要什么來發(fā)射吶,固定的433Mhz或者315Mhz
作者: 豬八戒三打    時間: 2022-5-5 11:44
這個怎么演示啊,搞不懂
作者: 豬八戒三打    時間: 2022-5-12 11:38
哪位大佬可以解答一下這個程序的思想嗎,理解不了程序
作者: 雪玉寐影    時間: 2022-5-12 12:50
有意思!這兒還有HAM!73!de BH4TXN!
作者: 風(fēng)158    時間: 2022-5-16 12:29
w4589 發(fā)表于 2022-1-14 20:59
好吧,我只是想說還是往識別人工手法方面都研究一下,現(xiàn)在玩手鍵的只有業(yè)余無線電愛好者了,業(yè)余無線電只 ...

我看了一下ft8的通信原理,發(fā)現(xiàn)有兩個地方不如cw通信。一是不完全調(diào)幅,接收時就不能通過限幅方法抗干擾。二是功耗仍然較大,因為ft8是連續(xù)波。cw通信在抗干擾和省電方面(省電在野外很重要)是最好的。ft8號稱靈敏度高于cw,因此可以減少發(fā)射功率,其實主要是用聲卡代替人耳帶來的優(yōu)勢。采用單片機(jī)接收cw同樣能大幅提高靈敏度,也可因此減少發(fā)射功率。而且單片機(jī)可以使用音頻脈沖發(fā)射,又比常規(guī)的cw通信減少一半功率消耗。由于音頻脈沖也是等幅脈沖,接收時還可以對音頻進(jìn)行二次限幅,使抗干擾能力進(jìn)一步增強(qiáng)。
只要能收到信號,脈沖信號就比連續(xù)信號抗干擾能力強(qiáng)。

單片機(jī)CW脈沖圖示.PNG (8.74 KB, 下載次數(shù): 119)

單片機(jī)CW脈沖圖示.PNG

作者: 風(fēng)158    時間: 2022-5-16 15:00
關(guān)于通信速率問題要看使用環(huán)境。單片機(jī)解碼速度很快,理論上可以縮短脈寬提高速率,可以直逼數(shù)字通信。但是cw通信的特點決定了其更強(qiáng)調(diào)抗干擾,能聯(lián)通。一般在極端環(huán)境下使用。在利用月亮反射通信時,每分鐘只能發(fā)送10-15個字符。ft8通信為了提高靈敏度,發(fā)送速率也不高。
至于采用跳頻抗干擾,其實屬于發(fā)射技術(shù)。單片機(jī)cw信號同樣可以采用跳頻發(fā)射,而且由于單片機(jī)cw信號采用的是單一音頻,接收時更容易選擇、辨識,抗干擾能力更強(qiáng)。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1