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

📄 zd8212.c

📁 采用MICROCHIP单片机
💻 C
📖 第 1 页 / 共 2 页
字号:
// --------------------------------------
// Function: H4001 64位RFID只读卡读头
// MCU:   PIC16F690
// Crystal: 12Mhz
// Designed by: yuzhengting
// Date:  2009/2/16
// --------------------------------------
// Compiler:
// PICC 9.6
// RFID基站芯片:U2270B  
// --------------------------------------
#include <pic.h>
#include "config.h"
/*********************************************************************************************************
** Function name : interrupt ISR(void)
** Descriptions  : 中断入口函数
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void interrupt ISR(void)
{
  if (TMR2IE && TMR2IF) //判TMR0 中断
  {
    TMR2IF = 0; //清除TMR0 中断标志   
    CLRWDT();
    clk_10ms++;
    clk_20ms++;
    clk_50ms++;
    clk_100ms++;
    clk_500ms++;    
    if(clk_20ms >= 4)
    {
      clk_20ms  = 0;
      flag_20ms = 1;
    }
    if(clk_50ms >= 10)
    {
      clk_50ms  = 0;
      flag_50ms = 1;
    }
    if(clk_100ms >= 20)
    {
      clk_100ms  = 0;
      flag_100ms = 1;
    }
    if(clk_500ms >= 100)
    {
      clk_500ms  = 0;
      flag_500ms = 1;
      clk_2s++;
      if(clk_2s > 6)
      {
        if(flag_card)
        {
          flag_card = 0;
        }
      }
    }
  }
}
/*********************************************************************************************************
** Function name : time_dly
** Descriptions  : 1ms延时程序
** Input         : 延迟计数
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void time_dly(uint delay_cnt)       //1ms延时
{
  uchar ncount;
  while(delay_cnt--)
  {
    CLRWDT();        
    for(ncount=240; ncount>0;ncount--);          
    CLRWDT();
  }
}
/*********************************************************************************************************
** Function name : init_io
** Descriptions  : 初始化IO口
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void init_io(void)
{
  ANSEL  = 0;
    
  ANSELH = 0;
  
  TRISA0 = 1;
	
  TRISA1 = 0;
  
  TRISA2 = 1;
  
  TRISA3 = 1;

  TRISA4 = 0;
  
  TRISA5 = 0;
  
  TRISB0 = 0;
  
  TRISB4 = 0;
	
  TRISB5 = 0;	
  
  TRISC0 = 1;
  
  TRISC1 = 0;
        
  TRISC4 = 1;
	
  TRISC5 = 0;
  
  TRISC6 = 0;
  
  TRISC7 = 1;
       
  BEEP_0();
    
  WD00 = 1;
    
  WD10 = 1;
}
/*********************************************************************************************************
** Function name : init_t1
** Descriptions  : 初始化定时器1
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void init_t1(void)
{    
  TMR1H   = 0XFA;
	
  TMR1L   = 0X17;
	
  T1CON   = 0X01;
	
  TMR1IE  = 0;
}
/*********************************************************************************************************
** Function name : init_t2
** Descriptions  : 初始化定时器2
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void init_t2(void)
{
  TMR2IF = 0;
  
  T2CON = 0X75;
  
  PR2   = 230;
  
  TMR2  = 0X00;
    
  PEIE  = 1;
  
  TMR2IE = 1;  
}
/*********************************************************************************************************
** Function name : init_ram
** Descriptions  : 初始化RAM
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void init_ram(void)
{
  flag_beep     = 0;
  clk_10ms      = 0;
  clk_20ms      = 2;
  clk_50ms      = 4;
  clk_100ms     = 8;
  clk_2s        = 8;
  buzzer_cycle  = 1;
  flag_beep     = 1;
  MOTOR_F_BUF   = 1;
  MOTOR_R_BUF   = 1;
}
/*********************************************************************************************************
** Function name : s_mode
** Descriptions  : 选择输出模式
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
** Comment       : 系统默认输出为韦根输出
********************************************************************************************************/
void s_mode(void)
{
  if(MODE)
  {
    flag_vg   = 1;
    flag_uart = 0;
  }
  else
  {
    flag_uart = 1;
    flag_vg   = 0;
  }
}
/*********************************************************************************************************
** Function name : init_uart
** Descriptions  : 初始化串口通讯
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void init_uart(void)
{
  TXEN  = 1;
  SYNC  = 0;
  SPEN  = 1;
  SPBRG = 17;
}
/*********************************************************************************************************
** Function name : initial
** Descriptions  : 初始化单片机
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void initial(void)
{
  init_io();
  init_t2();
  init_t1();
  init_ram();
  init_uart();
  s_mode();
  RX_E();
}
/*********************************************************************************************************
** Function name : TaskBEEP
** Descriptions  : 蜂鸣器进程
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void TaskBEEP(void)
{
  uchar i;
  CLRWDT();
  if(flag_beep)
  {
    CLRWDT();
    buzzer_cnt++;
    if(buzzer_cnt<20)
    {
      CLRWDT();
      i=buzzer_cnt<<1;
      if(i<20)
      {
        BEEP_1();
      }
      if(i>20)
      {
        BEEP_0();
      }
    }
    else if(buzzer_cnt >= 20)
    {
      CLRWDT();
      buzzer_cnt =0;
      if(buzzer_cycle>1)
      {
        buzzer_cycle--;
      }
      else
      {
        flag_beep = 0;
      }
    }
  }
  else
  {
    CLRWDT();
    BEEP_0();
  }
}
/*********************************************************************************************************
** Function name : set_decode
** Descriptions  : 为数组decode赋值
** Input         : 缓存
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void set_decode(uchar buf)
{
  uchar i;
	
  CLRWDT();
	
  i = line_num /8;
  switch(vir_num)
  {
  case 0: decode[i].onebit.b0 = buf; line_num++; vir_num++; break;
  case 1: decode[i].onebit.b1 = buf; line_num++; vir_num++; break;
  case 2: decode[i].onebit.b2 = buf; line_num++; vir_num++; break;
  case 3: decode[i].onebit.b3 = buf; line_num++; vir_num++; break;
  case 4: decode[i].onebit.b4 = buf; line_num++; vir_num++; break;
  case 5: decode[i].onebit.b5 = buf; line_num++; vir_num++; break;
  case 6: decode[i].onebit.b6 = buf; line_num++; vir_num++; break;
  case 7: decode[i].onebit.b7 = buf; line_num++; vir_num = 0; break;
  }
}
/*********************************************************************************************************
** Function name : gethead
** Descriptions  : 获取同步头信息
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void gethead(void)
{
  uchar i;
  uchar x,y;
  
  CLRWDT();
  
  for(i=0; i<64; i++)
  {
    x = i / 8;
    y = i % 8;
    switch(y)
    {
    case 0: 
      if ((decode[x].onebit.b0 == 0) & (decode[x].onebit.b1 == 1)
          & (decode[x].onebit.b2 == 1) & (decode[x].onebit.b3 == 1)
            & (decode[x].onebit.b4 == 1) & (decode[x].onebit.b5 == 1)
              & (decode[x].onebit.b6 == 1) & (decode[x].onebit.b7 == 1)
                & (decode[x+1].onebit.b0 == 1) & (decode[x+1].onebit.b1 == 1))
      {
        line_num = x + 1;
        vir_num  = 2;
        goto GETHEADEND;
      }
      break;
    case 1: 
      if ((decode[x].onebit.b1 == 0) & (decode[x].onebit.b2 == 1)
          & (decode[x].onebit.b3 == 1) & (decode[x].onebit.b4 == 1)
            & (decode[x].onebit.b5 == 1) & (decode[x].onebit.b6 == 1)
              & (decode[x].onebit.b7 == 1) & (decode[x+1].onebit.b0 == 1)
                & (decode[x+1].onebit.b1 == 1) & (decode[x+1].onebit.b2 == 1))
      {
        line_num = x + 1;
        vir_num  = 3;
        goto GETHEADEND;
      }
      break;
    case 2: 
      if ((decode[x].onebit.b2 == 0) & (decode[x].onebit.b3 == 1)
          & (decode[x].onebit.b4 == 1) & (decode[x].onebit.b5 == 1) 
            & (decode[x].onebit.b6 == 1) & (decode[x].onebit.b7 == 1)
              & (decode[x+1].onebit.b0 == 1) & (decode[x+1].onebit.b1 == 1)
                & (decode[x+1].onebit.b2 == 1) & (decode[x+1].onebit.b3 == 1))
      {
        line_num = x + 1;
        vir_num  = 4;
        goto GETHEADEND;
      }
      break;
    case 3: 
      if ((decode[x].onebit.b3 == 0) & (decode[x].onebit.b4 == 1) 
          & (decode[x].onebit.b5 == 1) & (decode[x].onebit.b6 == 1)  
            & (decode[x].onebit.b7 == 1) & (decode[x+1].onebit.b0 == 1) 
              & (decode[x+1].onebit.b1 == 1) & (decode[x+1].onebit.b2 == 1) 
                & (decode[x+1].onebit.b3 == 1) & (decode[x+1].onebit.b4 == 1))
      {
        line_num = x + 1;
        vir_num  = 5;
        goto GETHEADEND;
      }
      break;
    case 4: 
      if ((decode[x].onebit.b4 == 0) & (decode[x].onebit.b5 == 1)
          & (decode[x].onebit.b6 == 1) & (decode[x].onebit.b7 == 1)  
            & (decode[x+1].onebit.b0 == 1) & (decode[x+1].onebit.b1 == 1)
              & (decode[x+1].onebit.b2 == 1) & (decode[x+1].onebit.b3 == 1)
                & (decode[x+1].onebit.b4 == 1) & (decode[x+1].onebit.b5 == 1))
      {
        line_num = x + 1;
        vir_num  = 6;
        goto GETHEADEND;
      }
      break;
    case 5: 
      if ((decode[x].onebit.b5 == 0) & (decode[x].onebit.b6 == 1) 
          & (decode[x].onebit.b7 == 1) & (decode[x+1].onebit.b0 == 1) 
            & (decode[x+1].onebit.b1 == 1) & (decode[x+1].onebit.b2 == 1)
              & (decode[x+1].onebit.b3 == 1) & (decode[x+1].onebit.b4 == 1)
                & (decode[x+1].onebit.b5 == 1) & (decode[x+1].onebit.b6 == 1))
      {
        line_num = x + 1;
        vir_num  = 7;
        goto GETHEADEND;
      }
      break;
    case 6: 
      if ((decode[x].onebit.b6 == 0) & (decode[x].onebit.b7 == 1) 
          & (decode[x+1].onebit.b0 == 1) & (decode[x+1].onebit.b1 == 1) 
            & (decode[x+1].onebit.b2 == 1) & (decode[x+1].onebit.b3 == 1) 
              & (decode[x+1].onebit.b4 == 1) & (decode[x+1].onebit.b5 == 1) 
                & (decode[x+1].onebit.b6 == 1) & (decode[x+1].onebit.b7 == 1))
      {
        line_num = x + 2;
        vir_num  = 0;
        goto GETHEADEND;
      }
      break;
    case 7: 
      if ((decode[x].onebit.b7 == 0) & (decode[x+1].onebit.b0 == 1)	  
          & (decode[x+1].onebit.b1 == 1) & (decode[x+1].onebit.b2 == 1) 
            & (decode[x+1].onebit.b3 == 1) & (decode[x+1].onebit.b4 == 1) 
              & (decode[x+1].onebit.b5 == 1) & (decode[x+1].onebit.b6 == 1)
                & (decode[x+1].onebit.b7 == 1) & (decode[x+2].onebit.b0 == 1))
      {
        line_num = x + 2;
        vir_num  = 1;
        goto GETHEADEND;
      }
      break;
    }
  }
GETHEADEND:
  if(line_num == 0)
  {
    CLRWDT();
    err_cnt++;
  }
}
/*********************************************************************************************************
** Function name : TaskCARD
** Descriptions  : 获取卡号任务
** Input         : 无
** Output        : 无
** Created Date  : 2009-02-16
********************************************************************************************************/
void TaskCARD(void)
{
  uchar i;
  uint  temp;
  uchar buf;
  i = 0;
	
  RFW_1();
	
  for(i=0; i<16; i++)
  {
    decode[i].onebit.b0  = 1;
    decode[i].onebit.b1  = 1;
    decode[i].onebit.b2  = 1;
    decode[i].onebit.b3  = 1;
    decode[i].onebit.b4  = 1;
    decode[i].onebit.b5  = 1;
    decode[i].onebit.b6  = 1;
    decode[i].onebit.b7  = 1;
  }
	
  half = 0;
  lastbit = 0;	
  err_cnt = 0;
  line_num = 0;
  vir_num = 0;
	
  TMR1H = 0X00;	
  TMR1L = 0X00;

  for(i=0; i<192; i++)
  {
    CLRWDT();
    	
    clk_10ms  = 0;
    flag_10ms = 0;
    while(RFID != lastbit)
    {
      if(clk_10ms >=2)
      {
        goto TaskCARDEND;
      }
    }
    
    CLRWDT();
		
    temp = TMR1H;
    temp = ((temp << 8) | TMR1L);
		
    TMR1H = 0X00;
    TMR1L = 0X00;
	    
    if(((temp > TIME1) && (temp < TIME2)) || ((temp > TIME3) && (temp < TIME4)))
    {
      if((temp > TIME1) && (temp < TIME2))
      {
        if(half==1)
        {
				
          half=0;
          if(lastbit)
          {
            set_decode(1);	
          }
          else
          {
            set_decode(0);	
          }
        } 
        else
        {
          half=1;
        }
      }
      else
      {
        if(half == 1)
        {
          if(lastbit)
          {
            set_decode(0);
          }
          else
          {
            set_decode(1);
          }
        }
        else
        {
          err_cnt++;
          i = 0;
          line_num = 0;
          vir_num = 0;
          if(err_cnt >2)
          {
            goto TaskCARDEND;
          }
        }
        half = 1;
      }

⌨️ 快捷键说明

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