玩命加载中qwq

莫尔斯代码模拟器

  • 2017-06-24
  • 1,526
  • 8

Capture
这是一个莫尔斯代码模拟器。需要在Windows环境下编译运行。
使用这个程序时需要主板上的小喇叭。因为程序通过Beep函数发声。
使用方法很简单,直接输入要模拟发送的单词或语句即可。
注意这个程序只能翻译国际标准的莫尔斯代码啦(美国标准莫尔斯代码是不支持的)。
使用 .f+数字 可以改变响声频率。.p+数字 改变字母间隔时间
.l+数字 改变长音延续时间 .s改变短音延续时间
.d 显示为点线模式 .b 显示为01数字模式
.q 或者按下 Ctrl+C 退出程序。

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <Windows.h>

typedef struct st_alarm {
	DWORD afeq;   // Alarm frequency.
	DWORD dLong;  // Long signal duration.
	DWORD dShort; // Short signal duration.
	DWORD dPause; // Pause duration.
} ALARM, *PALARM;

BYTE morsec[36] = { 0x42, 0x81, 0x85, 0x61, 0x20,
					0x84, 0x63, 0x80, 0x40, 0x8E,
					0x65, 0x82, 0x43, 0x41, 0x67,
					0x86, 0x8B, 0x62, 0x60, 0x21,
					0x64, 0x88, 0x66, 0x89, 0x8D,
					0x83, 0xBF, 0xBE, 0x8C, 0xB8,
					0x88, 0xA0, 0xA1, 0xA3, 0xA7,
					0xAF
				  };

void fprintmb(const char * szasc, size_t siz, FILE * fout, BOOL dd, char sep, PALARM parm)
{
	register int i, k, l, c;
	for (i = 0; i < (int)siz; ++i)
	{
		// Get index.
		if (isalpha(c = (int)szasc[i]))
			c = isupper(c) ? c - (int)'A' : c - (int)'a';
		else if (isdigit(c))
			c = c - (int)'0' + 26;
		else
		{
			putc('*', fout);
			goto Lbl_InvalidChar;
		}
		k = (int)(morsec [ c ] >> 5);
		for (l = 0; l < k; ++l) // Traverse the whole string.
		{
			if (0 != (((BYTE)1 << l) & morsec [ c ])) // Get significant bits.
			{
				if (dd)
					putc('-', fout);
				else
					putc('1', fout);
				Beep(parm->afeq, parm->dLong);
			}
			else
			{
				if (dd)
					putc('.', fout);
				else
					putc('0', fout);
				Beep(parm->afeq, parm->dShort);
			}
		}
	Lbl_InvalidChar:
		if (sep)
		{ // Alarm pause punctuation.
			putc(sep, fout);
			Beep(0, parm->dPause);
		}
	}
}

int main()
{
	ALARM arm = { 800, 700, 200, 500 };
	char c = ' ', szbuf[100] = { 0 };
	BOOL dd = TRUE;
	printf("####################################\n");
	printf("# Emulator for International Morse #\n");
	printf("####################################\n");
	printf("Usage:\n.d\t: Dot/Dash Mode\n.b\t: Digit/Bit Mode\n.f800\t: Frequency \
		    \n.l700\t: Long Signal's Duration\n.s200\t: Short Signal's Duration \
            \n.p500\t: Pauses' Duration\n.q\t: Exit\n\n");
	while (1)
	{
		scanf("%s", szbuf);
		switch (*(WORD *)szbuf)
		{
		case 0x642E: dd = TRUE; break;
		case 0x622E: dd = FALSE; break;
		case 0x662E: arm.afeq = atol(szbuf + 2); break; // Frequency.
		case 0x6C2E: arm.dLong = atol(szbuf + 2); break; // Long signal.
		case 0x732E: arm.dShort = atol(szbuf + 2); break; // Short signal.
		case 0x702E: // Pause.
			if (0 == (arm.dPause = atol(szbuf + 2)))
				c = '\0';
			else
				c = ' ';
			break;
		case 0x712E: return 0; // Quit.
		default:
			fprintmb(szbuf, strlen(szbuf), stdout, dd, c, &arm);
			printf("\n");
		}
	}
	return 0;
}

In Use

感谢打赏!
支付宝

灌水吐槽区(登录QQ有头像!)

  • Zenazo

    有个问题大家注意一下,我得到的原始码表是数字4等于V。但是国际标准码不是这样的。码表存放在数组morsec中。存放方式是1代表长音0代表短音。并且从MSB处开始先存放有效位数,再从LSB处存放原码的二进制值。为啥只支持国际标码呢?因为8bit正好适合,节约空间!美码和欧陆码需要的位数都多。用char太短用short浪费。甲由申。

  • 小雨萌萌哒丶

    _(・ω・」 ∠)_猫猫这几天简直高产似母猪!

  • ⑨BIE

    hhhhh我记得貌似是beep函数吧qwq
    不过现在好多主板貌似连这个嗡鸣器都木有了的说。
    顺便用这个貌似可以用来开车hhhhh

    • Zenazo

      (..•˘_˘•..) 然而还不能发车,因为没写 Morse->Ascii Decode函数。。。Decode时候就得背Morse码表 ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄

    • 小雨萌萌哒丶

      ( ̄ˇ ̄)单片机就能做。另外电机也会发出声音2333(都不用买蜂鸣器了

      • Zenazo

        Beep函数是WinAPI。你要树莓派上安个Windows CE吗?期待树莓派运行WinCE教程!然后开发嵌入式设备就可以使用C井。dot NET。

        • 小雨萌萌哒丶

          ( ̄▽ ̄)”树莓派好像不能用winCE吧。。但是对于一个蜂鸣器来说,驱动太简单啦!有源蜂鸣器接上输出PWM就能响~

你必须 登录 才能发表灌水吐槽区(登录QQ有头像!).