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

📄 uart0.c

📁 采用430单片机完成的门禁控制器程序
💻 C
📖 第 1 页 / 共 2 页
字号:
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]==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;
  uint 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 uart_set_par()
{
  uchar x;
  if(RX_DATA[12] == 0X45)
  {
    x = 32;
    if(uart_set_re(x))
    {
      RX_DATA[20] |=RX_DATA[19]<<4;
      SAVEP  = (RX_DATA[20] << 8);
      SAVEP |= (RX_DATA[17] << 4);
      SAVEP |= (RX_DATA[18]);
      RX_DATA[24] |= (RX_DATA[23]<<4);
      LOADP  = (RX_DATA[24] << 8);    
      LOADP |= (RX_DATA[21] << 4);
      LOADP |= (RX_DATA[22]);
      MF  = (RX_DATA[25] << 4);
      MF |= (RX_DATA[26]);
      set_par_re();
      FLAG1 |= gb_flashw;
    }
  }
  else
  {
    x = 28;
    if(uart_set_re(x))
    {
      RX_DATA[20] |= (RX_DATA[19]<<4);
      LOADP  = (RX_DATA[20] << 8);
      LOADP |= RX_DATA[17]<<4;
      LOADP |= RX_DATA[18];
      MF  = RX_DATA[21]<<4;
      MF |= RX_DATA[22];
      set_par_re();
      FLAG1 |= gb_flashw;
    }
  }
}
/********************************************************/
/*****************远程开门*******************************/
/********************************************************/
void uart_set_opdr()
{
  ulong i;
  i = 34;
  if(uart_set_re(i))
  {
    if((RX_DATA[17] ==0X00) && (RX_DATA[18] == 0X01))
    {
      FLAG |=gb_lock;
      FLAG |=gb_buzzer;
      buzzer_cycle = 1;
      clk_20s = delay_cnt;
      FLAG2 |= gb_doorval;
    }
    REMARK = 0X02;
    STATUS = 0;
    GETSTATUS();
    recordbuf = (RX_DATA[19]<<4);
    recordbuf |= (RX_DATA[20]);
    i         = (RX_DATA[21]<<4);
    i         |= (RX_DATA[22]);
    cardnum   =i;
    cardnum   <<= 24;
    i         = (RX_DATA[23]<<4);
    i         |= (RX_DATA[24]);
    cardnum   |= (i<<16);
    i         = (RX_DATA[25]<<4);
    i         |= (RX_DATA[26]);
    cardnum   |= (i<<8);
    i         = (RX_DATA[27]<<4);
    i         |= (RX_DATA[28]);
    cardnum   |= i;
    FLAG        |= gb_re1302;
    FLAG1       |= gb_wrmsg; 
    set_par_re();
  }
}
/************************************************/
/***********设置门锁继电器执行时间***************/
/************************************************/
void uart_set_delay()
{
  uchar i;
  i = 24;
  if(uart_set_re(i))
  {
    delay_cnt = (RX_DATA[17]<<4);
    delay_cnt |=(RX_DATA[18]);
    FLAG1 |= gb_flashw;
    set_par_re();
  }
}
/*******************************************************/
/***********设置开门后等待进入的延时时间****************/
/*******************************************************/
void uart_set_opde()
{
  uchar i;
  i = 24;
  if(uart_set_re(i))
  {
    wait_cnt = (RX_DATA[17]<<4);
    wait_cnt |=(RX_DATA[18]);
    FLAG1 |= gb_flashw;
    set_par_re();
  }
}
/**************************************************/
/********红外报警输出的被确认时间******************/
/**************************************************/
void uart_set_iren()
{
  uchar i;
  i = 24;
  if(uart_set_re(i))
  {
    iren_cnt = (RX_DATA[17]<<4);
    iren_cnt |= (RX_DATA[18]);
    FLAG1 |= gb_flashw;
    set_par_re();
  }
}
/**************************************************/
/*********设置异地报警的延时时间*******************/
/**************************************************/
void uart_set_alarmde()
{
  uchar i;
  i = 24;
  if(uart_set_re(i))
  {
    alarm_cnt = (RX_DATA[17]<<4);
    alarm_cnt |= RX_DATA[18];
    FLAG1 |= gb_flashw;
    set_par_re();
  }
}
/*****************************************************/
/**********设置工作日的准进时段***********************/
/*****************************************************/
void uart_set_work()
{
  uchar i;
  i = 56;
  uchar j;
  if(uart_set_re(i))
  {
   j = RX_DATA[18]*16;
   for(i=19; i<51; i++)
   {
     table_buf[j] = (RX_DATA[i++]<<4);
     table_buf[j++] |= RX_DATA[i];
   }
   set_par_re();
   if(RX_DATA[18] == 4)
   {
     FLAG1 |= gb_work;
   }
  }
}
/**********************************************/
/******设置非工作日的准进时段******************/
/**********************************************/
void uart_set_nowork()
{
  uchar i,j;
  i = 56;
  j = 0;
  if(uart_set_re(i))
  {
    if(RX_DATA[18] == 8)
    {
      FLAG2 |= gb_flashw;
      for(i=19; i<51; i++)
      {
        ircon[j] = (RX_DATA[i++]<<4);
        ircon[j++] |= RX_DATA[i];
      }
    }
    else if(RX_DATA[18] == 1)
    {
      for(i=19; i<51; i++)
      {
        table_buf[j] = (RX_DATA[i++]<<4);
        table_buf[j++] |= RX_DATA[i];
      }
    }
    set_par_re();
  }
}
/*******************************************/
/****设置星期准进时段***********************/
/*******************************************/
void uart_set_week()
{
  uchar i;
  uint j;
  i = 74;  
  if(uart_set_re(i))
  {
    j = RX_DATA[18]*168+(RX_DATA[20]-1)*24;
    for(i=21; i<69; i++)
    {
      table_buf[j] = (RX_DATA[i++]<<4);
      table_buf[j++] |= RX_DATA[i];
    }
    set_par_re();
    if((RX_DATA[18] == 0x04) && (RX_DATA[20] == 0x07))
    {
      FLAG1 |= gb_week;
    }
  }
}
/******************************************************/
/****设置星期内的休息日********************************/
/******************************************************/
void uart_set_rest()
{
  uchar i;
  i = 26;
  if(uart_set_re(i))
  {
    restday1 = RX_DATA[18];
    restday2 = RX_DATA[20];
    set_par_re();
    FLAG1 |= gb_flashw;
  }
}
/******************************************************/
/**********设置法定节假日******************************/
/******************************************************/
void uart_set_holiday()
{
  uchar i;
  uchar j;
  uchar buf;
  uchar buf1;
  i = 26;
  if(uart_set_re(i))
  {
    buf = (RX_DATA[17]<<4);
    buf |= RX_DATA[18];
    buf1 = (RX_DATA[19]<<4);
    buf1 |= RX_DATA[20];
    for(i=0; i<40; i++)
    {
      if((holiday[i][0]==0xff) && (holiday[i][1]==0xff))
      {
        j = i;
        break;
      }
    }
    for(i=0; i<j; i++)
    {
      if((holiday[i][0]==buf) && (holiday[i][1]==buf1))
      {        
        goto holidayend;
      }     
    }
    holiday[j][0] = buf;
    holiday[j][1] = buf1;
    FLAG1 |= gb_flashw;
  }
holidayend:
  set_par_re();
  return;
}
/************************************************************/
/***********删除节假日***************************************/
/************************************************************/
void uart_set_delhol()
{
  uchar i;
  uchar j;
  uchar buf;
  uchar buf1;
  i = 26;
  if(uart_set_re(i))
  {
    buf = (RX_DATA[17] << 4);
    buf |=(RX_DATA[18]);
    buf1 =(RX_DATA[19] << 4);
    buf1 |=(RX_DATA[20]);
    if((buf == 0) && (buf1 == 0))
    {
      for(i=0; i<40; i++)
      {
        holiday[i][0] = 0xff;
        holiday[i][1] = 0xff;
      }
      FLAG1 |= gb_flashw;
      set_par_re();
    }
    else 
    {
      for(i=0; i<40; i++)
      {
        if((buf == holiday[i][0]) && (buf1 == holiday[i][1]))
        {
          holiday[i][0] = 0xff;
          holiday[i][1] = 0xff;
          for(j=i; j<39; j++)
          {
            holiday[j][0] = holiday[j+1][0];
            holiday[j][1] = holiday[j+1][1];
          }
          holiday[39][0] = 0xff;
          holiday[39][1] = 0xff;
          FLAG1 |= gb_flashw;
          set_par_re();
          goto delholend;
        }
      }
      set_tx();
      TX_DATA[7] = 0X45;
      TX_DATA[8] = 0X35;
      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] = 0X39;
      TX_DATA[16] = 0X43;
      TX_DATA[17] = 0X0D;
      tx_len = 18;
      FLAG |= gb_tx;
    }   
  }
delholend:
  return;
}
/********************************************************/
/***********增加一个用户*********************************/
/********************************************************/
void uart_set_addcd()
{
  uint i;
  i = 54;
  if(uart_set_re(i))
  {
    card_buf[0]  = (RX_DATA[19] << 4);
    card_buf[0] |= RX_DATA[20];
    card_buf[1]  = (RX_DATA[21] << 4);
    card_buf[1] |= RX_DATA[22];
    card_buf[2]  = (RX_DATA[23] << 4);
    card_buf[2] |= RX_DATA[24];
    card_buf[3]  = (RX_DATA[25] << 4);
    card_buf[3] |= RX_DATA[26];
    card_buf[4]  = (RX_DATA[47] << 4);
    card_buf[4] |= RX_DATA[48];
    i = card_buf[4] & 0x30;
    if(i == 0x00)
    {
      if(card_buf[4] == 0x00)
      {
        FLAG |= gb_addnom;
      }
      else
      {
        FLAG |= gb_addvip;
      }
    }
    else if(i == 0x30)
    {
      if(card_buf[4] == 0x00)
      {
        FLAG |= gb_addynom;
      }
      else
      {
        FLAG |= gb_addyvip;
      }
    }
    
  }
}
/************************************************************/
/*********删除一个用户***************************************/
/************************************************************/
void uart_set_delcd()
{
  uchar i;
  i = 34;
  if(uart_set_re(i))
  {
    if(RX_DATA[18] == 0)
    {
      card_buf[0]  = (RX_DATA[21] << 4);
      card_buf[0] |= RX_DATA[22];
      card_buf[1]  = (RX_DATA[23] << 4);
      card_buf[1] |= RX_DATA[24];
      card_buf[2]  = (RX_DATA[25] << 4);
      card_buf[2] |= RX_DATA[26];
      card_buf[3]  = (RX_DATA[27] << 4);
      card_buf[3] |= RX_DATA[28];
      FLAG |= gb_delvip;

⌨️ 快捷键说明

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