找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3508|回复: 0
打印 上一主题 下一主题
收起左侧

基于MFRC500的读卡程序-带4-3键盘输入和12864液晶

[复制链接]
跳转到指定楼层
楼主
基于MFRC500射频芯片和51单片机的13.56MHzRFID射频识别系统的读写程序。

单片机源程序如下:
  1. /****************************************************************************                                                                        
  2. * File:         MAIN.C                                                      *                                                                        
  3. * Version:      饭卡打卡系统简化版1.0                                       *                                                                        
  4. * Created:      2007.11.30                                                  *
  5. * Last Change:  2008.5.15                                                   *                                                                        
  6. * Author:                                                                   *
  7. * QQ:                                                                       *
  8. * EMail:                                                                    *
  9. * Compiler:     KEIL C51 uVision2 V2.23                                     *                                                                       
  10. * Description:  操作流程:先读卡,等待键盘输入,再写卡                         *                                                   
  11. *               注意:键盘输入后,卡不能抽走,不然数据流失!                    *
  12. *               注意:程序共有18个警告,因为有些函数暂时没用到!               *
  13. *               注意:暂没小数显示,由于以后考虑用以太网通讯,故没加进UATR通讯*
  14. *               留言:谢谢Hexing的帮助,如果大家对程序有什么意见可以随时找我  *      
  15. ****************************************************************************/
  16. #include "main.h"
  17. #include "m500a.h"
  18. #include "PORT.h"
  19. #include "delay.h"
  20. #include "LCD_Key.h"                  
  21. /*************************公有变量定义**********************************************/
  22. bit   KEY_SCAN_G;            //键盘扫描标志   
  23. bit   W_CARD_SCAN_G;         //写卡扫描标志
  24. tWord Card_Money;            //最大值这里只取9999,显示4位数金额
  25. tByte LCD_Money[5];          //卡中金额显示缓冲区
  26. tByte LCD_Key[6]="    ";     //初始化按键显示缓冲区,保证数组最后字节存有结束符'\0'              
  27. tByte temp;                  //临时变量
  28. tByte tt1[2];                //存放卡类型号            
  29. tByte Snr_RC500[4];          //存放rc500序列号
  30. tByte AbsoluteBlock = 8;     //对绝对块8进行操作, 取值范围为 0 <= AbsoluteBlock < 64
  31. tByte data cardserialno[4];  //存放卡号
  32. tByte idata blockdata[16];   //绝对块8数据缓冲区,注意其储存模式 idata                       
  33. /************************私有函数原型**************************************************/
  34. void  MCU_Init(void);                                           //单片机初始化函数
  35. void  BEEP_Ctrl(void);                                          //蜂鸣器控制函数
  36. tByte MF_Active(tByte AbsoluteBlock,tByte data *cardserialno);  //卡激活函数
  37. tByte MF_Read  (tByte AbsoluteBlock,tByte idata *blockdata);    //读卡函数
  38. tByte MF_Write (tByte AbsoluteBlock,tByte idata *blockdata);    //写卡函数
  39. tByte data RC500_Disp[13];
  40. void hex_ten(unsigned char *RC500_St);                                 
  41. /*****************************************************************************************
  42. 函数名称:主函数
  43. 函数输入:
  44. 函数输出:
  45. 函数功能:                                                                    
  46. ******************************************************************************************/
  47. void main (void)
  48. {
  49.   /*************************硬件初始化**********************************************/
  50.   MCU_Init();               
  51.   M500PCD_Init();      
  52.   KEYPAD_Init();
  53.   LCD_Init();
  54.   LCD_China_Disp();
  55.   BEEP_Ctrl();              //声音提示1,所有初始化完成,等待读卡
  56.   /*************************大循环执行**********************************************/                            
  57.   while(1)
  58.   {     
  59.      temp=MF_Active( AbsoluteBlock,cardserialno);       //激活一张卡
  60.      if(temp!=MI_OK)
  61.      {           
  62.                 continue;                                       //跳到 while 入口                          
  63.      }
  64.      temp=MF_Read(AbsoluteBlock,blockdata);             //读卡数据   
  65.      if(temp!=MI_OK)
  66.      {
  67.         continue;   
  68.          }
  69.      BEEP_Ctrl();
  70.      hex_ten(cardserialno);                          //声音提示2,读卡成功,等待键盘扫描
  71.      put_char(4,30,RC500_Disp);
  72.      /*************************按键扫描循环**********************************************/                                                 
  73.      KEY_SCAN_G=1;                                      //允许键盘扫描                  
  74.      while(KEY_SCAN_G)                                 
  75.          {
  76.         Card_Money=blockdata[0]+blockdata[1]*256;       //合并绝对块8前两字节
  77.             LCD_Money[0]=Card_Money/1000+48;                //装载千位数据     
  78.         LCD_Money[1]=Card_Money%1000/100+48;            //百位
  79.         LCD_Money[2]=Card_Money%1000%100/10+48;         //十位
  80.         LCD_Money[3]=Card_Money%1000%100%10+48;         //个位
  81.             LCD_Money[4]='\0';                              //结束符
  82.                 LCD_KEY_Update();                               //键盘和LCD刷新
  83.         delay_nms(30);                                        //每隔30毫秒扫描一次键盘
  84.          }
  85.            /*************************写入卡循环**********************************************/       
  86.      W_CARD_SCAN_G=1;                                        //允许写卡扫描     
  87.      while(W_CARD_SCAN_G)
  88.      {
  89.         blockdata[0]=Card_Money%256;                     //分解回字节数据,准备写回到绝对块8
  90.         blockdata[1]=Card_Money/256;
  91.         temp=MF_Active( AbsoluteBlock,cardserialno);     //激活同一张卡
  92.         if(temp!=MI_OK)
  93.         {         
  94.                   continue;
  95.         }
  96.         temp=MF_Write(AbsoluteBlock,blockdata);          //写数据入卡  
  97.             if(temp!=MI_OK)
  98.         {
  99.           continue;
  100.             }
  101.         W_CARD_SCAN_G=0;                //清循环标志,跳出while循环
  102.         BEEP_Ctrl();
  103.         put_char(4,30,"            ");//声音提示3,表示写卡完成,用户可以取走卡
  104.         delay_nms(1000);                             
  105.           }                                                            //注意:声音提示后的1秒延迟期间,必须拿走卡,否则体统重新读卡
  106.    }
  107. }
  108. /*————————————————————————————————————————————main函数结束———————————————————————————————————————*/
  109. /*****************************************************************************************
  110. 函数名称:tByte MF_Active     激活卡函数
  111. 函数输入:tByte AbsoluteBlock,tByte data *cardserialno
  112. 函数输出:
  113. 函数功能:激活A类卡类型                                                                    
  114. ******************************************************************************************/
  115. tByte MF_Active(tByte AbsoluteBlock,tByte data *cardserialno)
  116. {  
  117.     tByte status1;
  118.     tByte *sak1;
  119.         /*********************寻卡***************************/
  120.         status1 = M500PiccRequest(PICC_REQALL, tt1);
  121.           if (status1!=MI_OK)
  122.         {
  123.            return(FM1715_REQERR);
  124.         }
  125.         /********************防碰撞**************************/
  126.     status1=M500PiccAnticoll(0,cardserialno);
  127.     if (status1!=MI_OK)
  128.         {
  129.        return(FM1715_REQERR);          
  130.         }
  131.         /*********************选择卡*************************/
  132.            status1=M500PiccSelect(cardserialno,sak1);
  133.           if (status1!=MI_OK)
  134.         {
  135.        return(FM1715_REQERR);          
  136.         }   
  137.     /*************************授权********************************/
  138.     status1 = M500PiccAuth(PICC_AUTHENT1A, cardserialno, 1, AbsoluteBlock);
  139.           if (status1!=MI_OK)                                        //对第八块(绝对地址)进行授权, 也就是第三个扇区第一块
  140.         {       
  141.        return(FM1715_REQERR);       
  142.         }
  143.             
  144.         return MI_OK;
  145. }
  146. /*****************************************************************************************
  147. 函数名称:tByte MF_Read     读卡函数
  148. 函数输入:tByte AbsoluteBlock,tByte idata *blockdata
  149. 函数输出:
  150. 函数功能:读取射频卡的数据                                                                    
  151. ******************************************************************************************/
  152. tByte MF_Read(tByte AbsoluteBlock,tByte idata *blockdata)
  153. {  
  154.     tByte status1;
  155.     status1=M500PiccRead(AbsoluteBlock, blockdata);
  156.   
  157.         if (status1!=MI_OK)
  158.         {          
  159.             return(FM1715_REQERR);               
  160.         }
  161.        
  162.     return MI_OK;
  163. }
  164. /*****************************************************************************************
  165. 函数名称:tByte MF_Write    写卡函数
  166. 函数输入:tByte AbsoluteBlock,tByte idata *blockdata
  167. 函数输出:
  168. 函数功能:写入射频卡数据                                                                    
  169. ******************************************************************************************/
  170. tByte MF_Write(tByte AbsoluteBlock,tByte idata *blockdata)
  171. {   
  172.     tByte status1;
  173.     status1 = M500PiccWrite(AbsoluteBlock,blockdata);

  174.           if (status1!=MI_OK)
  175.         {
  176.            return(FM1715_REQERR);         
  177.         }

  178.         return MI_OK;
  179. }
  180. /*****************************************************************************************
  181. 函数名称:MCU_Init函数
  182. 函数输入:
  183. 函数输出:
  184. 函数功能:初始化RC500                                                                    
  185. ******************************************************************************************/
  186. void MCU_Init(void)
  187. {
  188.     RC500RST    = FALSE;
  189.     RC500_CS    = TRUE;        // Enable the CS for RC500                         
  190.     IT0 = 1;                            // Config ext0 as edge trigger for RC500
  191.     EX0 = 1;                            // Enable ext0 interrupt for RC500
  192.     EA = TRUE;                        // Enable all interrupts       
  193. }
  194. /*****************************************************************************************
  195. 函数名称:BEEP_Ctrl (void)    蜂鸣器驱动初始化
  196. 函数输入:
  197. 函数输出:
  198. 函数功能:有源蜂鸣器                                                                    
  199. ******************************************************************************************/
  200. void BEEP_Ctrl (void)
  201. {
  202.     BEEP = OFF;
  203. ……………………

  204. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
基于MFRC500读卡芯片的读卡程序-带4-3键盘输入和12864液晶.zip (244.28 KB, 下载次数: 42)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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