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ī)源碼如下: - #include<reg52.h> //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
- #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}; //張三號(hào)
- unsigned char code lsID[4]={0x8a,0xa7,0xe3,0x73}; //李四號(hào)
- unsigned char code weID[4]={0xc9,0xad,0x84,0xc3}; //王二號(hào)
- /*********/
- unsigned char UID[5]; //號(hào)
- unsigned char Temp[4] ; //暫存數(shù)組
- unsigned long time_20ms; //定時(shí)計(jì)數(shù)
- char dis0[16]; //液晶顯示數(shù)組
- char dis1[16];
- unsigned char zsFlag =' ';//張三 是否到標(biāo)志
- unsigned char lsFlag =' ';//李四 是否到標(biāo)志
- unsigned char weFlag =' ';//王二 是否到標(biāo)志
- unsigned char disFlag =0; //顯示標(biāo)志
- unsigned char manNum=0; //人數(shù)
- bit buzFlag = 0; //蜂鳴器報(bào)警標(biāo)志
- void Init_Timer0(void); //函數(shù)聲明
- 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(); //定時(shí)器0初始化
- UART_Init(); //串口初始化
- buzzer = 0; //報(bào)警 開(kāi)
- LCD_Init(); //初始化液晶
- DelayMs(100); //延時(shí)有助于穩(wěn)定
- LCD_Clear();
- buzzer = 0; //報(bào)警 關(guān)
- PcdReset();//復(fù)位RC522
- PcdAntennaOn();//開(kāi)啟天線發(fā)射
- sprintf(dis0,"ZS:%c LS:%c WE:%c ",zsFlag,lsFlag,weFlag);//打印數(shù)據(jù)
- LCD_Write_String(0,0,dis0);//顯示第二行
- while (1) //主循環(huán)
- {
- if(PcdRequest(0x52,Temp)==MI_OK) //檢測(cè)到號(hào)
- {
- if(PcdAnticoll(UID)==MI_OK) //讀取號(hào)成功
- {
- uartSendByte(0x00); //串口發(fā)送號(hào)
- 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);//打印數(shù)據(jù)
- LCD_Write_String(0,0,dis0);//顯示第二行
- manNum=0; //清空總?cè)藬?shù)
- 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);//打印數(shù)據(jù)
- LCD_Write_String(0,1,dis1);//顯示第二行
- disFlag =0;
- }
- if(key == 0) //按鍵按下
- {
- if(manNum != 3) //人數(shù)不夠
- {
- buzFlag = 1; //蜂鳴器報(bào)警標(biāo)志
- }
- }
- }
- }
- void Init_Timer0(void)
- {
- TMOD |= 0x01; //使用模式1,16位定時(shí)器,使用"|"符號(hào)可以在使用多個(gè)定時(shí)器時(shí)不受影響
- TH0=(65536-20000)/256; //重新賦值 20ms
- TL0=(65536-20000)%256;
- EA=1; //總中斷打開(kāi)
- ET0=1; //定時(shí)器中斷打開(kāi)
- TR0=1; //定時(shí)器開(kāi)關(guān)打開(kāi)
- }
- void Timer0_isr(void) interrupt 1
- {
- TH0=(65536-20000)/256; //重新賦值 20ms
- TL0=(65536-20000)%256;
- time_20ms++;
- if(time_20ms%10==0) //定時(shí)顯示
- {
- disFlag = 1 ;
- DelayMs(150);
- if(buzFlag == 1) buzzer =!buzzer;//蜂鳴器報(bào)警
- else buzzer = 1;//不報(bào)警
- }
- }
- 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 打開(kāi)
- EA = 1; //打開(kāi)總中斷
- ES = 1; //打開(kāi)串口中斷
- }
- void uartSendByte(unsigned char dat)
- {
- unsigned char time_out;
- time_out=0x00;
- SBUF = dat; //將數(shù)據(jù)放入SBUF中
- while((!TI)&&(time_out<100)) //檢測(cè)是否發(fā)送出去
- {time_out++;DelayUs2x(10);} //未發(fā)送出去 進(jìn)行短暫延時(shí)
- TI = 0; //清除ti標(biāo)志
- }
- void uartSendStr(unsigned char *s,unsigned char length)
- {
- unsigned char NUM;
- NUM=0x00;
- while(NUM<length) //發(fā)送長(zhǎng)度對(duì)比
- {
- uartSendByte(*s); //放松單字節(jié)數(shù)據(jù)
- s++; //指針++
- NUM++; //下一個(gè)++
- }
- }
- void UART_SER (void) interrupt 4 //串行中斷服務(wù)程序
- {
- if(RI) //判斷是接收中斷產(chǎn)生
- {
- RI=0; //標(biāo)志位清零
- }
- if(TI) //如果是發(fā)送標(biāo)志位,清零
- TI=0;
復(fù)制代碼 原理圖: 無(wú)
仿真: 無(wú)
代碼:
開(kāi)源-考勤.zip
(296.13 KB, 下載次數(shù): 11)
2024-5-14 11:25 上傳
點(diǎn)擊文件名下載附件
|