AT128_RFID.h
上传用户:pingzwdz
上传日期:2021-12-25
资源大小:2k
文件大小:6k
- /*****************************************************
- RFID 读卡演示程序
- 曼切斯特码 380KHz 64 OTC
- 1个数据位1=168us对应两次跳变,在85us应有一个跳变(1/380*32=84us)
- 曼切斯特码 125KHz 64 OTC
- 1个数据位1=168*3us对应两次跳变,在85*3us应有一个跳变(1/380*32*3=252us)
- zhangxiaohui 2010.01.02
- *****************************************************/
- #ifndef __ATMEGA128_RFID_H
- #define __ATMEGA128_RFID_H
- #define F380KHz
- #define RFID_READ 6 //PC6脚
- #define RFID_WRITE 7 //PC7脚
- #define RFID_PIN PINC
- #define RFID_DDR DDRC
- #define RFID_PORT PORTC
- #define SET_RFID_WRITE RFID_DDR&=~(1<<RFID_WRITE);RFID_PORT|=1<<RFID_WRITE;
- #define CLR_RFID_WRITE RFID_DDR|=1<<RFID_WRITE;RFID_PORT&=~(1<<RFID_WRITE);
- //#define RFID_DDR_INIT {RFID_DDR&=~(1<<RFID_READ);RFID_PORT&=~(1<<RFID_READ);RFID_DDR|=1<<RFID_WRITE;RFID_PORT&=~(1<<RFID_WRITE);}
- //用来区分脉冲宽度的参数
- #ifdef F380KHz
- #define TIME00 2 //5us
- #define TIME05 43 //32为85us,为可靠,应取40-45
- #define TIME10 85 //最少180us
- #else //125KHz
- #define TIME00 5
- #define TIME05 126
- #define TIME10 252
- #endif
- extern uchar key,k_cur,k_vol;//菜单设置的键值,光标位置,更改数值
- extern unsigned char ID_buff[15]; //在主程序定义的解码缓冲区
- extern unsigned char wr_buff[11]; //解码缓冲区
- extern unsigned char wr_ID[5];//1个用户字节+4个ID号字节;共40bit。
- extern unsigned char count,temp[80];//ts
- extern unsigned char RFID_PIN_STA; //上一次的状态位
- //定时器初始化函数--------------------------14 定时器初始化函数
- void RFID_timer0_init(void) //10mS定时,外部晶振7.3728M经过1024分频
- {
- CLI();
- TCCR0=0x00;
- TCNT0=0x00;//0xae;
- TCCR0=0x03; //0x01=不分频;0x03=32分频
- TIMSK=0x00;//T0的中断,设置为TCNT0加到255时产生中断
- SEI();
- }
- //定时器中断函数--------------------------15
- #pragma interrupt_handler remote_timer0_ovf_isr:17
- void RFID_timer0_ovf_isr(void)
- {
- }
- uchar READ_RFID_PIN()
- {
- uchar temp;
- temp=RFID_PIN;
- temp=(temp>>RFID_READ)&0x01;
- if(temp==0x01)return 1;
- else return 0;
- }
- //检测数据引脚位跳变的脉宽
- unsigned char readbit()
- {
- unsigned char mk=TIME10-20; //装入超时值
- RFID_timer0_init();
- while(--mk){ //超时机制,防止死等
- if(RFID_PIN_STA!=READ_RFID_PIN()) //有跳变
- break;
- delay_us(1);
- }
- TCCR0=0x00; //停止计时
- if(mk==0) //超时退出
- return 0;
- RFID_PIN_STA=READ_RFID_PIN(); //保存状态
- mk=TCNT0; //计算这样跳变的脉宽
- if((mk>TIME05)&&(mk<=TIME10)) return 1; //一个周期
- if((mk>=TIME00)&&(mk<=TIME05)) return 2; //半个周期
- return 0; //出错
- }
- //读一个完整的数据位
- unsigned char readdata()
- {
- uchar a;
- switch(readbit())
- {
- case 1: //一个周期
- return RFID_PIN_STA;//根据读卡板引脚电平,如开始为1,折返回!RFID_PIN_STA.
- case 2: //半个周期
- if(readbit()!=2) return 2; //再读一次半个周期
- return RFID_PIN_STA;
- default:
- return 2;//2;
- }
- }
- void READ(unsigned char tt)//调试用
- {
- unsigned int mk=TIME10; //装入超时值
- RFID_PIN_STA=READ_RFID_PIN(); //保存位状态
- RFID_timer0_init();
- while(RFID_PIN_STA==READ_RFID_PIN()); //有跳变
- TCCR0=0x00; //停止计时
- temp[tt]=TCNT0; //计算这样跳变的脉宽
- }
- //接收并解码
- uchar CheckData()
- {
- unsigned char i,j;
- //RFID_timer0_init();//TS
- RFID_PIN_STA=READ_RFID_PIN(); //保存位状态
- //while(RFID_PIN_STA==READ_RFID_PIN());//TS
- for(i=0;i<9;i++) //检测9个引导数据位1
- if(readdata()!=1)return 0; //有一个为0则退出
- /*/ if(i==9){//调试用
- for(j=0;j<80;j++)
- READ(j);
- for(j=0;j<80;j++){
- //printhex(temp[j]);
- printf("%d",temp[j]);
- printf(" ");
- }
- putchar('n');
- // }*/
-
-
- //开始读取55个数据
- for(i=0;i<11;i++)//11组
- {
- ID_buff[i]=0x00;
- for(j=0;j<5;j++)//每组5个,第5位是前面4位1的个数的校验位
- {
- ID_buff[i]<<=1;
- switch(readdata())
- {
- case 0: //0
- break;
- case 1: //1
- ID_buff[i]|=0x08;
- break;
- case 2: //err
- return 0;
- // printhex(j);printhex(TH0);printhex(TL0);putchar('n');//调试用
- }
- }
- }
- //结束位
- if(ID_buff[10]&0x08!=0x00)
- return 0;
- //行奇校验位
- for(i=0;i<10;i++)//异或
- if((((ID_buff[i]>>4) ^(ID_buff[i]>>3) ^(ID_buff[i]>>2) ^(ID_buff[i]>>1) ^ID_buff[i])&0x08)!=0)//将每组的5个数进行验正,1的个数因该为偶数
- return 0;
- //列奇校验位
- j=0;
- for(i=0;i<11;i++)
- j=j ^ (ID_buff[i]&0x80);//将每列的11个数进行验正,1的个数因该为偶数
- if(j!=0)
- return 0;
- for(i=0;i<11;i++)
- j=j ^ (ID_buff[i]&0x40);
- if(j!=0)
- return 0;
- for(i=0;i<11;i++)
- j=j ^ (ID_buff[i]&0x20);
- if(j!=0)
- return 0;
- for(i=0;i<11;i++)
- j=j ^ (ID_buff[i]&0x10);
- if(j!=0)
- return 0;
- //完成*/
- return 1;
- }
- uchar READ_CARD_ID()
- {
- if(CheckData()) //检测卡
- { unsigned int t;
- unsigned long x=0,y=0,z=0;
- //编码输出
- ID_buff[11]=(ID_buff[0] & 0xF0) | (ID_buff[1]>>4 & 0x0F);
- ID_buff[12]=(ID_buff[2] & 0xF0) | (ID_buff[3]>>4 & 0x0F);
- ID_buff[13]=(ID_buff[4] & 0xF0) | (ID_buff[5]>>4 & 0x0F);
- ID_buff[14]=(ID_buff[6] & 0xF0) | (ID_buff[7]>>4 & 0x0F);
- ID_buff[15]=(ID_buff[8] & 0xF0) | (ID_buff[9]>>4 & 0x0F);
-
- lcd_rubber(3,0,0,8);delay_ms(200);
- lcd_printf(3,0,0,"ID: 0X");//输出到LCD显示屏
- lcd_printhex(3,3,0,ID_buff[11]);
- lcd_printhex(3,4,0,ID_buff[12]);
- lcd_printhex(3,5,0,ID_buff[13]);
- lcd_printhex(3,6,0,ID_buff[14]);
- lcd_printhex(3,7,0,ID_buff[15]);
- x=256*256*(unsigned long)ID_buff[13];//强制类型转换
- y=256*(unsigned long)ID_buff[14];//强制类型转换
- z=(unsigned long)ID_buff[15];//强制类型转换
- x=x+y+z;
-
- printf("ID IS ");//输出到电脑
- printf("%u",ID_buff[11]);putchar('+');//输出用户码
- printf("%u",ID_buff[12]);putchar('+');//输出高2位
- printf("%lu",x);putchar(' ');putchar(' ');//输出后6位
- printf("rn");
- delay_ms(10);
-
-
- delay_ms(10);
- return 1;
- }
- //delay_ms(10);
- return 0;
- }
- #endif