搜索
bottom↓
回复: 6

RFID 125KHz 读卡器制作 Mega8 16MHz Arduino C源程序

[复制链接]

出0入104汤圆

发表于 2016-11-13 13:46:13 | 显示全部楼层 |阅读模式
本帖最后由 andy 于 2016-11-14 10:24 编辑

参考以下本网站老陈的资料制作的
MEGA8-T2-CTC产生125KHz方波,ICP中断方式读125KHz的RFID卡(EM4100系列)成功,发贴祝贺!
http://www.amobbs.com/forum.php? ... d%2B125k&page=1

// ATMEGA8 16MHz Arduino IDE
// ----------------------------------------------------------------------------
// | 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.3(OC2) ------> 135.6KHZ输出

volatile unsigned char bit_array[256];
volatile unsigned char test_end = 0;

void put_c(unsigned char dat)
{
        while(!(UCSRA & (1 << UDRE)));
        UDR = dat;
}

void put_s(char *dat,char enter)
{
        while(*dat)
        {
             put_c(*dat);
             dat++;
        }
        if(enter == 1)
        {
              put_c(0x0d);
              put_c(0x0a);
        }
}

void put_long(unsigned long dat)
{
        long temp = 1000000000;
        char i,out;
        for(i = 0;i < 10;i++)
        {
              out = dat / temp;
              dat %= temp;
              temp /= 10;
              put_c(out + '0');
        }
}

//解码RFID码函数
void decode()
{
        unsigned char i,j,k;
        unsigned char id_code[11] = {0,0,0,0,0,0,0,0,0,0,0};
        unsigned char col_parity = 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);      //串口打印 RFID 码的内容
                        return;
                }
        }
}

//定时器T1输入捕捉中断服务程序
ISR(TIMER1_CAPT_vect)
{
        static unsigned char tr = 0;
        static unsigned char bit_no = 0;
       
        TCCR1B = 0;
        TCNT1 = 0;
        if(ICR1L > 9)
        {
                bit_no = 0;
        }
        if(test_end == 0)
        {
                if(tr == 1)
                {
                        bit_array[bit_no] = 0;
                        bit_no++;
                        if(bit_no == 0)
                        {
                                test_end = 1;
                        }
                        if(ICR1L > 6)
                        {
                                bit_array[bit_no] = 0;
                                //put_long (bit_array[bit_no]);
                                bit_no++;
                                if(bit_no == 0)
                                {
                                        test_end = 1;
                                }
                        }
                        TCCR1B = 0xC5; //上升沿触发
                        tr = 0;
                }
                else
                {
                        bit_array[bit_no] = 1;
                        bit_no++;
                        if(bit_no == 0)
                        {
                                test_end = 1;
                        }
                        if(ICR1L > 6)
                        {
                                bit_array[bit_no] = 1;
                                bit_no++;
                                if(bit_no == 0)
                                {
                                        test_end = 1;
                                }
                        }
                        TCCR1B = 0x85; //下降沿触发
                        tr = 1;
                }
        }
}

void setup()
{
  // put your setup code here, to run once:
        MCUCR  = 0x00;
        GICR   = 0x00;

        //端口初始化
        PORTB = 0x00;
        DDRB |= (1<<PB3);          //OC2_OUTPUT
        PORTC = 0x00;
        DDRC  = 0x00;
        PORTD = 0x03;              //RXD TXD 上拉电阻
        DDRD  = 0x02;                   //TXD OUTPUT

        //定时T1初始化
        TCCR1B = 0x00;             //停止定时器
        TIMSK  = (1<<TICIE1);      //允许T1输入捕捉中中断允许
        TCNT1H = 0xFF;             //初始值 0xFF
        TCNT1L = 0xF8;             //初始值 0xF8 /8
        TCCR1A = 0x00;
        TCCR1B = 0xC5;             //启动定时器
       
        //定时器T2初始化
        TCCR2  = 0x00;            //停止定时器
        ASSR   = 0x00;            //异步时钟模式
        TCNT2  = 0x00;            //初始值
        OCR2   = 63;              //63 0x3F匹配值
        TCCR2  = 0x19;            //启动定时器 16MHz/1=250KHz/2=125KHz

        //串口通信初始化
        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);
        pinMode(2, OUTPUT);
}

void loop()
{
        sei();
        put_s("RFID 125KHz Card Reader",1);
        while(1)
        {
                if(test_end==1)      //有要RFID解码旗标是1
                {
                         test_end = 0;
                          digitalWrite(2, LOW);
                          decode();
                          digitalWrite(2, HIGH);
                }
        }
}

用现成RFID 125KHz读卡器,但是,买了回来不合适使用,要改装:
1  > 硬件改装,C14焊离(不使用),R22改换1k电阻,R6-R7 2个电阻焊离(不使用),C14电容下焊点焊上1个104P电容(自动Bootload功能),这个电容下面焊接1条柒皮线连接到R6上焊点,
        Mega8_30Pin_RXD焊接1条柒皮线连接到R7上焊点,将晶振8MHz换为16MHz(不换掉达不到115200),硬件改装完成了,可参考看第2张图片。
2  > 将Mega8写入Bootload,就可在Arduino IDE玩了。

可将Mega8 改换为 Mega328P 单片机

也很方便改回AVRGCC C源程序的,但是,以后用到AVR 8Bit单片机都将全面用Arduino IDE 来執行編譯。

右边5位排针:
      1 > +5V
      2 > GND
      3 > DTR (DI)
      4 > RXD (DO)
      5 > TXD

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2016-11-13 17:51:51 | 显示全部楼层
125K的现在都没什么人玩了吧?不安全

出0入0汤圆

发表于 2016-11-15 06:51:52 | 显示全部楼层
恭喜楼主哦

出10入12汤圆

发表于 2016-11-15 07:22:55 来自手机 | 显示全部楼层
烂大街的东西

出0入4汤圆

发表于 2016-11-15 08:29:44 来自手机 | 显示全部楼层
fghfguytu 发表于 2016-11-13 17:51
125K的现在都没什么人玩了吧?不安全

请教下,现在安全的频点是什么呢?

出0入0汤圆

发表于 2016-11-15 12:25:00 | 显示全部楼层
不错,学习了

出0入12汤圆

发表于 2016-11-15 15:03:15 来自手机 | 显示全部楼层
vermon 发表于 2016-11-15 08:29
请教下,现在安全的频点是什么呢?

没有什么叫安全频点,只有相对安全的卡片,CPU卡,目前为止还是无敌的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-16 19:43

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表