51單片機射頻RFID考勤上課上班統計設計主要具有如下功能:
本設計由STC89C52單片機電路+RFID模塊電路+1602液晶顯示電路+按鍵電路+蜂鳴器報警電路+電源電路組成。 1、系統有3張,分別代表依次是張三、李四、王二。 2、任何一個人刷成功能,1602液晶響應顯示,未刷顯示空“ ”位置上空的,刷成功后相應位置顯示有人。 3、液晶第二行顯示刷的人數,即出勤總人數。 4、按下按鍵表示上課,如果簽到人數和總人數不符合,蜂鳴器
具體程序和圖見本帖附件 原理圖如下所示:
103.JPG (188.8 KB, 下載次數: 24)
下載附件
原理圖
2024-5-14 11:19 上傳
單片機源碼如下: - #include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
- #include<stdio.h>
- #include <intrins.h>
- #include "delay.h"
- #include "rc522.h"
- #include "1602.h"
- sbit key = P1^1; //接口定義
- sbit buzzer = P1^0; //接口定義
- /*********/
- unsigned char code zsID[4]={0x56,0xe9,0xe0,0x73}; //張三號
- unsigned char code lsID[4]={0x8a,0xa7,0xe3,0x73}; //李四號
- unsigned char code weID[4]={0xc9,0xad,0x84,0xc3}; //王二號
- /*********/
- unsigned char UID[5]; //號
- unsigned char Temp[4] ; //暫存數組
- unsigned long time_20ms; //定時計數
- char dis0[16]; //液晶顯示數組
- char dis1[16];
- unsigned char zsFlag =' ';//張三 是否到標志
- unsigned char lsFlag =' ';//李四 是否到標志
- unsigned char weFlag =' ';//王二 是否到標志
- unsigned char disFlag =0; //顯示標志
- unsigned char manNum=0; //人數
- bit buzFlag = 0; //蜂鳴器報警標志
- void Init_Timer0(void); //函數聲明
- void UART_Init(void);
- void uartSendStr(unsigned char *s,unsigned char length);
- void uartSendByte(unsigned char dat);
- void main (void)
- {
- unsigned char disPlace=0; //顯示位置
- Init_Timer0(); //定時器0初始化
- UART_Init(); //串口初始化
- buzzer = 0; //報警 開
- LCD_Init(); //初始化液晶
- DelayMs(100); //延時有助于穩定
- LCD_Clear();
- buzzer = 0; //報警 關
- PcdReset();//復位RC522
- PcdAntennaOn();//開啟天線發射
- sprintf(dis0,"ZS:%c LS:%c WE:%c ",zsFlag,lsFlag,weFlag);//打印數據
- LCD_Write_String(0,0,dis0);//顯示第二行
- while (1) //主循環
- {
- if(PcdRequest(0x52,Temp)==MI_OK) //檢測到號
- {
- if(PcdAnticoll(UID)==MI_OK) //讀取號成功
- {
- uartSendByte(0x00); //串口發送號
- uartSendStr(UID,4);
- uartSendByte(0x00);
- if((UID[0]==zsID[0])&&(UID[1]==zsID[1]))//張三 到
- {
- if(zsFlag != 0xff) //第一次刷到該
- {
- zsFlag =0xff; //顯示 到
- time_20ms = 8;buzzer = 0; //蜂鳴器短暫鳴叫
- }
- }
- else if((UID[0]==lsID[0])&&(UID[1]==lsID[1]))//李四 到
- {
- if(lsFlag != 0xff) //第一次刷到該
- {
- lsFlag =0xff; //顯示 到
- time_20ms = 8;buzzer = 0; //蜂鳴器短暫鳴叫
- }
- }
- else if((UID[0]==weID[0])&&(UID[1]==weID[1]))//李四 到
- {
- if(weFlag != 0xff) //第一次刷到該
- {
- weFlag =0xff; //顯示 到
- time_20ms = 8;buzzer = 0; //蜂鳴器短暫鳴叫
- }
- }
- }
- }
- if(disFlag == 1)
- {
- sprintf(dis0,"ZS:%c LS:%c WE:%c ",zsFlag,lsFlag,weFlag);//打印數據
- LCD_Write_String(0,0,dis0);//顯示第二行
- manNum=0; //清空總人數
- if(zsFlag==0xff) //張三到 +1
- {manNum=manNum+1;}
- if(lsFlag==0xff)
- {manNum=manNum+1;} //李四到 +1
- if(weFlag==0xff)
- {manNum=manNum+1;} //王二到 +1
- sprintf(dis1,"ZongRen:%d ",(int)manNum);//打印數據
- LCD_Write_String(0,1,dis1);//顯示第二行
- disFlag =0;
- }
- if(key == 0) //按鍵按下
- {
- if(manNum != 3) //人數不夠
- {
- buzFlag = 1; //蜂鳴器報警標志
- }
- }
- }
- }
- void Init_Timer0(void)
- {
- TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
- TH0=(65536-20000)/256; //重新賦值 20ms
- TL0=(65536-20000)%256;
- EA=1; //總中斷打開
- ET0=1; //定時器中斷打開
- TR0=1; //定時器開關打開
- }
- void Timer0_isr(void) interrupt 1
- {
- TH0=(65536-20000)/256; //重新賦值 20ms
- TL0=(65536-20000)%256;
- time_20ms++;
- if(time_20ms%10==0) //定時顯示
- {
- disFlag = 1 ;
- DelayMs(150);
- if(buzFlag == 1) buzzer =!buzzer;//蜂鳴器報警
- else buzzer = 1;//不報警
- }
- }
- void UART_Init(void)
- {
- SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
- TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重裝
- TH1 = 0xFD; // TH1: 重裝值 9600 波特率 晶振 11.0592MHz
- TL1 = TH1;
- TR1 = 1; // TR1: timer 1 打開
- EA = 1; //打開總中斷
- ES = 1; //打開串口中斷
- }
- void uartSendByte(unsigned char dat)
- {
- unsigned char time_out;
- time_out=0x00;
- SBUF = dat; //將數據放入SBUF中
- while((!TI)&&(time_out<100)) //檢測是否發送出去
- {time_out++;DelayUs2x(10);} //未發送出去 進行短暫延時
- TI = 0; //清除ti標志
- }
- void uartSendStr(unsigned char *s,unsigned char length)
- {
- unsigned char NUM;
- NUM=0x00;
- while(NUM<length) //發送長度對比
- {
- uartSendByte(*s); //放松單字節數據
- s++; //指針++
- NUM++; //下一個++
- }
- }
- void UART_SER (void) interrupt 4 //串行中斷服務程序
- {
- if(RI) //判斷是接收中斷產生
- {
- RI=0; //標志位清零
- }
- if(TI) //如果是發送標志位,清零
- TI=0;
復制代碼 原理圖: 無
仿真: 無
代碼:
開源-考勤.zip
(296.13 KB, 下載次數: 11)
2024-5-14 11:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|