AT128_RFID.h
上传用户:pingzwdz
上传日期:2021-12-25
资源大小:2k
文件大小:6k
源码类别:

RFID编程

开发平台:

C/C++

  1. /*****************************************************
  2. RFID 读卡演示程序
  3. 曼切斯特码 380KHz 64 OTC
  4. 1个数据位1=168us对应两次跳变,在85us应有一个跳变(1/380*32=84us)
  5. 曼切斯特码 125KHz 64 OTC
  6. 1个数据位1=168*3us对应两次跳变,在85*3us应有一个跳变(1/380*32*3=252us)
  7.               zhangxiaohui   2010.01.02
  8. *****************************************************/
  9. #ifndef __ATMEGA128_RFID_H
  10. #define __ATMEGA128_RFID_H
  11. #define F380KHz
  12. #define RFID_READ   6 //PC6脚
  13. #define RFID_WRITE  7 //PC7脚
  14. #define RFID_PIN  PINC
  15. #define RFID_DDR  DDRC
  16. #define RFID_PORT PORTC
  17. #define SET_RFID_WRITE  RFID_DDR&=~(1<<RFID_WRITE);RFID_PORT|=1<<RFID_WRITE;
  18. #define CLR_RFID_WRITE  RFID_DDR|=1<<RFID_WRITE;RFID_PORT&=~(1<<RFID_WRITE);
  19. //#define RFID_DDR_INIT  {RFID_DDR&=~(1<<RFID_READ);RFID_PORT&=~(1<<RFID_READ);RFID_DDR|=1<<RFID_WRITE;RFID_PORT&=~(1<<RFID_WRITE);}
  20. //用来区分脉冲宽度的参数
  21. #ifdef F380KHz 
  22. #define TIME00 2    //5us
  23. #define TIME05 43   //32为85us,为可靠,应取40-45
  24. #define TIME10 85   //最少180us
  25. #else  //125KHz
  26. #define TIME00 5    
  27. #define TIME05 126   
  28. #define TIME10 252   
  29. #endif
  30. extern uchar key,k_cur,k_vol;//菜单设置的键值,光标位置,更改数值
  31. extern unsigned char ID_buff[15]; //在主程序定义的解码缓冲区
  32. extern unsigned char wr_buff[11]; //解码缓冲区
  33. extern unsigned char wr_ID[5];//1个用户字节+4个ID号字节;共40bit。
  34. extern unsigned char count,temp[80];//ts
  35. extern unsigned char RFID_PIN_STA; //上一次的状态位
  36. //定时器初始化函数--------------------------14               定时器初始化函数
  37. void RFID_timer0_init(void)  //10mS定时,外部晶振7.3728M经过1024分频
  38. {
  39. CLI();
  40. TCCR0=0x00;
  41. TCNT0=0x00;//0xae;
  42. TCCR0=0x03; //0x01=不分频;0x03=32分频
  43. TIMSK=0x00;//T0的中断,设置为TCNT0加到255时产生中断
  44. SEI();
  45. }
  46. //定时器中断函数--------------------------15
  47. #pragma interrupt_handler remote_timer0_ovf_isr:17
  48. void RFID_timer0_ovf_isr(void)
  49. }
  50. uchar READ_RFID_PIN()
  51. {
  52.  uchar temp;
  53.  temp=RFID_PIN;
  54.  temp=(temp>>RFID_READ)&0x01;
  55.  if(temp==0x01)return 1;
  56.  else return 0; 
  57. }
  58. //检测数据引脚位跳变的脉宽
  59. unsigned char readbit()
  60. {
  61. unsigned char mk=TIME10-20; //装入超时值
  62. RFID_timer0_init();
  63. while(--mk){ //超时机制,防止死等
  64. if(RFID_PIN_STA!=READ_RFID_PIN()) //有跳变
  65. break;
  66.     delay_us(1);
  67. }
  68. TCCR0=0x00; //停止计时
  69. if(mk==0) //超时退出
  70. return 0;
  71. RFID_PIN_STA=READ_RFID_PIN(); //保存状态
  72. mk=TCNT0; //计算这样跳变的脉宽
  73. if((mk>TIME05)&&(mk<=TIME10))   return 1; //一个周期
  74. if((mk>=TIME00)&&(mk<=TIME05)) return 2; //半个周期
  75. return 0; //出错
  76. }
  77. //读一个完整的数据位
  78. unsigned char readdata()
  79. {
  80.  uchar a;
  81. switch(readbit())
  82. {
  83. case 1: //一个周期
  84. return RFID_PIN_STA;//根据读卡板引脚电平,如开始为1,折返回!RFID_PIN_STA.
  85. case 2: //半个周期
  86. if(readbit()!=2) return 2; //再读一次半个周期
  87. return RFID_PIN_STA;
  88. default:
  89. return 2;//2;
  90. }
  91. }
  92. void READ(unsigned char tt)//调试用
  93. {
  94. unsigned int mk=TIME10; //装入超时值
  95. RFID_PIN_STA=READ_RFID_PIN(); //保存位状态
  96. RFID_timer0_init();
  97. while(RFID_PIN_STA==READ_RFID_PIN()); //有跳变
  98. TCCR0=0x00; //停止计时
  99. temp[tt]=TCNT0; //计算这样跳变的脉宽
  100. }
  101. //接收并解码
  102. uchar CheckData()
  103. {   
  104. unsigned char i,j;
  105. //RFID_timer0_init();//TS
  106. RFID_PIN_STA=READ_RFID_PIN(); //保存位状态
  107. //while(RFID_PIN_STA==READ_RFID_PIN());//TS
  108. for(i=0;i<9;i++) //检测9个引导数据位1
  109.  if(readdata()!=1)return 0;  //有一个为0则退出
  110. /*/ if(i==9){//调试用
  111.           for(j=0;j<80;j++)
  112.            READ(j);
  113.           for(j=0;j<80;j++){
  114.            //printhex(temp[j]);
  115.    printf("%d",temp[j]);
  116.    printf(" ");
  117.   }
  118.   putchar('n');
  119. //  }*/
  120.    
  121.   //开始读取55个数据
  122.   for(i=0;i<11;i++)//11组
  123. {
  124. ID_buff[i]=0x00;
  125. for(j=0;j<5;j++)//每组5个,第5位是前面4位1的个数的校验位
  126. {   
  127.     ID_buff[i]<<=1;     
  128. switch(readdata())
  129. {
  130. case 0: //0
  131. break;
  132. case 1: //1
  133. ID_buff[i]|=0x08;
  134. break;
  135. case 2: //err
  136. return 0;
  137. // printhex(j);printhex(TH0);printhex(TL0);putchar('n');//调试用
  138. }
  139. }
  140. }
  141. //结束位
  142. if(ID_buff[10]&0x08!=0x00)
  143. return 0;
  144. //行奇校验位
  145. for(i=0;i<10;i++)//异或
  146. if((((ID_buff[i]>>4) ^(ID_buff[i]>>3) ^(ID_buff[i]>>2) ^(ID_buff[i]>>1) ^ID_buff[i])&0x08)!=0)//将每组的5个数进行验正,1的个数因该为偶数
  147. return 0;
  148. //列奇校验位
  149. j=0;
  150. for(i=0;i<11;i++)
  151. j=j ^ (ID_buff[i]&0x80);//将每列的11个数进行验正,1的个数因该为偶数
  152. if(j!=0)
  153. return 0;
  154. for(i=0;i<11;i++)
  155. j=j ^ (ID_buff[i]&0x40);
  156. if(j!=0)
  157. return 0;
  158. for(i=0;i<11;i++)
  159. j=j ^ (ID_buff[i]&0x20);
  160. if(j!=0)
  161. return 0;
  162. for(i=0;i<11;i++)
  163. j=j ^ (ID_buff[i]&0x10);
  164. if(j!=0)
  165. return 0;
  166. //完成*/
  167. return 1;
  168. }
  169. uchar READ_CARD_ID()
  170. {   
  171. if(CheckData()) //检测卡
  172. {   unsigned int t;
  173. unsigned long x=0,y=0,z=0;
  174. //编码输出
  175.         ID_buff[11]=(ID_buff[0] & 0xF0) | (ID_buff[1]>>4 & 0x0F);
  176. ID_buff[12]=(ID_buff[2] & 0xF0) | (ID_buff[3]>>4 & 0x0F);
  177. ID_buff[13]=(ID_buff[4] & 0xF0) | (ID_buff[5]>>4 & 0x0F);
  178. ID_buff[14]=(ID_buff[6] & 0xF0) | (ID_buff[7]>>4 & 0x0F);
  179. ID_buff[15]=(ID_buff[8] & 0xF0) | (ID_buff[9]>>4 & 0x0F);
  180. lcd_rubber(3,0,0,8);delay_ms(200);
  181. lcd_printf(3,0,0,"ID: 0X");//输出到LCD显示屏
  182.         lcd_printhex(3,3,0,ID_buff[11]);
  183. lcd_printhex(3,4,0,ID_buff[12]);
  184. lcd_printhex(3,5,0,ID_buff[13]);
  185. lcd_printhex(3,6,0,ID_buff[14]);
  186. lcd_printhex(3,7,0,ID_buff[15]);
  187. x=256*256*(unsigned long)ID_buff[13];//强制类型转换
  188. y=256*(unsigned long)ID_buff[14];//强制类型转换
  189. z=(unsigned long)ID_buff[15];//强制类型转换
  190. x=x+y+z;
  191.         printf("ID IS ");//输出到电脑
  192.         printf("%u",ID_buff[11]);putchar('+');//输出用户码
  193. printf("%u",ID_buff[12]);putchar('+');//输出高2位
  194.         printf("%lu",x);putchar(' ');putchar(' ');//输出后6位
  195. printf("rn");
  196. delay_ms(10);
  197. delay_ms(10);
  198. return 1;
  199. }
  200. //delay_ms(10);
  201. return 0;
  202. }
  203. #endif