張娜 鄧文波
摘要:摩爾斯電碼,又稱為摩斯電碼,是一種時(shí)通時(shí)斷的信號(hào)代碼,這種信號(hào)代碼通過不同的排列順序來表達(dá)不同的英文字母、數(shù)字和標(biāo)點(diǎn)符號(hào)等。該系統(tǒng)硬件以單片機(jī)AT89C51為核心,采用C語言編程,實(shí)現(xiàn)按鍵功能設(shè)置,然后驅(qū)動(dòng)喇叭播放摩爾斯電碼,最后再利用液晶屏同步顯示播放的摩爾斯電碼。該系統(tǒng)可實(shí)現(xiàn)摩爾斯碼碼速、方式可調(diào),具有一定的現(xiàn)實(shí)價(jià)值和意義。
關(guān)鍵詞:AT89C51單片機(jī);摩爾斯碼;播報(bào)機(jī);系統(tǒng)設(shè)計(jì);
中圖分類號(hào):TP391? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A? ? ? ?文章編號(hào):1009-3044(2018)35-0220-04
電報(bào)通信的語言是由電碼符號(hào)組成的,是美國薩繆爾·摩爾斯在1844年發(fā)明的,所以電碼符號(hào)也被叫做摩爾斯電碼(Morse code)。摩爾斯電碼(又稱為摩斯電碼)是一種時(shí)通時(shí)斷的信號(hào)代碼,這種信號(hào)代碼通過不同的排列順序來表達(dá)不同的英文字母、數(shù)字和標(biāo)點(diǎn)符號(hào)等。它是一種早期的數(shù)字化通信形式。由于通信技術(shù)的進(jìn)步,摩爾斯碼已被其他通信編碼所取代,但由于它所占的頻寬最少,又具一種技術(shù)及藝術(shù)的特性,在實(shí)際生活中有廣泛的應(yīng)用,現(xiàn)主要用于航海、遠(yuǎn)航通信等領(lǐng)域。
1 硬件系統(tǒng)
1.1 整體設(shè)計(jì)
本設(shè)計(jì)主要包括四部分:51單片機(jī)系統(tǒng)、按鍵檢測模塊、聲音驅(qū)動(dòng)模塊和顯示模塊,系統(tǒng)框圖如圖1所示。
本設(shè)計(jì)主要是基于51單片機(jī)的摩爾斯報(bào)播報(bào)系統(tǒng)。通過制作相關(guān)電路板構(gòu)建該系統(tǒng)的硬件實(shí)物平臺(tái),并采用 Keil軟件編程實(shí)現(xiàn)摩爾斯碼播報(bào)機(jī)的相關(guān)功能。
本設(shè)計(jì)主要完成的功能:
1) 對(duì)摩爾斯碼播報(bào)機(jī)參數(shù)的設(shè)置。通過對(duì)按鍵電路的檢測,實(shí)現(xiàn)摩爾斯碼播報(bào)相關(guān)參數(shù)的設(shè)置,主要實(shí)現(xiàn)播報(bào)速度、播報(bào)方式的設(shè)置。
2) 實(shí)現(xiàn)摩爾斯電碼的播報(bào)。設(shè)定好相關(guān)參數(shù)后,驅(qū)動(dòng)聲音驅(qū)動(dòng)模塊實(shí)現(xiàn)摩爾斯碼的播報(bào),同時(shí)利用顯示模塊對(duì)播報(bào)的摩爾斯碼實(shí)時(shí)顯示。
1.2 單片機(jī)最小系統(tǒng)
51單片機(jī)最小系統(tǒng)由單片機(jī)、晶振電路和復(fù)位電路組成,如圖2所示所示。晶振電路,又稱為時(shí)鐘電路,是系統(tǒng)的心臟部分,為單片機(jī)的運(yùn)行提供時(shí)鐘脈沖信號(hào)。晶振頻率f為22.1184Mhz,即單片機(jī)執(zhí)行一條機(jī)械指令所需要的時(shí)間為1/f。復(fù)位電路主要用于程序運(yùn)行不正常、死機(jī)或者需要重新復(fù)位運(yùn)行時(shí)對(duì)單片機(jī)進(jìn)行復(fù)位。正常情況下,單片機(jī)RST端為低電位,單片機(jī)正常運(yùn)行。當(dāng)按鍵按下后松開,單片機(jī)RST端出現(xiàn)短暫的高電位,從而致使單片機(jī)執(zhí)行復(fù)位操作。
1.3 其他輔助電路
如圖3所示為發(fā)報(bào)機(jī)系統(tǒng)外圍電路設(shè)計(jì)圖,主要有三部分組成:功能設(shè)置(按鍵電路)、音響播報(bào)(聲響驅(qū)動(dòng)電路)、結(jié)果顯示(液晶顯示電路)。按鍵主要用于測試?yán)鹊囊粜Ш筒?bào)碼數(shù)、播報(bào)方式的設(shè)置;音響電路主要用去驅(qū)動(dòng)喇叭發(fā)聲,實(shí)現(xiàn)摩爾斯碼的播報(bào);液晶顯示電路主要用于對(duì)相關(guān)參數(shù)和播報(bào)電碼的顯示。
2 摩爾斯編碼
2.1 摩爾斯碼簡介
摩爾斯電碼(Morse alphabet)是一種時(shí)通時(shí)斷的信號(hào),這種信號(hào)通過不同的排序來表示不同的英文字母、數(shù)字和符號(hào)等內(nèi)容。它不同于現(xiàn)代的二進(jìn)制代碼,摩爾斯電碼由兩種最基本信號(hào)和不同的間隔時(shí)間組成:短促的點(diǎn)信號(hào)(·,通常讀‘滴)和保持一定時(shí)間的長信號(hào)(—,通常讀為‘噠)。它的代碼主要包括五種: 點(diǎn)(·)、劃(—)、字間點(diǎn)(·)和劃(—)之間的停頓、字符與字符之間的停頓、詞(組)與詞(組)之間的停頓。摩爾斯碼如圖4所示,以一個(gè)點(diǎn)(·)為一基本信號(hào)單位,則有:
1) 一劃(—)的時(shí)間長度為3點(diǎn)(·)的時(shí)間長度。
2) 在一個(gè)字符內(nèi),點(diǎn)(·)與點(diǎn)(·)、點(diǎn)(·)與劃(—)、劃(—)與劃(—)之間的間隔為一點(diǎn)(·)的時(shí)間長度。
3) 字符與字符之間的間隔為3點(diǎn)(·)的時(shí)間長度。
4) 字(組)與字(組)之間的間隔為5點(diǎn)(·)的時(shí)間長度。
利用點(diǎn)(·)和劃(—)兩個(gè)基本信號(hào),然后通關(guān)不同的排序來表示對(duì)應(yīng)的字母、數(shù)字和符號(hào)等,如表1、2所示為常用的字母和數(shù)字摩爾斯編碼。
2.2 三進(jìn)制編碼方式
計(jì)算機(jī)數(shù)據(jù)處理通常采用二進(jìn)制編碼,為方便處理,摩爾斯碼在計(jì)算機(jī)處理中必須進(jìn)行數(shù)據(jù)化。當(dāng)利用二進(jìn)制編碼方式對(duì)編碼進(jìn)行處理時(shí),即點(diǎn)(·)為0、劃(—)為1,則會(huì)出現(xiàn)編碼后不同的字母或者數(shù)字量化結(jié)果相同,無法進(jìn)行區(qū)分,如字母h、i、s和數(shù)字5的編碼結(jié)果都為0。為解決該問題,可采用在編碼前增加一位編碼校驗(yàn)位,該位編碼為1,也可采用其他編碼方式。本設(shè)計(jì)采用三進(jìn)制進(jìn)行編碼,以點(diǎn)(·)為1、劃(—)為2,同時(shí)為方便計(jì)算處理,本文采用倒序編碼,如字母a的摩爾斯編碼為(· —),則三進(jìn)制倒序編碼后為(21)3,編碼結(jié)果為7。表1、2字母和數(shù)字對(duì)應(yīng)三進(jìn)制倒序編碼結(jié)果如表3、4所示。表中括號(hào)內(nèi)數(shù)字為對(duì)應(yīng)三進(jìn)制編碼結(jié)果。
2.3 電報(bào)播報(bào)方式
常用的摩爾斯碼電報(bào)播報(bào)方式有三種:字母報(bào)、數(shù)字報(bào)和混合報(bào)。其中數(shù)字報(bào)又分為數(shù)字長碼報(bào)和數(shù)字短碼報(bào);混碼報(bào)是常用的發(fā)包方式,是由字母碼與數(shù)字長碼的混合而成。
3 軟件設(shè)計(jì)
3.1 軟件整體設(shè)計(jì)
系統(tǒng)軟件設(shè)計(jì)整體框圖如圖5所示。硬件初始化后,進(jìn)入摩爾斯碼播報(bào)機(jī)相關(guān)參數(shù)的設(shè)定狀態(tài)。系統(tǒng)對(duì)按鍵狀態(tài)進(jìn)行掃描檢測,實(shí)現(xiàn)摩爾斯碼播報(bào)碼數(shù)、播報(bào)方式的設(shè)置。播報(bào)碼數(shù):即單位時(shí)間內(nèi)播報(bào)滴(·)的個(gè)數(shù)。以播報(bào)滴(·)的時(shí)間為一個(gè)基本的時(shí)間單元t,碼數(shù)為V,則一個(gè)基本時(shí)間單元t的時(shí)長為60/V/2秒,公式中除以2是因?yàn)樵诓?bào)中滴(·)與滴(·)之間的間隔剛好為一個(gè)基本時(shí)間單元t。播報(bào)方式的設(shè)定,即對(duì)字母報(bào)、數(shù)字長碼報(bào)、數(shù)字短碼報(bào)或者混合報(bào)播報(bào)方式進(jìn)行選擇。參數(shù)設(shè)定完畢后,系統(tǒng)隨機(jī)產(chǎn)生字母或者數(shù)字,然后播放該字符的摩爾斯碼,同時(shí)實(shí)時(shí)通過液晶顯示所播報(bào)的字碼。當(dāng)需要對(duì)碼數(shù)和播報(bào)方式重新設(shè)定時(shí),只需要啟動(dòng)復(fù)位按鍵,對(duì)單片機(jī)進(jìn)行復(fù)位啟動(dòng),然后重新對(duì)各參數(shù)進(jìn)行設(shè)定即可。
3.2 按鍵按識(shí)
按鍵識(shí)別程序采用基于按鍵狀態(tài)的掃描設(shè)計(jì),該方法能有效消除因按鍵抖動(dòng)而產(chǎn)生的短促電位改變致使對(duì)按鍵結(jié)果產(chǎn)生的誤判。程序開始后進(jìn)入按鍵掃描的初始0狀態(tài),檢測按鍵是否按下。當(dāng)存在按鍵按下時(shí),進(jìn)入下一狀態(tài),利用延時(shí)判斷對(duì)按鍵狀態(tài)再次確認(rèn),如果確實(shí)按下,則轉(zhuǎn)入下一狀態(tài),否則返回0狀態(tài)繼續(xù)按鍵檢測。當(dāng)確實(shí)有按鍵按下后,進(jìn)入下一狀態(tài)等待按鍵的松開,同樣利用延時(shí)法消除按鍵抖動(dòng)產(chǎn)生的誤判,在按鍵確實(shí)松開后置按鍵標(biāo)志位為高電平。部分程序及注解如下所示:
void key_mainloop()//按鍵掃描函數(shù)
{ static unsigned char key1_state = 0;//按鍵掃描狀態(tài)號(hào)
static unsigned char key1_count = 0; //計(jì)數(shù)器
switch(key1_state)
{case 0:
{if(key1 == 0)key1_state = 1;}break;//當(dāng)有按鍵按下時(shí),進(jìn)如1狀態(tài)
case 1:
{if(key1_count++ >=10)//延時(shí)消除抖動(dòng)
{key1_count = 0;
if(key1 == 0) key1_state = 2;
else key1_state = 0;} //確實(shí)存在按鍵按下,則進(jìn)入2狀態(tài),否則回0狀態(tài)
} break;
case 2:
{if(key1 == 1) key1_state = 3;}//當(dāng)檢測到按鍵松開時(shí),進(jìn)入3狀態(tài)
case 3:
{if(key1_count++ >= 10) //延時(shí)消除抖動(dòng)
{key1_count = 0;
if(key1 == 1){key1_state = 0;key1_flag_g = 1;}
else key1_state = 2; }//當(dāng)該按鍵確實(shí)松開后,則把按鍵標(biāo)志位置1,并使程序進(jìn)入0狀態(tài),繼續(xù)掃描按鍵;否則回到2狀態(tài)繼續(xù)等待按鍵松開。
} break;
}}
當(dāng)按鍵掃描程序獲得按鍵狀態(tài)后,程序通過讀取不同按鍵的按鍵標(biāo)志位狀態(tài),區(qū)分是否存在按鍵按下和哪一個(gè)按鍵按下,從而執(zhí)行不同的程序段,實(shí)現(xiàn)不同功能按鍵的實(shí)現(xiàn)和參數(shù)的設(shè)定。
3.3 聲音驅(qū)動(dòng)
音響驅(qū)動(dòng)如圖3(b)所示,當(dāng)單片機(jī)P3-3端口輸出為高電平時(shí),則此時(shí)三極管導(dǎo)通,音響發(fā)聲,當(dāng)P3-3端口輸出為低電平時(shí),則此時(shí)三極管斷開,音響靜音狀態(tài)。通過控制輸出端P3-3的電位隨時(shí)間的變化,便可以產(chǎn)生不同的影響效果。
以滴(·)為一個(gè)基本時(shí)間單位t,則噠(—)的時(shí)間為3t,字中滴(·)與噠(—)之間的時(shí)間間隔為1t,字與字之間的時(shí)間間隔為3t,而詞(組)與詞(組)之間的時(shí)間間隔為5t。
單片機(jī)開始播報(bào)后,通過讀取rand()函數(shù)結(jié)合單片機(jī)定時(shí)計(jì)數(shù)器1低八位數(shù)據(jù)產(chǎn)生隨機(jī)序列,然后讀取對(duì)應(yīng)序號(hào)的三進(jìn)制倒序編碼,執(zhí)行聲音驅(qū)動(dòng)字碼播放程序,過程中執(zhí)行液晶顯示程序,對(duì)播報(bào)的摩爾斯碼字符進(jìn)行實(shí)時(shí)顯示。本文采用倒序三進(jìn)制編碼對(duì)摩爾斯碼進(jìn)行編碼,主要為了方便程序的設(shè)計(jì)。部分代碼如下所示:
switch(Step_flag)
case 0:{Now = (TL1+rand()) % Z_Num;Now_S = zimu[Now+Z_begin];
Step_flag++; }//產(chǎn)生隨機(jī)序列,并讀取對(duì)應(yīng)序列字碼摩爾斯編碼的三進(jìn)制倒序編碼
case 1:{g = Now_S%3; Step_flag++;}//三進(jìn)制編碼對(duì)3取余
case 2:{if(g==1) speak_1();//余數(shù)為1,則播報(bào)(·)
else if(g==2) speak_2();//余數(shù)為2,則播報(bào)(—)
if(Sp_flag==1) Step_flag++;
}break;
case 3:{Now_S = Now_S/3;Step_flag++;}//三進(jìn)制編碼除以3取整
case 4:{if(Now_S) Step_flag=1;循環(huán)能,如果數(shù)據(jù)不為0,則繼續(xù)進(jìn)行取余循環(huán)。
3.4 結(jié)果測試
液晶顯示結(jié)果如圖6所示。圖中①V為播報(bào)碼數(shù);②M為播報(bào)方式,其中Z為字母碼播報(bào),H為混碼播報(bào),C為數(shù)字長碼播報(bào),D為數(shù)字短碼播報(bào)。③為組號(hào),在播報(bào)過程中,每5個(gè)字符劃分為一組。
4 結(jié)論
基于51單片機(jī)的摩爾斯碼播報(bào)系統(tǒng),是以AT89C51單片機(jī)為主控芯片,利用按鍵、聲響及液晶模塊,實(shí)現(xiàn)摩爾斯碼的播報(bào)功能,并實(shí)現(xiàn)摩爾斯碼播報(bào)碼數(shù)、播報(bào)方式的調(diào)節(jié)。該系統(tǒng)設(shè)計(jì)簡單,方便實(shí)現(xiàn),且體積小、耗電低、造價(jià)便宜等優(yōu)點(diǎn),具有一定的現(xiàn)實(shí)價(jià)值和實(shí)際意義。
參考文獻(xiàn):
[1] 汪滿明. 永遠(yuǎn)的摩爾斯[J].中國海事,2011(9):71-72.
[2] 韋醒超.摩爾斯短波無線通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)研究[M].長沙:湖南大學(xué),2017:19-30.
[3] 蕭如珀,楊信男. 1844年5月24日:摩爾斯與電報(bào)[J].現(xiàn)代物理知識(shí),2011(3):61-62.
[4] 李科文. 別了,“SOS”[J].科學(xué)之友,1999(5):21.
[通聯(lián)編輯:梁書]