📄 main.c
字号:
/**********单片机与PC机间摩尔斯码通信**************************/
#include <reg51.h>
//设计者:Au QQ:94647613
//版权没有,可以随意修改
/***********************约定************************************/
//fosc=11.0592M
#define a 1
/*di最低资格&抖动最高资格*/
#define b 20
/*di最高资格&da最低资格*/
#define c 50
/*dida间隔的最高资格&字符间隔的最低资格*/
#define d 100
/*字符间隔的最高资格&字符串间隔的最低资格*/
//电平抖动小于 a*10 ms
//低电平持续介于a*10~b*10 ms间为di(*)
//低电平持续超过b*10 ms为da(--)
//高电平持续小于c*10 ms为dida间隔
//高电平持续介于c*10~d*10 ms为字符间
//高电平持续大于d*10 ms字符串间
/**************************************************************/
/************参数声明*******************/
unsigned char Low_num = 0; /*记录低电平数目*/
unsigned char High_num = 0; /*记录高电平数目*/
unsigned char Design=1; /*P1^0电平标志,若低电平则为0,高为1*/
unsigned char Dida_num=0; /*di da 的个数*/
unsigned int idata Zifu[] = {2,2,2,2,2,2}; /*记录单个字符*/
unsigned char Space_flag=1; /*字符间隔标志*/
unsigned int Send=0; /*存放要发送的字符*/
sbit P1_0 = P1^0; /*键盘接口*/
unsigned int test;
/*******************************发送子程********************/
void send_out(unsigned int Send)
{
if(Send==' ')
Space_flag=1; /*字符间隔标志置位*/
SBUF = Send;
while (TI == 0);
TI = 0;
}
/******************将所采集的信号转换为字符*************/
void change(void)
{
unsigned int Au=0;
test=(10000*Zifu[0]+1000*Zifu[1]+100*Zifu[2]+10*Zifu[3]+1*Zifu[4]+0*Zifu[5]);
if(Zifu[0]!=2||Zifu[1]!=2||Zifu[2]!=2||Zifu[3]!=2||Zifu[4]!=2||Zifu[5]!=2)
{
Au= test;
switch(test)
{
case 1222: Send = 'A';break; /*A*/
case 10002: Send = 'B';break; /*B*/
case 10102: Send = 'C';break; /*C*/
case 10022: Send = 'D';break; /*D*/
case 2222: Send = 'E';break; /*E*/
case 102: Send = 'F';break; /*F*/
case 11022: Send = 'G';break; /*G*/
case 2: Send = 'H';break; /*H*/
case 222: Send = 'I';break; /*I*/
case 1112: Send = 'J';break; /*J*/
case 10122: Send = 'K';break; /*K*/
case 1002: Send = 'L';break; /*L*/
case 11222: Send = 'M';break; /*M*/
case 10222: Send = 'N';break; /*N*/
case 11122: Send = 'O';break; /*O*/
case 1102: Send = 'P';break; /*P*/
case 11012: Send = 'Q';break; /*Q*/
case 1022: Send = 'R';break; /*R*/
case 22: Send = 'S';break; /*S*/
case 12222: Send = 'T';break; /*T*/
case 122: Send = 'U';break; /*U*/
case 12: Send = 'V';break; /*V*/
case 1122: Send = 'W';break; /*W*/
case 10012: Send = 'X';break; /*X*/
case 10112: Send = 'Y';break; /*Y*/
case 11002: Send = 'Z';break; /*Z*/
case 11111: Send = '0';break; /*0*/
case 1111: Send = '1';break; /*1*/
case 111: Send = '2';break; /*2*/
case 11: Send = '3';break; /*3*/
case 1: Send = '4';break; /*4*/
case 0: Send = '5';break; /*5*/
case 10000: Send = '6';break; /*6*/
case 11000: Send = '7';break; /*7*/
case 11100: Send = '8';break; /*8*/
case 11110: Send = '9';break; /*9*/
default : Send = '?';
}
send_out(Send); /*调用发送子程*/
Dida_num=0; /*清数组记数*/
Send = 0; /*清Send*/
}
}
/****************************低电平处理函数********************************/
void low(void)
{
if(Low_num > a && Low_num <= b&&Dida_num<=5) /*若电平持续不到10b ms*/
{ /*为di*/
Zifu[Dida_num] = 0; /*记录为0*/
Dida_num++;
}
if(Low_num > b&&Dida_num<=5) /*若低电平持续超过10b ms*/
{ /*为da*/
Zifu[Dida_num] = 1; /*记录为1*/
Dida_num++;
}
}
/****************************高电平处理函数*****************************/
void high(void)
{
unsigned char i;
if(High_num ==c) /*若高电平持续大于10c*/
{
change(); /*字符处理子程*/
for(i=0;i<=5;i++)
Zifu[i] = 2; /*字符数组重置*/
}
if(High_num >d&&Space_flag==0) /*若高电平持续超过10d ms并且字符间隔标志位为0*/
{
send_out(' '); /*发送空格*/
High_num = 0; /*高电平计数清零*/
}
}
/*******timer0中断服务程序************/
void timer0(void) interrupt 1 using 1
{
TH0 = 0xDC;
TL0 = 0x00; /*定时10ms*/
if(Design == 0) /*低电平标志*/
{
if(High_num>0&&High_num<=a) /*软件去抖*/
Design = 1;
else
Low_num++; /*低电平计数加1*/
if(Low_num>=200) /*防止Low_num溢出*/
Low_num=200;
if(Low_num==1)
High_num=0; /*高电平计数清零*/
}
if(Design == 1) /*高电平标志*/
{
if(Low_num>0&&Low_num<=a) /*软件去抖*/
Design = 0;
else
{
High_num++; /*高电平计数加1*/
if(High_num>=200) /*防止High_num溢出*/
High_num=200;
if(High_num==1) /*若第一次高电平*/
{
low(); /*调用低电平处理函数*/
Low_num=0; /*低电平计数清零*/
}
high(); /*调用高电平处理函数*/
}
}
TR0=1;
}
/***************主函数******************/
void main(void)
{
TMOD = 0x21; /*定时器0方式1||定时器1方式2*/
TH0 = 0xDC;
TL0 = 0x00; /*定时10ms*/
EA = 1; /*CPU开中断*/
ET0 = 1; /*T/C0开中断*/
TR0 = 1; /*启动T/C0*/
TH1 = 0xFD;
TL1 = 0xFD; /*设置波特率为9600*/
SCON = 0xD8;
PCON = 0x00; /*设置串行口工作方式*/
TR1 = 1;
while(1)
{
if(P1_0 == 0)
{
Space_flag=0; /*清字符间隔位*/
Design = 0; /*低电平标志*/
}
else
Design = 1; /*高电平标志*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -