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

📄 main.c.bak

📁 多路语音控制及MAC地址加密以供上位机验证
💻 BAK
字号:
//-----------------------------------------------------
//| 海事局多路控制器
//| 程序名 - 
//| 版本 - 
//| 作者 - 樊伟
//| 建立日期 - 2008年9月26日
//| 修改日期 - 2008年910月19日
//|
//| 功能:1、根据上位机传来数据控制选择音源,打开或关闭指定通道。
//|   2、加密上位机传来的MAC。
//|
//| CPU - AT89C52
//| 晶振 - 11.0592MHz
//| 时钟 - 12时钟模式
//-----------------------------------------------------

#include <AT89X52.H> 
#include <string.h> 

//-------------------引脚定义---------------------------
sbit sousel    = P1^7;
sbit ch0       = P1^6;
sbit ch1       = P1^5;
sbit ch2       = P1^4;
sbit ch3       = P1^3;
sbit ch4       = P1^2;
sbit ch5       = P1^1;
sbit ch6       = P1^0;
sbit ch7       = P0^0;
sbit ch8       = P0^1;
sbit ch9       = P0^2;
sbit ch10      = P0^3;
sbit jt        = P0^4;
sbit rl0       = P0^5;
sbit rl1       = P0^6;
sbit rl2       = P0^7;
sbit rl3       = P2^0;
sbit rl4       = P2^1;
sbit rl10      = P2^2;
sbit rl9       = P2^3;
sbit rl8       = P2^4;
sbit rl7       = P2^5;
sbit rl6       = P2^6;
sbit rl5       = P2^7;
sbit sou       = P3^6;
sbit s42       = P3^7;

#define INBUF_LEN 9 //数据长度 

//----------------------变量定义----------------------
unsigned char inbuf[INBUF_LEN], swstr[INBUF_LEN]; 
unsigned char checksum,count, strleng; 
code unsigned char pos[6] = {3, 1, 5, 2, 4, 0};
code unsigned char ss[] = "GuoChao Soft co, V1.1!  ";
bit read_flag = 0 ; 
bit incept = 0;

//---------------------函数申明----------------------
unsigned char decode(void);
void delay(unsigned char x);
void init_serialcomm( void );
void send_char_com( unsigned char ch);
void send_string_com( unsigned char *str, unsigned int strlen);
void serial ();

//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数: init_serialcomm
//+ 功能: 串口参数设置
//+       
//+ 参数: 无
//+ 返回: 无
//+++++++++++++++++++++++++++++++++++++++++++++++++++++
void init_serialcomm( void ) 
{ 
  SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr 
  TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload 
  PCON |= 0x80 ; //SMOD=1; 
  TH1 = 0xFA ; //Baud:9600 fosc=11.0592MHz 
  IE |= 0x90 ; //Enable Serial Interrupt 
  TR1 = 1 ; // timer 1 run 
  // TI=1; 
} 

//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数: send_char_com
//+ 功能: 向串口发送一个字符
//+       
//+ 参数: ch
//+ 返回: 无
//+++++++++++++++++++++++++++++++++++++++++++++++++++++
void send_char_com( unsigned char ch) 
{ 
  SBUF=ch; 
  while (TI== 0 ); 
    TI= 0 ; 
} 

//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数: send_char_com
//+ 功能: 向串口发送一个字符串
//+       
//+ 参数: *str, strlen
//+ 返回: 无
//+++++++++++++++++++++++++++++++++++++++++++++++++++++
void send_string_com( unsigned char *str, unsigned int strlen) 
{ 
  unsigned int k= 0 ; 
  do 
  { 
    send_char_com(*(str + k)); 
    k++; 
  } while (k < strlen); 
} 


//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数: serial
//+ 功能: 串口接收中断函数
//+       
//+ 参数: 无
//+ 返回: 无
//+++++++++++++++++++++++++++++++++++++++++++++++++++++
void serial () interrupt 4 using 3 
{ 
  unsigned char i;
  if (RI) 
  { 
    unsigned char ch; 
    RI = 0 ; 
    ch=SBUF; 
    if (ch == 0x55 ) 
    { 
      incept = 1; 
      count = 0;
      for(i = 0; i < 7; i ++)
        inbuf[i] = 0x00;
    }
    if(incept)
    { 
      inbuf[count]=ch; 
      count++; 
    }
    if (count == 2)
    {
      if ((inbuf[1]  == 0x01) | (inbuf[1]  == 0x02))
      {
        if (inbuf[1]  == 0x01)        //验证串
          strleng = 5;
        if (inbuf[1]  == 0x02)        //命令字
          strleng = 9;
      }
      else
      {
        incept = 0;                 //第二字节无效,恢复接收状态
      }
    }
    if (count == strleng) 
    { 
      read_flag= 1 ; //如果串口接收的数据达到INBUF_LEN个,且校验没错, 
      incept = 0; 
    } 
  } 
} 

//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数: delay
//+ 功能: 延时函数
//+       
//+ 参数: x
//+ 返回: 无
//+++++++++++++++++++++++++++++++++++++++++++++++++++++
void delay(unsigned char x)
{
  while(x --);
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数: decode
//+ 功能: 解码上位机传来数据
//+       
//+ 参数: 无
//+ 返回: 无
//+++++++++++++++++++++++++++++++++++++++++++++++++++++
unsigned char decode(void)
{
  unsigned char i, tem, tem1, same = 0;

  if(read_flag & ((inbuf[1] & 0x03) == inbuf[1]) & ((inbuf[2] & 0x03) == inbuf[2])) //第2第3字节是否合法(整条数据是否合法)
  {
    if (strleng == 9)        //验证串,做编码
    {
      for(i = 0; i < strleng; i ++) 
      {
        swstr[i] = inbuf[pos[i] + 3];
      }
      swstr[0] = ~swstr[0];  //第0位取反
      tem = swstr[1] & 0x1f; //第1右5
      swstr[1] >>= 5;
      swstr[1] |= tem << 3;
      tem = swstr[2] & 0xb0; //第2位左2
      swstr[2] <<= 2;
      swstr[2] |= tem >> 4;
      tem = swstr[3] & 0x07; //第3位右3
      swstr[3] >>= 3;
      swstr[3] |= tem << 5;
      tem = swstr[4] & 0x3f; //第4位右6
      swstr[4] >>= 6;
      swstr[4] |= tem << 2;
      swstr[5] = ~swstr[5];
      send_string_com(swstr, 6);
    }    
    if (strleng == 5)        //命令串,解析
    {
      for (i = 0; i < 5; i ++)
      {
        if (swstr[i] != inbuf[i])
          {same = 1;}
        swstr[i] = inbuf[i];
      }
      if (same)
      {
        //通道0
        if (inbuf[3] & 0x80)
        {
          ch0 = 0;
          rl0 = 0;
        }
        else
        {
          ch0 = 1;
          rl0 = 1;
        }
        //通道1
        if (inbuf[3] & 0x40)
        {
          ch1 = 0;
          rl1 = 0;
        }
        else
        {
          ch1 = 1;
          rl1 = 1;
        }
        //通道2
        if (inbuf[3] & 0x20)
        {
          ch2 = 0;
          rl2 = 0;
        }
        else
        {
          ch2 = 1;
          rl2 = 1;
        }
        //通道3
        if (inbuf[3] & 0x10)
        {
          ch3 = 0;
          rl3 = 0;
        }
        else
        {
          ch3 = 1;
          rl3 = 1;
        }
        //通道4
        if (inbuf[3] & 0x08)
        {
          ch4 = 0;
          rl4 = 0;
        }
        else
        {
          ch4 = 1;
          rl4 = 1;
        }
        //通道5
        if (inbuf[3] & 0x04)
        {
          ch5 = 0;
          rl5 = 0;
        }
        else
        {
          ch5 = 1;
          rl5 = 1;
        }
        //通道6
        if (inbuf[3] & 0x02)
        {
          ch6 = 0;
          rl6 = 0;
        }
        else
        {
          ch6 = 1;
          rl6 = 1;
        }
        //通道7
        if (inbuf[3] & 0x01)
        {
          ch7 = 0;
          rl7 = 0;
        }
        else
        {
          ch7 = 1;
          rl7 = 1;
        }
        //通道8
        if (inbuf[4] & 0x80)
        {
          ch8 = 0;
          rl8 = 0;
        }
        else
        {
          ch8 = 1;
          rl8 = 1;
        }
        //通道9
        if (inbuf[4] & 0x40)
        {
          ch9 = 0;
          rl9 = 0;
        }
        else
        {
          ch9 = 1;
          rl9 = 1;
        }
        //通道10
        if (inbuf[4] & 0x20)
        {
          ch10 = 0;
          rl10 = 0;
        }
        else
        {
          ch10 = 1;
          rl10 = 1;
        }
        //监听通道
        if (inbuf[4] & 0x10)
        {
          jt = 0;
//          rl0 = 0;
        }
        else
        {
          jt = 1;
//          rl0 = 1;
        }
        //音源选择通道1音频
        if (inbuf[2] & 0x02)
        {
          sousel = 0;
          sou = 0;
        }
        else
        {
          sou = 1;
        }
        //音源选择通道1TTS
        if (inbuf[2] & 0x01)
        {
          sousel = 1;
          s42 = 0;
        }
        else
        {
          s42 = 1;
        }
      }
    
    }  
    read_flag = 0;
  }
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 函数: main
//+ 功能: 主函数
//+       
//+ 参数: 无
//+ 返回: 无
//+++++++++++++++++++++++++++++++++++++++++++++++++++++
void main(void) 
{ 
  init_serialcomm(); //初始化串口 
  send_string_com(ss, 24);
  P0 = 0xff;
  P1 = 0xff;
  P2 = 0xff;
  P3 = 0xff;
  while ( 1 ) 
  { 
    decode();
  } 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -