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

📄 cardread.c

📁 采用430单片机完成的门禁控制器程序
💻 C
字号:
//------------------------------------------------------------------------------
//读卡程序 
//------------------------------------------------------------------------------
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)
    {
      FLAG1 |=gb_cardin;
    }
    if(cardout !=0)
    {
      FLAG1 |=gb_cardout;
    }
  }
  _EINT();
}
//------------------------------------------------------------------------------
//卡号奇偶校验
//------------------------------------------------------------------------------
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;
    }
    else
    {
      return 0;
    }
  }
  else
  {
    return 0;
  }
}
/*****读取卡号并比较,存在返回1,不存在返回0************/
uchar card_read040(ulong addr39, ulong card, ulong ncount)
{
  uchar card_buf[4];
  uchar card_pre[4];
  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=addr39; i<ncount+addr39; i++)
  {
    for(j=0; j<4; j++)
    {
      //(i*4-addr39*3+j)为读取的地址。如:addr39=0x800,i=0x804,j=0
      //则 i*4-addr39*3+j =0x810
      card_pre[j] = read040(i*4-addr39*3+j);
    }
    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]))
    {
      return 1;
    }
  }
  return 0;
}
/*****判断卡号是否存在**********/
uchar card_read(ulong card)
{
  ulong addr39;
  addr39 =0;
  if(card_read040(addr39,card,nvip))
  {
    return 0;
  }
  addr39 = 0x800;
  if(card_read040(addr39,card,nnom))
  {
    return 1;
  }
  else
  {
    return 2;
  }
}
//------------------------------------------------------------------------------
//内门刷卡处理
//------------------------------------------------------------------------------
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)
      {
        FLAG |=gb_buzzer;
        FLAG |=gb_lock;
        buzzer_cycle =1;
      }
      else if(i==1)
      {
        FLAG |=gb_buzzer;
        buzzer_cycle =1;
      }
      else if(i==2)
      {
        FLAG |=gb_buzzer;
        buzzer_cycle =2;
      }              
    }
    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)
      {
        FLAG |=gb_buzzer;
        FLAG |=gb_lock;
        buzzer_cycle =1;
      }
      else if(i==1)
      {
        FLAG |=gb_buzzer;
        buzzer_cycle =1;
      }
      else if(i==2)
      {
        FLAG |=gb_buzzer;
        buzzer_cycle =2;
      }              
    }
    cardout =0;
  }
}

⌨️ 快捷键说明

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