美文网首页
一个整数发出的SOS信号

一个整数发出的SOS信号

作者: DrS6 | 来源:发表于2016-07-01 18:26 被阅读89次

    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灯光变化的序列这一思路很绝妙。
    小伙伴们,如果是你,你怎么实现呢?欢迎评论,留言,指正。谢谢大家!

    相关文章

      网友评论

          本文标题:一个整数发出的SOS信号

          本文链接:https://www.haomeiwen.com/subject/pvzfjttx.html