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

📄 carddeal.c

📁 采用430单片机完成的门禁控制器程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//------------------------------------------------------------------------------
//读卡程序 
//------------------------------------------------------------------------------
void GETCARD()
{
  ulong j;
  uchar card_scan;
  _DINT();
  for(j=0;j<5;j++)
  {
    card_scan =P1IN&0x0f;
  }  
  j=0x01;
  if(card_scan!=0x0f)
  {
    switch(card_scan)
    {              
    case 7 :  cardin |=j<<(25-card_cnt); break;
    case 11:  break;
    case 13:  cardout |=j<<(25-card_cnt); break;    
    case 14:  break;
    }
    card_cnt++;
    for(card_scan=P1IN&0X0F;card_scan!=0x0f;card_scan=P1IN&0X0F); //等待数据线为高  
  }
  if(card_cnt>=26)
  {
    card_cnt=0;
    if(cardin !=0)
    {
      if( FLAG & gb_card)    //內門刷卡器加巡更卡
      {
        cardin = ((cardin >> 1) & 0xffffff);
        card_buf[0] = 0x00;
        card_buf[1] = ((cardin >> 16) & 0xff);
        card_buf[2] = ((cardin >> 8) & 0xff);
        card_buf[3] = (cardin & 0xff);
        card_buf[4] = 0xff;
        cardin      = 0;
        clk_20s      = 10;
        FLAG        |= gb_lock;
        FLAG |= gb_addnom;
      }
      else
      {
        FLAG1 |=gb_cardin;
      }
    }
    if(cardout !=0)
    {
      if( FLAG & gb_card)  //外門刷卡器加正式卡
      {
        cardout = ((cardout >> 1) & 0xffffff);
        card_buf[0] = 0x00;
        card_buf[1] = ((cardout >> 16) & 0xff);
        card_buf[2] = ((cardout >> 8) & 0xff);
        card_buf[3] = (cardout & 0xff);
        card_buf[4] = 0xff;
        cardout      = 0;
        clk_20s      = 10;
        FLAG        |= gb_lock;
        FLAG |= gb_addvip;
      }
      else
      {
        FLAG1 |=gb_cardout;
      }
    }
  }
  _EINT();
}
/********************************************************/
/**********获取监控状态程序******************************/
/********************************************************/
void GETSTATUS()
{
  uchar i;
  uchar buf;
  for(i=0; i<10; i++)
  {
    buf = P1IN;
  }
  buf &= 0x30;
  if(conone & BIT6)
  {
    if(buf & 0x10)//红外状态
    {
      if(conone & BIT2)
      {
        STATUS |=0X09;
      }
      else
      {
        STATUS |=0X00;
      }
    }
  }
  if(buf & 0x20)//门状态
  {
    if(conone & BIT3)
    {
      STATUS |=0X70;
    }
    else
    {
      STATUS |=0X30;
    }
  }
}
/******************************************************/
/**********获取状态量**********************************/
/******************************************************/
void ERRORSTATUS()
{
  uchar i;
  uchar buf;
  /**此处的程序有待改善*****/
  for(i=0; i<10; i++)
  {
    buf = P2IN;
  }
  buf &= 0x40;
  switch(buf)
  {
    case 0x00: STATUS |= 0X02; break; //按键按下
    case 0x40: STATUS |= 0X00; break; //案件松开
  }
}
//------------------------------------------------------------------------------
//卡号奇偶校验
//------------------------------------------------------------------------------
uchar card_chk(uint i)
{
  uchar j=0;
  uchar m;
  for(m=0;m<12;m++)
  {    
    if(i&0x01)
      j++;
   i >>=1;       
   }
  return j;
}
//------------------------------------------------------------------------------
//判断卡号是否合法
//------------------------------------------------------------------------------
uchar CARD_DEAL(ulong card)
{
  uint  i;
  uchar j;
  i = (card>>13)&0xfff;  //13-24位的奇校验
  j =card_chk(i);
  j %= 2;
  if(j == (card>>25))
  {
    i = (card>>1)&0xfff;  //1-12位的偶校验
    j =card_chk(i);
    j %= 2;
    if(j == 0)
    {
      j =1;
    }
    else
    {
      j =0;
    }
    if(j == (card & 0x01))
    {
      return 1;
    }
  }
  return 0;
}
/******************************************************/
/*****读取卡号并比较,存在返回1,不存在返回0************/
/******************************************************/
uchar card_read040(ulong addr39, ulong card, ulong ncount)
{
  uchar card_buf[4];
  uchar card_pre[5];
  uchar j;
  uint  i;
  card_buf[0] = 0x00;
  card_buf[1] = (card >> 16)& 0xff;        
  card_buf[2] = (card >> 8)& 0xff;
  card_buf[3] = card & 0xff;
  for(i=0; i<ncount; i++)
  {
    for(j=0; j<5; j++)
    {
      card_pre[j] = read040(addr39++);
    }
    if((card_pre[0] == card_buf[0]) && (card_pre[1] == card_buf[1])
       && (card_pre[2] == card_buf[2]) && (card_pre[3] == card_buf[3]))
    {
      index_vip = card_pre[4];
      return 1;
    }
  }
  return 0;
}
/**********************************************************/
/*****判断卡号是否存在*************************************/
/******正式卡号返回0***************************************/
/*****非正式卡号返回1**************************************/
/*****不存在返回2******************************************/
/**********************************************************/
uchar card_read(ulong card)
{
  ulong addr39;
  addr39 =0;
  if(card_read040(addr39,card,nvip))
  {
    return 0;
  }
  addr39 = 0x2000;
  if(card_read040(addr39,card,nnom))
  {
    return 1;
  }
  addr39 = 0x4000;
  if(card_read040(addr39,card,nyvip))
  {
    return 3;
  }
  addr39 = 0x6000;
  if(card_read040(addr39,card,nynom))
  {
    return 4;
  }
  else
  {
    return 2;
  }
}
/**********************************************************/
/********* 判断时间是否在允许开门得时段内******************/
/**********************************************************/
uchar card_chktime(ulong addr39, uchar ncount, uint timebuf)
{
  uchar i;
  uchar j;
  uchar buf[4];
  uint  buf2;
  uint  buf3;
  ulong addrrrr;
  addrrrr = addr39;
  for(j=0; j<ncount; j++)
  {
    for(i=0; i<4; i++)
    {
      buf[i] = read040(addrrrr++);
    }
    buf2 = buf[0];
    buf2 = ((buf2 << 8) | buf[1]);
    buf3 = buf[2];
    buf3 = ((buf3 << 8) | buf[3]);
    if((timebuf > buf2) && (timebuf < buf3))
    {
      return 1;
    }
  }
  for(i=0; i<4; i++)
  {
    buf[i] = read040(addr39++);
  }
  if((buf[0] == 0xff) && (buf[1] == 0xff)
  && (buf[2] == 0xff) && (buf[3] == 0xff))
  {
    return 1;
  }
  return 0;
}
/**********************************************************/
/******判断是否为节假日************************************/
/*********是节假日返回1************************************/
/*********非节假日返回0************************************/
/**********************************************************/
uchar card_chkhol()
{
  uchar i;
  for(i=0; i<40; i++)
  {
    if((clock[4] == holiday[i][0]) 
        && (clock[3] == holiday[i][1]))
    {
      return 1;
    }
  }
  return 0;
}
/**********************************************************/
/******判断卡号是否能在现时间开门**************************/
/*****能开门返回1******************************************/
/*****不能开门返回0****************************************/
/**********************************************************/
uchar card_chkvip()
{
  uchar i;
  uint buf1;
  ulong addr39;
  i = (index_vip & 0xc0);
  if(i == 0x40)
  {
    i = (index_vip & 0x0f);
    FLAG        |= gb_re1302;
    BurstWriteTime();
    buf1 = clock[2];
    buf1 = ((buf1<<8)|clock[1]);
    addr39 = 0x9000 + i*168 + (clock[5]-1)*24;
    if(card_chktime(addr39, 6, buf1))
    {
      return 1;
    }
  }
  else if(i == 0x80)
  {
    i = (index_vip & 0x03);
    FLAG        |= gb_re1302;
    BurstWriteTime();
    if(card_chkhol())
    {
      addr39 = 0x8000;
    }
    else
    {
      addr39 = 0x8000 + (i+1)*16;
    }
    buf1 = clock[2];
    buf1 = ((buf1<<8)|clock[1]);
    if(card_chktime(addr39, 4, buf1))
    {
      return 1;
    } 
  }
  else if(i == 0xc0)
  {
    return 1;
  }
  return 0;
}
//------------------------------------------------------------------------------
/**************内门刷卡处理******************************/
//------------------------------------------------------------------------------
void CARDIN_DEAL()
{
  if(FLAG1 & gb_cardin)
  {
    FLAG1 &=~gb_cardin;
    uchar i;
    if(CARD_DEAL(cardin)) //判断卡号是否合法 
    {
      cardin = (cardin >> 1) & 0xffffff;
      i = card_read(cardin);   //判断卡号是否存在
      if(i == 0)   //卡号是正式卡号
      {
        if(card_chkvip())
        {
          FLAG |= gb_lock;
          REMARK = 0X00;
          STATUS =0X02;
          GETSTATUS(); 
        }
        else
        {
          REMARK = 10;
          STATUS = 0x02;
          ERRORSTATUS();
        }      
      }
      else if(i == 1)  //卡号是巡更卡号
      {
        REMARK = 0X00;
        STATUS =0X00;
        GETSTATUS();
      }
      else if(i == 2)  //卡号为无效卡号
      {
        REMARK = 0x08;
        STATUS = 0;
        ERRORSTATUS();
      }
    }
    FLAG        |= gb_re1302;
    FLAG        |= gb_buzzer;
    FLAG1       |= gb_wrmsg; 
    buzzer_cycle = 1;
    cardnum      = cardin;
    recordbuf = 0x00;
    cardin       = 0;
  }
}
/**********************************************************/
/****外门刷卡处理******************************************/
/**********************************************************/
void CARDOUT_DEAL()
{
  if(FLAG1&gb_cardout)
  {
    FLAG1 &=~gb_cardout;
    uchar i;
    
    if(CARD_DEAL(cardout))  //判断卡号是否合法
    {
      cardout = (cardout >> 1) & 0xffffff;
      i = card_read(cardout);  //判断卡号是否存在
      if(i == 0)   //卡号是正式卡号
      {
        if(card_chkvip())
        {
          FLAG  |= gb_lock;
          FLAG1 |= gb_protect;
          FLAG2 |= gb_doorval;
          REMARK = 0X00;
          STATUS = 0X00;
          GETSTATUS(); 
        }
        else
        {
          REMARK = 10;
          STATUS = 0;
          ERRORSTATUS();
        }      
      }
      else if(i == 1)  //卡号是巡更卡号
      {
        REMARK = 0X00;
        STATUS = 0X00;
        GETSTATUS();
      }
      else if(i == 2)  //卡号为无效卡号
      {        
        REMARK = 0X08;
        STATUS = 0;
        ERRORSTATUS();
      }              
    }
    FLAG        |= gb_re1302;
    FLAG        |= gb_buzzer;
    FLAG1       |= gb_wrmsg; 
    buzzer_cycle = 1;
    cardnum      = cardout;
    recordbuf = 0x00;
    cardout      = 0;
  }
}
/********************************************************/
/**********遥控器开门请求处理程序************************/
/*******************************************************/
void cardy_deal()
{
  if(FLAG2 & gb_cardyao)
  {
    FLAG2 &= ~gb_cardyao;
    uchar i;    
    
    i = card_read(cardyao);  //判断卡号是否存在
    if(i == 3)   //卡号是正式卡号
    {
      if(card_chkvip())  //判断卡号在当前时间内能否开门
      {
        FLAG  |= gb_lock;
        FLAG1 |= gb_protect;
        FLAG2 |= gb_doorval;
        REMARK = 0X00;
        STATUS = 0X04;
        GETSTATUS();
      }
      else
      {
        REMARK = 10;
        STATUS = 4;
        ERRORSTATUS();
      }      
    }
    else if(i == 4)  //卡号是巡更卡号
    {
      REMARK = 0X00;
      STATUS = 0X04;
      GETSTATUS();
    }
    else if(i == 2)  //卡号为无效卡号
    {        
      REMARK = 0X08;
      STATUS = 4;
      ERRORSTATUS();
    }
    FLAG        |= gb_re1302;
    FLAG        |= gb_buzzer;
    FLAG1       |= gb_wrmsg; 
    buzzer_cycle = 1;
    cardnum      = cardyao;
    recordbuf = 0x00;
    cardyao      = 0;
  }
}
/***************************************************/
/******判断卡号是否已存在***************************/
/***************************************************/
uchar cardexist(ulong addr39, uint ncount)
{
  uchar cardbuf[5];
  uchar x;
  uint  i;
  for(i=0; i<ncount; i++)
  {
    for(x=0; x<5; x++)
    {
      cardbuf[x] = read040(addr39++);
    }
    if((cardbuf[0]==card_buf[0]) && (cardbuf[1]==card_buf[1])
     && (cardbuf[2]==card_buf[2]) && (cardbuf[3]==card_buf[3]))
    {
      if(cardbuf[4]==card_buf[4])
      {
        return 0;
      }
      else 
      {
        addrbuf = addr39-1;
        return 1;
      }

⌨️ 快捷键说明

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