SOS来自于国际摩尔斯电码,它表示求救信号,摩尔斯电码为...---...。基本规则为三短三长三短,手电发射信号遵守这个规则即可,下面的时间间隔规则可以不用太在意。
最近研发的激光枪瞄手电需要新加一个求救信功能,so,简单研究了一下关于SOS,下面是我归纳的内容:
|-------------------分割线---------------------|
1:摩尔斯电码符号点和线,1个点持续的时间为一个单位时间,1个线持续的时间为点持续时长的三倍。
2:符号之间时间间隔一般为1个单位时间,例如点与点之间需要停顿1个单位时间。
3:字母之间时间间隔,S与O之间的时长一般为3个单位时长。
4:词和词之间的时间间隔,2个SOS信号之间的间隔时间一般为7个时间单位。
根据上述规则可以得到如下的一个序列:
10101+000+111011101110+000+10101+0000000
将这个序列存入一个64位整数就可以得到闪灯的规则,其中1亮灯,0灭灯,解析顺序从高位开始到低位结束。
到这里不知道各位看官,看懂没,没看懂的话,看下序列的解析:
10101 (点停顿点停顿点停顿)这一串表示 S
000 字母间隔
11101110111 三个1表示一个线0表示停顿 这一串表示O
000 字母间隔
10101 (点停顿点停顿点停顿)这一串表示 S
0000000 词间隔
序列总长度34(N),从高到低依次取出序列的第N位,每取出一位,操作Led管脚一次,计时,完成后取出N-1,如此往复,34次结束后就是一个SOS信号组合。
下面是简单的代码:
|--------------------------|
[code 语言C]
/#define SHIFT 34
int64_t SOS = 0x2A3BB8A80;//sos的亮灭序列
int perTime = 200;//单位时间
int shift_len = 34;
int timerCount = 0;//时间间隔计数
//function需要每1毫秒执行一次STM32f1单片机有系统函数SysTick_Handler(),这个函数是每1ms执行一次
void function()
{
if(timerCount == 0)
{
shift_len--;
//取位
uint8_t status = SOS >> shift_len;
status = status & 1;
//控制LED
if(status == 1)
{
//亮灯
Led_ON();
}
else
{
//关灯
Led_OFF();
}
}
if(timerCount++ > perTime)
{
timerCount = 0;
}
if(shift_len == 1)
{
shift_len = SHIFT;
timerCount = 0;
}
}
[code]
|--------------------------|
代码不重要,主要是使用一个整数来表示SOS灯光变化的序列这一思路很绝妙。
小伙伴们,如果是你,你怎么实现呢?欢迎评论,留言,指正。谢谢大家!
网友评论