⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 刚刚看了下最近的搜索
💻 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 + -