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

📄 uart0_rx.c

📁 采用430单片机完成的门禁控制器程序
💻 C
字号:
void RXRERE();
void uart_set_time();
void uart_read_time();
void uart_addvip();
void uart_addnom();
void uart_delvip();
void uart_delnom();
uchar uart_card();
void uart_card_error();
void uart_read();
void uart_set();

//------------------------------------------------------------------------------
//UART0程序
//------------------------------------------------------------------------------
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
  _DINT();
   RXRERE();
  _EINT();
}

/*******接收程序*************/
void RXRERE()
{
  uchar i,j;
  uchar rx_pre[7]={0x7e,0x31,0x30,addr1,addr,0x38,0x30};
  RX_DATA[0]=U0RXBUF;
  if(RX_DATA[0]==0xaa)
  {
    while (!(IFG1 & URXIFG0));
    RX_DATA[1]=U0RXBUF;
    if(RX_DATA[1]==0x01)
    {
      while (!(IFG1 & URXIFG0));
      RX_DATA[2]=U0RXBUF;
      if(RX_DATA[2]==0x01)
      {
        i =uart_card();
        if(i)
        {
          FLAG |= gb_addvip;
        }
        else
        {
          uart_card_error();
        }
      }
      else if(RX_DATA[2]==0x02)
      {
        i =uart_card();
        if(i)
        {
          FLAG |= gb_addnom;
        }
        else
        {
          uart_card_error();
        }
      }
    }
    else if(RX_DATA[1]==0x02)
    {
      while (!(IFG1 & URXIFG0));
      RX_DATA[2]=U0RXBUF;
      if(RX_DATA[2]==0x01)
      {
        i =uart_card();
        if(i)
        {
          FLAG |= gb_delvip;
        }
        else
        {
          uart_card_error();
        }
      }
      else if(RX_DATA[2]==0x02)
      {
        i =uart_card();
        if(i)
        {
          FLAG |= gb_delnom;
        }
        else
        {
          uart_card_error();
        }
      }
    }
  }
  else if(RX_DATA[0]==0x7e)
  {
    for(i=1;i<7;i++)
    {
      while (!(IFG1 & URXIFG0));
      RX_DATA[i]=U0RXBUF;
      if(RX_DATA[i] != rx_pre[i])
      {
        goto end;
      }
    }
    while (!(IFG1 & URXIFG0));
    RX_DATA[7]=U0RXBUF;
    while (!(IFG1 & URXIFG0));
    RX_DATA[8]=U0RXBUF;
    i=hex_c(RX_DATA[7]);
    j=hex_c(RX_DATA[8]);
    j |= i<<4;
    switch(j)
    {
      case 0x49: uart_set();  break;
      case 0x4a: uart_read(); break;      
    }               
  }
end:
  return;
}
/*************************************/
/*********接收设置命令****************/
/*************************************/
uchar uart_set_re(uchar x)
{
  uchar i;
  uint  j;
  uchar m;
  for(i=17;i<x;i++)
  {
    while (!(IFG1 & URXIFG0));
    RX_DATA[i]=U0RXBUF;
  }
  j =0;
  for(i=1;i<(x-5);i++)
  {
    j +=RX_DATA[i];
  }
  j %=0xffff;
  j ^=0xffff;
  j +=1;
  m=0;
  for(i=(x-5); i<(x-1); i++)
  {
    m |=hex_c(RX_DATA[i])<<((x-i-2)*4);
  }
  if(j==m)
  {
    if(RX_DATA[x-1]==0X0D)
    {
      for(i=17;i<(x-5);i++)
      {
        RX_DATA[i] =hex_c(RX_DATA[i]);
      }
      return 1;
    }
  } 
  return 0;
}
/***********接受设置时间命令**********/
void uart_set_time()
{
  uchar x;
  x = 38;
  if(uart_set_re(x))
  {
    FLAG |=gb_wr1302;
  }
}
/*********************************/
/****回复设置历史记录参数*********/
/*********************************/
void set_par_re()
{
  set_tx();
  TX_DATA[7] =0x30;
  TX_DATA[8] =0x30;
  TX_DATA[9] =0x30;
  TX_DATA[10] =0x30;
  TX_DATA[11] =0x30;
  TX_DATA[12] =0x30;
  TX_DATA[13] =0x46;
  TX_DATA[14] =0x44;
  TX_DATA[15] =0x42;
  TX_DATA[16] =0x36;
  TX_DATA[17] =0x0D;
  FLAG  |= gb_tx;
}
/********************************/
/****接收设置历史纪录参数命令****/
/********************************/
void uart_set_par()
{
  uchar x;
  x = 32;
  if(uart_set_re(x))
  {
    SAVEP |= RX_DATA[17]<<4;
    SAVEP = RX_DATA[18];
    SAVEP |= RX_DATA[19]<<12;
    SAVEP |= RX_DATA[20]<<8;
    LOADP |= RX_DATA[21]<<4;
    LOADP = RX_DATA[22];
    LOADP |= RX_DATA[23]<<12;
    LOADP |= RX_DATA[24]<<8;
    MF  = RX_DATA[25]<<4;
    MF |= RX_DATA[26];
    set_par_re();
    FLAG1 |= gb_flashw;
  }
  else
  {
    x = 28;
    if(uart_set_re(x))
    {
      LOADP |= RX_DATA[17]<<4;
      LOADP = RX_DATA[18];
      LOADP |= RX_DATA[19]<<12;
      LOADP |= RX_DATA[20]<<8;
      MF  = RX_DATA[21]<<4;
      MF |= RX_DATA[22];
      set_par_re();
      FLAG1 |= gb_flashw;
    }
  }
}
/********************************/
/********接受设置命令************/
/********************************/
void uart_set()
{
  uint i;
  uint j;
  for(i=9; i<17;i++)
  {
    while (!(IFG1 & URXIFG0));
    RX_DATA[i]=U0RXBUF;
  }
  i=hex_c(RX_DATA[13]);
  j=hex_c(RX_DATA[14]);
  j |= i<<4;
  if(j == 0xf1)
  {
    i=hex_c(RX_DATA[15]);
    j=hex_c(RX_DATA[16]);
    j |= i<<4;
    switch(j)
    {
      case 0xe0: uart_set_time(); break;
      case 0xf0: uart_set_par();  break;
    }
  }
}

/*******接收读取时间命令********/
void uart_read_time()
{
  uchar rx_pre[7]={0x30,0x30,0x46,0x43,0x33,0x44,0x0d};
  uchar i;
  for(i=0; i<7; i++)
  {
    while (!(IFG1 & URXIFG0));
    RX_DATA[i]=U0RXBUF;
    if(RX_DATA[i] != rx_pre[i])
    {
      goto retimeend;
    }
  }
  FLAG |=gb_re1302;
  FLAG |=gb_time_re;
retimeend:
  return;
}
/****读取卡号数目*********/
void uart_read_cdnum()
{
  uchar rx_pre[7]={0x30, 0x30, 0x46, 0x43, 0x33, 0x38, 0x0d };
  uchar j;
  uint i;
  for(i=0; i<7; i++)
  {
    while (!(IFG1 & URXIFG0));
    RX_DATA[i]=U0RXBUF;
    if(RX_DATA[i] != rx_pre[i])
    {
      goto retimeend;
    }
  }
  set_tx();
  TX_DATA[7] = 0x34;
  TX_DATA[8] = 0x41;
  TX_DATA[9] = 0x30;
  TX_DATA[10] = 0x30;
  TX_DATA[11] = 0x43;
  TX_DATA[12] = 0x30;
  TX_DATA[13] = 0x30;
  TX_DATA[14] = 0x34;
  i = nvip + nnom;
  j = (i>>12) & 0x0f;
  TX_DATA[15] = c_hex(j);
  j = (i>>8) & 0x0f;
  TX_DATA[16] = c_hex(j);
  j = (i>>4) & 0x0f;
  TX_DATA[17] = c_hex(j);
  j = i & 0x0f;
  TX_DATA[18] = c_hex(j);
  i=0;
  for(j=1; j<19; j++)
  {
    i +=TX_DATA[i];
  }
  i %=0xffff;
  i ^=0xffff;
  i +=1;
  j =(i>>12)&0x0f;
  TX_DATA[19]=c_hex(j);
  j =(i>>8)&0x0f;
  TX_DATA[20]=c_hex(j);
  j =(i>>4)&0x0f;
  TX_DATA[21]=c_hex(j);
  j =i&0x0f;
  TX_DATA[22]=c_hex(j);
  TX_DATA[23]=0X0D;
  tx_len =24;
  FLAG |=gb_tx;
retimeend:
  return;
}
/*************************/
/***顺序读取一条记录******/
/*************************/
void uart_read_meg()
{
  uchar rx_pre[5]={0x46, 0x43, 0x39, 0x42, 0x0D};
  uchar i;
  for(i=0; i<5; i++)
  {
    while (!(IFG1 & URXIFG0));
    RX_DATA[i]=U0RXBUF;
    if(RX_DATA[i] != rx_pre[i])
    {
      goto remegend;
    }
  }
  FLAG1 |=gb_remsg;
remegend:
  return;
}
/*************************************/
/*********读取历史记录参数************/
/*************************************/
void uart_read_megpar()
{
  uchar rx_pre[7]={0x30, 0x30, 0x46, 0x43, 0x33, 0x43, 0x0D};
  uchar i;
  for(i=0; i<7; i++)
  {
    while (!(IFG1 & URXIFG0));
    RX_DATA[i]=U0RXBUF;
    if(RX_DATA[i] != rx_pre[i])
    {
      goto megparend;
    }
  }
  FLAG1 |=gb_repar;
megparend:
  return;
}
/***接收读取信息命令******/
void uart_read()
{
  uint i;
  uint j;
  for(i=9; i<17;i++)
  {
    while (!(IFG1 & URXIFG0));
    RX_DATA[i]=U0RXBUF;
  }
  i=hex_c(RX_DATA[13]);
  j=hex_c(RX_DATA[14]);
  j |= i<<4;
  if(j == 0xf2)
  {
    i=hex_c(RX_DATA[15]);
    j=hex_c(RX_DATA[16]);
    j |= i<<4;
    switch(j)
    {
      case 0xe0: uart_read_time();  break;
      case 0xe5: uart_read_cdnum(); break; 
      case 0xe2: uart_read_meg();   break;
      case 0xe1: uart_read_megpar();break;
    }
  }
}
/***********************/
/****增加正式卡号*******/
/***********************/
uchar uart_card()
{
  uint  i;
  uint  j=0;
  uint  m=0;
  for(i=3; i<6; i++)
  {
    while (!(IFG1 & URXIFG0));
    RX_DATA[i]=U0RXBUF;
  }
  j |=RX_DATA[3]<<8;
  j |=RX_DATA[4]<<4;
  j |=RX_DATA[5];
  j =j*4+6;
  for(i=6; i<j+1; i++)
  {
    while (!(IFG1 & URXIFG0));
    RX_DATA[i]=U0RXBUF;
  }
  for(i=0; i<j; i++)
  {
    m +=RX_DATA[i];
  }
  m &=0xff;
  if(m == RX_DATA[j])
  {
    return 1;
  }
  else
  {
    return 0;
  }
}
/*****接收卡号错误******/
void uart_card_error()
{
  TX_DATA[0] = 0XAA;
  TX_DATA[1] = 0X03;
  TX_DATA[2] = 0X02;
  TX_DATA[3] = 0X00;
  TX_DATA[4] = 0X00;
  TX_DATA[5] = 0X00;
  TX_DATA[6] = 0XAF;
  FLAG  |=gb_tx;
  tx_len =7;  
}
/*********发送程序***********/
void uart0_tx()
{
  if(FLAG & gb_tx)
  {
    _DINT();
    FLAG &= ~gb_tx;
    uchar i ;
    P3OUT |=BIT3;
    for(i=0;i<tx_len;i++)
    {
      while (!(IFG1 & UTXIFG0));
      U0TXBUF=TX_DATA[i];
    }
    while(!(TXEPT&UTCTL0));
    P3OUT &=~BIT3;
    _EINT();
  }
}

⌨️ 快捷键说明

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