单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 259|回复: 2
收起左侧

MSP430通过RC522实现门禁卡功能(RFID)

[复制链接]
sdb194200 发表于 2019-9-19 13:08 | 显示全部楼层 |阅读模式
本帖最后由 sdb194200 于 2019-9-19 15:58 编辑


1568850881(1).jpg
//实现门禁卡功能
//刷卡实现LCD灯亮 + 12864LCD屏幕显示相应内容
屏幕效果如下:

刷卡提示

刷卡提示

刷卡成功

刷卡成功



  1.                                                                        //
  2. //===========================================================================//
  3. /********************************************************************
  4. //MSP430F149单片机 + RC522 +M1
  5. //实现门禁卡功能
  6. //刷卡实现LCD灯亮  +  12864LCD屏幕显示相应内容
  7. //调试环境:IAR + MSP430F149 +RC522
  8. //作者:孙登波 119104010574
  9. //时间:2019.09.10
  10. ********************************************************************/
  11. #include "msp430x14x.h"
  12. #include "PIN_DEF.H"
  13. #include "RC522.H"
  14. #include "UART0_Func.c"
  15. #include "ctype.h"
  16. #include "BoardConfig.h"
  17. #include "lcd.h"
  18. #include "led8run.h"

  19. unsigned char UID[5],Temp[4]                                       ;
  20. unsigned char RF_Buffer[18]                                        ;
  21. unsigned char Password_Buffer[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}   ; // Mifare One 缺省密码
  22. char          MBRX[30]                                             ;
  23. char          MBKeyTP[30]                                          ;
  24. char          Event                                                ;
  25. unsigned char DISP_MODE,i                                            ; // 编辑控件显示模式
  26. unsigned char des_on       = 0                                     ; // DES加密标志
  27. void Key_TP_Task(void)                                             ;

  28. //***************************************************************************//
  29. //                                                                           //
  30. //                 初始化主时钟: MCLK = XT1×(FLL_FACTOR+1)                  //
  31. //                                                                           //
  32. //***************************************************************************//
  33. void Init_CLK(void)
  34. {
  35.   unsigned int qq;
  36.   WDTCTL     = WDTPW + WDTHOLD                                     ; // 关看门狗
  37.   BCSCTL1 &= ~XT2OFF;           //打开XT2高速晶体振荡器  
  38.   do
  39.   {
  40.     IFG1 &= ~OFIFG;           //Clear oscFault flag清除振荡器失效标志
  41.     for(qq=0xff;qq>0;qq--);
  42.   }while((IFG1&OFIFG));       //oscFault flag still set

  43.   BCSCTL2 |= SELM_2;          //MCLK=XT2
  44.   //BCSCTL2 |= DIVM_0;        //控制MCLK不分频,默认

  45.   BCSCTL2 |= SELS;            //SMCLK=XT2
  46.   //BCSCTL2 |= DIVS_0;        //控制SMCLK不分频,默认
  47. }

  48. void Delay(unsigned int time)
  49. {
  50.   unsigned int i,k                             ;
  51.   for(i=0;i<255;i++)
  52.     for(k=0;k<time;k++)
  53.       _NOP()                                   ;   
  54. }

  55. void Init_Port(void)
  56. {
  57.   P4DIR   =   RF_LPCTL + RF_SS   + RF_SCLK  + RF_DATA_OUT                     ;
  58.   P2DIR |= BIT0+RF_LPCTL + RF_SS   + RF_SCLK  + RF_DATA_OUT;
  59.   P1DIR   =   RF_LPCTL + RF_SS   + RF_SCLK  + RF_DATA_OUT                     ;
  60. }

  61. void main( void )
  62. {
  63.   unsigned char status;
  64.   WDTCTL     = WDTPW + WDTHOLD                                     ; // 关看门狗
  65.   BoardConfig(0xf0);
  66.   Init_Port();
  67.   InitUART();
  68.   _EINT()                                            ;
  69. loop:lcd_welcome();
  70.   PcdReset();//复位RC522
  71.   PcdAntennaOn();//开启天线发射
  72.   while(1)
  73.   {
  74.     status = PcdRequest(PICC_REQIDL, Temp); ////寻卡,输出为卡类型
  75.     if (status == MI_OK)
  76.       status = PcdAnticoll(UID); //防冲撞处理,输出卡片序列号,4字节
  77.     if (status == MI_OK)
  78.       status = PcdSelect(UID); //选择卡片,输入卡片序列号,4字节
  79.     if (status == MI_OK)
  80.       status = PcdAuthState(PICC_AUTHENT1A, 1, Password_Buffer, UID); //在进行读写操作之前需要先进行认
  81.     if (status == MI_OK)
  82.     {
  83.       led_run();
  84.       lcd_success();
  85.       Delay(2500);
  86.       goto loop;
  87.     }

  88.   }
  89.   }
复制代码

这里要注意,为了使main函数的简洁性,分别将LEDLCD函数构建成.h头文件,直接实现在main中的调用。

关于goto loop的解释:
在实际程序实现过程中发现,如果将开机欢迎界面写入到while(1)函数中,会导致未刷卡的时候,屏幕一直在刷新。所以为了避免这种情况,将开机欢迎界面函数放在while(1)外,并且用goto函数实现跳出循环。有效地解决了这个问题。

如果有感兴趣,想寻找到其他解决方法的师兄,可以先尝试将开机画面放回main()函数中,观察实际运行情况,寻找更佳的解决办法。
希望能找到更佳的解决办法,因为goto函数不符合结构化程序设计要求,不到万不得已不建议采用。

具体程序见附件
主要实现刷卡灯亮(可以连续实现)


门禁卡.rar

110.55 KB, 下载次数: 2, 下载积分: 黑币 -5

RFID门禁卡MSP430/RC522

评分

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

查看全部评分

回复

使用道具 举报

 楼主| sdb194200 发表于 2019-9-19 15:41 | 显示全部楼层
有什么问题可以QQ找我,我也是刚刚学习,互帮互助。
有人帮助会学的很快
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

快速回复 返回顶部 返回列表
妞干网免费观看频2018