找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1068|回復(fù): 0
收起左側(cè)

基于51單片機(jī)射頻RFID考勤數(shù)計(jì)數(shù)系統(tǒng)設(shè)計(jì)

[復(fù)制鏈接]
ID:1120652 發(fā)表于 2024-5-14 11:22 | 顯示全部樓層 |閱讀模式
51單片機(jī)射頻RFID考勤上課上班統(tǒng)計(jì)設(shè)計(jì)主要具有如下功能:
本設(shè)計(jì)由STC89C52單片機(jī)電路+RFID模塊電路+1602液晶顯示電路+按鍵電路+蜂鳴器報(bào)警電路+電源電路組成。
1、系統(tǒng)有3張,分別代表依次是張三、李四、王二。
2、任何一個(gè)人刷成功能,1602液晶響應(yīng)顯示,未刷顯示空“ ”位置上空的,刷成功后相應(yīng)位置顯示有人。
3、液晶第二行顯示刷的人數(shù),即出勤總?cè)藬?shù)。
4、按下按鍵表示上課,如果簽到人數(shù)和總?cè)藬?shù)不符合,蜂鳴器
具體程序和圖見(jiàn)本帖附件
原理圖如下所示:

原理圖

原理圖

單片機(jī)源碼如下:
  1. #include<reg52.h> //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
  2. #include<stdio.h>
  3. #include <intrins.h>
  4. #include "delay.h"
  5. #include "rc522.h"
  6. #include "1602.h"

  7. sbit key = P1^1;  //接口定義
  8. sbit buzzer  = P1^0;  //接口定義

  9. /*********/
  10. unsigned char code zsID[4]={0x56,0xe9,0xe0,0x73};        //張三號(hào)
  11. unsigned char code lsID[4]={0x8a,0xa7,0xe3,0x73};        //李四號(hào)
  12. unsigned char code weID[4]={0xc9,0xad,0x84,0xc3};        //王二號(hào)
  13. /*********/

  14. unsigned char UID[5];        //號(hào)
  15. unsigned char Temp[4] ; //暫存數(shù)組  

  16. unsigned long time_20ms;   //定時(shí)計(jì)數(shù)
  17. char dis0[16];                //液晶顯示數(shù)組
  18. char dis1[16];
  19. unsigned char zsFlag =' ';//張三 是否到標(biāo)志
  20. unsigned char lsFlag =' ';//李四 是否到標(biāo)志
  21. unsigned char weFlag =' ';//王二 是否到標(biāo)志
  22. unsigned char disFlag =0;        //顯示標(biāo)志
  23. unsigned char manNum=0;                         //人數(shù)
  24. bit buzFlag = 0; //蜂鳴器報(bào)警標(biāo)志
  25. void Init_Timer0(void);                 //函數(shù)聲明
  26. void UART_Init(void);
  27. void uartSendStr(unsigned char *s,unsigned char length);
  28. void uartSendByte(unsigned char dat);

  29. void main (void)
  30. {     
  31.         unsigned char disPlace=0;        //顯示位置
  32.         Init_Timer0();        //定時(shí)器0初始化
  33.         UART_Init();          //串口初始化

  34.         buzzer = 0; //報(bào)警         開(kāi)
  35.         LCD_Init();           //初始化液晶
  36.         DelayMs(100);          //延時(shí)有助于穩(wěn)定
  37.         LCD_Clear();
  38.         buzzer = 0; //報(bào)警         關(guān)

  39.         PcdReset();//復(fù)位RC522
  40.         PcdAntennaOn();//開(kāi)啟天線發(fā)射

  41.         sprintf(dis0,"ZS:%c LS:%c WE:%c ",zsFlag,lsFlag,weFlag);//打印數(shù)據(jù)        
  42.         LCD_Write_String(0,0,dis0);//顯示第二行

  43.         while (1)         //主循環(huán)
  44.         {

  45.                  if(PcdRequest(0x52,Temp)==MI_OK)  //檢測(cè)到號(hào)
  46.             {
  47.               if(PcdAnticoll(UID)==MI_OK) //讀取號(hào)成功
  48.               {
  49.                 uartSendByte(0x00);        //串口發(fā)送號(hào)
  50.                         uartSendStr(UID,4);
  51.                 uartSendByte(0x00);
  52.                         if((UID[0]==zsID[0])&&(UID[1]==zsID[1]))//張三 到
  53.                         {
  54.                                 if(zsFlag != 0xff)        //第一次刷到該
  55.                                 {                                                        
  56.                                         zsFlag =0xff;           //顯示 到
  57.                                         time_20ms = 8;buzzer = 0;          //蜂鳴器短暫鳴叫
  58.                                 }
  59.                         }
  60.                         else if((UID[0]==lsID[0])&&(UID[1]==lsID[1]))//李四 到
  61.                         {
  62.                                 if(lsFlag != 0xff)          //第一次刷到該
  63.                                 {
  64.                                         lsFlag =0xff;          //顯示 到
  65.                                         time_20ms = 8;buzzer = 0;         //蜂鳴器短暫鳴叫
  66.                                 }
  67.                         }
  68.                         else if((UID[0]==weID[0])&&(UID[1]==weID[1]))//李四 到
  69.                         {
  70.                                 if(weFlag != 0xff)         //第一次刷到該
  71.                                 {
  72.                                         weFlag =0xff;          //顯示 到
  73.                                         time_20ms = 8;buzzer = 0;        //蜂鳴器短暫鳴叫
  74.                                 }
  75.                         }
  76.               }
  77.             }
  78.                 if(disFlag  == 1)
  79.                 {
  80.                         sprintf(dis0,"ZS:%c LS:%c WE:%c ",zsFlag,lsFlag,weFlag);//打印數(shù)據(jù)        
  81.                         LCD_Write_String(0,0,dis0);//顯示第二行
  82.                         manNum=0;                        //清空總?cè)藬?shù)
  83.                         if(zsFlag==0xff)                //張三到 +1
  84.                         {manNum=manNum+1;}
  85.                         if(lsFlag==0xff)
  86.                         {manNum=manNum+1;}        //李四到 +1
  87.                         if(weFlag==0xff)
  88.                         {manNum=manNum+1;}        //王二到 +1        
  89.                         sprintf(dis1,"ZongRen:%d  ",(int)manNum);//打印數(shù)據(jù)        
  90.                         LCD_Write_String(0,1,dis1);//顯示第二行                                                               
  91.                         disFlag =0;               
  92.                 }

  93.                 if(key == 0) //按鍵按下
  94.                 {
  95.                         if(manNum != 3)          //人數(shù)不夠
  96.                         {
  97.                                 buzFlag = 1; //蜂鳴器報(bào)警標(biāo)志
  98.                         }               
  99.                 }

  100.         }
  101. }


  102. void Init_Timer0(void)
  103. {
  104.         TMOD |= 0x01;          //使用模式1,16位定時(shí)器,使用"|"符號(hào)可以在使用多個(gè)定時(shí)器時(shí)不受影響                     
  105.         TH0=(65536-20000)/256;                  //重新賦值 20ms
  106.         TL0=(65536-20000)%256;
  107.         EA=1;            //總中斷打開(kāi)
  108.         ET0=1;           //定時(shí)器中斷打開(kāi)
  109.         TR0=1;           //定時(shí)器開(kāi)關(guān)打開(kāi)
  110. }

  111. void Timer0_isr(void) interrupt 1
  112. {
  113.         TH0=(65536-20000)/256;                  //重新賦值 20ms
  114.         TL0=(65536-20000)%256;        
  115.         time_20ms++;
  116.         if(time_20ms%10==0)           //定時(shí)顯示
  117.         {
  118.                 disFlag = 1 ;
  119.                 DelayMs(150);  
  120.                 if(buzFlag == 1) buzzer =!buzzer;//蜂鳴器報(bào)警
  121.                 else buzzer = 1;//不報(bào)警
  122.         }
  123. }

  124. void UART_Init(void)
  125. {
  126.     SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
  127.     TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重裝
  128.     TH1   = 0xFD;               // TH1:  重裝值 9600 波特率 晶振 11.0592MHz
  129.         TL1 = TH1;  
  130.     TR1   = 1;                  // TR1:  timer 1 打開(kāi)                        
  131.     EA    = 1;                  //打開(kāi)總中斷
  132.     ES    = 1;                  //打開(kāi)串口中斷
  133. }


  134. void uartSendByte(unsigned char dat)
  135. {
  136.         unsigned char time_out;
  137.         time_out=0x00;
  138.         SBUF = dat;                          //將數(shù)據(jù)放入SBUF中
  139.         while((!TI)&&(time_out<100))  //檢測(cè)是否發(fā)送出去
  140.         {time_out++;DelayUs2x(10);}        //未發(fā)送出去 進(jìn)行短暫延時(shí)
  141.         TI = 0;                                                //清除ti標(biāo)志
  142. }

  143. void uartSendStr(unsigned char *s,unsigned char length)
  144. {
  145.         unsigned char NUM;
  146.         NUM=0x00;
  147.         while(NUM<length)        //發(fā)送長(zhǎng)度對(duì)比
  148.         {
  149.                 uartSendByte(*s);  //放松單字節(jié)數(shù)據(jù)
  150.                 s++;                  //指針++
  151.                 NUM++;                  //下一個(gè)++
  152.            }
  153. }

  154. void UART_SER (void) interrupt 4         //串行中斷服務(wù)程序
  155. {
  156.         if(RI)                        //判斷是接收中斷產(chǎn)生
  157.         {
  158.                 RI=0;                      //標(biāo)志位清零
  159.         }
  160.         if(TI)  //如果是發(fā)送標(biāo)志位,清零
  161.         TI=0;

復(fù)制代碼

原理圖: 無(wú)
仿真: 無(wú)
代碼: 開(kāi)源-考勤.zip (296.13 KB, 下載次數(shù): 11)

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表