久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3453|回復: 3
打印 上一主題 下一主題
收起左側

STM32單片機刷卡簽到系統設計資料 源碼原理圖等

[復制鏈接]
跳轉到指定樓層
樓主
電路原理圖如下:


Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


單片機源程序如下:
  1. #include "my_include.h"

  2. #define NUM_SECTOR_REC_RFID             0
  3. #define NUM_SECTOR_CARD                 1
  4. #define ADDR_FLASH_ID_BASE_RFID         FLASH_BASE_ADDR+(STM32_FLASH_SIZE - NUM_SECTOR_REC_RFID  - 1)*1024//保存刷卡用戶記錄的Flash地址
  5. #define ADDR_FLASH_ID_BASE_CARD         FLASH_BASE_ADDR+(STM32_FLASH_SIZE - NUM_SECTOR_CARD - 1)*1024//保存用戶卡號的Flash地址
  6. #define MAX_NUM_USER_CARD               3//RFID最大用戶數
  7. #define F_SIZE                          12//默認字體大小
  8. #define MyLCD_Show(m,n,p)               LCD_ShowString(LCD_GetPos_X(F_SIZE,m),LCD_GetPos_Y(F_SIZE,n),p,F_SIZE,false)
  9. #define MAX_MENU                        4//菜單條目總數
  10. #if F_SIZE==12
  11. #define START_LINE                      0
  12. #define POS_MENU_Y                      1//菜單顯示起始行數
  13. #elif F_SIZE==24
  14. #define START_LINE                      1
  15. #define POS_MENU_Y                      4//菜單顯示起始行數
  16. #endif

  17. u8 UID[4];//讀取到的卡號
  18. u8 userCard[MAX_NUM_USER_CARD][4];//用戶的卡號

  19. char disTemp[17];
  20. char dis0[64];//液晶顯示暫存數組
  21. char dis1[64];//液晶顯示暫存數組
  22. u32 ticks_rly=0,ticks_beep=0;//繼電器和蜂鳴器動作及時
  23. bool beepAlarm = false;//蜂鳴器報警標志
  24. _record_obj saveRecord_CARD[MAX_NUM_USER_CARD+1];//最大刷卡用戶數+未錄入卡號(所有未錄入卡號視為同一個)
  25. char *userName_CARD[MAX_NUM_USER_CARD+1] = {"RFID01","RFID02","RFID03","RFID未錄入"};//用戶名稱
  26. u8 workState = 0;
  27. u8 availableCardCount = 0;


  28. void OnGetUartMessage(const _uart_msg_obj *uartMsgRec)
  29. {
  30.     char *strPtr;
  31.     if((strPtr = strstr(uartMsgRec->payload,"RTC"))!=NULL)//接收到rtc字符串
  32.     {
  33.         My_RTC_SetStr(strPtr+3);//設置實時時鐘時間
  34.         USART_printf(USART1,"*Set RTC OK#\r\n");
  35.     }
  36.     else if(strstr(uartMsgRec->payload,"RELAY_KEY")!=NULL)//接收到字符串
  37.     {
  38.         ticks_rly = My_SysTick_GetTicks();//獲取系統時間
  39.         MyLCD_Show(4,POS_MENU_Y+3,"遠程操作成功    ");//液晶顯示字符串
  40.         relay = RLY_ON;//繼電器閉合
  41.         beepAlarm = false;//取消蜂鳴器報警
  42.         //**All notes can be deleted and modified**//
  43.     }
  44.     else if(strstr(uartMsgRec->payload,"BEEP_KEY")!=NULL)//接收到字符串
  45.     {
  46.         #pragma push
  47.         #pragma diag_suppress 188//暫時屏蔽#188-D: enumerated type mixed with another type警告
  48.         beepAlarm = !beepAlarm;//切換報警狀態
  49.         #pragma pop
  50.         buzzer = beepAlarm;//蜂鳴器動作
  51.         USART_printf(USART1,"*Set BEEP OK#\r\n");
  52.     }
  53.     else if(strstr(uartMsgRec->payload,"GET_RECORD_RFID")!=NULL)//接收到字符串
  54.     {
  55.         u8 i;
  56.         for(i=0;i<MAX_NUM_USER_CARD+1;i++)
  57.         {
  58.             sprintf(dis0,"*REC_CARD_U%dC%dT%d#\r\n",i,saveRecord_CARD[i].count,saveRecord_CARD[i].timeCount);
  59.             USART_printf(USART1,dis0);
  60.         }
  61.     }
  62.     else
  63.     {
  64.         USART_printf(USART1,"*CMD ERROR#\r\n");
  65.     }
  66. }

  67. void keySetTime( void );
  68. int main(void)
  69. {
  70.     u8 index_CARD;//當前選擇的用戶編號
  71.     u8 sec_now = 0;//當前時間的秒鐘數
  72.     u8 day_now = 0;//當前日期的天數
  73.     u8 i;
  74.    
  75.     My_LED_Init();//LED初始化
  76.     My_KEY_Init();//按鍵初始化
  77.     USARTx_Init(USART1,9600);//串口初始化為9600
  78. //    USARTx_Init(USART2,9600);//串口初始化為9600
  79.     relay = RLY_ON;//繼電器閉合
  80.     buzzer = BEEP_ON;//蜂鳴器報警
  81.     LCD_Init();//液晶初始化
  82.     relay = RLY_OFF;//繼電器斷開
  83.     buzzer = BEEP_OFF;//蜂鳴器取消報警
  84.     LCD_Clear(Color16_BLACK);//清除液晶屏幕
  85.     FRONT_COLOR = Color16_WHITE;//設置液晶前景色(畫筆顏色)
  86.     BACK_COLOR = Color16_BLACK;//設置液晶背景色(畫布顏色)

  87.     My_RTC_Init(false);//RTC初始化(不使能鬧鐘)
  88.     keySetTime();//進入按鍵設置時鐘 如果是有無線通信的情況下 該按鍵設置可以取消

  89.     MyLCD_Show(4,0,"智能打卡系統");//液晶顯示字符串
  90.     MyLCD_Show(4,2+START_LINE,"正在初始化...");//液晶顯示字符串
  91.     My_RC522_Init();
  92.    
  93.     My_STMFlash_SectorSaveInit(NUM_SECTOR_REC_RFID,ADDR_FLASH_ID_BASE_RFID,(u16 *)saveRecord_CARD,sizeof(saveRecord_CARD)/2);//讀取保存的RFID歷史記錄數據
  94.     for(i=0;i<MAX_NUM_USER_CARD+1;i++)
  95.     {
  96.         if(saveRecord_CARD[i].count==0xffff)
  97.         {
  98.             saveRecord_CARD[i].timeCount=0;//記錄時間戳默認為0(即1970年1月1日00時00分00秒)
  99.             saveRecord_CARD[i].count=0;//記錄簽到次數默認為0
  100.             saveRecord_CARD[i].userID = i;//用戶ID按照數組順序賦值
  101.             saveRecord_CARD[i].type = 1;
  102.         }
  103.     }
  104.     My_STMFlash_SectorSaveInit(NUM_SECTOR_CARD,ADDR_FLASH_ID_BASE_CARD,(u16 *)userCard,sizeof(userCard)/2);//讀取保存的用戶卡號數據
  105.     for(i=0;i<MAX_NUM_USER_CARD;i++)//將無效卡號清零
  106.     {
  107.         if(*((u32 *)userCard[i])==0xffffffff)
  108.         {
  109.             *((u32 *)userCard[i])=0;//卡號為0是為無效卡
  110.         }
  111.         //**All notes can be deleted and modified**//
  112.     }
  113.     availableCardCount = MAX_NUM_USER_CARD-availableCardCount;
  114.    
  115.     MyLCD_Show(4,2+START_LINE,"初始化成功      ");//液晶顯示字符串
  116.     sprintf(disTemp,"RFID總數:%d",availableCardCount);
  117.     MyLCD_Show(4,3+START_LINE,disTemp);//液晶顯示字符串
  118.    
  119.     delay_ms(1000);
  120.     MyLCD_Show(4,2+START_LINE,"                ");//液晶顯示字符串
  121.     MyLCD_Show(4,3+START_LINE,"                ");//液晶顯示字符串
  122.     MyLCD_Show(4,4+START_LINE,"                ");//液晶顯示字符串
  123.     MyLCD_Show(4,POS_MENU_Y,"  歡迎使用         ");//液晶顯示字符串
  124. //FINGERPRINT_Cmd_Delete_All_Model();
  125.     My_Menu_Init();
  126.    
  127.      while(1)
  128.     {
  129.         My_KeyScan();//按鍵掃描
  130.         
  131.         
  132.         switch(My_Menu_GetSelectID())//獲取菜單ID
  133.         {
  134.             case MENU_ID_ADD_RFID:////////////////////////////////////////////////添加卡號
  135.                 {
  136.                     switch(workState)
  137.                     {
  138.                         case 0:
  139.                             for(index_CARD=0;index_CARD<MAX_NUM_USER_CARD;index_CARD++)//計算有效卡號數量
  140.                             {
  141.                                 if(*((u32 *)userCard[index_CARD])==0)//卡號為0是為無效卡
  142.                                 {
  143.                                     break;
  144.                                 }
  145.                             }
  146.                             if(index_CARD>=MAX_NUM_USER_CARD)//卡號索引大于等于最大用戶數
  147.                             {
  148.                                 MyLCD_Show(4,POS_MENU_Y+2,"RFID庫已滿!");//液晶顯示字符串
  149.                                 delay_ms(1000);
  150.                                 MyLCD_Show(4,POS_MENU_Y+2,"            ");//液晶顯示字符串
  151.                                 My_Menu_Back(true);
  152.                                 break;
  153.                             }
  154.                             MyLCD_Show(5,POS_MENU_Y+2,"選擇編號        ");//液晶顯示字符串
  155.                             sprintf(disTemp,"    %s        ",userName_CARD[index_CARD]);//顯示ID號
  156.                             MyLCD_Show(4,POS_MENU_Y+3,disTemp);
  157.                             workState++;//進入下一個狀態
  158.                             break;
  159.                         case 1:
  160.                             if(KeyIsPress(key_up))//按下了向上鍵
  161.                             {
  162.                                 index_CARD++;//ID號加
  163.                                 index_CARD %= MAX_NUM_USER_CARD;//最大用戶數
  164.                                 sprintf(disTemp,"    %s        ",userName_CARD[index_CARD]);//顯示ID號
  165.                                 MyLCD_Show(4,POS_MENU_Y+3,disTemp);
  166.                             }
  167.                             if(KeyIsPress(key_down))//按下了向下鍵
  168.                             {
  169.                                 //**All notes can be deleted and modified**//
  170.                                 sprintf(disTemp,"    %s        ",userName_CARD[index_CARD]);//顯示ID號
  171.                                 MyLCD_Show(4,POS_MENU_Y+3,disTemp);
  172.                             }
  173.                             if(KeyIsPress(key_ok))//按下了OK鍵
  174.                             {
  175.                                 if(*((u32 *)userCard[index_CARD])==0)//卡號為0是為無效卡
  176.                                 {
  177.                                     workState++;//進入下一個狀態
  178.                                 }
  179.                                 else
  180.                                 {
  181.                                     sprintf(disTemp,"%s已存在!  ",userName_CARD[index_CARD]);//顯示ID號
  182.                                     MyLCD_Show(4,POS_MENU_Y+3,"                ");
  183.                                     MyLCD_Show(4,POS_MENU_Y+2,disTemp);
  184.                                     delay_ms(1000);
  185.                                     MyLCD_Show(4,POS_MENU_Y+2,"            ");
  186.                                     //**All notes can be deleted and modified**//
  187.                                 }
  188.                             }
  189.                             break;
  190.                         case 2:
  191.                             MyLCD_Show(5,POS_MENU_Y+2,"請刷卡...        ");//液晶顯示字符串
  192.                             MyLCD_Show(5,POS_MENU_Y+3,"                 ");//液晶顯示字符串
  193.                             workState++;//進入下一個狀態
  194.                             break;
  195.                         case 3:
  196.                             if(My_RC522_ReadCardID(UID,true))//讀取到一次卡號
  197.                             {
  198.                                 buzzer = BEEP_ON;
  199.                                 delay_ms(100);
  200.                                 buzzer = BEEP_OFF;
  201.                                 for(i=0;i<MAX_NUM_USER_CARD;i++)//對比所有的用戶卡號
  202.                                 {
  203.                                     if(My_memcmp(UID,userCard[i],4))//與用戶卡號相同
  204.                                     {
  205.                                         break;
  206.                                     }
  207.                                 }
  208.                                 if(i<MAX_NUM_USER_CARD)//與其中一個用戶卡號相同
  209.                                 {
  210.                                     MyLCD_Show(5,POS_MENU_Y+2,"卡號已存在!    ");//液晶顯示字符串
  211.                                     delay_ms(900);
  212.                                     MyLCD_Show(5,POS_MENU_Y+2,"                ");//液晶顯示字符串
  213.                                     workState--;//返回上一個狀態
  214.                                 }
  215.                                 else//與所有的用戶卡號都不相同
  216.                                 {
  217.                                     MyLCD_Show(5,POS_MENU_Y+2,"刷卡成功...    ");//液晶顯示字符串
  218.                                     delay_ms(400);
  219.                                     //**All notes can be deleted and modified**//
  220.                                 }
  221.                             }
  222.                             break;
  223.                         case 4:
  224.                             MyLCD_Show(5,POS_MENU_Y+2,"請再刷一次...    ");//液晶顯示字符串
  225.                             workState++;//進入下一個狀態
  226.                             break;
  227.                         case 5:
  228.                             if(My_RC522_ReadCardID(userCard[index_CARD],true))//讀取到一次卡號
  229.                             {
  230.                                 buzzer = BEEP_ON;
  231.                                 delay_ms(100);
  232.                                 buzzer = BEEP_OFF;
  233.                                 if(My_memcmp(userCard[index_CARD],UID,4))//對比兩次讀取的卡號是否相同
  234.                                 {
  235.                                     MyLCD_Show(5,POS_MENU_Y+2,"刷卡成功!    ");//液晶顯示字符串
  236.                                     My_STMFlash_SaveUseSector(NUM_SECTOR_CARD);//保存數據到用戶RFID卡號位置
  237.                                     workState++;//進入下一個狀態
  238.                                     delay_ms(900);
  239.                                 }
  240.                                 else
  241.                                 {
  242.                                     MyLCD_Show(5,POS_MENU_Y+2,"卡號不匹配!    ");//液晶顯示字符串
  243.                                     MyLCD_Show(5,POS_MENU_Y+3,"請再次刷卡...  ");//液晶顯示字符串
  244.                                     *((u32 *)userCard[index_CARD])=0;//卡號清零
  245.                                     //**All notes can be deleted and modified**//
  246.                                 }
  247.                             }
  248.                             break;
  249.                         case 6:
  250.                             MyLCD_Show(5,POS_MENU_Y+2,"             ");//液晶顯示字符串
  251.                             My_Menu_Exit();//退出菜單
  252.                             workState=0;//回到初始狀態
  253.                             break;
  254.                         default:break;
  255.                     }
  256.                 }
  257.                 break;
  258.             case MENU_ID_DEL_RFID:////////////////////////////////////////////////刪除卡號
  259.                 {
  260.                     switch(workState)
  261.                     {
  262.                         case 0:
  263.                             if(index_CARD>=MAX_NUM_USER_CARD)
  264.                             {
  265.                                 index_CARD = MAX_NUM_USER_CARD-1;//指向最大值
  266.                             }
  267.                             MyLCD_Show(5,POS_MENU_Y+2,"選擇編號        ");//液晶顯示字符串
  268.                             sprintf(disTemp,"    %s        ",userName_CARD[index_CARD]);//顯示ID號
  269.                             MyLCD_Show(4,POS_MENU_Y+3,disTemp);
  270.                             workState++;//進入下一個狀態
  271.                             break;
  272.                         case 1:
  273.                             if(KeyIsPress(key_up))//按下了向上鍵
  274.                             {
  275.                                 index_CARD++;//ID號加
  276.                                 index_CARD %= MAX_NUM_USER_CARD;//最大用戶數
  277.                                 sprintf(disTemp,"    %s        ",userName_CARD[index_CARD]);//顯示ID號
  278.                                 MyLCD_Show(4,POS_MENU_Y+3,disTemp);
  279.                             }
  280.                             if(KeyIsPress(key_down))
  281.                             {
  282.                                 if(index_CARD)//索引號大于0
  283.                                 {
  284.                                     index_CARD--;//ID號減
  285.                                 }
  286.                                 else
  287.                                 {
  288.                                     index_CARD = MAX_NUM_USER_CARD-1;//指向最大值
  289.                                 }
  290.                                 sprintf(disTemp,"    %s        ",userName_CARD[index_CARD]);//顯示ID號
  291.                                 MyLCD_Show(4,POS_MENU_Y+3,disTemp);
  292.                             }
  293.                             if(KeyIsPress(key_ok))//按下了OK鍵
  294.                             {
  295.                                 if(*((u32 *)userCard[index_CARD])==0)//卡號為0是為無效卡
  296.                                 {
  297.                                     sprintf(disTemp,"%s不存在!",userName_CARD[index_CARD]);
  298.                                     MyLCD_Show(5,POS_MENU_Y+2,disTemp);//液晶顯示字符串
  299.                                     MyLCD_Show(4,POS_MENU_Y+3,"                ");//液晶顯示字符串
  300.                                     //**All notes can be deleted and modified**//
  301.                                 }
  302.                                 else
  303.                                 {
  304.                                     sprintf(disTemp,"刪除%s卡號?",userName_CARD[index_CARD]);
  305.                                     MyLCD_Show(4,POS_MENU_Y+2,disTemp);//液晶顯示字符串
  306.                                     MyLCD_Show(4,POS_MENU_Y+3,"                ");//液晶顯示字符串
  307.                                     //**All notes can be deleted and modified**//
  308.                                 }
  309.                                 delay_ms(500);
  310.                             }
  311.                             break;
  312.                         case 2:
  313.                             if(KeyIsPress(key_ok))//按下了OK鍵
  314.                             {
  315.                                 MyLCD_Show(4,POS_MENU_Y+2,"卡號已刪除!    ");//液晶顯示字符串
  316.                                 MyLCD_Show(4,POS_MENU_Y+3,"                ");//液晶顯示字符串
  317.                                 saveRecord_CARD[index_CARD].timeCount = 0;//默認為0
  318.                                 saveRecord_CARD[index_CARD].count=0;//計數值清零
  319.                                 My_STMFlash_SaveUseSector(NUM_SECTOR_REC_RFID);//保存數據到RFID歷史記錄位置
  320.                                 *((u32 *)userCard[index_CARD])=0;//卡號清零
  321.                                 My_STMFlash_SaveUseSector(NUM_SECTOR_CARD);//保存數據到用戶RFID卡號位置
  322.                                 workState++;//進入下一個狀態
  323.                                 delay_ms(500);
  324.                             }
  325.                             break;
  326.                         case 3:
  327.                             MyLCD_Show(4,POS_MENU_Y+2,"                ");//液晶顯示字符串
  328.                             My_Menu_Exit();//退出菜單
  329.                             workState=0;//回到初始狀態
  330.                             break;
  331.                         default:break;
  332.                     }
  333.                 }
  334.                 break;
  335.             case MENU_ID_CLR_RFID:////////////////////////////////////////////////清空卡號
  336.                 {
  337.                     switch(workState)
  338.                     {
  339.                         case 0:
  340.                             MyLCD_Show(4,POS_MENU_Y+1,"                ");//液晶顯示字符串
  341.                             MyLCD_Show(4,POS_MENU_Y+2,"確認清空卡號?  ");//液晶顯示字符串
  342.                             MyLCD_Show(4,POS_MENU_Y+3,"                ");//液晶顯示字符串
  343.                             workState++;//進入下一個狀態
  344.                             break;
  345.                         case 1:
  346.                             if(KeyIsPress(key_ok))//按下了OK鍵
  347.                             {
  348.                                 MyLCD_Show(4,POS_MENU_Y+2,"卡號已清空!  ");//液晶顯示字符串
  349.                                 //**All notes can be deleted and modified**//
  350.                                 My_STMFlash_SaveUseSector(NUM_SECTOR_REC_RFID);//保存數據到RFID歷史記錄位置
  351.                                 for(i=0;i<MAX_NUM_USER_CARD;i++)//清除每一個RFID卡號
  352.                                 {
  353.                                     *((u32 *)userCard[i])=0;//卡號為0是為無效卡
  354.                                 }
  355.                                 My_STMFlash_SaveUseSector(NUM_SECTOR_CARD);//保存數據到flash
  356.                                 workState++;//進入下一個狀態
  357.                                 delay_ms(800);
  358.                             }
  359.                             break;
  360.                         case 2:
  361.                             MyLCD_Show(4,POS_MENU_Y+2,"                ");//液晶顯示字符串
  362.                             My_Menu_Exit();//退出菜單
  363.                             workState=0;//回到初始狀態
  364.                             break;
  365.                         default:break;
  366.                     }
  367.                 }
  368.                 break;
  369.             case MENU_ID_HISTORY_RFID:////////////////////////////////////////////RFID歷史記錄
  370.                 {
  371.                     switch(workState)
  372.                     {
  373.                         case 0:
  374.                             for(i=0;i<MAX_NUM_USER_CARD+1;i++)//遍歷每一個RFID歷史記錄
  375.                             {
  376.                                 _calendar_obj cal_save;
  377.                                 My_RTC_IntegerToCalendar(saveRecord_CARD[i].timeCount,&cal_save);//將RFID歷史記錄的時間數據轉換為日歷結構體
  378.                                 sprintf(dis0,"%s   %d次        ",userName_CARD[i],saveRecord_CARD[i].count);//數據格式轉換
  379.                                 sprintf(dis1,"%04d-%02d-%02d %02d:%02d:%02d",cal_save.year,cal_save.month,cal_save.day,cal_save.hour,cal_save.minute,cal_save.second);
  380.                                 MyLCD_Show(0,POS_MENU_Y+(i<<1)+1,dis0);//液晶顯示字符串
  381.                                 MyLCD_Show(0,POS_MENU_Y+(i<<1)+2,dis1);//液晶顯示字符串
  382.                             }
  383.                             workState++;//進入下一個狀態
  384.                             break;
  385.                         case 1:
  386.                             if(KeyIsPress(key_set_back))//按下了返回按鍵
  387.                             {
  388.                                 for(i=0;i<MAX_NUM_USER_CARD+1;i++)//清除每一條歷史紀錄的顯示
  389.                                 {
  390.                                     MyLCD_Show(0,POS_MENU_Y+(i<<1)+1,"                      ");//液晶顯示字符串
  391.                                     MyLCD_Show(0,POS_MENU_Y+(i<<1)+2,"                      ");//液晶顯示字符串
  392.                                 }
  393.                             }
  394.                             break;
  395.                         default:break;
  396.                     }
  397.                 }
  398.                 break;
  399.             default:
  400.                 break;
  401.         }
  402.         My_Menu_Contrl();//控制菜單的上下移動及進入和返回
  403.         
  404.         if(My_Menu_GetSelectID() == 0)//未進入菜單
  405.         {
  406.             if(KeyIsPress(key_up))//如果按下了繼電器控制按鍵
  407.             {
  408.                 ticks_rly = My_SysTick_GetTicks();//獲取系統時間
  409.                 relay = RLY_ON;//繼電器閉合
  410.                 beepAlarm = false;//取消蜂鳴器報警
  411.                 buzzer = BEEP_OFF;//取消蜂鳴器報警
  412.             }
  413.             if(KeyIsPress(key_down))//如果按下了報警按鍵
  414.             {
  415.                 #pragma push
  416.                 #pragma diag_suppress 188//暫時屏蔽#188-D: enumerated type mixed with another type警告
  417.                 beepAlarm = !beepAlarm;//切換報警狀態
  418.                 #pragma pop
  419.                 buzzer = beepAlarm;//蜂鳴器動作
  420.             }
  421.         // 尋卡
  422.             if(My_RC522_ReadCardID(UID,true))
  423.             {
  424.                 for(index_CARD=0;index_CARD<MAX_NUM_USER_CARD;index_CARD++)//對比每一個RFID卡號
  425.                 {
  426.                     if(My_memcmp(UID,userCard[index_CARD],4))//如果卡號相同
  427.                     {
  428.                         break;
  429.                     }
  430.                 }
  431.                 buzzer = !buzzer;
  432.                 delay_ms(100);
  433.                 buzzer = !buzzer;
  434.                 saveRecord_CARD[index_CARD].timeCount = My_RTC_CalendarToInteger(&calendar);//將當前RTC時間轉換為整數
  435.                 saveRecord_CARD[index_CARD].count++;//計數值+1
  436.                 if(index_CARD<MAX_NUM_USER_CARD)//如果讀取到的卡號與其中一個用戶卡號相同
  437.                 {
  438.                     ticks_rly = My_SysTick_GetTicks();//獲取系統時間
  439.                     beepAlarm = false;//取消蜂鳴器報警
  440.                     relay = RLY_ON;//繼電器閉合
  441.                     buzzer = BEEP_OFF;//取消蜂鳴器報警
  442.                     FRONT_COLOR = Color16_GREEN;//將液晶前景色(畫筆顏色)設置為綠色
  443.                     sprintf(disTemp,"%s  %d次",userName_CARD[index_CARD],saveRecord_CARD[index_CARD].count);
  444.                     MyLCD_Show(4,POS_MENU_Y+3,"刷卡成功!");//液晶顯示字符串
  445.                 }
  446.                 else//如果讀取到的卡號與所有用戶卡號都不相同
  447.                 {
  448.                     ticks_beep = My_SysTick_GetTicks();//獲取系統時間
  449.                     buzzer = BEEP_ON;//蜂鳴器報警
  450.                     relay = RLY_OFF;//繼電器斷開
  451.                     FRONT_COLOR = Color16_RED;//將液晶前景色(畫筆顏色)設置為紅色
  452.                     sprintf(disTemp,"RFID未錄入 %d次",saveRecord_CARD[index_CARD].count);
  453.                 }
  454.                 sprintf(dis0,"*REC_CARD_U%dC%dT%d#\r\n",index_CARD,saveRecord_CARD[index_CARD].count,saveRecord_CARD[index_CARD].timeCount);
  455.                 USART_printf(USART1,dis0);
  456.                 MyLCD_Show(4,POS_MENU_Y+2,disTemp);//液晶顯示字符串
  457.                 sprintf(dis0,"%04d-%02d-%02d",calendar.year,calendar.month,calendar.day);
  458.                 sprintf(dis1,"%02d:%02d:%02d %d",calendar.hour,calendar.minute,calendar.second,calendar.week);
  459.                 MyLCD_Show(4,POS_MENU_Y+4,dis0);//液晶顯示字符串
  460.                 MyLCD_Show(4,POS_MENU_Y+5,dis1);//液晶顯示字符串
  461.                 //**All notes can be deleted and modified**//
  462.                 delay_ms(1800);//防止手指松開時的誤判斷
  463.                 MyLCD_Show(0,POS_MENU_Y+2,"                      ");//液晶顯示字符串
  464.                 MyLCD_Show(0,POS_MENU_Y+3,"                      ");//液晶顯示字符串
  465.                 MyLCD_Show(0,POS_MENU_Y+4,"                      ");//液晶顯示字符串
  466.                 MyLCD_Show(0,POS_MENU_Y+5,"                      ");//液晶顯示字符串
  467.             }
  468.         }
  469.         if(ticks_rly>0 && SysTickSecPassed(ticks_rly,3))//時間過去3秒鐘
  470.         {
  471.             ticks_rly = 0;
  472.             relay = RLY_OFF;//繼電器斷開
  473.         }
  474.         if(ticks_beep>0 && SysTickSecPassed(ticks_beep,3))//時間過去3秒鐘
  475.         {
  476.             ticks_beep = 0;
  477.             buzzer = BEEP_OFF;//取消蜂鳴器報警
  478.         }
  479.         
  480.         if(day_now != calendar.day)
  481.         {
  482.             day_now = calendar.day;
  483.             sprintf(dis0,"%04d-%02d-%02d",calendar.year,calendar.month,calendar.day);
  484.             #if START_LINE==1
  485.             MyLCD_Show(5,1,dis0);//液晶顯示字符串
  486.             #else
  487.             MyLCD_Show(2,0,dis0+5);//液晶顯示字符串
  488.             MyLCD_Show(7,0,"   ");//液晶顯示字符串
  489.             #endif
  490.         }
  491.         if(sec_now != calendar.second)
  492.         {
  493.             sec_now = calendar.second;
  494.             sprintf(dis1,"%02d:%02d:%02d %d",calendar.hour,calendar.minute,calendar.second,calendar.week);
  495.             #if START_LINE==1
  496.             MyLCD_Show(5,2,dis1);//液晶顯示字符串
  497.             #else
  498.             MyLCD_Show(9,0,dis1);//液晶顯示字符串
  499.             #endif
  500.         }
  501.         if(beepAlarm)
  502.         {
  503.             relay = RLY_OFF;//繼電器斷開
  504.             buzzer = BEEP_ON;
  505.         }
  506.         My_UartMessage_Process();//處理串口數據
  507.     }
  508. }

  509. void My_Menu_Contrl(void)
  510. {
  511.     if(selectedMenu!=NULL)
  512.     {
  513.         if(KeyIsPress(key_up))//按下了向上鍵
  514.         {
  515.             My_Menu_SelectUp(true);
  516.         }
  517.         if(KeyIsPress(key_down))//按下了向上鍵
  518.         {
  519.             My_Menu_SelectDown(true);
  520.         }
  521.         if(KeyIsPress(key_ok))//按下了OK鍵
  522.         {
  523.             My_Menu_Into(true);
  524.         }
  525.         if(KeyIsPress(key_set_back))
  526.         {
  527.             MyLCD_Show(0,POS_MENU_Y+1,"                      ");//液晶顯示字符串
  528.             MyLCD_Show(0,POS_MENU_Y+2,"                      ");//液晶顯示字符串
  529.             MyLCD_Show(0,POS_MENU_Y+3,"                      ");//液晶顯示字符串
  530.             workState=0;//回到初始狀態
  531.             My_Menu_Back(true);
  532.         }
  533.     }
  534.     else if(KeyIsPress(key_set_back))
  535.     {
  536.         My_Menu_Into(true);
  537.     }
  538. }
  539. void My_Menu_Display(void)
  540. {
  541.     u8 i;
  542.     if(selectedMenu==NULL)//如果已經退出菜單
  543.     {
  544.         MyLCD_Show(4,POS_MENU_Y,"  歡迎使用         ");//液晶顯示字符串
  545.         return;
  546.     }
  547.     if(My_Menu_UnderBottom())
  548.     {
  549.         MyLCD_Show(6,POS_MENU_Y,*(selectedMenu->contentPtrArray+selectedMenu->selectIndex));//液晶顯示字符串
  550.         return;
  551.     }
  552.     MyLCD_Show(6,POS_MENU_Y,selectedMenu->title);//液晶顯示字符串
  553.     for(i=0;i<selectedMenu->itemCount;i++)
  554.     {
  555.         if(i==selectedMenu->selectIndex)
  556.         {
  557.             FRONT_COLOR = Color16_LIGHTBLUE;//設置前景色(畫筆顏色)為淺藍色
  558.             MyLCD_Show(5,i+POS_MENU_Y+1,">");//液晶顯示字符串
  559.             MyLCD_Show(6,POS_MENU_Y+1+i,*(selectedMenu->contentPtrArray+i));//液晶顯示字符串
  560.             FRONT_COLOR = Color16_WHITE;//設置前景色(畫筆顏色)為白色
  561.         }
  562.         else
  563.         {
  564.             MyLCD_Show(5,i+POS_MENU_Y+1," ");//液晶顯示字符串
  565.             MyLCD_Show(6,POS_MENU_Y+1+i,*(selectedMenu->contentPtrArray+i));//液晶顯示字符串
  566.         }
  567.     }
  568. }
  569. void My_Menu_Clear(void)
  570. {
  571.     u8 i,len;
  572.     if(selectedMenu==NULL || My_Menu_UnderBottom())//如果推出了菜單或當前在菜單的最底層
  573.     {
  574.         MyLCD_Show(4,POS_MENU_Y,"               ");//液晶顯示字符串
  575.         return;
  576.     }
  577.     len = strlen(selectedMenu->title);//計算字符串長度
  578.     while(len--)
  579.     {
  580.         MyLCD_Show(6+len,POS_MENU_Y," ");//液晶顯示字符串
  581.     }
  582.     for(i=0;i<selectedMenu->itemCount;i++)//
  583.     {
  584.         len = strlen(*(selectedMenu->contentPtrArray))+1;//計算字符串長度
  585.         while(len--)
  586.         {
  587.             MyLCD_Show(5+len,POS_MENU_Y+i+1," ");//液晶顯示字符串
  588.         }
  589.     }
  590. }

  591. #pragma diag_suppress 188
  592. #ifdef LCD_2_4
  593.     #define MyLCD_ShowSetTime(m,n,p) LCD_ShowString(LCD_GetPos_X(24,m),LCD_GetPos_Y(24,n),p,24,false)
  594. #else
  595.     #define MyLCD_ShowSetTime(m,n,p) LCD_ShowString(LCD_GetPos_X(12,m),LCD_GetPos_Y(12,n),p,12,false)
  596. #endif
  597. void keySetTime( void )
  598. {
  599.     u8 delay=0;//延時跳出
  600.     u8 setTimeFlag =0;//不進行設置時間
  601.     u8 disPlace =0;
  602.     u16 setYear,setMonth,setDay,setHour,setMin,setSec;
  603.     u8 setFlag = 0;
  604.     u8 i= 0;
  605.    
  606.     MyLCD_ShowSetTime(1,2,"Set Rtc ?");
  607.     MyLCD_ShowSetTime(1,3,"K1:Yes K2:No");
  608.     delay = 100; //延時選擇約2s
  609.     while(delay)
  610.     {
  611.         My_KeyScan();//按鍵掃描
  612.         if(KeyIsPressed(0))
  613.         {
  614.             setTimeFlag = 1;//進入時間設置
  615.             LCD_Clear(Color16_BLACK);//清除液晶屏幕
  616.             FRONT_COLOR = Color16_WHITE;//設置液晶前景色(畫筆顏色)
  617.             MyLCD_ShowSetTime(0,0,"set RTC :");
  618.             setYear = calendar.year;setMonth = calendar.month;setDay = calendar.day;
  619.             setHour = calendar.hour;setMin = calendar.minute;setSec = calendar.second;
  620.             break;
  621.         }
  622.         else if(KeyIsPress(1))
  623.         {
  624.             break;
  625.         }
  626.         delay--; //延時--
  627.         delay_ms(10);
  628.     }
  629.    
  630.     while(setTimeFlag)//時間設置 設置到最后一項后再點擊設置跳出
  631.     {
  632.         disPlace =1;//顯示位置依次增加
  633.         FRONT_COLOR = Color16_WHITE;//設置液晶前景色(畫筆顏色)
  634.         sprintf(dis0,"Year:%04d ",setYear);
  635.         MyLCD_ShowSetTime(2,disPlace++,dis0);
  636.         
  637.         sprintf(dis0,"Mon :%02d ",setMonth);
  638.         MyLCD_ShowSetTime(2,disPlace++,dis0);
  639.         
  640.         sprintf(dis0,"Day :%02d ",setDay);
  641.         MyLCD_ShowSetTime(2,disPlace++,dis0);
  642.         
  643.         sprintf(dis0,"Hour:%02d ",setHour);
  644.         MyLCD_ShowSetTime(2,disPlace++,dis0);
  645.         
  646.         sprintf(dis0,"Min :%02d ",setMin);
  647.         MyLCD_ShowSetTime(2,disPlace++,dis0);
  648.         
  649.         sprintf(dis0,"Sec :%02d ",setSec);
  650.         MyLCD_ShowSetTime(2,disPlace++,dis0);

  651.         My_KeyScan();//按鍵掃描
  652.         
  653.             if(KeyIsPress(0)) //設置值鍵
  654.             {
  655.                 setFlag++;//設置標志
  656.                 if(setFlag >= 7)
  657.                 {
  658.                     setFlag = 0;//設置結束
  659.                     setTimeFlag =0;//設置結束
  660.                     LCD_Clear(Color16_BLACK);//清除液晶屏幕
  661.                     FRONT_COLOR = Color16_WHITE;//設置液晶前景色(畫筆顏色)
  662.                     BACK_COLOR = Color16_BLACK;//設置液晶背景色(畫布顏色)
  663.                     break;
  664.                 }
  665.             }
  666.             else if(KeyIsPress(1)) //設置值鍵+
  667.             {
  668.                 if(setFlag == 1)if(setYear  < 2999){setYear  =  setYear     +1;}//設置年   +1
  669.                 if(setFlag == 2)if(setMonth < 12  ){setMonth =  setMonth    +1;}//設置月
  670.                 if(setFlag == 3)if(setDay   < 31  ){setDay   =  setDay      +1;}//設置日
  671.                 //  不設置 周 周是自動的
  672.                 if(setFlag == 4)if(setHour  < 23  ){setHour    = setHour   +1;}//設置時
  673.                 if(setFlag == 5)if(setMin   < 59  ){setMin     = setMin    +1;}//設置分
  674.                 if(setFlag == 6)if(setSec   < 59  ){setSec     = setSec    +1;}//設置秒
  675.             }
  676.             else if(KeyIsPress(2)) //設置值鍵-
  677.             {
  678.                 if(setFlag == 1)if(setYear  > 0  ){setYear  = setYear   -1;}//設置年  -1
  679.                 if(setFlag == 2)if(setMonth > 0  ){setMonth = setMonth  -1;}//設置月
  680.                 if(setFlag == 3)if(setDay   > 0  ){setDay   = setDay    -1;}//設置日
  681.                 if(setFlag == 4)if(setHour  > 0  ){setHour  = setHour   -1;}//設置時
  682.                 if(setFlag == 5)if(setMin   > 0  ){setMin   = setMin    -1;}//設置分
  683.                 if(setFlag == 6)if(setSec   > 0  ){setSec   = setSec    -1;}//設置秒
  684.             }
  685.             My_RTC_Set(setYear,setMonth,setDay,setHour,setMin,setSec);
  686.             FRONT_COLOR = Color16_RED;//設置液晶前景色(畫筆顏色)
  687.             for(i=1;i<7;i++) //顯示設置位置
  688.             {
  689.                 if(i == setFlag){MyLCD_ShowSetTime(1,i,">");}
  690.                 else MyLCD_ShowSetTime(1,i," ");
  691.             }
  692.     }
  693.     LCD_Clear(Color16_BLACK);//清除液晶屏幕
  694.     FRONT_COLOR = Color16_WHITE;//設置液晶前景色(畫筆顏色)
  695.     BACK_COLOR = Color16_BLACK;//設置液晶背景色(畫布顏色)
  696. }
復制代碼

以上資料51hei下載:
STM32單片機刷卡簽到系統設計.7z (11.67 MB, 下載次數: 71)


評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:1024398 發表于 2022-5-6 20:30 | 只看該作者
您好,麻煩問一下,我用網絡調試助手鏈接到了esp8266,但是向他發送RTC,設備上沒有反應,是為什么
回復

使用道具 舉報

板凳
ID:1024398 發表于 2022-5-8 04:34 | 只看該作者
問一下,TFT是多大的
回復

使用道具 舉報

地板
ID:1024398 發表于 2022-5-9 17:28 | 只看該作者

2.4英寸的,
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字字幕一区二区三区四区五区 | 伊人色综合久久天天五月婷 | 97国产精品 | 日本不卡高字幕在线2019 | 日韩在线 | 天堂久久av | 日韩成人在线观看 | 欧美一级久久 | 免费成人高清在线视频 | 久久国产精品视频 | 亚洲视频一区 | 精品国产精品国产偷麻豆 | 9久久 | 欧美一级免费看 | 涩涩视频网站在线观看 | 免费在线黄 | 中国黄色毛片视频 | 国产男女猛烈无遮掩视频免费网站 | 久久伊人一区 | 国产黄色av网站 | 97视频在线免费 | 综合久久av | 国产精品久久久久久久模特 | 电影91久久久 | 国产日韩一区二区三区 | 久久成人人人人精品欧 | 国产精品欧美一区喷水 | 国产精品久久久久久久7电影 | 国产精品国产a级 | 久久精品免费观看 | 成人免费毛片在线观看 | 97日日碰人人模人人澡分享吧 | 成人av鲁丝片一区二区小说 | 作爱视频免费观看 | 日本在线播放一区二区 | 亚洲二区视频 | 亚洲一区二区精品视频在线观看 | 午夜视频一区二区 | 免费看国产a | 久久久久久久久久影视 | 成人精品一区亚洲午夜久久久 |