论坛首页 → RFID技术 → 技术研究 → H4001读写程序(AVR)
发表新的主题 发起新的投票 发起新的交易 发起新的任务 回复话题
 标题:H4001读写程序(AVR)上一篇 下一篇 
bennycen
等级:RFID游民
权限:普通用户
积分:32
金钱:29
声望:57
经验:8
发帖数:7
注册时间:2008-7-25
收藏 编辑 删除 楼主

// --------------------------------------
// Function: H4001 64位RFID只读卡读头
// MCU:   ATmega32
// Crystal: 7.3728Mhz
// Date:  2005/01/16
// --------------------------------------
// Compiler:
// ICCAVR 6.28C,6.31A
// RFID基站芯片:U2270B
// --------------------------------------

#include <iom32v.h>
#include <macros.h>
//variable definition
unsigned char timer_count,error=0,post=0,data1,rxdata,run=0;
unsigned char decode[192],head=0,rfiddata[54];
unsigned int  tcomp=0;
unsigned char lastbit=0,half=0;
const unsigned char ascii[16]="0123456789ABCDEF";
//pin definition
#define led() (PORTD^=0x80)
#define RFW (1<<6)                       
//RFW, RFID输出载波控制
#define RFW_1() (PORTC |=RFW)         
#define RFW_0() (PORTC &=~RFW)
#define beep (1<<4)                       
#define beep_1() (PORTC |=beep)
#define beep_0() (PORTC &=~beep)
#define okled (1<<0)
#define okled1() (PORTC |=okled)
#define okled0() (PORTC &=~okled)
//RFID_IN U2270B返回卡的未解调码
#define RFID_IN  (PINC&0x80)

void port_init(void)
{
 PORTA = 0xFF;
 DDRA  = 0x00;
 PORTB = 0xFF;
 DDRB  = 0x00;
 PORTC = 0xFF;
 DDRC  = 0x51;
 PORTD = 0x7F;
 DDRD  = 0x80;
}

//TIMER0 initialisation - prescale:1024
// WGM: Normal
// desired value: 10mSec
// actual value:  9.861mSec (1.4%)
void timer0_init(void)
{
 TCCR0 = 0x00; //stop
 TCNT0 = 0xB9; //set count
 OCR0  = 0x47;  //set compare
 TCCR0 = 0x05; //start timer
}

#pragma interrupt_handler timer0_ovf_isr:12
void timer0_ovf_isr(void)
{
     TCNT0 = 0xB9; //reload counter value
     timer_count++;
  if (timer_count>50) {     // 0.01*50=0.5sec,每0.5秒扫描一次是否有ID卡
//      led();
     timer_count=0;
        run=1;
        }
}

//TIMER1 initialisation - prescale:1
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1Hz
// actual value: Out of range
void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0x00 /*INVALID SETTING*/; //setup
 TCNT1L = 0x00 /*INVALID SETTING*/;
 OCR1AH = 0x00 /*INVALID SETTING*/;
 OCR1AL = 0x00 /*INVALID SETTING*/;
 OCR1BH = 0x00 /*INVALID SETTING*/;
 OCR1BL = 0x00 /*INVALID SETTING*/;
 ICR1H  = 0x00 /*INVALID SETTING*/;
 ICR1L  = 0x00 /*INVALID SETTING*/;
 TCCR1A = 0x00;
 TCCR1B = 0x01; //start Timer
}

//UART0 initialisation
// desired baud rate: 9600
// actual: baud rate:57600 (0.0%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)         //Uart初始化  
{
 UCSRB = 0x00; //disable while setting baud rate
 UCSRA = 0x00;
 UCSRC = 0x06;
 UBRRL = 0x07; //set baud rate lo,9600=0x2F,57600=0x07
 UBRRH = 0x00; //set baud rate hi
 UCSRB = 0x98;
}

#pragma interrupt_handler uart0_rx_isr:14 
void uart0_rx_isr(void)        //接收中断处理          
{
 //uart has received a character in UDR
   rxdata=UDR;
}


//call this routine to initialise all peripherals
void init_devices(void)              //初始化
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 timer0_init();
 timer1_init();
 uart0_init();
 MCUCR = 0x02;
 GICR  = 0x40;
 TIMSK = 0x01; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialised
}


void ldelay(unsigned int i)       //长延时
     {
     while(i--);
     }

void beeps(unsigned char i) {     //讯响
     while(i--) {
        beep_0();
        ldelay(60000);
     ldelay(60000);
     ldelay(60000);
     beep_1();
        ldelay(60000);
     ldelay(60000);
     ldelay(60000);
     }    
     }    
  
void wait_tx() {               //等待发送完一个字节
 while(!(UCSRA&0x40));
    UCSRA|=0x40;
 }   

 
void R_H4001()                    //读卡
    {             
     unsigned char i=0,j=0;
     unsigned int bits=0;
  data1=0;
  for (i=0;i<192;i++) {
         decode[i]=1;
  }  
  for (i=0;i<64;i++) {
         rfiddata[i]=0;
  }  
  RFW_1();
     data1=0;
  lastbit=0;
  TCNT1=0;
  half=0;
  j=0;
  for (bits=0;bits<256;bits++) {
    //  while (((!(PINC&0x80))==lastbit)& (TCNT1<20000)) { }            //low level 
    //   while (((!(PINC&0x80))==lastbit)& (TCNT1<20000)) { }
         while (((!(RFID_IN))==lastbit)& (TCNT1<20000)) { }             
      tcomp=TCNT1;
         TCNT1=0;
     if ((tcomp>1500 & tcomp<2500)|(tcomp>3000 & tcomp<5000)) {    //判断是否为合法跳变
   if (tcomp>1500 & tcomp<2500) {
          if (half==1) {
           half=0;
        decode[j]=lastbit;
        j++;
        }
       else
           half=1;  
      }
      else
       {                 // (tcomp>3000 & tcomp<5000)  
          if (half==1)
       {
                   if (lastbit==0) {
              decode[j]=1;
           }
          else
             {
        if (lastbit==1) {
           decode[j]=0;
                    }
       }
                   }
       else
       {
        decode[j]=0x0E;
        if (j<127) {
                       bits=0;
        }     
     else
        break;
     }
       j++;
       half=1;
          }
       }
   lastbit^=0x01;
         }

     j=0;
  head=0;
  post=0;
  error=0;
  for (i=0;i<128;i++)
      {                        //查找最后一个终止位(0),及9位(1)引导位
      if ((decode[i]==0)&(decode[i+1]==1)&(decode[i+2]==1)&(decode[i+3]==1)&(decode[i+4]==1)&(decode[i+5]==1)&(decode[i+6]==1)&(decode[i+7]==1)&(decode[i+8]==1)&(decode[i+9]==1)) {
       head=1;
    post=i+10;
    break;
       }
   }
   if (head==1) {
     for (i=0;i<54;i++) {
       if (decode[post+i]==0x0e) error++;
    rfiddata[i]=decode[post+i];
    }
         if (error==0) {          //H4001卡采用的二维行列偶校验码
    for (i=0;i<10;i++) { //先对10行数据进行校验
                 if (!(rfiddata[i*5]^rfiddata[i*5+1]^rfiddata[i*5+2]^rfiddata[i*5+3]==rfiddata[i*5+4])) error++;
     }
             for (i=0;i<4;i++) {  //再对4列数据进行校验
                 if (!(rfiddata[i]^rfiddata[i+5]^rfiddata[i+10]^rfiddata[i+15]^rfiddata[i+20]^rfiddata[i+25]^rfiddata[i+30]^rfiddata[i+35]^rfiddata[i+40]^rfiddata[i+45]==rfiddata[i+50])) error++;
                 }
    if (error==0) {
        beeps(1);
                 UDR=10;
                 wait_tx();
              UDR=13;
              wait_tx();
     for (i=0;i<10;i++) {    //对10行数据进行校验
            data1=(rfiddata[i*5]*8)+(rfiddata[i*5+1]*4)+(rfiddata[i*5+2]*2)+rfiddata[i*5+3];
                     UDR=ascii[data1%16];
      wait_tx();
     }
    }
      }
   }
 }

 
void int0_isr(void)
{
 //external interupt on INT0
}


void main(void)
{
    unsigned char i,j,t_i;
    init_devices();
    RFW_1();
    okled0();
 while (1) {
  if (run==1) {
   R_H4001();
   led(); 
   run=0;
   }
    }   
}


/* H4001卡有关信息,采用曼切斯特编码,125Khz,RF/64,位周期512uS
// 激光编程64位ID,前9位头全"1",10位行检验,4位列检验,1个终止位,
// 8位CustomID,32位ID信息,即10个十六进制编码
// 一个典型数据   111111111
//   CustomID    0      00000
//   CustomID    F      11111
//               0      00000
//               0      00000
//               4      01001
//               A      10100
//               D      11011
//               E      11101
//        1      00011
//        9      10010 
//               10100
*/    

2008-7-25 22:45:11IP: 保密
中国RFID网
等级:RFID技术总监
权限:管理员
积分:4044
金钱:1130
声望:410
经验:3667
发帖数:344
注册时间:2003-12-30
编辑 删除 引用 第2楼
支持,不错
这个社会将因我们的存在而更美好!
                                       中国电子标签网
                                        http://www.chinarfid.com.cn
2008-7-26 22:12:24IP:保密
 快速回复
  • 支持UBB,HTML标签

  • 高级回复
  • 内容

    操作选项: 加精 解精 奖惩 设专题 设公告 解公告 固顶 总固顶 解固顶 结帖 解结帖 锁帖 解锁 移帖 删帖

    Copyright © 2004-2005  Chinarfid.com.cn Powered By: 中国电子标签网论坛|RFID论坛 Version 4.0

    首页 | 网站简介 | 客服中心 | 网站地图 | 广告服务 | 投诉建议 | 版权声明

    不良信息举报中心 陕ICP备:0500963号