// --------------------------------------
// 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
*/