0 前言
🔥
这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 毕业设计 stm32 RFID员工打卡门禁系统(源码+硬件+论文)
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:3分
- 创新点:4分
🧿 项目分享:见文末!
实物演示效果:
毕业设计 stm32 RFID员工打卡门禁系统
1 主要功能
拟采以单片机为主控模块,围绕无线射频模块和无线传输模块、OLED显示模块、继电器模块实现考勤系统的考勤打卡、人员管理、考勤统计、无线通信功能等功能。
(1)射频识别。根据考勤要求,选择合理的射频工作频率,电子标签、读写器,保证选择的器件可以满足考勤系统要求的标准和协议。并在硬件的基础上设置合理的软件,使其能实现员工信息识别的功能。
(2)员工数据库设计。设计员工数据库,对公司人员新增、员工信息的删除等功能进行实现。数据库中还应该记录每个员工打卡的具体信息。
(3)RFID考勤系统的总体调试。结合前两部分功能,实现对RFID考勤系统的调试,使其能正常实现考勤的基本功能。
2 硬件设计(原理图)
3 核心软件设计
关键代码
先将上位机程序初始化,对实时时间进行获取,具体代码如下:
def get_time():
t = time.time() # 获得当前时间的时间戳
timeArray = time.localtime(t)
day = timeArray.tm_mday
time_str = time.strftime('%Y-%m-%d %H:%M:%S', timeArray) # 转换时间格式
return time_str
再将上位机所在PC端连接对应的WiFI,在连接成功之后,上位机模块在该局域网内请求连接ESP-01S模块IP,连接成功后进行下一步操作,主要连接代码如下:
ddef start_reception():
global tcp_client_socket
global prase_data
tcp_client_socket = socket(AF_INET, SOCK_STREAM)
server_ip = entry_ip.get()
server_port = int(port.get()) # TCP socket端口
# 链接服务器
tcp_client_socket.connect((server_ip, server_port))
# 发送密钥,建成连接
上位机通过TCP通信接收下位机上传的打卡信息,通过调用数据库,将上传卡号与数据库内卡号进行对比,判断是否打卡成功。若卡号存在,则打卡成功,在上位机界面的数据日志中显示"name:" + people_name + “已打卡\n” +“card_number:” + id + “\n” + “\n”,并将打卡信息传入数据库,向下位机下发打卡成功信号以及打卡数据;若卡号不存在,则打卡失败,在上位机界面的数据日志中显示"未知身份,拒绝访问" +“\n” + “card_number:” + card_id + “\n” + “\n”,并向下位机下发打卡失败的指令。具体代码如下:
def add_card_record(card_id):
flag = check_id(card_id)
//判断卡号
if(flag >= 0):
print(all_person_data)
new_txt = (all_person_data[flag]).split(",")
people_name = new_txt[0]#######
id = new_txt[1]
all_person_data[flag] = new_txt[0] +","+ new_txt[1] + ",1" +","+get_time() + "\n"
with open("persons.txt","w") as f:
f.writelines(all_person_data)
f.close()
entry_5.insert(END, get_time() + ' RECV DATA =====>' + '\n')
entry_5.insert(END, "name:" + people_name + " 已打卡\n" +"card_number:" + id + "\n" + "\n")
send_data = "###"+people_name
tcp_client_socket.send(send_data.encode("gbk"))
entry_5.see(END)
else:
entry_5.insert(END, get_time() + ' RECV DATA =====>' + '\n')
entry_5.insert(END, "未知身份,拒绝访问" +
"\n" + "card_number:" + card_id + "\n" + "\n")
send_data = "###"+"unknown"
tcp_client_socket.send(send_data.encode("gbk"))
entry_5.see(END)
信息录入子程序设计
在上位机程序中,可以通过将信息录入对数据库进行增加操作。上位机数据库信息录入子程序如图4-3所示。
上位机通过调用数据库与接收的下位机传送数据进行对比。在打卡时,上位机将上传卡号与数据库内卡号进行对比,如果存在该卡号,则在上位机界面的数据日志中显示“该卡号已存在\n\n”;若不存在该卡号,则进行信息录入。点击“信息录入”按钮,如果信息输入不完全,则在上位机界面的数据日志中显示“错误:输入姓名或卡号为空!!!\n\n”;如果输入正确,在数据库内进行写入操作,再在上位机界面的数据日志中显示“log_name + “,” + log_id + “,0” + “,0” + “\n””。具体代码如下:
def add_null_id():
log_name = Name.get().replace(" ", "")##输入名字
print(log_name)
log_id = (card_number.get()).replace(" ", "")#输入卡号
print(log_id)
if (log_id!= '') and (log_name != ''):####卡号和名字
flag = check_id(log_id)
if(flag >= 0):##检查id是否重复
entry_5.insert(END, get_time() + ' SAVE DATA =====>' + '\n')
entry_5.insert(END, "该卡号已存在\n\n")
entry_5.see(END)
else:
with open("persons.txt", 'a+') as f:
f.write(log_name + "," + log_id + ",0" + ",0" + "\n")####输入名字和卡号
f.close()
entry_5.insert(END, get_time() + ' SAVE DATA =====>' + '\n')
entry_5.insert(END, log_name + ": "+log_id+" 已录入\n\n")
entry_5.see(END)
else:
entry_5.insert(END, get_time() + ' SAVE DATA =====>' + '\n')
entry_5.insert(END, "错误:输入姓名或卡号为空!!!\n\n")
entry_5.see(END)
信息删除子程序设计
在上位机程序中,可以通过“按卡号删除”对数据库进行删除操作。信息删除子程序如图4-4所示。
点击“按卡号删除”按钮,将下位机上传的卡号与数据库内卡号进行对比,如果存在该卡号,在数据内进行对该卡号信息进行删除操作,在上位机界面的数据日志中显示“卡号:" + card_id + “已删除\n”+ "\n”;若不存在该卡号,则在上位机界面的数据日志中显示“卡号不存在\n\n”。具体代码如下:
def del_record():
card_id = (entry_del.get()).replace(" ",'')
flag = check_id(card_id)
if(flag >= 0):
all_person_data.pop(flag)
with open("persons.txt","w") as f:#############
f.writelines(all_person_data)
f.close()
entry_5.insert(END, get_time() + ' DEL DATA =====>' + '\n')
entry_5.insert(END, "卡号:" + card_id + " 已删除\n"+ "\n")
else:
entry_5.insert(END, get_time() + ' DEL DATA =====>' + '\n')
entry_5.insert(END, "卡号不存在\n\n")
entry_5.see(END)
4 实现效果
实物演示效果:
毕业设计 stm32 RFID员工打卡门禁系统
5 最后
包含内容
详细论文:
🧿 项目分享:见文末!