找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3193|回復: 11
收起左側

STM32單片機RC522門禁程序(含保存IC卡功能掉電不丟失)

  [復制鏈接]
ID:1071040 發(fā)表于 2023-11-29 20:20 | 顯示全部樓層 |閱讀模式
STM32-RC522-門禁.png
單片機源程序如下:
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "usart.h"
  4. #include "rc522.h"
  5. #include "LED.h"
  6. #include "Key.h"
  7. #include "OLED.h"
  8. #include "Store.h"
  9. #include "Servo.h"

  10. /**
  11. *   連線說明:
  12. *   1--SDA  <----->PA4
  13. *   2--SCK  <----->PA5
  14. *   3--MOSI <----->PA7
  15. *   4--MISO <----->PA6
  16. *   5--懸空
  17. *   6--GND <----->GND
  18. *   7--RST <----->PB0
  19. *   8--VCC <----->VCC
  20. **/
  21. uint32_t num;  //
  22. uint8_t j = 0;
  23. int main(void)
  24. {
  25.     delay_init();                     //延時函數(shù)初始化
  26.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優(yōu)先級分組為組2:2位搶占優(yōu)先級,2位響應優(yōu)先級
  27.     uart_init(115200);                 //串口初始化為115200
  28.     RC522_Init();       //初始化射頻卡模塊
  29.                
  30.                 LED_Init();                //LED???
  31.                 Key_Init();                //?????
  32.                 OLED_Init();                //OLED???
  33.                 Store_Init();
  34.                 Servo_Init();                //?????
  35.        
  36.     while(1)
  37.     {
  38.                         Key_GetNum();
  39.                         //先將sn清零
  40.                         SN[0]=0X00;
  41.                         SN[1]=0X00;
  42.                         SN[2]=0X00;
  43.                         SN[3]=0X00;
  44.                        
  45.                         if (KeyNum == 1)                       
  46.                         {
  47.                                 //這里執(zhí)行讀卡
  48.                                 OLED_ShowString(1, 1, "moshi:       ");
  49.                                 OLED_ShowString(1, 1, "moshi:du");       
  50.                                 RC522_Handel();
  51.                                  //
  52.                                 num = (uint32_t)SN[0] << 24 | (uint32_t)SN[1] << 16 | (uint32_t)SN[2] << 8 | SN[3];  
  53.                                 OLED_ShowHexNum(2, 1, num, 8);
  54.                                         //將存儲里的卡號讀出來對比這個卡號是否開鎖
  55.                                 for (j = 1; j < 255; j ++)                                //
  56.                                 {
  57.                                         if(num==0x00000000){
  58.                                                 //跳出循環(huán)
  59.                                                  break;
  60.                                         }else        if(Store_Data[j]==0x00000000){
  61.                                                 OLED_ShowString(3, 1, "                  ");
  62.                                                 OLED_ShowString(3, 1, "error:failed");       
  63.                                                
  64.                                                 //跳出循環(huán)
  65.                                                  break;  //
  66.                                         }
  67.                                         else if(Store_Data[j]==num){
  68.                                                 OLED_ShowString(3, 1, "                  ");
  69.                                                 OLED_ShowString(3, 1, "success:ok");
  70.                                                 //開門
  71.                                                 Servo_SetAngle(90);
  72.                                                 delay_ms(5000);       
  73.                                                 Servo_SetAngle(0);
  74.                                                 //跳出循環(huán)
  75.                                                  break;  //
  76.                                         }
  77.                                 }
  78.                                
  79.                         }
  80.                        
  81.                         if (KeyNum == 2)                       
  82.                         {
  83.                                 //這里執(zhí)行授權
  84.                                 OLED_ShowString(1, 1, "moshi:shouqun");       
  85.                                 RC522_Handel();
  86.                                  //
  87.                                 num = (uint32_t)SN[0] << 24 | (uint32_t)SN[1] << 16 | (uint32_t)SN[2] << 8 | SN[3];  
  88.                                 OLED_ShowHexNum(2, 1, num, 8);
  89.                                 //將存儲里的卡號讀出來對比這個卡號是否存在
  90.                                 for (j = 1; j < 255; j ++)                                //
  91.                                 {
  92.                                         if(num==0x00000000){
  93.                                                 //跳出循環(huán)
  94.                                                  break;
  95.                                         }else        if(Store_Data[j]==num){
  96.                                                 OLED_ShowString(3, 1, "                  ");
  97.                                                 OLED_ShowString(3, 1, "success:exist");       
  98.                                                
  99.                                                 //跳出循環(huán)
  100.                                                  break;  //
  101.                                         }else        if(Store_Data[j]==0x00000000){
  102.                                                 Store_Data[j] = num;
  103.                                                 Store_Save();
  104.                                                 OLED_ShowString(3, 1, "                  ");
  105.                                                 OLED_ShowString(3, 1, "success:save ok");       
  106.                                                 delay_ms(5000);
  107.                                                 //跳出循環(huán)
  108.                                                  break;  //
  109.                                         }
  110.                                        
  111.                                 }
  112.                         }
  113.         
  114.     }
  115. }
復制代碼

原理圖: 無
仿真: 無
代碼: RFID-RC522.7z (226.75 KB, 下載次數(shù): 83)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:845150 發(fā)表于 2024-6-27 11:47 | 顯示全部樓層
cxjbook 發(fā)表于 2024-6-3 08:37
可以用的,兩個按鈕一個是授權模式,一個是讀取模式

我用mcuisp 0.993上傳可以了,謝謝樓主分享。
51hei圖片_20240627114733.jpg
51hei.jpg
回復

使用道具 舉報

ID:1071040 發(fā)表于 2024-6-3 08:37 | 顯示全部樓層
gz5353741 發(fā)表于 2024-6-1 21:19
樓主,用ttl的下載方式?jīng)]oled顯示,用不了。

可以用的,兩個按鈕一個是授權模式,一個是讀取模式
回復

使用道具 舉報

ID:845150 發(fā)表于 2024-6-1 21:19 | 顯示全部樓層
樓主,用ttl的下載方式?jīng)]oled顯示,用不了。
回復

使用道具 舉報

ID:1071040 發(fā)表于 2024-5-2 13:09 | 顯示全部樓層
ZhengX5897 發(fā)表于 2024-5-1 19:23
大佬用什么軟件畫的圖

很明顯,原圖不是我畫的,后面畫的亂七八糟那個是我畫的
回復

使用道具 舉報

ID:1119044 發(fā)表于 2024-5-1 19:23 來自手機 | 顯示全部樓層
大佬用什么軟件畫的圖
回復

使用道具 舉報

ID:1071040 發(fā)表于 2024-4-9 13:18 | 顯示全部樓層
退役的人 發(fā)表于 2024-4-8 16:26
工程打開之后的默認芯片是STM32F103ZE,改成C8之后好多報錯

由于代碼是多個項目拼接的,所以會有一點設置上的問題,但目前ttl的燒錄方式的話是測試通過的。
回復

使用道具 舉報

ID:932262 發(fā)表于 2024-4-8 16:26 | 顯示全部樓層
cxjbook 發(fā)表于 2024-2-20 13:30
測試的芯片是stm32f103c8t6,芯片不同內(nèi)置存儲的地址會有所不同。

工程打開之后的默認芯片是STM32F103ZE,改成C8之后好多報錯
回復

使用道具 舉報

ID:1071040 發(fā)表于 2024-2-22 11:28 | 顯示全部樓層
原理圖是stlink的下載方式,我測試的時候是用ttl的下載方式,如果要使用stlink的方式下載想要自信再配置一下。
回復

使用道具 舉報

ID:1071040 發(fā)表于 2024-2-20 13:30 | 顯示全部樓層
yinqing452 發(fā)表于 2024-2-19 16:39
樓主,這個程序您測試過嗎?為什么用不了呢?

測試的芯片是stm32f103c8t6,芯片不同內(nèi)置存儲的地址會有所不同。
回復

使用道具 舉報

ID:1071040 發(fā)表于 2024-2-20 13:07 | 顯示全部樓層
yinqing452 發(fā)表于 2024-2-19 16:39
樓主,這個程序您測試過嗎?為什么用不了呢?

提示什么錯誤?
回復

使用道具 舉報

ID:370644 發(fā)表于 2024-2-19 16:39 | 顯示全部樓層
樓主,這個程序您測試過嗎?為什么用不了呢?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表