基于STC15W104的摩尔斯电码生成测试

warning: 这篇文章距离上次修改已过515天,其中的内容可能已经有所变动。

要求

  摩尔斯电码由两种基本信号组成:短促的点信号"·",读"滴";保持一定时间的长信号"-",读"嗒"。间隔时间:滴 = 1t,嗒= 3t,滴嗒间 = 1t,字符间 = 3t,单词间 = 7t。本系统发端摩尔斯电码"点"宽 t=300ms,发端可循环发送通过手动选择的三种固定词:"SOS"、"83#"、"OK"。

管脚配置

STC15W10x管脚图STC15W10x管脚图

在本设计中P3^4为控制信号输出脚,P3^1 P3^2 P3^3分别为"SOS"、"83#"、"OK"循环输出的切换按钮;利用STC15内部R/C电路通过配置定时器中断产生周期30ms时钟,再自定义控制函数和编码方式控制信号输出。

下载电路

源代码

times.h

#include <reg51.h>
 
sfr AUXR = 0x8e; //定时器辅助寄存器

sbit OUT = P3^4;//脉冲输出

void timer_init();    //定时器0初始化函数
void interval(int num,int level);  //确定定时及高低电平函数
void time0();    //定时器0中断函数

times.c

#include "times.h"

int flag = 0;    //定时器定时一次结束标志

void timer_init()    //定时器0初始化函数
{
    AUXR &= 0x7f; //指定定时器0为12T模式
    //定时器1配置 12Mhz情况
    TMOD=0x01;//定时器0工作方式1
    TH0=0x8a;//(65536-30000)/256;//赋初值定时
    TL0=0xd0;//(65536-30000)%256;//30ms
    EA=1;//开总中断
    ET0=1;//开定时器0中断
}

void interval(int num, int level)   //确定定时及高低电平函数
{
    OUT = level;
    TR0 = 1;    //启动定时器
    while(num > 0)
    {
        while(!flag){;}    //等待
        num = num-1;
        flag = 0;
    }
    TR0 = 0;    //关闭定时器
}

void time0() interrupt 1    //定时30ms
{
    TR0=0;//赋初值时,关闭定时器
    TH0=0x8a;//(65536-30000)/256;//赋初值定时
    TL0=0xd0;//(65536-30000)%256;//30ms
    TR0=1;//打开定时器
    flag = 1;
}

info.h

#include <reg51.h>

#include "times.h"

sbit key0 = P3^1;
sbit key1 = P3^2;
sbit key2 = P3^3;

void info_init();//初始化函数
void actions();//操作函数
void start_send();//开始发送函数
void send_sos();//发送SOS
void send_83x();//发送83#
void send_ok();//发送OK
void end_send();//结束发送函数

info.c

#include "info.h"

int knock0 = 0;//按键按下及清除标志
int knock1 = 0;
int knock2 = 0;

void info_init()//初始化函数
{
    timer_init();
    key0 = 1;
    key1 = 1;
    key2 = 1;
}

void actions()//操作函数
{
    if (key0 == 0)//按键0按下 循环发送SOS
    {
        knock0 = 1;
        knock1 = 0;
        knock2 = 0;
        while(knock0)
        {
            if(key1==0 || key2==0)
            {
                knock0 = 0;
                break;
            }
            start_send();
            send_sos();
            end_send();
        }
    }
    else
            if (key1 == 0)//按键0按下 循环发送83#
            {
                knock0 = 0;
                knock1 = 1;
                knock2 = 0;
                while(knock1)
                {
                    if(key0==0 || key2==0)
                    {
                        knock1 = 0;
                        break;
                    }
                    start_send();
                    send_83x();
                    end_send();
                }
            }
    else
            if (key2 == 0)//按键0按下 循环发送ok
            {
                knock0 = 0;
                knock1 = 0;
                knock2 = 1;
                while(knock2)
                {
                    if(key0==0 || key1==0)
                    {
                        knock2 = 0;
                        break;
                    }
                    start_send();
                    send_ok();
                    end_send();
                }
            }
}

void start_send()//开始发送函数 _._._
{
    interval(7,0);
    interval(3,1);
    interval(1,0);
    interval(1,1);
    interval(1,0);
    interval(3,1);
    interval(1,0);
    interval(1,1);
    interval(1,0);
    interval(3,1);
    interval(7,0);
    
}

void end_send()//结束发送函数 ..._.
{
    interval(7,0);
    interval(1,1);
    interval(1,0);
    interval(1,1);
    interval(1,0);
    interval(1,1);
    interval(1,0);
    interval(3,1);
    interval(1,0);
    interval(1,1);
    interval(7,0);
    
}

void send_sos()//发送SOS ..._ _ _...
{
    interval(7,0);
    interval(1,1);
    interval(1,0);
    interval(1,1);
    interval(1,0);
    interval(1,1);
    
    interval(3,0);
    
    interval(3,1);
    interval(1,0);
    interval(3,1);
    interval(1,0);
    interval(3,1);
    
    interval(3,0);
    
    interval(1,1);
    interval(1,0);
    interval(1,1);
    interval(1,0);
    interval(1,1);
    interval(7,0);
    
}

void send_83x()//发送83# _ _ _ .. ..._ _ .._ _..
    {
    interval(7,0);
    interval(3,1);
    interval(1,0);
    interval(3,1);
    interval(1,0);
    interval(3,1);
    interval(1,0);
    interval(1,1);
    interval(1,0);
    interval(1,1);
    
    interval(3,0);
    
    interval(1,1);
    interval(1,0);
    interval(1,1);
    interval(1,0);
    interval(1,1);
    interval(1,0);
    interval(3,1);
    interval(1,0);
    interval(3,1);

    
    interval(3,0);
    
    interval(1,1);
    interval(1,0);
    interval(1,1);
    interval(1,0);
    interval(3,1);
    interval(1,0);
    interval(3,1);
    interval(1,0);
    interval(1,1);
    interval(1,0);
    interval(1,1);
    interval(7,0);
}

void send_ok()//发送OK _ _ _ _._
{
    interval(7,0);
    interval(3,1);
    interval(1,0);
    interval(3,1);
    interval(1,0);
    interval(3,1);
    
    interval(3,0);
    
    interval(3,1);
    interval(1,0);
    interval(1,1);
    interval(1,0);
    interval(3,1);
    interval(7,0);
}

main.c

#include "info.h"

void main(void)
{
    //初始化
    info_init();
    while(1)
    {
        actions();
    }
}
 

测试结果

输出SOS输出SOS

输出83#输出83#

输出OK输出OK

输出切换输出切换

已有 2 条评论

  1. 日常来访~

    1. 雨中执笔 雨中执笔

      欢迎常来!

添加新评论