门禁考勤软件设计与实现--设计报告.doc_第1页
门禁考勤软件设计与实现--设计报告.doc_第2页
门禁考勤软件设计与实现--设计报告.doc_第3页
门禁考勤软件设计与实现--设计报告.doc_第4页
门禁考勤软件设计与实现--设计报告.doc_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

沈阳航空航天大学 课课 程程 设设 计计 报报 告告 课程设计名称:物联网综合课程设计物联网综合课程设计 课程设计题目:13.56MHZ 门禁考勤软件设计与实现门禁考勤软件设计与实现 院(系):计算机学院 专 业: 班 级: 学 号: 姓 名: 指导教师: 完成日期: 沈阳航空航天大学课程设计报告 -1- 目目 录录 第第 1 章章 总体设计方案总体设计方案.2 1.1 设计原理 .2 1.2 设计思路 .3 1.3 设计环境 .5 第第 2 章章 详细设计方案详细设计方案.7 2.1 顶层方案图的设计与实现 .7 2.2 功能模块的设计与实现 .7 2.2.1 信息管理的实现8 2.2.2 刷卡功能的实现13 第第 3 章章 编程下载与硬件测试编程下载与硬件测试.17 3.1 编程下载 .17 3.2 硬件测试及结果分析 .17 附附 录(录(课课设设程程序序源代码)源代码).22 沈阳航空航天大学课程设计报告 -2- 第第 1 1 章章 总体设计方案总体设计方案 1.11.1 设计原理设计原理 本课设题目名称为 13.56MHZ 门禁考勤软件设计与实现,在数字技术网络技 术飞速发展的今天门禁技术得到了迅猛的发展。门禁系统早已超越了单纯的门道 及钥匙管理,它已经逐渐发展成为一套完整的出入管理系统。它在工作环境安全、 人事考勤管理等行政管理工作中发挥着巨大的作用。需要刷卡进行考勤管理的门 禁系统,门禁卡在发放最终用户使用前,经由系统管理员设置,确定可使用区域 及用户权限,用户使用门禁卡刷卡进入管理区域,无门禁卡或权限未开通用户, 不能进入管理区域。正是在这一应用背景下,本课设设计了一套基于 13.56MHZ 的 RFID 技术的智能门禁考勤管理系统。 RFID 技术是一种非接触的自动识别技术。该技术的原理主要是利用射频信 号和空间耦合的传输属性,从而能够对物体进行自动识别。RFID 技术在门禁考 勤上发挥了很大的作用。卡读卡器以固定频率向外发出电磁波,在此设计中频率 是 13.56MHZ,当感应卡进入读卡器电磁波辐射范围内时,会触发感应卡上的线 圈,产生电流并触发感应卡上的天线向读卡器发射一个信号,该信号带有卡片信 息,读卡器将电平信号转换成数字序号,以韦根协议传送给就地控制器,就地控 制器将信息上传给上层控制器,最终上传给门禁服务器,门禁服务器将卡号与数 据库内的信息进行比对,从而得到全部的卡片信息。 RFID 系统主要由电子标签、RFID 读写器和天线三部分构成。每张门禁卡 的RFID 标签都是唯一的电子标签,其内部信息需要用EEPROM 进行存储卡的各 项信息;而RFID 读写器由RFID 控制器和RFID 天线构成,读写器主要用来读取 和写入RFID 标签信息;而天线的作用就是用来传递RFID 读写器和RFID 标签之 间的信息信号。 沈阳航空航天大学课程设计报告 -3- 1.21.2 设计思路设计思路 根据 13.56MHZ 门禁考勤软件的原理,可以将该考勤管理软件分为以下几个 部分:刷卡识别、信息管理。 刷卡识别:该功能可以利用 13.56MHZ 电子标签卡实现考勤识别,该识别功 能主要分为两步:接收读卡器串口数据(如图 1.1 所示)、解析卡的数据(如图 1.2 所示)。 图图 1.11.1 接收读卡器串口数据框图接收读卡器串口数据框图 打开串口 start(“COM1”) 检测串口数据 发射对应信号 数据包解析 onRecvedPackage() 发射接收数据信号 recvPackage() 获取串口有效数据包 onPortDataReady() 沈阳航空航天大学课程设计报告 -4- 图图 1.21.2 解析卡的数据框图解析卡的数据框图 信息管理:由数据库包含的用户表和考勤日志表功能可以实现添加、删除或 修改门禁卡信息。 门禁考勤软件系统功能结构框图如图 1.3 所示: 图图 1.31.3 门禁考勤软件系统功能结构框图门禁考勤软件系统功能结构框图 门禁考勤软件 信 息 管 理 入 刷 卡 识 别 寻卡 process_searchCard() 数据打包 IEEE14443Package() 读卡成功 onReadCard() 获取卡号成功 onFoundCard() 等待信号 发送 sendData() 沈阳航空航天大学课程设计报告 -5- 1.31.3 设计环境设计环境 1.软件环境 (1)QT 是一个多平台的 C+图形应用程序应用框架,QT 是完全面向对象 的,很容易扩展,并且允许真正的组件编程。QT Creator 可以实现代码的查看、 编辑、界面的查看、以图形化的方式编辑、修改、编译等工作;甚至在 PC 环境 下还可以对应用程序进行调试。调试 QT Creator 还是一个跨平台的工具,它支持 包括 Linux、Mac OS X 以及 Windows 在内的多种操作系统平台,使得不同的开 发工作者可以在不同的开发平台下共享代码或协同工作。 (2)超级终端:Windows 自带的超级终端可以在 PC 端使用串口通信来对实 验箱进行控制,将编译生成的文件下载到实验箱上并运行。 2.硬件环境 物联网多网技术综合教学开发平台 B 版(以下简称实验箱),重在研究不同 网络在物联网中的各种应用,包含 RFID 技术、Zigbee、BlueTooth、Wifi、GPRS 等各种数据通信方式,可应用于物联网专业教学、项目开发等方向。该系统聚集 了传感器网络、RFID 射频、WIFI 无线网、GPRS 通讯、蓝牙技术、二维码扫描等 物联网相关技术平台,涉及技术比较广泛。实验箱结构如图 1.4 所示。 功能特点: 实验箱提供了全面的开发工具和配套资料,最大程度的激发学生兴趣,巩固 学习效果,方便了学习和应用。该平台的特色是:实验箱将模拟电子、数字电子、 电路设计、信号处理、传感器原理与检测、单片机技术、RFID 技术、BlueTooth 技术、Wifi 技术、Zigbee 通信、GPRS 通信、嵌入式技术等相关知识融会贯通, 涵盖了当前物联网行业最热门最尖端的技术,实现了多网融合,让学生可以灵活 应用各科知识,发挥创新能力。实验箱为高校老师和学生们提供当前最受欢迎的 嵌入式技术。学生通过实践能够熟悉嵌入式开发的流程,掌握相关软件和调试工 具的使用方法。采用源码开放的 Linux 操作系统采用源代码开放的 Linux 操作系 统。 沈阳航空航天大学课程设计报告 -6- 图图 1.41.4 实验箱实物图实验箱实物图 老师和学生不仅可以阅读Linux系统的源码,而且可以自己配置和修改部分 代码,定制个性操作系统。由于Linux相关的网络资料、书本资料很丰富,因此 在学习或开发过程中如果遇到问题,就可以在相关论坛得到帮助,缩短技术攻关 的时间,提高学习或工作效率。实验箱具有一键还原功能,通过该功能在做完实 验后,可将实验箱恢复到初始状态,方便管理节约检查配置时间。 沈阳航空航天大学课程设计报告 -7- 第第 2 2 章章 详细设计方案详细设计方案 2.12.1 顶层方案图的设计与实现顶层方案图的设计与实现 顶层方案图实现 13.56MHZ 门禁考勤软件的逻辑功能。在 Linux 系统下的 Qt 软件中将该代码编译,再将编译好的文件从 Linux 中复制到 Windows 系统下。在 Windows 系统下需要使用串口通信软件来对实验箱进行控制。通常情况下,使用 Windows 系统自带的“超级终端”工具即可。在超级终端中,执行命令 “ipconfig eth0 -i 30 -m -g ”,即可为实验 箱手动配置 IP 地址,如图 2.1 所示。 图图 2.12.1 手动配置实验箱的手动配置实验箱的 IPIP 地址地址 其中,-i 后面的参数是实验箱的IP 地址;-m 后面的参数是子网掩码;-g 后面的参数是网关地址。如果不需要网关,可以将 -g 和其后面的参数省略。 设 置完成之后,需要执行“service network restart”命令重启网络服务,使设置生效。 需要注意的是,实验箱的IP 地址需要设置为与电脑同一个网段,例如,在本例中, 电脑的IP 地址为“/”,而实验箱的IP 地址为 “30/”。打开“我的电脑”,在地址栏中输入ftp:/开发板的 IP地址,在超级终端中执行命令“chmod +x ”,为文件增加可执行权限。最后执行 “./”命令,即可运行13.56MHZ 门禁考勤软件程序。 2.22.2 功能模块的设计与实现功能模块的设计与实现 该 13.56MHZ 门禁考勤软件由刷卡识别和信息管理两个部分组成。 沈阳航空航天大学课程设计报告 -8- 信息管理模块将信息录入后才可以进行刷卡识别。信息管理模块还可以进行 考勤信息的添加、修改和删除。 刷卡识别模块可以通过 13.56MHZ 电子标签实现考勤管理,具体通过电子标 签的 id 号进行对门禁卡的识别。 .1 信息管理功能的实现信息管理功能的实现 该门禁考勤管理的实现主要是在 Qt 中搭建了一个考勤系统管理的界面,再 通过 ManageWidget 这个类来实现具体的信息管理功能 (1) 门禁考勤管理的界面如下图 2 .2 所示 图图 2.22.2 门禁考勤管理的界面门禁考勤管理的界面 (2)具体的实现过程 在 ManageWidget 中定义了 7 个类,分别为:onCardReaded(const QString updateUserTable(); ManageWidget:ManageWidget() delete ui; void ManageWidget:onCardReaded(const QString void ManageWidget:updateUserTable() /用户的更新 ui-userTable-clear(); DBCard c; if(c.first() QTreeWidgetItem *item; do item = new QTreeWidgetItem(ui-userTable); item-setText(0, QString:number(c.id(); item-setText(1, c.cardid(); 沈阳航空航天大学课程设计报告 -10- item-setText(2, (); while(c.next(); void ManageWidget:updateLogTable() ui-logTable-clear(); DBLog l; if(l.first() QTreeWidgetItem *item; do item = new QTreeWidgetItem(ui-logTable); item-setText(0, QString:number(l.id(); item-setText(1, l.date().toString(“yyyy-MM-dd hh:mm:ss“); item-setText(2, l.cardid(); while(l.next(); void ManageWidget:on_addBtn_clicked() /添加信息 if(!usrEditDlg-isHidden() return; int currentRow = ui-logTable-currentIndex().row(); qDebug() 0) 沈阳航空航天大学课程设计报告 -11- QTreeWidgetItem *item = ui-logTable-currentItem(); usrEditDlg-setCardId(item-text(2); usrEditDlg-setName(“); else usrEditDlg-setCardId(“); usrEditDlg-setName(“); if(usrEditDlg-exec() = QDialog:Rejected) return; if(usrEditDlg-cardId().isEmpty() QMessageBox:warning(this, tr(“Warning“), tr(“Card ID cant be empty!“); return; if(usrEditDlg-name().isEmpty() QMessageBox:warning(this, tr(“Warning“), tr(“User Name cant be empty!“); return; DBCard:addCard(usrEditDlg-cardId(), usrEditDlg-name(); updateUserTable(); void ManageWidget:on_delBtn_clicked() /删除信息 QList selItems = ui-userTable-selectedItems(); while(selItems.count() 沈阳航空航天大学课程设计报告 -12- QTreeWidgetItem *item = selItems.first(); DBCard:delCard(item-text(1); delete item; selItems.removeFirst(); void ManageWidget:on_modifyBtn_clicked() /修改信息 QList selItems = ui-userTable-selectedItems(); if(selItems.count() QTreeWidgetItem *item = selItems.first(); if(!usrEditDlg-isHidden() return; usrEditDlg-setCardId(item-text(1); usrEditDlg-setName(item-text(2); if(usrEditDlg-exec() = QDialog:Rejected) return; DBCard:updateName(usrEditDlg-cardId(), usrEditDlg-name(); updateUserTable(); void ManageWidget:on_refreshBtn_clicked() /刷新 updateLogTable(); 沈阳航空航天大学课程设计报告 -13- void ManageWidget:on_pushButton_clicked() /删除 login 卡的记录 QList logItems = ui-logTable-selectedItems(); while(logItems.count() QTreeWidgetItem *item = logItems.first(); DBCard:delLogCard(item-text(2); /删除当前 cardid delete item; logItems.removeFirst(); .2 刷卡识别功能的实现刷卡识别功能的实现 刷卡功能的实现主要是在 Qt 中搭建了一个刷卡显示信息的界面,刷卡时显示 卡号和与之关联的姓名,再通过 ClockInWidget 这个类来实现具体的刷卡识别功 能 (1) 刷卡显示界面如下图 2.3 所示 图图 2.32.3 刷卡显示界面图刷卡显示界面图 沈阳航空航天大学课程设计报告 -14- (2)具体实现过程 在 ClockInWidget 类中定义了 6 个函数:ClockInWidget(QWidget *parent)、 ClockInWidget()、updateTime()、updateDateTime()、onCardReaded(const QString updateDateTime(); timer = new QTimer(this); timer-setInterval(1000); timer-setSingleShot(false); connect(timer, SIGNAL(timeout(), this, SLOT(updateTime(); timer-start(); ClockInWidget:ClockInWidget() delete timer; delete ui; void ClockInWidget:updateTime() QDateTime d = QDateTime:currentDateTime(); ui-secondNumber-display(d.time().second(); 沈阳航空航天大学课程设计报告 -15- if(d.time().second() = 0) ui-minuteLabel-motionToNumber(d.time().minute(); if(d.time().minute() = 0) ui-hourLabel-motionToNumber(d.time().hour(); if(d.time().hour() = 0) ui-dayNumber-display(d.date().day(); if(d.date().day() = 1) ui-monthNumber-display(d.date().month(); if(d.date().month() = 1) ui-yearNumber-display(d.date().year(); void ClockInWidget:updateDateTime() /更新日期 QDateTime d = QDateTime:currentDateTime(); ui-yearNumber-display(d.date().year(); ui-monthNumber-display(d.date().month(); ui-dayNumber-display(d.date().day(); 沈阳航空航天大学课程设计报告 -16- ui-hourLabel-motionToNumber(d.time().hour(); ui-minuteLabel-motionToNumber(d.time().minute(); ui-secondNumber-display(d.time().second(); void ClockInWidget:onCardReaded(const QString ui-cardIdEdit-setText(cardid); ui-nameEdit-setText(name.isEmpty() ? tr(“No such person!“) : name); /清理读卡状态字符显示 ui-labelScan-setText(“Scanning card:“+cardid); DBLog:addLog(cardid); void ClockInWidget:on_pushButton_clicked() / 启动扫描卡的过程 ui-cardIdEdit-clear(); ui-nameEdit-clear(); ui-labelScan-setText(“Scanning card.“); MainWidget:rfidIEEE14443-getCardId(); 沈阳航空航天大学课程设计报告 -17- 第第 3 3 章章 编程下载与硬件测试编程下载与硬件测试 3.13.1 编程下载编程下载 在 Linux 系统下的 Qt 软件中将本软件代码编译,再将编译好的文件从 Linux 中复制到 Windows 系统下。在 Windows 系统下需要使用串口通信软件来对实验 箱进行控制。通常情况下,使用 Windows 系统自带的“超级终端”工具即可。在 超级终端中设定好开发板的 IP 地址,如图 3.1 所示。将编译好的程序下载到该 IP 地址对应的文件夹中,即完成了下载过程。 图图 3.13.1 手动配置试验箱的手动配置试验箱的 IPIP 地址地址 其中,-i 后是试验箱的 IP 地址,-m 后面的参数是子网掩码,-g 后面的参数 是网关地址。并且,实验箱的 IP 地址设置要与电脑的在同一网段。设置完成后, 执行“service network restart”命令重启网络服务,使设置生效。 3.23.2 硬件测试及结果分析硬件测试及结果分析 1.利用物联网多网技术综合开发平台实现门禁卡的识别和信息管理功能。在超 级终端中为 Attendance 文件增加可执行权限,并运行它如图 3.2 所示: 图图 3.23.2 运行运行 Attendance 程序程序 沈阳航空航天大学课程设计报告 -18- 2.程序运行之后,可以在LCD 上看到图3.3所示的界面: 图图3.33.3 Attendance主界面主界面 3.“Clock in”界面为刷卡界面,在此界面下,刷卡时会显示卡号和与之关联的 姓名,如果该卡没有记录,则Name栏将显示“No shch person”,如图3.4所示: 图图3.43.4 刷卡无效时的界面刷卡无效时的界面 沈阳航空航天大学课程设计报告 -19- 4.在“Manage”页面中,可以对用户信息进行管理,并可以查看考勤记录,如 图3.5所示: 图图 3.53.5 Manage 界面界面 5. 点击“Add”可以打开添加用户界面,如图3.6所示: 图图 3.63.6 添加用户界面添加用户界面 沈阳航空航天大学课程设计报告 -20- 6. 添加用户之后,再次回到“Clock in”界面,此时刷卡将会显示用户名,如图 3.7 所示: 图图 3.73.7 刷卡有效时的效果刷卡有效时的效果 沈阳航空航天大学课程设计报告 -21- 参考文献参考文献 1 单承赣.射频识别(RFID)原理与应用M.北京:电子工业出版社,2012 2 物联网多网技术综合开发平台实验指导书M.北京:凌阳科技有限公司, 2013 3 熊茂华等.嵌入式 Linux 实时操作系统及应用编程M.北京:清华大学出版 社,2011 4 厦华.无线通信模块设计与物联网应用开发M.北京:电子工业出版社, 2011 5 多网综合开发平台 B 版使用说明书M.北京:凌阳科技有限公司,2013 6 周华.射频识别 RFID 技术原理与应用实例M.北京:人民邮政出版社,2008(12) 沈阳航空航天大学课程设计报告 附 录 -22- 附附 录(关键部分程序清单)录(关键部分程序清单) #include “UserEditDialog.h“ #include “ui_UserEditDialog.h“ #include “ClockInWidget.h“ #include “ui_ClockInWidget.h“ #include “MainWidget.h“ #include “ui_MainWidget.h“ #include “rotatenumberlabel.h“ #include #include UserEditDialog:UserEditDialog(QWidget *parent) : QDialog(parent), ui(new Ui:UserEditDialog) ui-setupUi(this); ui-sftKeypad-changeRecver(ui-nameEdit); connect(ui-sftKeypad, SIGNAL(newString(QString), this, SLOT(onSftKeypadNewString(QString); UserEditDialog:UserEditDialog() delete ui; QString UserEditDialog:cardId() const return ui-cardIdEdit-text(); QString UserEditDialog:name() const return ui-nameEdit-text(); void UserEditDialog:setCardId(const QString void UserEditDialog:setName(const QString void UserEditDialog:onSftKeypadNewString(const QString RotateNumberLabel:RotateNumberLabel(QWidget *parent) : QLabel(parent) , currentIndex(0) , currentNumber(0) , nextNumber(0) , motion(false) timer = new QTimer(this); timer-setInterval(50); connect(timer, SIGNAL(timeout(), this, SLOT(onTimer(); reloadPicture(); RotateNumberLabel:RotateNumberLabel() delete timer; void RotateNumberLabel:onTimer() this-update(); if(motion) timer-start(); void RotateNumberLabel:paintEvent(QPaintEvent *ev) / QLabel:paintEvent(ev); 沈阳航空航天大学课程设计报告 附 录 -24- if(this-bgPic.isNull() return; int oy = (90 - 87) / 2; int ox1 = 8; int ox2 = 0; QPainter pt(this); pt.scale(qreal(this-width() / 96, qreal(this-height() / 90); pt.drawImage(0, 0, bgPic); pt.drawImage(ox1, oy, underPic0); pt.drawImage(ox1 + ox2 + underPic0.width(), oy, underPic1); pt.drawImage(ox1, oy, upperPic0); pt.drawImage(ox1 + ox2 + upperPic0.width(), oy, upperPic1); if(motion) if(+currentIndex = 10) currentIndex = 0; currentNumber = nextNumber; motion = false; reloadPicture(); int RotateNumberLabel:speed() const return 1000 / timer-interval(); void RotateNumberLabel:setSpeed(int fps) timer-setInterval(1000 / fps); int RotateNumberLabel:number() const return nextNumber; void RotateNumberLabel:setNumber(int n) n = n % 100; currentIndex = 0; 沈阳航空航天大学课程设计报告 附 录 -25- currentNumber = n; nextNumber = n; reloadPicture(); motion = false; this-update(); void RotateNumberLabel:motionToNumber(int n) n = n % 100; currentIndex = 0; nextNumber = n; motion = true; reloadPicture(); this-update(); timer-start(); ManageWidget:ManageWidget(QWidget *parent) : QWidget(parent), ui(new Ui:ManageWidget), usrEditDlg(new UserEditDialog) ui-setupUi(this); updateUserTable(); ManageWidget:ManageWidget() delete ui; void ManageWidget:onCardReaded(const QString void ManageWidget:updateUserTable() ui-userTable-clear(); DBCard c; 沈阳航空航天大学课程设计报告 附 录 -26- if(c.first() QTreeWidgetItem *item; do item = new QTreeWidgetItem(ui-userTable); item-setText(0, QString:number(c.id(); item-setText(1, c.cardid(); item-setText(2, (); while(c.next(); void ManageWidget:updateLogTable() ui-logTable-clear(); DBLog l; if(l.first() QTreeWidgetItem *item; do item = new QTreeWidgetItem(ui-logTable); item-setText(0, QString:number(l.id(); item-setText(1, l.date().toString(“yyyy-MM-dd hh:mm:ss“); item-setText(2, l.cardid(); while(l.next(); void ManageWidget:on_addBtn_clicked() if(!usrEditDlg-isHidden() return; int currentRow = ui-logTable-currentIndex().row(); qDebug() 0) QTreeWidgetItem *item = ui-logTable-currentItem(); usrEditDlg-setCardId(item-text(2); usrEditDlg-setName(“); 沈阳航空航天大学课程设计报告 附 录 -27- else usrEditDlg-setCardId(“); usrEditDlg-setName(“); if(usrEditDlg-exec() = QDialog:Rejected) return; if(usrEditDlg-cardId().isEmpty() QMessageBox:warning(this, tr(“Warning“), tr(“Card ID cant be empty!“); return; if(usrEditDlg-name().isEmpty() QMessageBox:warning(this, tr(“Warning“), tr(“User Name cant be empty!“); return; DBCard:addCard(usrEditDlg-cardId(), usrEditDlg-name(); updateUserTable(); void ManageWidget:on_delBtn_clicked() QList selItems = ui-userTable-selectedItems(); while(selItems.count() QTreeWidgetItem *item = selItems.first(); DBCard:delCard(item-text(1); delete item; selItems.removeFirst(); void ManageWidget:on_modifyBtn_clicked() QList selItems = ui-userTable-selectedItems(); if(selItems.count() 沈阳航空航天大学课程设计报告 附 录 -28- QTreeWidgetItem *item = selItems.first(); if(!usrEditDlg-isHidden() return; usrEditDlg-setCardId(item-text(1); usrEditDlg-setName(item-text(2); if(usrEditDlg-exec() = QDialog:Rejected) return; DBCard:updateName(usrEditDlg-cardId(), usrEditDlg-name(); updateUserTable(); void ManageWidget:on_refreshBtn_clicked() updateLogTable(); void ManageWidget:on_pushButton_clicked() /删除 login 卡的记录 QList logItems = ui-logTable-selectedItems(); while(logItems.count() QTreeWidgetItem *item = logItems.first(); DBCard:delLogCard(item-text(2); /删除当前 cardid delete item; logItems.removeFirst(); IEEE14443Control *MainWidget:rfidIEEE14443 = NULL; MainWidget:MainWidget(QWidget *parent) : QWidget(parent), ui(new Ui:MainWidget) DBControl:Create(); ui-setupUi(this); 沈阳航空航天大学课程设计报告 附 录 -29- / 选择 125K 读卡器 if(0) RFIDChannelMan:setChannel(RFIDChannelMan:Channel125K); else / 选择 13.56M 通道 RFIDChannelMan:setChannel(RFIDChannelMan:ChannelIEEE14443); / 创建 125K 读卡器操作类对象 if(0) rfid = new ID125KControl(this); else rfidIEEE14443 = new IEEE14443Control(this); / 连接扫描到卡的信号 if(0) connect(rfid, SI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论