日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

基于RFID技术的考勤系统设计

發布時間:2024/3/12 windows 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于RFID技术的考勤系统设计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基于RFID技術的考勤系統設計

目錄

    • 基于RFID技術的考勤系統設計
  • 前言
  • 一、設計方案
    • 1.1 總設計框圖
    • 1.2功能簡述
    • 1.3硬件仿真圖
  • 二、基于RFID考勤管理系統設計
    • 2.1單片機STC89C52芯片功能簡述
    • 2.2射頻識別RC522芯片功能簡述
    • 2.3 LCD顯示屏
    • 2.4 CRC碼計算
    • 2.5 上位機設計
    • 2.6 數據庫設計
    • 2.7 Altium Designer簡介
    • 2.8 防碰撞原理分析
    • 2.9 邏輯加密卡的認證分析
  • 三、設計結果驗證
  • 總結
  • 參考文獻
  • 部分單片機代碼


前言

隨著科技技術的快速發展,單片機的應用越來越廣泛,在醫療、工廠、機械之類方面起著重要的作用,單片機的編程非常靈活,在生活的應用中起著重要的作用。更多的尤其是企業和教育機構,人們更多的使用射頻識別設備進行打卡,實現員工上班和下班的考勤工作記錄,不僅方便了工作人員的考勤操作,也為企業或教育機構的管理提供了便利的工具,從而真正的實現工作人員上班打卡記錄和下班打卡記錄的操作,一改傳統的人員手工記錄操作,使數據信息更加的真實性,準確性和易于操作性。

提示:以下是本篇文章正文內容,下面案例僅供參考

一、設計方案

1.1 總設計框圖

以STC89C52單片機即8051單片機的增強版為核心,起著控制作用。系統包括LCD液晶顯示屏電路、復位電路、晶振電路、蜂鳴器警報電路、RC522射頻識別電路。設計思路分為四個模塊:STC89C52RC、LCD顯示電路、蜂鳴器警報電路、射頻識別電路。

1.2功能簡述

基于RFID的考勤管理系統,主要用于員工的打卡登記。當IC卡接觸射頻識別模塊RC522時,液晶顯示屏顯示員工姓名和卡號顯示上班打卡成功,同一張IC卡再一次接觸射頻模塊時,液晶顯示屏顯示員工姓名和卡號顯示下班打卡成功。每次刷卡成功時,蜂鳴器響。上位機里面可以查看到刷卡的記錄信息。

1.3硬件仿真圖


二、基于RFID考勤管理系統設計

2.1單片機STC89C52芯片功能簡述

STC89C52是一種帶8K字節閃爍可編程可擦除只讀存儲器的低電壓、高性能COMOS8的微處理器。STC89C52內部有一個用于構成振蕩器的高增益反相放大器,引腳RXD和TXD分別是放大器的輸入端和輸出端。時鐘可以由內部方式產生或外部方式產生。在RXD和TXD引腳上外接定時元件,內部振蕩器就產生自激振蕩。定時元件通常采用石英晶體和電容組成并聯諧振電路。STC89C52系列單片機具有一下功能:兼容MCS51指令系統32個雙向I/O口3個16位可編程定時/計數器中斷2個串行中斷2個外部中斷源2個讀寫中斷口線

VCC:電源輸入,接+5V電源 GND:接地線 XTAL1:片內振蕩電路的輸入端 XTAL2:片內振蕩電路的輸出端 PSEN:外部存儲器讀選通信號 EA/VPP:程序存儲器的內外部選通,接低電平從外部程序存儲器讀指令,如果接高電平則從內部程序存儲器讀指令。 RST/VPD:復位引腳,引腳上出現2個機器周期的高電平將使單片機復位。 ALE/PROG:地址鎖存允許信號,當訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。 P0口:P0口是一組8 位漏極開路型雙向I/O口,也即地址/數據總線復用口。作為輸出口用時,每位能吸收電流的方式驅動8個TTL邏輯門電路,對端口寫“1”可作為高阻抗輸入端用。 P1口:P1口是一個內部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。 P2口:P2口為一個內部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當P2口被寫“1”時,其管腳被內部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內部上拉的緣故。P2口當用于外部程序存儲器或16位地址外部數據存儲器進行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內部上拉優勢,當對外部八位地址數據存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。 P3口:P3口是一組帶有內部上拉電阻的8位雙向I/O口。P3口輸出緩沖級可驅動4個TTL邏輯門電路。對P3口寫入“1”時,它們被內部上拉電阻拉高并可作為輸入端口。做輸入端時,被外部拉低的P3口將用上拉電阻輸出電流。P3口除了作為一般的I/O口線外,還有重要的第二功能。

表1-1 P3組主要功能描述

端口引腳第二功能
P3.0RXD(串行輸入口)
P3.1TXD(串行輸出口)
P3.2INT0*(外中斷0)
P3.3INT1*(外中斷1)
P3.4T0(定時/計數器0外部輸入)
P3.5T1(定時/計數器1外部輸入)
P3.6WR*(外部數據存儲器寫選通)
P3.7RD*(外部數據存儲器讀選通)

2.2射頻識別RC522芯片功能簡述

MFRC522是高度集成的非接觸式讀寫卡芯片,發送模塊利用調制和解調的原理,將他們完全集成到各種非接觸式通信方法和協議中。可以用來處理兼容ISO 14443A卡和應答機的信號,數字電路部分處理完整的ISO 14443A幀和錯誤檢測。MFRC522支持更高速的非接觸式通信,雙向數據傳輸速率高達424kbit/s。TVDD:發送器電源,給TX1和TX2的輸出級供電。TX1:發送器1,傳遞調制的13.56MHz的能量載波信號。TX2:發送器2,傳遞調制的13.56MHz的能量載波信號。TVSS:發送器地,TX1和TX2的輸出級的地。DVSS:數字地SDA:串行數據線IRQ:中斷請求,輸出用來指示的一個中斷事件。OSCIN:晶振輸入,振蕩器的反相放大器的輸入,外部產生的時鐘的輸入。OSCOUT:晶振輸出,振蕩器的反相放大器輸出。RX:接收器輸入,接收RF信號的管腳

表2-1 中斷標志及情況

中斷標志中斷源中斷標志置位情況
TimerIRq定時器定時器計數從1到0
TxIRaq發送器一次數據流發送結束
CRCIRqCRC協處理器已處理完FIFO緩沖區的所有數據
RxIRq接收器一次數據流接收結束
IdleIRq命令寄存器執行完一個命令
HiAlertIRqFIFO緩沖區FIFO緩沖區已滿
LoAlertIRqFIFO緩沖區FIFO緩沖區為空
ErrIRq非接觸式UART檢測到一個錯誤

2.3 LCD顯示屏

LCD液晶顯示屏具有4位/8位并行,2線或3線串行多種接口,可顯示16*16點漢字,16*8點ASCII字符集,低電壓低功耗。V0:屏幕亮度調整RS:當RS=’H’ DB7-DB0顯示數據,當RS=’L’ DB7-DB0顯示指令數據。R/W:當R/W=’H’,E=’H’,數據被讀到DB7-DB0。E(SCLK):使能信號PSB: H:8位或4位并口方式,L:串口方式。

2.4 CRC碼計算

(1)若信息字段代碼為1011001,對應〖m(x)=x〗^6+x^4+x^3+1;假設生成多項式為g(x)=x^4+x^3+1,對應g(x)代碼為11001,x^4 〖m(x)=x〗^10+x^8+x^7+x^4,對應代碼為10110010000(2)采用多項式除法x^4 m(x)/g(x),得到余數1010,校驗字段1010(3)發送方發送的傳輸字段為10110011010,前7位信息字段,后4位校驗字段(4)接收方使用相同的生成碼進行校驗,接收到的多項式如果能除盡,則正確。

2.5 上位機設計

登錄界面

登錄界面VB程序示例:

Private Sub Command1_Click() Dim sql As String Dim rs_login As New ADODB.Recordset If Trim(Text1.Text) = "" Then '判斷輸入的用戶名是否為空MsgBox "沒有這個用戶", vbOKOnly + vbExclamation, ""Text1.SetFocus Elsesql = "select * from 用戶信息表 where 用戶名='" & Text1.Text & "'"rs_login.Open sql, conn, adOpenKeyset, adLockPessimisticIf rs_login.EOF = True ThenMsgBox "沒有這個用戶", vbOKOnly + vbExclamation, ""Text1.SetFocusElse '檢驗密碼是否正確If Trim(rs_login.Fields(1)) = Trim(Text2.Text) ThenuserID = Text1.Text' userpow = rs_login.Fields(2)rs_login.CloseUnload MeForm1.ShowElseMsgBox "密碼不正確", vbOKOnly + vbExclamation, ""Text2.SetFocusEnd IfEnd If End If cnt = cnt + 1 If cnt = 3 ThenUnload Me End If Exit Sub End SubPrivate Sub Command2_Click() Unload Me End SubPrivate Sub Form_Load() Dim connectionstring As String connectionstring = "provider=Microsoft.Jet.oledb.4.0;" & _"data source=信息.mdb" conn.Open connectionstring cnt = 0 End Sub

信息顯示界面

信息顯示界面VB程序示例:

Dim vHour%, vState$ 'Public qq As VariantDim Con As New ADODB.Connection Dim rs As New ADODB.Recordset Dim sq1 As String Dim tt As Variant Dim tt2 As Variant Dim num As VariantDim gg As Variant'Dim g4 As Variant Dim a As StringDim b As StringDim c As String'Dim MyInt As VariantPrivate Sub COM1_Click() '串口號選擇Combo1.ListIndex = 0 End SubPrivate Sub COM2_Click() '串口號選擇Combo1.ListIndex = 1End SubPrivate Sub COM3_Click() '串口號選擇Combo1.ListIndex = 2 End SubPrivate Sub COM4_Click() '串口號選擇Combo1.ListIndex = 3 End SubPrivate Sub COM5_Click() '串口號選擇Combo1.ListIndex = 4 End SubPrivate Sub Command1_Click() Set recRecordset1 = Adodc2.Recordset '復制記錄集Dim sFilterStr As String Dim xhtj As String '學號條件 Dim xmtj As String '姓名條件 Dim bjtj As String '班級條件'查詢時,若字段不填,則默認查詢全部 If Trim(Text6.Text) = "" Then xhtj = "" Else xhtj = "卡號 like '*" & Trim(Text6.Text) & "*'" End IfIf Trim(Text7.Text) = "" Then xmtj = "" Else xmtj = "姓名 like '*" & Trim(Text7.Text) & "*'" End IfIf Trim(Text8.Text) = "" Then bjtj = "" Else xbtj = "班級 like '*" & Trim(Text8.Text) & "*'" End IfIf Trim(Text6.Text) <> "" And Trim(Text7.Text) <> "" Then xmtj = " and " & xmtj End IfIf (Trim(Text6.Text) <> "" Or Trim(Text7.Text) <> "") And Trim(Text8.Text) <> "" Then xbtj = " and " & xbtj End IfsFilterStr = Trim(sFilterStr & xhtj & xmtj & xbtj)If sFilterStr = "" Then Adodc2.RecordSource = "select * from 刷卡時間 order by 卡號" Adodc2.RefreshElse recRecordset1.Filter = sFilterStr End If DataGrid1.Visible = True 'Adodc2.RecordSource = "select * from 刷卡時間 order by 刷卡時間 desc"' Adodc2.Refresh Set DataGrid1.DataSource = Adodc2End SubPrivate Sub MSComm1_OnComm() Select Case MSComm1.CommEventCase comEvReceive ' 收到 RThreshold # ofDim hk As Varianthk = MSComm1.InputIf hk = "Y" Thentt = 2MSComm1.RThreshold = 8tt2 = 1' Text3.Text = "一號讀卡器"End Ifgg = hkIf tt = 2 ThenIf gg <> "Y" ThenText6.Text = ggCon.Open "provider=Microsoft.jet.OLEDB.4.0;data source=" & App.Path & "\信息.mdb"sq1 = "select * from 信息 where 卡號='" + gg + "'"rs.Open sq1, ConIf rs.EOF ThenText3.Text = ""Text1.Text = ""Text2.Text = ""Text4.Text = ""Text9.Text = ""Text10.Text = ""If MSComm1.PortOpen = True Then '防止串口沒有打開 打開發送出錯If tt2 = 1 ThenMSComm1.Output = "D" '給單片機發送E 開關MSComm1.OutBufferCount = 0 '發送緩沖區清空End If' If tt2 = 2 Then'MSComm1.Output = "F" '給單片機發送E 開關'MSComm1.OutBufferCount = 0 '發送緩沖區清空End If' End IfMSComm1.RThreshold = 1' MsgBox "此卡號不存在,請檢查...", vbExclamation, "查詢"Con.CloseSet rs = NothingSet Con = NothingExit SubElseText1.Text = rs.Fields("姓名")'Text3.Text = rs.Fields("幾棟幾樓")Text2.Text = rs.Fields("性別")Text3.Text = rs.Fields("部門")Text9.Text = rs.Fields("工號")Text10.Text = rs.Fields("狀態")' Text12.Text = rs.Fields("庫存")num = Text12.TextText4.Text = vState & a & "/" & b & "/" & c & "/" & TimeIf MSComm1.PortOpen = True Then '防止串口沒有打開 打開發送出錯If tt2 = 1 ThenMSComm1.Output = "E" '給單片機發送E 開關MSComm1.OutBufferCount = 0 '發送緩沖區清空End If' If tt2 = 2 Then'MSComm1.Output = "G" '給單片機發送E 開關' MSComm1.OutBufferCount = 0 '發送緩沖區清空'' End IfEnd IfEnd Ifrs.CloseCon.CloseSet rs = NothingSet Con = NothingIf Text10.Text = "上班" ThenIf MSComm1.PortOpen = True Then '防止串口沒有打開 打開發送出錯MSComm1.Output = "A" '給單片機發送E 開關MSComm1.OutBufferCount = 0 '發送緩沖區清空End IfCon.connectionstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\信息.mdb;Persist Security Info=False"Con.OpenSet rs = Con.Execute("UPDATE 信息 SET 狀態= '下班' where 卡號='" + gg + "'")' Set rs = Con.Execute("UPDATE 信息 SET 庫存='" + Text11.Text + "'where 卡號='" + gg + "'")Con.CloseEnd IfIf Text10.Text = "下班" ThenIf MSComm1.PortOpen = True Then '防止串口沒有打開 打開發送出錯MSComm1.Output = "B" '給單片機發送E 開關MSComm1.OutBufferCount = 0 '發送緩沖區清空End IfCon.connectionstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\信息.mdb;Persist Security Info=False"Con.OpenSet rs = Con.Execute("UPDATE 信息 SET 狀態= '上班' where 卡號='" + gg + "'")' Set rs = Con.Execute("UPDATE 信息 SET 庫存='" + Text11.Text + "'where 卡號='" + gg + "'")Con.CloseEnd IfMSComm1.RThreshold = 1tt = 1tt2 = 0Adodc1.connectionstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\信息.mdb;Persist Security Info=False"Adodc1.RecordSource = "select * from 刷卡時間"Adodc1.RefreshAdodc1.Recordset.AddNew '添加新紀錄Adodc1.Recordset("部門").Value = Text3.TextAdodc1.Recordset("性別").Value = Text2.TextAdodc1.Recordset("工號").Value = Text9.TextAdodc1.Recordset("狀態").Value = Text10.TextAdodc1.Recordset("姓名").Value = Text1.TextAdodc1.Recordset("卡號").Value = Text6.TextAdodc1.Recordset("刷卡時間").Value = Text4.Text' Adodc1.Recordset("庫存").Value = Text11.TextAdodc1.Recordset.Update '保存End IfEnd IfMSComm1.InBufferCount = 0Adodc2.RefreshDataGrid1.Visible = FalseCommand1.Visible = TrueEnd SelectEnd SubPrivate Sub oo_Click() '設置波特率9600 2 MSComm1.Settings = "9600,n,8,1" End SubPrivate Sub qw_Click() '設置波特率56000 MSComm1.Settings = "56000,n,8,1" End SubPrivate Sub Timer1_Timer() Text5.Text = vState & a & "/" & b & "/" & c & "/" & Time End SubPrivate Sub Form_Load()Adodc1.connectionstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\信息.mdb;Persist Security Info=False"Adodc1.RecordSource = "select * from 信息" Timer1.Interval = 10Data = Nowa = Format(Data, "yyyy")b = Format(Data, "mm")c = Format(Data, "dd") End SubPrivate Sub KSGZ_Click()g4 = g4 + 1 If g4 = 1 Then'Call dd_Click'Combo1.ListIndex = 0 'MSComm3.CommPort = 3MSComm1.InBufferSize = 8 '設置返回接收緩沖區的大小,以字符為單位。MSComm1.OutBufferSize = 2If MSComm1.PortOpen = True Then '關串口End IfMSComm1.RThreshold = 1 '設置并返回產生oncomm事件的字符數,以字符為單位. Rthreshold 為 1,接收緩沖區收到每一'個字符都會使 MSComm 控件產生 OnComm 事件。'MSComm1.SThreshold = 1 'MSComm1.InputLen = 0 '設置從接收緩沖區讀取的字數,0讀取整個緩沖區MSComm1.InputMode = comInputModeText '以文本方度接收MSComm1.InBufferCount = 0 '清空接收緩沖區' MSComm1.PortOpen = TrueEnd IfOn Error GoTo BLAKIf MSComm1.PortOpen = True ThenMSComm1.PortOpen = FalseMSComm1.CommPort = Combo1.ListIndex + 1MSComm1.PortOpen = True ElseMSComm1.CommPort = Combo1.ListIndex + 1MSComm1.PortOpen = True End IfExit Sub BLAK: MsgBox "串口不存在或者被占用!", vbOKOnly, "提示信息" End SubPrivate Sub tt_Click() '設置波特率4800 MSComm1.Settings = "4800,n,8,1" End SubPrivate Sub ttee_Click() Form5.ShowEnd SubPrivate Sub ttt_Click() Form2.ShowEnd SubPrivate Sub TZGZ_Click() If MSComm1.PortOpen = True Then MSComm1.PortOpen = False End If End SubPrivate Sub uu_Click() Form2.Show End SubPrivate Sub uu22_Click() Form4.ShowEnd SubPrivate Sub ww_Click() '設置波特率1200 2 MSComm1.Settings = "1200,n,8,1" End SubPrivate Sub xx_Click() '設置波特率2400 2 MSComm1.Settings = "2400,n,8,1" End SubPrivate Sub yy_Click() '設置波特率4800 2 MSComm1.Settings = "4800,n,8,1" End Sub

信息管理界面

2.6 數據庫設計

2.7 Altium Designer簡介

Altium Designer主要進行原理圖設計、電路仿真、PCB繪制編輯、拓撲邏輯自動布線、信號完整性分析 和設計輸 出等設計。在PCB部分,多通道復制、實時的、阻抗控制布線功能;SitusTM自動布線器等新功能以外,還著重在:差分對布線,FPGA器件差分對管腳的動態分配, PCB和FPGA之間的全面集成,從而實現了自動引腳優化和非凡的布線效果。還有PCB文件切片,PCB多個器件集體操作,復雜BGA器件的多層自動扇出,提供 了對高密度封裝(如 BGA)的交互布線功能, 總線布線功能,器件精確移動,快速鋪銅等功能交互式編輯、出錯查詢、布線和可視化功能,從而能更快地實現電路板布局,支持高速電路設計,具有成熟的布線后信號完整性分析工具.對差分信號提供系統范圍內的支持,可對高速內連的差分信號對進行充分定義、管理和交互式布線。支持包括對在FPGA項目內部定義的LVDS信號的物理設計 進行自動映射。在原理圖部分,可以將一些不同的對象拷貝到原理圖當中,原理圖文件切片,多個器件集體操作,文本筐的直接編輯,箭頭的添加,器件精確移動,總線走線,自動網標選擇等!在信號仿真部分,提供完善的混合信號仿真,在對 XSPICE 標準的支持之外,還支持對Pspice模型和電路的仿真。對FPGA設計提供了豐富的IP內核,包括各種處理器、存儲器、外設、接口、以及虛擬儀器。嵌入式設計部分,增強了JTAG器件的實時顯示功能,增強型基于FPGA的邏輯分析儀,可以支持32位或64位的信號輸入。除了現有的多種處理器內核外,還增強了對更多的32位微處理器的支持,可以使嵌入式軟件設計在軟處理器,FPGA內部嵌入的硬處理器,分立處理器之間無縫的遷移。使用了Wishbone開放總線連接器允許在FPGA上實現的邏輯模塊可以透明的連接到各種處理器上。

2.8 防碰撞原理分析

發生碰撞的原因:

(1)當多個標簽同時接受命令,又同時發出信息,給閱讀器造成信息的交叉干擾,以致分不清對象,造成沖突。 (2)多個讀寫器讀同一張標簽,同樣也會發送信息的碰撞,造成沖突。

防碰撞分析:

(1)PCD為選擇的防沖突類型和串聯級別分配了帶有編碼的SEL。 (2)PCD分配了帶有值為‘20’的NVB。 (3)PCD發送SEL和NVB。 (4)工作場內的所有PICC應使用它們的完整的UID CLn響應。 (5)假設場內的PICC擁有唯一序列號,那么,如果一個以上的PICC響應,則沖突發生。 (6)PCD應識別出第一個沖突的位置。 (7)PCD分配了帶有值的NVB,該值規定了UID CLn有效比特數。這些有效位應是PCD所決定的沖突發生之前被接收到的UID CLn的一部分再加上(0)b或(1)b。典型的實現是增加(1)b。 (8)PCD發送SEL和NVB,后隨有效位本身。 (9)只有PICC的UID CLn中的一部分等于PCD所發送的有效位時,PICC才應發送其UID CLn的其余部分。 (10)如果出現進一步的沖突,則重復步驟6~9。最大的環數目是32。 (11)如果不出現進一步的沖突,則PCD分配帶有值為‘70’的NVB。 (12)PCD發送SEL和NVB,后隨UID CLn的所有40個位,后面又緊跟CRC_A校驗和。 (13)它的UID CLn與40個比特匹配,則該PICC以其SAK表示響應。 (14)如果UID完整,則PICC應發送帶有清空的串聯級別位的SAK,并從READY狀態轉換到ACTIVE狀態。 (15)PCD應檢驗SAK(選擇確認)的串聯比特是否被設置,以決定帶有遞增串聯級別的進一步防沖突環是否應繼續進行。如果PICC的UID是已知的,則PCD可以跳過步驟2~10來選擇該PICC,而無需執行防沖突環。

防碰撞分析流程圖:

2.9 邏輯加密卡的認證分析

(1)應用程序通過RFID讀寫器向電子標簽發送認證請求。 (2)電子標簽收到請求后向讀寫器發送一個隨機數B。 (3)讀寫器收到隨機數B后,向電子標簽發送要驗證的密鑰加密B的數據包,其中包含了讀寫器生成的另一個隨機數A。 (4)電子標簽收到數據包后,使用芯片內部存儲的密鑰進行解密,解出隨機數B并校驗與之發出的隨機數B是否一致。 (5)如果一致,則RFID使用芯片內部存儲的密鑰對A進行加密并發送給讀寫器。 (6)讀寫器收到數據包后,進行解密,解出A并與之前的A比較是否一致。 (7)如果每一個環節都成功,則驗證成功,否則驗證失敗。

邏輯加密卡三次認證:

三、設計結果驗證

刷卡上班測試

刷卡下班測試

上位機上班結果顯示

上位機下班結果顯示

多功能按鍵界面

注冊界面

注銷界面

總結

設計最大的亮點就是模塊化設計,將執行功能的各個部分封裝成一個個模塊,即子函數。在主函數中編寫需要調用功能的子函數名即可執行相應的功能,目的是便于修改,減小了對程序大規模的修改,降低了程序編寫過程中的出錯率。設計的硬件圖考慮到實際應用的需求和視覺審美,盡最大程度的減少電路設計過程中線路的繁雜和無條理性,所以選擇標號的方式,既能使電路處于連通的狀態又能使電路整體整潔美觀。防碰撞原理的分析是本次設計的最大難點,RC522射頻識別采用防碰撞算法去解決讀寫器同時讀多個標簽時的沖突問題,采用了流程圖的方法,盡可能直觀形象的分析防碰撞的原理以及操作過程。邏輯加密卡三次認證的原理通過采用示意圖將讀寫器對標簽讀寫操作前的認證得到了較好的分析和操作。

參考文獻

[1]黃廣林.我國單片機技術的應用及發展趨勢[J]. 電子技術與軟件工程,2017(19):254 [2]周曉光,王曉華.射頻識別(RFID)技術原理與應用實例[M].人民郵電出版社,2006.5:35-37. [3] 李淑琴,范蟠果.射頻識別非接觸式IC卡讀卡器的設計[J].計算機測量與控制,2007,29(3): 378-380. [4] 嚴光文,張其善.射頻識別卡讀寫模塊的設計[J].北京航空航天大學學報,2003,41(2):74-76. [5] 安劍,孫秀梅,鞏建華.Visual Basic項目開發全程實錄.清華大學出版社,2011 [6] 嚴光文,張其善.射頻識別卡讀寫模塊的設計[J].北京航空航天大學學報,2003,41(2):74-76. [7] 郭天祥.新概念52單片機C語言教程——入門、提高、開發、拓展全攻略[M].北京:電子工業出版社,2008

部分單片機代碼

/** *函數將我們的尋卡命令PICC_REQIDL裝填到要發送的數組,通過 *PcdComMF522函數發送出去,如果此時在PCD有效范圍內沒有尋找到卡,則函數返回MI_ERR *若函數返回MI_OK,并且ulen為0x10為兩個字節則說明尋卡成功,返回的兩個字節被裝填入CardRevBuf數組。 */ char PcdRequest(unsigned char req_code,unsigned char *pTagType) {char status; unsigned int unLen;unsigned char ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08);//寄存器包含接收器和發送器和數據模式檢測器的狀態標志WriteRawRC(BitFramingReg,0x07);//不啟動數據發送SetBitMask(TxControlReg,0x03);//TX1,TX2輸出信號將傳遞經發送數據調制的13.56MHz的能量載波信號。ucComMF522Buf[0] = req_code;status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1, ucComMF522Buf,&unLen);//通過522發送req_code命令,并接收返回數據,存到ucComMF522Buf中。if ((status == MI_OK) && (unLen == 0x10))//因為2個字節是16bit{ *pTagType = ucComMF522Buf[0];*(pTagType+1) = ucComMF522Buf[1];}else{ status = MI_ERR; }return status; } /** *防沖突操作就是將防沖突命令通過PcdComMF522函數與PICC卡進行交互。防沖突命令是兩個字節, *其中第一個字節為Mifare_One卡的防沖突命令字PICC_ANTICOLL1(0X93), *第二個字節為0x20 *選擇代碼SEL(1個字節),SEL規定了串聯級別CLn。 *有效位的數目NVB(1個字節),NVB規定了PCD所發送的CLn的有效位的數目。 */ char PcdAnticoll(unsigned char *pSnr) {char status;unsigned char i,snr_check=0;unsigned int unLen;unsigned char ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08);//寄存器包含接收器和發送器和數據模式檢測器的狀態標志WriteRawRC(BitFramingReg,0x00);//不啟動數據發送,接收的LSB為存放在位0.接受到的第二位防在位1,定義發送的最后一個字節的位數為8ClearBitMask(CollReg,0x80);//所有接收的位在沖突后將被清除。ucComMF522Buf[0] = PICC_ANTICOLL1;ucComMF522Buf[1] = 0x20;status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2, ucComMF522Buf,&unLen);if (status == MI_OK){for (i=0; i<4; i++){ *(pSnr+i) = ucComMF522Buf[i];snr_check ^= ucComMF522Buf[i];}if (snr_check != ucComMF522Buf[i])//返回四個字節,最后一個字節為校驗位{ status = MI_ERR; }}SetBitMask(CollReg,0x80);return status; } //選定卡片 char PcdSelect(unsigned char *pSnr) {char status;unsigned char i;unsigned int unLen;unsigned char ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = PICC_ANTICOLL1;ucComMF522Buf[1] = 0x70;ucComMF522Buf[6] = 0;for (i=0; i<4; i++){ucComMF522Buf[i+2] = *(pSnr+i);ucComMF522Buf[6] ^= *(pSnr+i);}CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);//計算CRC裝填至ucComMF522Buf[7]ClearBitMask(Status2Reg,0x08);//寄存器包含接收器和發送器和數據模式檢測器的狀態標志。status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9, ucComMF522Buf,&unLen);if ((status == MI_OK) && (unLen == 0x18))//成功返回SAK,包括1字節的SAK和2字節的CRC_A。{ status = MI_OK; }else{ status = MI_ERR; }return status; }void main( ) { InitializeSystem1( );OperationCard = 0;tt=4;OperationCard = READCARD; STC_send_bluetooth('J');InitializeSystem( );Init_ST7920(); //初始化ClrScreen();STC_send_bluetooth('J');while (1){ if (CmdValid){CmdValid = FALSE;UartProcess();}KeyScan();//鍵盤掃描 if(tt==1) { LCD_PutString(0,1," ");LCD_PutString(0,2," 注冊界面 ");LCD_PutString(0,3," ");LCD_PutString(0,4," ");CtrlProcess();//控制處理}}if(tt==4) { LCD_PutString(0,1," ");LCD_PutString(0,2," 歡迎使用員工 ");LCD_PutString(0,3," 考勤管理系統 ");LCD_PutString(0,4," ");CtrlProcess();//控制處理}}if(tt==5) { LCD_PutString(0,1," ");LCD_PutString(0,2," 注銷界面 ");LCD_PutString(0,3," ");LCD_PutString(0,4," ");CtrlProcess();//控制處理} } LED=1; BEEP=1; iii=0; } } #include <reg52.h> #include <intrins.h> #include "delay.h" sbit RS = P1^7; //控制端口 sbit RW = P1^6; sbit E = P1^5; sbit PSB = P3^2; sbit PAUSE = P0^3; sbit RES = P0^2; #define DataPort P2 //單片機 P2<------> 液晶DB0-DB7 void Check_Busy() { RS=0;RW=1;E=1;DataPort=0xff;while((DataPort&0x80)==0x80);//忙則等待E=0; } void Write_Cmd(unsigned char Cmd) {Check_Busy();RS=0;RW=0;E=1;DataPort=Cmd;DelayUs2x(5);E=0;DelayUs2x(5); } void Write_Data(unsigned char Data) {Check_Busy();RS=1;RW=0;E=1;DataPort=Data;DelayUs2x(5);E=0;DelayUs2x(5); } void Init_ST7920() { DelayMs(40); //大于40MS的延時程序PSB=1; //設置為8BIT并口工作模式DelayMs(1); //延時RES=0; //復位DelayMs(1); //延時RES=1; //復位置高DelayMs(10);Write_Cmd(0x30); //選擇基本指令集DelayUs2x(50); //延時大于100usWrite_Cmd(0x30); //選擇8bit數據流DelayUs2x(20); //延時大于37usWrite_Cmd(0x0c); //開顯示(無游標、不反白)DelayUs2x(50); //延時大于100usWrite_Cmd(0x01); //清除顯示,并且設定地址指針為00HDelayMs(15); //延時大于10msWrite_Cmd(0x06); //指定在資料的讀取及寫入時,設定游標的移動方向及指定顯示的移位,光標從右向左加1位移動DelayUs2x(50); //延時大于100us } void LCD_PutString(unsigned char x,unsigned char y,unsigned char *s) { switch(y){case 1: Write_Cmd(0x80+x);break;case 2: Write_Cmd(0x90+x);break;case 3: Write_Cmd(0x88+x);break;case 4: Write_Cmd(0x98+x);break;default:break;}while(*s>0){ Write_Data(*s);s++;DelayUs2x(50);} } void ClrScreen() { Write_Cmd(0x01);DelayMs(15); }

資源文件下載鏈接:
?
基于RFID考勤系統單片機程序
基于RFID考勤系統流程圖、原理圖
基于RFID考勤系統上位機

總結

以上是生活随笔為你收集整理的基于RFID技术的考勤系统设计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。