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

📄 zd8212.c

📁 采用MICROCHIP单片机
💻 C
📖 第 1 页 / 共 2 页
字号:
    }
    if(lastbit)
    {
      lastbit = 0;
    }
    else
    {
      lastbit = 1;
    }
  }
  flag_head = 1;
TaskCARDEND:
  TMR1H = 0XF4;
  TMR1L = 0X2F;
  return;
}
/*********************************************************************************************************
** Function name : TASKHEAD()
** Descriptions  : 获取卡号头信号
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void TASKHEAD(void)
{
  if(flag_head)
  {
    uchar i;
    uint  temp;
    flag_head = 0;
    err_cnt = 0;
    line_num = 0;
    vir_num = 0;
    
    CLRWDT();
	
    gethead();
	
    CLRWDT();
	
    if(err_cnt == 0)
    {
      for(i=0; i<54; i++)
      {
        switch(vir_num)
        {
        case 0: rfdecode[i] = decode[line_num].onebit.b0; vir_num++; break;
        case 1: rfdecode[i] = decode[line_num].onebit.b1; vir_num++; break;
        case 2: rfdecode[i] = decode[line_num].onebit.b2; vir_num++; break;
        case 3: rfdecode[i] = decode[line_num].onebit.b3; vir_num++; break;
        case 4: rfdecode[i] = decode[line_num].onebit.b4; vir_num++; break;
        case 5: rfdecode[i] = decode[line_num].onebit.b5; vir_num++; break;
        case 6: rfdecode[i] = decode[line_num].onebit.b6; vir_num++; break;
        case 7: rfdecode[i] = decode[line_num].onebit.b7; vir_num = 0; line_num++; break;
        }
      }
    
      CLRWDT();
		
      for (i=0;i<10;i++) 
      {
        if(!(rfdecode[i*5]^rfdecode[i*5+1]^rfdecode[i*5+2]^rfdecode[i*5+3]==rfdecode[i*5+4])) 
        {
          err_cnt++;
        }
      }
      for (i=0;i<4;i++) 
      {
        if (!(rfdecode[i]^rfdecode[i+5]^rfdecode[i+10]^rfdecode[i+15]^rfdecode[i+20]^rfdecode[i+25]^rfdecode[i+30]^rfdecode[i+35]^rfdecode[i+40]^rfdecode[i+45] == rfdecode[i+50])) 
        {
          err_cnt++;
        }
      }
      if(err_cnt == 0)
      {
        temp = 20;
        for(i=1; i<25; i++)
        {	
          if(temp % 5 == 4)
          {
            temp++;
          }
          cardinfo[i] = rfdecode[temp++];	   
  	
        }		    
		    
        CLRWDT();
		    	
        temp = 0;
      
        for(i=1; i<13; i++)
        {
          temp +=  cardinfo[i];	      
        }
        if(temp%2)
        {
          cardinfo[0] = 1;	
        }
        else
        {
          cardinfo[0] = 0;
        }  
        CLRWDT();
			
        temp = 0;
        for(i=13; i<25; i++)
        {
          temp +=  cardinfo[i];
        }
        if(temp%2)
        {
          cardinfo[25] = 0;	
        }
        else
        {
          cardinfo[25] = 1;
        }
        if(flag_card == 0)
        {
          flag_card    = 1;
          flag_out     = 1;
          flag_beep    = 1;
          buzzer_cycle = 2;
          clk_2s       = 0;	
        }
        else
        {
          clk_2s       = 0;
        }			
      }
    }
  }
}

/*********************************************************************************************************
** Function name : TASKIO
** Descriptions  : 驱动IO端口
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void TASKIO(void)
{
  BEEP       = beep_buf;
  DOOR_I_BUF = DOOR_I;
  SW_I_BUF   = SW_I;
  DOOR_O     = DOOR_O_BUF;
  MOTOR_F    = MOTOR_F_BUF;
  MOTOR_R    = MOTOR_R_BUF;
  L_BUF      = L;
  WD00       = 1;
  WD10       = 1;
}
/*********************************************************************************************************
** Function name : TASK5S
** Descriptions  : 门磁判断程序
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void TASK5S(void)
{
  if(flag_5s)
  {
    clk_5s_cnt++;
    if(clk_5s_cnt > 10)
    {
      flag_5s     = 0;
      clk_5s_cnt  = 0;
      flag_di     = 1;
    }
  }
}
/*********************************************************************************************************
** Function name : TASKDOOR
** Descriptions  : 门磁判断程序
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void TASKDOOR(void)
{
  if(door == DOOR_I_BUF)
  {
    door_cnt++;
    if(door_cnt >= 10)
    {
      if(door)
      {
        flag_door = 0;
      }
      else
      {
        flag_door = 1;
      }
    }
  }
  else
  {
    CLRWDT();
    door = DOOR_I_BUF;
    door_cnt =0;
  }
  if(sw == SW_I_BUF)
  {
    sw_cnt++;
    if(sw_cnt >= 10)
    {
      if(sw)
      {
        flag_sw = 0;
      }
      else
      {
        flag_sw   = 1;
        if(flag_open || flag_close)
        {
          flag_5s = 0;
        }
        else
        {
          if(flag_5s == 0)
          {
            flag_5s     = 1;
            clk_5s_cnt  = 0;
          }          
        }
//        open_cnt  = 0;
//        flag_open = 1;
//        flag_sw   = 1;
      }
    }
  }
  else
  {
    CLRWDT();
    sw = SW_I_BUF;
    sw_cnt =0;
  }
  
  if(flag_door || flag_sw)
  {
    DOOR_O_BUF = 0;
  }
  else
  {
    DOOR_O_BUF = 1;
  }
}
/*********************************************************************************************************
** Function name : TASKL
** Descriptions  : 开门判断程序
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void TASKL(void)
{
//  if(flag_l == 0)
//  {
  if(l_pre == L_BUF)
  {
    l_cnt++;
    if(l_cnt >= 5)
    {
      if(l_pre)
      {        
        flag_l      = 0;
        MOTOR_F_BUF = 0;
        MOTOR_R_BUF = 0;
      }
      else
      {   
        if(flag_l == 0)
        {
          open_cnt    = 0;
          MOTOR_F_BUF = 0;
          MOTOR_R_BUF = 1;
          flag_open   = 1;
          flag_l      = 1;
        }          
      }
    }
  }
  else
  {
    CLRWDT();
    l_pre = L_BUF;
    l_cnt =0;
  }
//  }  
}
/*********************************************************************************************************
** Function name : TASKOPEN
** Descriptions  : 开门判断程序
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void TASKOPEN(void)
{
  if(flag_open)
  {
    open_cnt++;
    if(open_cnt <= 10)
    {
      MOTOR_F_BUF = 0;
      MOTOR_R_BUF = 1;   
    }
    else
    {
      MOTOR_F_BUF = 0;
      MOTOR_R_BUF = 0;
    }
    if(open_cnt >= 40)
    {
      if(flag_sw)
      {
        close_cnt   = 0;     
      }
      else
      {
        open_cnt = 0;
      }     
    }
    if(open_cnt >= 100)
    {
      open_cnt    = 0;
      flag_di     = 1;
      close_cnt   = 0;
      flag_open   = 0; 
    }
  }
}
/*********************************************************************************************************
** Function name : TASKCLOSE
** Descriptions  : 关门判断程序
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void TASKCLOSE(void)
{
  if(flag_close)
  {
    close_cnt++;
    if(close_cnt <= 20)
    {
      MOTOR_F_BUF = 1;
      MOTOR_R_BUF = 0;
    }
    else
    {
      if(flag_sw)
      {
        close_cnt = 0;
      }
      else
      {
        MOTOR_F_BUF = 1;
        MOTOR_R_BUF = 1; 
        close_cnt  = 0;
        flag_close = 0;
      }
    }
  }
}
/*********************************************************************************************************
** Function name : TASKDI
** Descriptions  : 判断门磁信号以确定是否关门
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void TASKDI(void)
{
  if(flag_di)
  {
    if(flag_door)
    {
      MOTOR_F_BUF = 1;
      MOTOR_R_BUF = 0;
      flag_close  = 1;
      flag_di     = 0;
    }
  }
}
/*********************************************************************************************************
** Function name : VGOUT
** Descriptions  : 韦根输出
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void VGOUT(void)
{
  uchar i;
    
  CLRWDT();
		
  for(i=0; i<26; i++)
  {
    CLRWDT(); 
    switch(cardinfo[i])
    {
    case 0: WD00 = 0; time_dly(4); WD00 = 1; time_dly(4); break;
    case 1: WD10 = 0; time_dly(4); WD10 = 1; time_dly(4); break;
    }
  }
  CLRWDT(); 
}
/*********************************************************************************************************
** Function name : UARTOUT
** Descriptions  : 485输出卡号
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void UARTOUT(void)
{
  char  i;
  uchar j;
  
  CLRWDT();
  
  for(i=0; i<4; i++)
  {
    card[i] = 0;
  }
  
  CLRWDT();
  
  for(i=0; i<8; i++)
  {
    card[0] |= cardinfo[i] << i;
  }
  
  CLRWDT();
  
  for(i=8; i<16; i++)
  {
    card[1] |= cardinfo[i] << (i-8);
  }
  
  CLRWDT();
  
  for(i=16; i<24; i++)
  {
    card[2] |= cardinfo[i] << (i-16);
  }
  
  CLRWDT();
  
  for(i=24; i<26; i++)
  {
    card[3] |= cardinfo[i] << (i-24);
  }
  
  CLRWDT();
  
  while(TXIF==0);
  TX_E();
  for(i=0; i<4; i++)
  {
    CLRWDT();
    
    TXREG = card[i] ;
    while(TXIF == 0);
  }
  RX_E();
}
/*********************************************************************************************************
** Function name : TASKOUT
** Descriptions  : 输出卡号
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void TASKOUT(void)
{
  if(flag_out)
  {
    flag_out = 0;
    if(flag_vg)
    {
      VGOUT();
    }
    if(flag_uart)
    {
      UARTOUT();
    }
  }  
}
/*********************************************************************************************************
** Function name : main
** Descriptions  : 主程序
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void main(void)
{
  GIE = 0;	
  initial();		
  WDTCON = 0X0E;	
  SWDTEN = 1;	   
  GIE = 1;	
  while(1)
  { 	
    CLRWDT();
    TASKIO();
    if(flag_20ms)
    {
      flag_20ms = 0;
      TASKDI();
      TASKDOOR();
      TASKL();
    }
    
    if(flag_50ms)
    {
      flag_50ms = 0;
      TASKOPEN();
      TASKCLOSE();
      TASKHEAD();
      TaskBEEP();
    }
    
    if(flag_100ms)
    {
      flag_100ms = 0;
      TASKOUT();    
    }
    
    if(flag_500ms)
    {
      flag_500ms = 0;
      TASK5S();
      TaskCARD();
    }
  }
}

⌨️ 快捷键说明

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