|
发表于 2011-2-5 16:35:18
|
显示全部楼层
//包含所需头文件
// ATMEGA8 16MHz
#include <stdio.h>
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>
// ----------------------------------------------------------------------------
// | 125 KHz RFID Functions |
// ----------------------------------------------------------------------------
// Data Parity example:
// 1 1 1 1 1 1 1 1 1 - header
// - received / decoded
// 0 0 0 0 |0 - 0x00 0x00
// 1 1 1 1 |0 - 0x1e 0x0F
// 0 0 0 0 |0 - 0x00 0x00
// 0 0 1 0 |1 - 0x05 0x02
// 0 1 1 0 |0 - 0x0c 0x06
// 1 0 1 1 |1 - 0x17 0x0B
// 1 1 1 1 |0 - 0x1e 0x0F
// 1 1 1 1 |0 - 0x1e 0x0F
// 1 0 1 0 |0 - 0x14 0x0A
// 1 0 1 1 |1 - 0x17 0x0B
// -------------
// ver parity 0 0 0 1 |0 - 0x02 (hor parity always 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
//PB.0(ICP) <----- 曼切斯特编码输入
//PB.1(OC1A) -----> 135.6KHZ输出
/*------宏定义------*/
volatile unsigned char bit_array[256];
volatile unsigned char test_end = 0;
volatile unsigned char bit_no = 0;
//端口初始化
void port_init(void)
{
PORTB = 0x00;
DDRB = (1<<PB1); //SET OC1A OUTPUT
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
}
//定时T1初始化
void timer1_init(void)
{
TCCR1B = 0x00; //停止定时器
TIMSK |= (1<<TICIE1); //允许T1输入捕捉中中断允许
TCNT1 = 0x00; //初始值 0xF8
OCR1A = 59; //16MHz/59=135.6KHz 匹配值
TCCR1A = (1<<COM1A0)|(1<<WGM11)|(1<<WGM10);
TCCR1B = (1<<ICNC1)|(1<<ICES1)|(1<<WGM13)|(1<<WGM12)|(1<<CS20);//16MHz/64=250KHz 启动定时器
}
//定时器T2初始化
void timer2_init(void)
{
TCCR2 = 0x00; //停止定时器
ASSR = 0x00; //异步时钟模式
TCNT2 = 0x00; //初始值
OCR2 = 00; //0x2B匹配值
TIMSK |= 0x00; //中断允许
TCCR2 = (1<<CS22)|(1<<CS21);//启动定时器 16MHz/256=500KHz
}
//串口通信初始化
void usart_init(void)
{
UCSRB = 0x00;//禁止中断
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
UBRRL = (16000000/8/115200)-1;
UBRRH = 0x00;
UCSRA |= (1<<U2X);
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
}
void put_c(unsigned char dat)
{
while(!(UCSRA & (1 << UDRE)));
UDR = dat;
}
void put_s(unsigned char *dat,unsigned char enter)
{
while(*dat)
{
put_c(*dat);
dat++;
}
if(enter == 1)
{
put_c(0x0d);
put_c(0x0a);
}
}
void put_long(unsigned long dat)
{
unsigned long temp = 1000000000;
unsigned char i = 0;
unsigned char out = 0;
for(i = 0;i < 10;i++)
{
out = dat / temp;
dat %= temp;
temp /= 10;
put_c(out + 48);
}
}
void init_devices(void)
{
cli(); //禁止所有中断
MCUCR = 0x00;
GICR = 0x00;
port_init();
timer1_init();
timer2_init();
usart_init();
sei(); //开全局中断
}
void decode(void)
{
unsigned char i,j,k;
unsigned char id_code[11] = {0,0,0,0,0,0,0,0,0,0,0};
unsigned char row_parity = 0;
unsigned char temp = 0;
unsigned char start_data[20] = {1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1};
unsigned long rfid = 0;
for(i = 0;i < 128;i++)
{
for(j = 0;j < 20;j++)
{
if(bit_array[i+j] != start_data[j])
{
break;
}
}
if(j == 20)
{
put_s("",1);
put_s("Find RFID Card.",1);
i += 20;
for(k = 0;k < 11;k++)
{
row_parity = 0;
// 读出五位数据
temp = 0;
for(j = 0;j < 5;j++)
{
temp <<= 1;
if((bit_array == 0) && (bit_array[i+1] == 1))
{
temp |= 0x01;
if(j < 4)
{
row_parity += 1;
}
}
else if((bit_array == 1) && (bit_array[i+1] == 0))
{
temp &= 0xfe;
}
else
{
return;
}
i += 2;
}
id_code[k] = (temp >> 1);
temp &= 0x01;
row_parity %= 2;
if(k < 10)
{
if(row_parity != temp)
{
return;
}
}
else
{
if(temp != 0)
{
return;
}
}
}
if(k == 11)
{
put_s("ID Card :",0);
for(j = 2;j < 10;j++)
{
rfid += (((unsigned long)(id_code[j])) << (4 * (9 - j)));
}
}
put_long(rfid);
return;
}
}
}
//捕捉解码代码修改如下:
//定时器T1输入捕捉中断服务程序
ISR(TIMER1_CAPT_vect)
{
ICR1L = TCNT2; //保留计数器2值到捕获寄存器低位
TCNT2 = 0; //将计数器2 清零
if(ICR1L > 32+4) //大于576uS 错误 1/(16MHz/256/36)=576uS
{
bit_no = 0; //将指针清零
TCCR1B &= ~(1<<ICES1); //设置下次为下降沿触发
}
else
{
if(test_end == 0) //未完成接收256Bit数组
{
if(TCCR1B &(1<<ICES1)) //__|--- 低电平跳变为高电平捕捉
bit_array[bit_no++] = 1; //写入1
else
bit_array[bit_no++] = 0; //写入0
if(bit_no == 0) //指针是否为0 ,是0 已接收了256BIT数组
test_end = 1; // 设置完成标志=1
if( ICR1L >= 32-3 && ICR1L <= 32+3 ) // 1/(16MHz/256/32)=464uS 1/(16MHz/256/35)=560uS
{
if(!(TCCR1B &(1<<ICES1))) //--|___ 高电平跳变为低电平捕捉
bit_array[bit_no++] = 0; //写入0
else
bit_array[bit_no++] = 1; //写入1
if(bit_no == 0) //指针是否为0 ,是0 已接收了256BIT数组
test_end = 1; // 设置标志=1
}
TCCR1B ^= (1<<ICES1); //反相下次沿触发
}
}
}
//主函数
int main(void)
{
init_devices();
//在这继续添加你的代码
put_s("RFID Card Reader",1);
while(1)
{
if(test_end == 1)
{
test_end = 0;
decode();
}
}
return 0;
} |
|