一個整數(shù)發(fā)出的SOS信號

SOS來自于國際摩爾斯電碼,它表示求救信號,摩爾斯電碼為...---...?;疽?guī)則為三短三長三短,手電發(fā)射信號遵守這個規(guī)則即可,下面的時間間隔規(guī)則可以不用太在意。
最近研發(fā)的激光槍瞄手電需要新加一個求救信功能,so,簡單研究了一下關(guān)于SOS,下面是我歸納的內(nèi)容:
|-------------------分割線---------------------|
1:摩爾斯電碼符號點和線,1個點持續(xù)的時間為一個單位時間,1個線持續(xù)的時間為點持續(xù)時長的三倍。
2:符號之間時間間隔一般為1個單位時間,例如點與點之間需要停頓1個單位時間。
3:字母之間時間間隔,S與O之間的時長一般為3個單位時長。
4:詞和詞之間的時間間隔,2個SOS信號之間的間隔時間一般為7個時間單位。
根據(jù)上述規(guī)則可以得到如下的一個序列:
10101+000+111011101110+000+10101+0000000
將這個序列存入一個64位整數(shù)就可以得到閃燈的規(guī)則,其中1亮燈,0滅燈,解析順序從高位開始到低位結(jié)束。
到這里不知道各位看官,看懂沒,沒看懂的話,看下序列的解析:
10101 (點停頓點停頓點停頓)這一串表示 S
000 字母間隔
11101110111 三個1表示一個線0表示停頓 這一串表示O
000 字母間隔
10101 (點停頓點停頓點停頓)這一串表示 S
0000000 詞間隔
序列總長度34(N),從高到低依次取出序列的第N位,每取出一位,操作Led管腳一次,計時,完成后取出N-1,如此往復(fù),34次結(jié)束后就是一個SOS信號組合。
下面是簡單的代碼:
|--------------------------|
[code 語言C]
/#define SHIFT 34
int64_t SOS = 0x2A3BB8A80;//sos的亮滅序列
int perTime = 200;//單位時間
int shift_len = 34;
int timerCount = 0;//時間間隔計數(shù)

//function需要每1毫秒執(zhí)行一次STM32f1單片機有系統(tǒng)函數(shù)SysTick_Handler(),這個函數(shù)是每1ms執(zhí)行一次
void function()
{
if(timerCount == 0)
{
shift_len--;
//取位
uint8_t status = SOS >> shift_len;
status = status & 1;
//控制LED
if(status == 1)
{
//亮燈
Led_ON();
}
else
{
//關(guān)燈
Led_OFF();
}
}
if(timerCount++ > perTime)
{
timerCount = 0;
}
if(shift_len == 1)
{
shift_len = SHIFT;
timerCount = 0;
}
}
[code]
|--------------------------|
代碼不重要,主要是使用一個整數(shù)來表示SOS燈光變化的序列這一思路很絕妙。
小伙伴們,如果是你,你怎么實現(xiàn)呢?歡迎評論,留言,指正。謝謝大家!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容