- 666.00 KB
- 2022-05-17 13:33:46 发布
- 1、本文档共5页,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
- 文档侵权举报电话:19940600175。
注:页眉,居中,楷体,五号。阅后删除此文本框。摘要“考勤管理系统”是以RFID射频卡为信息识别载体的适用于企业单位或学校的考勤管理系统。本系统可使用人单位摆脱繁琐、低效的签到模式。识别工作不受环境的影响,操作方便快捷,具有防污、防水、加密存储等优点。结合网络通信技术和单片机技术,实现了企业和单位的自动考勤和对考勤数据的分析处理,节约了考勤时间,提高了考勤效率并提高了考勤的准确率,促进了企业单位的考勤管理信息化水平的发展。硬件部分我们采用瑞士微电生产的EM4095构成的射频读卡电路。该芯片具有成本低,工作稳定,精确的采样点等优点。单片机采用51系列。通过CAN总线方式与单片机互相通信。读卡电路输出信号有单片机识别出卡号利用单片机与上位机之间进行232通信,实时上传数据,传送到PC机行处理。PC主要实现功能进行检测卡号数据。矚慫润厲钐瘗睞枥庑赖。硬件部分我们采用瑞士微电生产的EM4095构成的射频读卡电路。该芯片具有成本低,工作稳定,精确的采样点等优点。单片机采用51系列的AT89C52。聞創沟燴鐺險爱氇谴净。软件部分分为读卡识别、CAN通信、AT89C52单片机与上位机通信、报警,PC方检测处理等。本设计采用的单片机开发环境为:AVR开发环境为CodeVisionAVRCCompiler,AT89C52开发环境为KeiluVision2。残骛楼諍锩瀨濟溆塹籟。关键词:考勤管理系统;射频技术;单片机;CAN通信;232通信;SPI通信。
Abstract"AttendanceManagementSystem"isbasedonRFIDradiofrequencyidentificationcardinformationcarrierforbusinessorschoolattendancemanagementsystem.Thesystemcanuseoneunittogetridofcumbersome,inefficientattendancepatterns.Identificationworkfromtheenvironment,easytooperate,withastainresistant,waterproof,encryptedstorageandsoon.Combinedwithnetworkcommunicationtechnologyandsingle-chiptechnology,theenterprisesandunitsofautomaticattendanceandattendancedataanalysisandprocessing,savingtimeandattendancetime,improveefficiencyandincreaseattendanceattendanceaccuracy,promotetheenterpriseinformationmanagementunitsattendancelevelofdevelopment.酽锕极額閉镇桧猪訣锥。WeusethehardwarepartoftheSwissmicro-electricproductionconstitutedEM4095RFreadercircuitry.Thechiphasalowcost,stable,accuratesamplingpoints,andsoon.Microcontrollerwith51series.WaywiththemicrocontrollerthroughtheCANbuscommunicatewitheachother.Readercircuitoutputsignalsusingmicrocontrollermicrocontrolleridentifiesthecardnumberbetween232andPCcommunication,real-timeuploaddatatransfertoaPCforprocessing.ThemainachievementoffunctionaltestingPCcarddata.彈贸摄尔霁毙攬砖卤庑。WeusethehardwarepartoftheSwissmicro-electricproductionconstitutedEM4095RFreadercircuitry.Thechiphasalowcost,stable,accuratesamplingpoints,andsoon.SCMSeries51AT89C52.謀荞抟箧飆鐸怼类蒋薔。Softwarepartisdividedintoreaderidentification,CANcommunication,AT89C52microcontrollerandPCcommunication,alarm,PCsidedetectionprocessing.厦礴恳蹒骈時盡继價骚。Thisdesignusesamicrocontrollerdevelopmentenvironment:AVRdevelopmentenvironmentforCodeVisionAVRCCompiler,AT89C52developmentenvironmentfortheKeiluVision2.茕桢广鳓鯡选块网羈泪。Keywords:AttendanceManagementSystem;RFTechnology;SCM;CAN
Communication;232;SPICommunication.鹅娅尽損鹌惨歷茏鴛賴。目录摘要I籟丛妈羥为贍偾蛏练淨。AbstractII預頌圣鉉儐歲龈讶骅籴。第一章绪论1渗釤呛俨匀谔鱉调硯錦。第二章硬件部分设计3铙誅卧泻噦圣骋贶頂廡。2.1EM4095射频芯片部分32.1.1射频芯片选型依据32.1.2EM4095射频芯片简介42.1.3EM4095结构原理52.1.4磁卡与EM4095之间ISO14443协议7擁締凤袜备訊顎轮烂蔷。2.1.5EM4095与单片机连接原理图14贓熱俣阃歲匱阊邺镓騷。2.2AVR单片机部分16坛摶乡囂忏蒌鍥铃氈淚。2.2.1单片机选型依据13蜡變黲癟報伥铉锚鈰赘。2.2.2ATMEL单片机简介14買鲷鴯譖昙膚遙闫撷凄。2.2.3AT89C52原理图部分14綾镝鯛駕櫬鹕踪韦辚糴。2.3DS1302实时时钟部分16驅踬髏彦浃绥譎饴憂锦。2.3.1DS1302芯片简介17猫虿驢绘燈鮒诛髅貺庑。2.3.2SPI简介17锹籁饗迳琐筆襖鸥娅薔。2.3.3DS1302与AVR单片机连接原理图18構氽頑黉碩饨荠龈话骛。2.4CAN总线部分19輒峄陽檉簖疖網儂號泶。2.4.1CAN总线简介19尧侧閆繭絳闕绚勵蜆贅。2.4.2硬件部分的选型19识饒鎂錕缢灩筧嚌俨淒。2.4.3原理图及其解析20凍鈹鋨劳臘锴痫婦胫籴。2.4.4蜂鸣器报警部分21恥諤銪灭萦欢煬鞏鹜錦。2.5MAX232部分21鯊腎鑰诎褳鉀沩懼統庫。2.5.1MAX232简介21硕癘鄴颃诌攆檸攜驤蔹。2.5.2MAX232与51单片机连接原理图22阌擻輳嬪諫迁择楨秘騖。2.6显示部分22氬嚕躑竄贸恳彈瀘颔澩。2.6.1显示原理说明23釷鹆資贏車贖孙滅獅赘。
2.6.2数码管与单片机连接原理图23怂阐譜鯪迳導嘯畫長凉。2.7AT89C52部分23谚辞調担鈧谄动禪泻類。2.7.1AT89C52单片机硬件结构23嘰觐詿缧铴嗫偽純铪锩。2.7.2AT89C52单片机CPU电路图24熒绐譏钲鏌觶鷹緇機库。第三章软件部分26鶼渍螻偉阅劍鲰腎邏蘞。3.1AVR单片机环境介绍26纣忧蔣氳頑莶驅藥悯骛。3.2AT89C52单片机开发环境介绍26颖刍莖蛺饽亿顿裊赔泷。3.3AVR单片机读卡部分26濫驂膽閉驟羥闈詔寢賻。3.3.1程序实现简介26銚銻縵哜鳗鸿锓謎諏涼。3.3.2SPI通信简介26挤貼綬电麥结鈺贖哓类。3.3.3实现功能27赔荊紳谘侖驟辽輩袜錈。3.3.4EM4095读卡程序流程图27塤礙籟馐决穩賽釙冊庫。3.3.5参考程序27裊樣祕廬廂颤谚鍘羋蔺。3.4AVR发送数据部分28仓嫗盤紲嘱珑詁鍬齊驁。3.4.1程序实现简介28绽萬璉轆娛閬蛏鬮绾瀧。3.4.2实现功能28骁顾燁鶚巯瀆蕪領鲡赙。3.4.3程序流程图(见下一页)28瑣钋濺暧惲锟缟馭篩凉。3.4.4程序代码29鎦诗涇艳损楼紲鯗餳類。3.5AVR控制DS1302部分程序34栉缏歐锄棗鈕种鵑瑶锬。3.5.1程序实现简介34辔烨棟剛殓攬瑤丽阄应。3.5.2功能描述34峴扬斕滾澗辐滠兴渙藺。3.5.3程序流程图(见下一页)34詩叁撻訥烬忧毀厉鋨骜。3.5.4程序代码35则鯤愜韋瘓賈晖园栋泷。3.6AT89C52接收CAN数据部分程序40胀鏝彈奥秘孫戶孪钇賻。3.6.1程序实现简介40鳃躋峽祷紉诵帮废掃減。3.6.2功能描述40稟虛嬪赈维哜妝扩踴粜。3.6.3程序代码40陽簍埡鲑罷規呜旧岿錟。3.7AT89C52与PC机之间通信部分程序40沩氣嘮戇苌鑿鑿槠谔應。3.7.1程序实现简介40钡嵐縣緱虜荣产涛團蔺。3.7.2功能描述40懨俠劑鈍触乐鹇烬觶騮。3.7.3程序代码41謾饱兗争詣繚鮐癞别瀘。
第四章结论43呙铉們欤谦鸪饺竞荡赚。参考文献44莹谐龌蕲賞组靄绉嚴减。致谢46麸肃鹏镟轿騍镣缚縟糶。
第一章绪论背景考勤管理系统的研究背景随着信息化建设的不断发展,磁卡得到普遍的推广,大部分采用RFID射频技术,通过射频信号自动识别目标对象获取数据,识别工作不受环境的影响,操作方便快捷,具有防污、防水、加密存储等优点,较传统的接触式IC卡,具有明显的优势,被广泛应用在身份识别、消费等各项服务上,为企业或单位的管理以及人们的生活提供极大的便利。然而,在考勤管理方面,大多依然采用传统的签名签到的方式进行考勤,特别是在较大企业的签到管理上更是混乱。另外,传统签到的考勤方式既浪费时间,也给考勤数据的统计分析带来了诸多麻烦。本设计借助射频技术,结合网络通信技术和单片机技术,实现了企业和单位的自动考勤和对考勤数据的分析处理,节约了考勤时间,提高了考勤效率,促进了企业单位的考勤管理信息化水平的发展。納畴鳗吶鄖禎銣腻鰲锬。国内外的研究现状目前,在考勤管理系统方面,国外早在多年之前就进行了相关的研究和设计,现在已经在其单位和企业得到了较为广泛的普及,而我们国内,因为相关研究起步较晚,相关研究尽管达到同国外相同的水平,但是成本较高,许多单位和企业认识进行传统方式的考勤管理。只有在一些规模较大的单位和企业才能实现无线射频卡的考勤管理系统。風撵鲔貓铁频钙蓟纠庙。总体方案设计思路本次设计要设计基于单片机的考勤管理系统设计,主要的过程是用读卡器识别出射频卡唯一标签,将数据通过单片机传送至PC机,进行签到处理。灭嗳骇諗鋅猎輛觏馊藹。硬件选择
硬件部分我们采用瑞士微电生产的EM4095构成的射频读卡电路。该芯片具有成本低,工作稳定,精确的采样点等优点。单片机采用51系列。读卡电路输出信号有单片机识别出卡号,传送到PC机行处理。PC主要实现功能进行检测卡号数据。铹鸝饷飾镡閌赀诨癱骝。软件描述软件部分主要是实现读卡电路与单片机之间数据的通信。设计优势本次设计与传统考勤管理系统相比,具有快捷便利,有利于对考勤数据的整理,减少考勤管理时间,避免了考勤过程中的人为因素,充分体现了考勤管理的公平公正,减少了没有必要的人事纠纷。与其他电子类考勤宽利系统相比,所选用的硬件都是性价比较高的,在保证系统签到准确方便,工作稳定的同时,降低企业和单位在考勤管理方面的开支。攙閿频嵘陣澇諗谴隴泸。预期效果基于单片机的考勤管理系统,核心器件是单片机,单片机作为主控制器,并辅以射频卡,CAN总线等技术,实现预期的刷卡人用射频卡在射频识别读卡器上进行刷卡,利用单片机与射频识别读卡器之间进行通信,进而识别认证出刷卡人身份,在这个时候单片机配以时钟模块,这样就可以将时间与认证的数据包一起上传到PC机,这样就保证PC机的远程监控。本课题设计出来的系统为企业和单位提供了较为科学的、可靠的考勤管理方法,是现代化企业考勤管理的最佳模式。趕輾雏纨颗锊讨跃满賺。
第二章硬件部分设计系统框图图2.0系统框图2.1EM4095射频芯片部分2.1.1射频芯片选型依据选型的三大原则:1.符合国家标准 目前RFID技术并没有一个国际统一的标准。美国的电子产品代码(EPC)全球协会正在制定美国的电子产品代码无线接口协议。而因为其在世界微电子行业一流的基础,日本很有可能会制定自己的协议标准。另一方面,我国的RFID标准也正在由电子标签国家标准工作组制定。 因此,在选择射频识别方案的时候,必须考虑具体应用所在的国家环境和标准。在当今全球化的生产中,产业链很可能会跨越多个国家,那么产业链的管理系统就需要考虑到各个国家的有关标准,避免不必要的法律纠纷。 2.适合应用环境
RFID系统的工作频率是射频识别读写器发送射频信号时所使用的频率,RFID系统按照频率的不同可以分为低频、高频和超高频几种。高频系统识别距离长、读写数据速率高,而低频和中频系统作用距离短、成本低。RFID系统就基本的工作原理来说,射频识别系统还可以分为全双工系统和半双工系统以及时序系统。射频识别的标签也可以分为有源和无源两种。 其应用场合的不同决定了不同的射频识别系统。因此在开始进行方案选型的时候,用户需要根据自身的使用环境,选择最适合的系统方案,防止资金的浪费。3.与现有系统的结合 企业的信息化管理与供应链管理系统息息相关的,因此具体的射频识别方案必须能够与企业现在拥有的信息系统(例如ERP)相兼容。因此,世界上的大部分ERP提供商都拥有或者正在开发属于自己的基于射频识别的供应链管理方案,来大大降低由于兼容性所引起的不必要的风险。夹覡闾辁駁档驀迁锬減。2.1.2EM4095射频芯片简介EM4095是用于RFID(射频识别)的CMOS集成收发器电路基站芯片,它具有有以下功能;可以利用载波来驱动天线;用于可读写应答器的AM调制磁场;对从天线传输来应答器的AM调制磁场;和微处理器通过简单接口通讯;视絀镘鸸鲚鐘脑钧欖粝。一.优点:1.外部器件少,成本低;2.性能稳定;3.更宽的可靠的的AM调节;4.可变参数只有2个,所以系统分析和设计更加容易;5.精确的采样点;6.使用简单;
7.低功耗;8.具有同步时钟信号输出:可以轻松的得到头部信息。偽澀锟攢鴛擋緬铹鈞錠。二.特点:1.锁相环系统是集成的,从而使自适应载波频率与天线谐振频率相配。2.不需要外部晶振;3.载波频率范围是100到150KHz;4.驱动天线的方式是用桥驱动直接驱动;5.进行数据传输的方式是以OOK(100%AM调节);6.进行数据传输的方式是用外部可调整系数的单端驱动器以AM调制;7.兼容多种应答器协议;8.睡眠模式1µA;9.40至85°C温度范围;緦徑铫膾龋轿级镗挢廟。2.1.3EM4095结构原理图2.1EM4095框图原理分析:用来操作设备的是EM4095的引脚SHD和MOD。当SHD为高电平时,EM4095为睡眠模式,电流消耗为
最小。在上电的时候,SHD必须是高电平输入,来使初始化操作正确。当SHD为低电平的时候,回路可以发射射频场,并且开始对天线上的振幅调制信号进行解调。 騅憑钶銘侥张礫阵轸蔼。用来对125KHz射频信号进行调制的是引脚MOD。当在该引脚上施加高电平的时候,天线驱动将被阻塞,进而电磁场会关掉;当在该引脚上施加低电平的时候,片上VCO将进入自由运行模式,没有经过调制的125KHz的载波将出现在天线上。EM4095用作只读模式,引脚MOD没有使用,将它连接至VSS。 疠骐錾农剎貯狱颢幗騮。环滤波、电压控制振荡器和相比较模块加在一起组成锁相环。为了使DEMOD_IN引脚上得到的电压是天线的真实电压,使用外部电容分压。锁相环将载波频率锁定在天线的谐振频率上。因为天线种类的不同,在100kHz到150kHz之间的范围内系统谐振频率都是可以的。当谐振频率落在100kHz到150kHz之间的时候,就会被锁相环锁定。 镞锊过润启婭澗骆讕瀘。接收模块解调的输入信号是天线上的电压信号。接收链路的输入信号用的是DEMOD_IN引脚。该输入信号的级别应该比VDD-0.5V低,比VSS+0.5V高。输入信号的级别可以通过外部电容分压来进行调节。榿贰轲誊壟该槛鲻垲赛。一定要通过较小的谐振电容来补偿分压器增加的电容。直流偏置取消、带通滤波还有比较器组成接收电路。通过内部电阻把DEMOD_IN上的直流电压信号设置在AGND引脚上。采样AM信号,通过VCO时钟来同步,CDEC电容移除所有信号中的直流部分。邁茑赚陉宾呗擷鹪讼凑。通过进一步的滤波,余下的载波信号、二阶高通滤波器还有CDC2所带的低频和高频噪声被移除。接收信号通过放大和滤波处理,传输到异步比较器,比较器的输出缓存至DEMOD_OUT。嵝硖贪塒廩袞悯倉華糲。DVDD脚和VDD连接,DVSS脚和VSS连接。VDD和VSS上的电压降并不是流过管脚DVDD和DVSS电流产生的电压降。避免了因为天线驱动器产生的电源尖峰。如果我们对VSS管脚还有VDD管脚进行隔离,这也是可以有效果的。连接到相同VSS上的电容都应该是跟DC2/AGND/DMOD_IN管脚有关连的。该栎谖碼戆沖巋鳧薩锭。天线驱动使用提供VSS和VDD的电源的驱动器ANT,任何电源的变化和外界的噪声都会很严重的对天线谐振回路产生影响。我们尤其要注意的是频率为20kHz的噪声,因为EM4095就是在这个频率上响应信号的。
劇妆诨貰攖苹埘呂仑庙。我们可以把在管脚AGND上电容的值从220nF调至1uF。因为要想减小接收的噪声,电容值越大越好。A我们可以利用外部电容和内部电阻(2KΩ)对GND电压来滤波。 臠龍讹驄桠业變墊罗蘄。从驱动器ANT里发出的电流值的大小是不受EM4095限制的。在天线谐振回路的设计上,务必要求最大电流不可以高于250mA。如果这个值超过了250mA,则说明天线的品质因数有问题,必须使用串联电阻的方法进行限制。 鰻順褛悦漚縫冁屜鸭骞。务必使控制NMOS门的信号以及MOD信号一起调为低电平,该信号要想变为置高电平,必须是在调制天线的振幅之后。如果天线的品质因数较高,天线上的电压可以比正常高一些。要想提升读取的灵敏性,可以用外部检测回路来实现。穑釓虚绺滟鳗絲懷紓泺。2.1.4磁卡与EM4095之间ISO14443协议此次课题需要开发的射频识别卡读写设备是基于ISO/IEC14443TypeA标准的[6]和[7]。由四个部分组成的ISO/IEC14443协议将卡定义为2种类型,TypeA以及TypeB。隶誆荧鉴獫纲鴣攣駘賽。TypeA以及TypeB的区别主要是在调制方式和编码方式上的不同。调制方式上A型和B型的主要差别是,A型数据传输与微处理器工作是不能同时进行的,而B型数据传输与微处理器工作是可以同时进行的。浹繢腻叢着駕骠構砀湊。编码方式上A型和B型的区别主要是,A型必须用专门的硬件解码进行解码,而B型易于进行软件解码。协议ATQ对请求的应答ATQA对A型卡请求的应答ATQB对B型卡请求的应答ATR对重新启动的请求的应答ATS对选择请求的应答ATQ-ID对ID号请求的应答
CRC环检验码RATS对选择应答请求REQA对A型卡的请求REQB对B型卡的请求REQ-ID请求ID号RESEL重新选择的请求卡片返回的代码说明:0x00:对指定地址的访问被拒绝0x01:CRC或奇偶校验错误0x04:交易:溢出错误其它命令:对指定地址的访问被拒绝0x05:CRC或奇偶校验错误0x0A:确认基本命令:REQUEST控制单元射频卡Command:0x26or0x520x26:IDLE模式,只选择天线范围内IDLE模式的卡片0x52:ALL模式,选择天线范围内所有卡片Len:0射频卡控制单元Len:2Data[0]:_TagType(低字节)0x04Data[1]:_TagType(高字节)0x00在重新选择卡片时必须执行request操作。ANTICOLL控制单元射频卡Command:0x93Len:1
Data[0]:0x20NVB射频卡控制单元Len:5Data[0]:_Snr(LL)Data[1]:_Snr(LH)Data[2]:_Snr(HL)卡片系列号Data[3]:_Snr(HH)Data[4]:BCC此操作必须紧随在request操作后执行.如果被选的卡片的系列号已知,可以不用执行此操作SELECT控制单元射频卡Command:0x93Len:6Data[0]:0x70Data[1]:_Snr(LL)Data[2]:_Snr(LH)Data[3]:_Snn(HL)Data[4]:_Snr(HH)卡片系列号(UID)Data[5]:BCC射频卡控制单元Len:1Data[0]:_Size(卡片容量值:0x08或0x88)AUTHENTICATION控制单元射频卡Command:0x60or0x61Len:2Data[0]:0x60or0x61(0x60使用KEYA作验证,0x61使KEYB作验证)鈀燭罚櫝箋礱颼畢韫粝。Data[1]:_SecNr(扇区号)*4(即每个扇区的块0的块地址)
射频卡控制单元Len:0如果读写模块中的密码与卡片中的密码相匹配,则可以进行读、写等操作。HALT控制单元射频卡Command:0x50Len:0射频卡控制单元Len:0将操作后的卡片置于halt模式。如果又要对卡片操作,必须重新执行request操作。READ控制单元射频卡Command:0x30Len:1Data[0]:_Adr块地址(0~63)射频卡控制单元Len:16Data[0]:数据块的第一字节:Data[15]:数据块的最后一个字节WRITE控制单元射频卡Command:0xA0Len:17Data[0]:_Adr要写入数据的块地址(1~63)射频卡控制单元Len:4BitDATA[0]:0x0A(ACK)Data[1]:要写入卡片中的第一个数据:Data[16]:要写入卡片中的最后一个数据
射频卡控制单元Len:4BitDATA[0]:0x0A(ACK)INCREMENT控制单元射频卡Command:0xC1Len:5Data[0]:_Adr数值块的地址射频卡控制单元Len:4BitDATA[0]:0x0A(ACK)Data[1]:_Value(LL)Data[2]:_Value(LH)Data[3]:_Value(HL)Data[4]:_Value(HH)要增加的数值射频卡控制单元Len:0DECREMENT控制单元射频卡Command:0xC0Len:5Data[0]:_Adr数值块的地址射频卡控制单元Len:4BitDATA[0]:0x0A(ACK)Data[1]:_Value(LL)Data[2]:_Value(LH)Data[3]:_Value(HL)Data[4]:_Value(HH)要减少的数值射频卡控制单元
Len:0RESTORE控制单元射频卡Command:0xC2Len:6Data[0]:_Adr数值块的地址射频卡控制单元Len:4BitDATA[0]:0x0A(ACK)Data[1]:0x00Data[2]:0x00Data[3]:0x00Data[4]:0x00射频卡控制单元Len:0此操作相当于执行decrement(0)。TRANSFER控制单元射频卡Command:0xB0Len:1Data[0]:Adr要传输数据的卡片块地址射频卡控制单元Len:4BitDATA[0]:0x0A(ACK)2.1.5EM4095与单片机连接原理图本课题中进行通信方式应用了SPI方式,EM4095的SPI片选信号、SPI时钟、SPI口输出、SPI口输入引脚分别与单片机的P1.0、P1.1、P1.2、P3.3相对应。惬執缉蘿绅颀阳灣熗鍵。天线发发射出的是频率为的134.2KHZ的调制信号。
图2.2EM4095与单片机连接原理图2.2AVR单片机部分2.2.1单片机选型依据本设计采用以AVR单片机为核心,选型AVR单片机主要是因为AVR单片机具有以下特点:1.速度快:运用大型快速存储寄存器以及快速单周期指令的AVR单片机。累加器用32个通用寄存器代代替,这样就取消了以往累加器和存储器之间的数据传送,一条指令访问两个独立的寄存器,在一个时钟周期内就能得到执行。与常规CISC微控制器相比,代码效率快了十倍。贞廈给鏌綞牵鎮獵鎦龐。2.性价比较高AVR单片机中的引脚,既有较多的器件也有较少的器件,在用户进行选择的时候给了很多方便。AVR单片机的程序存储器还有数据存储器是不在一起的,想要访问程序存储器和数据存储器可以直接访问。AVR单片机片内的资源与其他类型的单片机相比较为丰富。为我们在硬件设计上提供了许多方便。AVR单片机的保密强度非常高。因为有多层密码保护锁死功能的程序存储器FLASH,所以解密基本是不可能的。嚌鲭级厨胀鑲铟礦毁蕲。
3.系统内可重新编程AVR单片机片内可以进行系统内重新编程,这样对于老产品的维护就会很方便,同时对于新产品的开发,也有了很大的便利。薊镔竖牍熒浹醬籬铃騫。4.工作电压范围宽、抗干扰能力强AVR单片机内部自带5V转3.3V电路,工作电压范围宽,其在使用过程中,应用的范围较广,适应性特别强。抗干扰的能力也为用户的使用提供了许多方便。齡践砚语蜗铸转絹攤濼。2.2.2ATMEL单片机简介本设计采用ATMEL系列单片机,AT89C52是一个CMOS8位的性能高,电压低的一种单片机,片内含有可以重复擦写的Flash只读程序存储器,还带有随机存取数据存储器(RAM)。采用的是ATMEL公司特有的密度高、非易失性存储的技术进行生产。并且可以兼容标准MCS-51的指令系统。单片机内通用的8位中央处理器以及Flash存储单元在片内也被安置,此种型号的单片机在电子技术行业内的应用较为广泛。绅薮疮颧訝标販繯轅赛。ATMEL128L单片机内部主要包括:1个8位CPU;128K系统内可编程FLASH;4K字节的EEPROM,4K字节的SRAM;53个IO口线;32个通用寄存器;实时时钟RTC;一个灵活的具有比较功能和PWM功能的定时器/计数器;两个UART;8通道10位ADC;具有内部振荡器的可编程看门狗定时器;SPI串行接口;六中通过软件形式的省电模式;2.2.3AT89C52原理图部分
原理图说明:1、CPU部分:通过在单片机芯片部分的23、24脚,使其与8MHz的晶振相连,同时加上两个20P电容C0、C1,来构成一个自激振荡器。饪箩狞屬诺釙诬苧径凛。2、电源部分:本课题选用的单片机电压为5V电压,AVR单片机标准工作电压为3.3V,但是在AVR单片机内部带有一个5V转3.3V的变压电路,所以,我们可以在单片机上连接5V电压从而获得5V和3.3V电压。烴毙潜籬賢擔視蠶贲粵。3、复位部分:因为单片机都是属于低电平的复位才有效果,所以我们在工作室把单片机3.3V和复位端连接,这样我们按下复位按键的时候,单片机就会进行复位。鋝岂涛軌跃轮莳講嫗键。AT89C52原理图如图2.3所示:
图2.3ATMEL原理图如图2.3DS1302实时时钟部分
2.3.1DS1302芯片简介美国DALLAS公司推出了一种实时时钟电路DS1302,它具有功耗低、带RAM、性能高等特点。它能实现对年、月、日、周日、时、分、秒进行计时,并且还带有闰年补偿这种功能。它的工作电压范围在2.5V~5.5V之间。同CPU进行同步通信的是三线接口,传送时钟信号或RAM数据采用的是突发方式,这样可以一次传送多个字节。作为DS1302,他是DS1202升级的产品,并且兼容升级之前的型号。相比之前型号,DS1302增加了主电源,别且增加了一种可以对后背电源进行充电的能力。撷伪氢鱧轍幂聹諛詼庞。2.3.2SPI简介作为一种同步串行的外围接口,SPI总线系统它使得MCU与各种外围设备串行的方式来交换信息。外围设置包括网络控制器以及A/D转换器等。SPI总线系统的方便之处是它允许与各其他公司产出的其他标准的外围设备直接连接。踪飯梦掺钓貞绫賁发蘄。SPI的通信原理其实非常容易理解,并不是想象的那样复杂,SPI应用的工作方式是主从,一般情况下这种模式应该有一个主设备,以及一个或几个从设备,所以需要的线数要大于等于4根。当然特殊情况下3根也是允许的,比如单向传输的时候。婭鑠机职銦夾簣軒蚀骞。SDO是主设备进行数据输出,从属设备进行数据输入。而SDI刚好相反它是主设备进行数据输入,从属设备进行数据输出。O和I分别是OUT以及IN的首字母。SCLK是由主设备发出的时钟信号。CS是从设备的使能信号,它是被主设备进行控制的。譽諶掺铒锭试监鄺儕泻。操控芯片是不是被选中的是CS,意思就是想要对此芯片操作有效用,必须是当片选信号是提前设定的使能信号,这种情况下才可以实现对此芯片的操作是有效用的。俦聹执償閏号燴鈿膽賾。我们是通过数据之间的交换实现通讯的,所以,在此之前要先了解SPI的串行通讯协议是什么样的,协议要求数据是必须是一位一位进行传输。这种情况下就要利用SCK时钟线,用SCK来产生时钟脉冲,这样SDI和SDO就能根据这个脉冲来实现数据之间的传输。缜電怅淺靓蠐浅錒鵬凜。
利用SDO线来完成数据输出,输出和输入的原理相同,都是在当前上沿和下沿处发生改变,在下一个上沿和下沿处读取数据,一次传输就这样完成了。骥擯帜褸饜兗椏長绛粤。SPI的接口不用进行寻址操作的情况是在点对点的通信的时候,这种情况下会使通信变得简单高效。如果是在系统中带有多个从属设备,那么需要每一个单独的从属设备都要有独立使能信号。癱噴导閽骋艳捣靨骢鍵。SPI协议格式如图所示:图2.4SPI协议格式2.3.3DS1302与AVR单片机连接原理图DS1302与AVR单片机连接原理分析:DS1302提供3.3V电压,该连接电路带有晶振Y1、时钟管脚、输入/输出以及复位管脚,他们分别与单片机IO口的PD5、PD6、PD7相连。鑣鸽夺圆鯢齙慫餞離龐。
图2.5DS1302与AVR单片机连接原理图2.4CAN总线部分2.4.1CAN总线简介在我们信息科学高速发展的今天,自动化领域技术发展出很多分支,其中一个热点就是现场总线技术,对于自动化系统来说的就相当于我们生活中的计算机网络。因为我们可以运用它来为分布式控制系统中每个节点之间进行实时的、可靠的数据通信。榄阈团皱鹏緦寿驏頦蕴。在现场总线的范畴里有一个很重要的总线网络CAN,这就是我们所说的控制器局域网络,这种串行通信网络可以很好的提供分布式控或者实时控制。与之前大部分分布式控制系统相比,在以下几个方面基于CAN总线的分布式控制系统拥有非常大优点:HTwDz$j 第一点,工作在多主方式的CAN控制器,可以让不相同的节点同一时间收到相同的数据。这种特点使得CAN总线构具有很强的实时性,提升了系统的可靠性还有系统的灵活性。 第二点,如果当系统出现错误是,CAN总线不会出现多个节点一起向总线发送数据,以至于总线出现短路,进而损坏其中一些节点的情况。值得一提的是在错误非常重大的时候CAN节点可以自动关闭输出,这样就会避免其他节点的操作受到影响。保证不会出现,如果单个节点发生情况,让总线发生“死锁”的状态。-yRA-+GY 第三点,拥有着完善的通信协议的CAN,很大程度上降低系统的开发难度,减少了用户的开发周期。除此之外,CAN总线还有高通信速率、实现很容易、而且性价比非常高等优点。GV]1K~UCr逊输吴贝义鲽國鳩犹騸。2.4.2硬件部分的选型CAN总线器件在当今自动化领域应用较为广泛的有两大类:一类是独立的CAN控制器。还有一类则是置有片CAN的微控制器。本此设计选取的是飞利浦
公司的型号为SJA1000CAN控制器和型号为82C250总线收发器。幘觇匮骇儺红卤齡镰瀉。2.4.3原理图及其解析解析:1、电源设计SJA1000里面三对电源引脚用来连接CAN控制器不同的部分:电源引脚VDD1/VSS1内部逻辑数字电源引脚VDD2/VSS2输入比较器模拟电源引脚VDD3/VSS3输出驱动器模拟2、复位设计SJA1000的复位因为要保证正确,所以必须有一个十分稳定的振荡器时钟来连接CAN管脚XTAL1,本次还运用的是使其也与单片机的复位管脚相互连接从而进行复位。誦终决懷区馱倆侧澩赜。3、振荡器和时钟策略SJA1000可以用片内振荡器或者片外时钟源进行工作,要想修改CLKOUT的信号频率,应该用时钟分频寄存器来实现。医涤侣綃噲睞齒办銩凛。1、模式选择:连接VCC的是管脚11,选择的模式为INTEL。
图2.6CAN原理图2.4.4蜂鸣器报警部分用一个PNP三极管来把蜂鸣器与3.3V电源相互连接起来,开关作用用三极管来实现。PC2为“1”时当单片机是处于正常工作状态,而这时候三极管的状态是关闭,如果运行过程中需要报警,PC2会为“0”,这时候蜂鸣器警报开始。舻当为遙头韪鳍哕晕糞。图2.7.蜂鸣器报警2.5MAX232部分2.5.1MAX232简介
作为双组驱动器/接收器的一种,MAX232里面有一个电容性电压发生器。这是为了输出EIA/TIA-232-E电平。接收器将输入进来的EIA/TIA-232-E电平变为5V的TTL/CMOS电平。鸪凑鸛齏嶇烛罵奖选锯。特点:电源工作的工作电压是单5V具有驱动器符合设计要求的标准输入电平在±30V低电源电流具有两个接收器2.5.2MAX232与51单片机连接原理图在MAX232的11脚输入单片机TTL电平,经过232转换由14脚输出即输入PC。在MAX232的13脚输入PC机输出的电平,经过232转换由12脚输出TTL电平即单片机输入。图2.8MAX232与51单片机连接原理图2.6显示部分
2.6.1显示原理说明通过四位共阳极数码管来进行显示,进行控制的是74HC595,单片机AT89C52对74HC595进行数据传送,本次设计选用的传送方式是通过SPI形式,为了减少了IO口的使用,我们把四位共阳极数码管的每一位,都使其具有其独立的位选,这样的话要控制整个四位显示便只需8个IO口。筧驪鴨栌怀鏇颐嵘悅废。2.6.2数码管与单片机连接原理图原理图说明:在显示部分的每一位的位选端都和一个PNP三极管相连接,起开关作用的是三极管,单片机IO口置低则位选有效,使三极管基极连接单片机IO口。韋鋯鯖荣擬滄閡悬贖蘊。图2.9数码管与单片机连接原理图2.7AT89C52部分2.7.1AT89C52单片机硬件结构
微处理器:与大部分市面上通用的微处理器没有什么较大区别,AT89C52拥有1个8位的微处理器,一样含有运算器还有控制器这两大部分,不同的是它增加了一种处理功能来实现面向控制,这样的优点是不光可以处理字节数据,还可以对未变量进行处理。涛貶騸锬晋铩锩揿宪骟。数据存储器:数据存储器片内为256个字节,同时片外也可进行外扩,并且最多扩至64K字节。数据存储器的主要作用是用来存储程序单片机在运行期间产生的工作变量等数据。钿蘇饌華檻杩鐵样说泻。程序存储器:程序存储器RAM是8K字节,如果感觉单片机内的存储器的容量不足用户使用要求,可以通过扩展片外只读存储器来实现单片机外最多64K字节的扩充。戧礱風熗浇鄖适泞嚀贗。定时器/计数器:单片机带有可以进行四种工作方式的计数器和定时器,他们是16位的。单片机内部放置定时器/计数器部件这种设计,可以使我们在运用单片机的过程中,可以对单片机外部的事件进行计数,并且定时十分精确,这样就可以提高单片机对整个系统实时控制能力。購櫛頁詩燦戶踐澜襯鳳。串行口:AT89C52拥有一个可以进行四种工作方式的全双工串行口。可用用它来实现串行通讯,扩展并行IO口等功能,这样就使该型号的单片机拥有更多的功能,并且使AT89C52的应用范围更广。嗫奐闃頜瑷踯谫瓒兽粪。特殊功能寄存器:用于对片内其他一些功能部件进行管理、控制、监视的特殊功能寄存器,在AT89C52中带有21个。然而实际上这些特殊功能寄存器其实是控制或者状态寄存器。虚龉鐮宠確嵝誄祷舻鋸。2.7.2AT89C52单片机CPU电路图
图2.10AT89C52单片机CPU电路图
第三章软件部分3.1AVR单片机环境介绍AVR单片机开发环境采用CodeVisionAVRCCompiler,这种开发环境属于部分免费开发环境,AVR单片机外围设备的源程序是它自带的,使用时用户可对其直接进行调用。此开发环境内部包括了单片机内部和外围电路的软件编写程序,使用户变得更加便捷。與顶鍔笋类謾蝾纪黾廢。3.2AT89C52单片机开发环境介绍 AT89C52采用KEILC编译环境作为开发环境,美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统KeilC51,C语言与汇编相比,在功能上其结构特性、可读特性、可维护性能上有很大的优势,所以好学好用。如果你用过C后再用汇编语言来开发,体味会很深刻。KeilC51软件为我们提供了功能强大的集成开发调试工具,还有很丰富的库函数。此外还有一点,编译后生成的汇编代码,只要看一眼,就会了解到KeilC51生成出来的的目标代码效率是很高的,大部分语句生成的汇编代码很紧凑,方便理解。如果在开发大型软件的时候,高级语言的优势就会体现出来。結释鏈跄絞塒繭绽綹蕴。3.3AVR单片机读卡部分3.3.1程序实现简介AVR单片机与EM4095之间可以采用总线方式与SPI总线方式进行通信,为了节约IO口,本设计采用SPI总线方式进行通信。餑诎鉈鲻缥评缯肃鮮驃。3.3.2SPI通信简介3.3.3实现功能
MFI卡通过EM4095读卡之后,识别卡号之后AVR控制蜂鸣器发出响声,再由四位数码管显示卡号。3.3.4EM4095读卡程序流程图读卡子程序开始初始化1702发寻卡指令发送读卡命令,读出卡内一块内容存入单片机激活标志位程序返回否是选择卡片和三重认证是否接到0004H不成功爷缆鉅摯騰厕綁荩笺潑。图3.0EM4095读卡程序流程图3.3.5参考程序参见附录1AVR控制EM4095部分3.4AVR发送数据部分
3.4.1程序实现简介AVR单片机与CAN模块之间以总线形式交换数据,通过总线方式来访问SJA1000内部寄存器,发送相应的指令来进行通信。锞炽邐繒萨蝦窦补飙赝。3.4.2实现功能功能描述:AVR以CAN总线形式发送数据至51单片机,发送帧格式为:卡号、年、月、日、时、分、秒、权限。曠戗輔鑽襉倆瘋诌琿凤。3.4.3程序流程图
开始将数据包分割成8帧想缓冲区填写描述符请求发送发送数据帧1发送数据帧8YES返回多帧数据发送完毕?NO延时图3.1AVR发送数据流程图3.4.4程序代码
AVR发送数据部分:功能描述:AVR以CAN总线形式发送数据至51单片机,发送帧格式为:卡号、年、月、日、时、分、秒、权限。轉厍蹺佥诎脚濒谘閥糞。#include//芯片头文件/*main程序头文件*//*主要功能:常量定义*/#ifndef_MAIN_INCLUDED_#define_MAIN_INCLUDED_//***************子函数声明****************************//嬷鯀賊沣謁麩溝赉涞锯。voidmain_init();//初始化voidSEND();//宏定义#defineucharunsignedchar//用uchar代替unsignedchar#defineuintunsignedint//用uint代替unsignedintvoidinit(void);voidcan_init();//主函数voidmain(void){main_init();//主函数初始化init();//初始化
can_init();//CAN初始化#asm("sei")while(1){SEND();//发送数据}}voidmain_init(){PORTF=0xff;DDRF=0xff;DDRB=0X7f;PORTB=0XFF;PORTD=0XFf;DDRD=0X00;DDRC=0XFF;PORTC=0XFF;DDRA=0XFF;PORTA=0XFF;DDRE=0XFF;PORTE=0XFF;//初始化I/O讯鎬謾蝈贺綜枢辄锁廪。
}voidcan_init(){MCUCR=0x80;XMCRB=0x06;XMCRA=0x70;*MO=0x09;*CD=0x88;*IE=0x0d;*B0=0x03;*B1=0xff;*OC=0xaa;*RX=0xaa;*R1=0xff;*R2=0xff;*R3=0xff;*R4=0x00;*R11=0x00;*R12=0x00;*R13=0x00;*RB=0x00;*TXE=0x00;
*EC=0x00;*MO=0x08;}voidSEND(){while(*S1&0x10);while(!(*S1&0x08));while(!(*S1&0x04));*RX=0x88;*R1=0xbb;*R2=0xff;*R3=0x11;*R4=0x12;*R11=n;*R12=y;*R13=r;*R14=h;*R15=m;*R16=s;*R17=jobID;*R18=0x08;*CM=0x01;
}3.5AVR控制DS1302部分程序3.5.1程序实现简介AVR通过SPI查询方式对DS1302内部数据进行读取(由于AVR开发环境内已经有了DS1302的源程序,因此可以对其直接进行调用)。兒躉讀闶軒鲧擬钇標藪。修改时间采用外部中断方式进行修改,按键之后进入外部中断模式,通过读取IO口的高低电平对时、分进行修改。繅藺詞嗇适篮异铜鑑骠。3.5.2功能描述功能描述:通过单片机控制DS1302并且将时间用四位数码管进行显示,如果想调节时间进入中断之后,通过控制按键进行时、分的调节。鮒簡觸癘鈄餒嬋锵户泼。3.5.3程序流程图(见下一页)
初始化PC.7是否按下是否产生中断?Y读取年、月、日NPC.6是否按下Y是否产生中断?Y读取时、分、秒NNN是否产生中断?YPC.4被按下PC.5被按下显示时分Na++b++图3.2AVR控制DS1302流程图3.5.4程序代码参见附录2DS1302时钟部分
功能描述:通过单片机控制DS1302并且将时间用四位数码管进行显示,如果想调节时间进入中断之后,通过控制按键进行时、分、秒的调节。眯毆蠐謝银癩唠阁跷贗。#include//芯片头文件#include//延时函数头文件#include//SPI总线头文件#include//DS1302头文件/*main程序头文件*//*主要功能:常量定义*/#ifndef_MAIN_INCLUDED_#define_MAIN_INCLUDED_Ucharshuzu[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳极数码管代码闵屢螢馳鑷隽劍颂崗鳳。//***************子函数声明****************************//檁傷葦开阈灯伞馑諧粮。voidmain_init();//初始化//宏定义#defineucharunsignedchar//用uchar代替unsignedchar#defineuintunsignedint//用uint代替unsignedint//定义DS1302引脚#asm.equ__ds1302_port=0x12;PORTD
.equ__ds1302_io=6.equ__ds1302_sclk=5.equ__ds1302_rst=7#endasm//定义全局变量flashucharshuzu1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};鄭饩腸绊頎鎦鹧鲕嘤錳。ucharh,m,s,r,y,n;inta,b;//函数声明voidinit(void);voiddisplay(ucharcom,uchardat);//主函数voidmain(void){main_init();//主函数初始化init();//初始化#asm("sei")while(1){rtc_get_date(&r,&y,&n);
rtc_get_time(&h,&m,&s);display(h,m);}}voidmain_init(){PORTF=0xff;DDRF=0xff;DDRB=0X7f;PORTB=0XFF;PORTD=0XFf;DDRD=0X00;DDRC=0XFF;PORTC=0XFF;DDRA=0XFF;PORTA=0XFF;DDRE=0XFF;PORTE=0XFF;//初始化I/O弃铀縫迁馀氣鰷鸾觐廩。}//中断函数修改时间interrupt[EXT_INT0]voidext_int0_isr(void)
{SPCR=0x53;DDRC=0x00;PINC=0xff;while(PINC.7==1)delay_ms(8);while(PINC.6==1){if(PINC.5==0){a++;if(a>24)a=0;while(PINC.5==0)display(a,0);delay_ms(6);}if(PINC.4==0){b++;if(b>59)b=0;while(PINC.4==0){display(b,0);}
delay_ms(6);}}rtc_init(1,2,3);rtc_set_date(3,29,10);rtc_set_time(a,b,00);}3.6AT89C52接收CAN数据部分程序3.6.1程序实现简介51单片机与CAN接收模块之间通过总线的方式对SJA1000进行查询,通过发送相应的指令读取其内部寄存器的数据。51单片机循环对CAN接收模块内部进行检测。调谇續鹨髏铖馒喪劉薮。3.6.2功能描述51单片机接收数据之后存入数组中,数组包含8帧数据,数据顺序为:卡号、年、月、日、时、分、秒、权限。3.6.3程序代码参见附录3CAN接收部分3.7AT89C52与PC机之间通信部分程序3.7.1程序实现简介
设置单片机的波特率为9600,发送数据为8位,无校验位,将单片机接收到的数据发送到单片机的暂存器之中,每次发送8位数据。厲耸紐楊鳝晋頇兗蓽驃。3.7.2功能描述打开串口精灵,调节波特率为9600,接收数据为8位,无校验位,当单片机开始发送数据之后,电脑的界面上就会出现相应的信息。苧瑷籮藶黃邏闩巹东澤。3.7.3程序代码51单片机与电脑之间进行232通信部分。#include#defineuintunsignedint#defineucharunsignedcharuchari,a[8];voidmain(void);//主函数voidIni_UART(void);//串口初始化voidDelay(void);//延时voidCMGF(void);voidmain(void){Ini_UART();//串口初始化CMGF();Delay();}
voidIni_UART(void){SCON=0x50;PCON=0x00;TMOD=0x20;TH1=0xFD;TL1=0xFD;TR1=1;}voidDelay(void)//1ms{uinti,j;for(i=0;i<10;i++){for(j=0;j<1000;j++);}}voidCMGF(void){while(i>7){SBUF=a[i];
while(TI==0);TI=0;i++;}}
第四章结论RFID射频读卡考勤管理系统参考了许多现在RFID的系统、企业和单位的考勤管理系统,在这些系统的基础上提出了本论文的总体设计方案。利用少量的经费解决了RFID无线射频卡在企业和单位考勤管理方面应用的关键技术,RFID(又称射频识别)读卡技术,该技术是全球高科技国家最近几年发展起来的一项新技术,它成功地将RFID技术、磁电感应技术和计算机技术结合起来,解决了卡中无电源、功耗低和不需要接触这一难题,克服了以往接触式读卡经常存在物理接触,经常造成磨损以及市场因接触而发生各种故障的缺点。鴿摄禱鋅儀憚銼嚕缗赞。而且RFID无线射频卡表现出来的防污、防水、加密存储等优点也远超一般的IC卡,而且RFID无线射频卡的读卡设备,省去插刷等步骤,像RFID无线射频卡一样具有防水、防油、防污、防扭曲、防静电等优点,表现出高安全、高快捷、高适用等性能,这种技术在现代电子领域是一项突破。正是由于RFID无线射频卡具有上述特点,使它在一些领域比其他类型读写卡更加具有无法比拟的优越性,在电子钱包、交通收费、食堂收费、门禁系统、考勤系统、身份证等领域。尤其是在地铁、公交、高速、轮渡等收费领域中,比重已经达到整个IC卡应用的60%以上。RFID射频读卡考勤管理系统在设计和实现时选择了MIFARE卡,与传统磁卡相比较,解决了卡中不需要电源电源、功耗低和不需要接触这一问题。箪啬癲剀净赶钩嬙鳄凫。RFID射频读卡考勤管理系统
通过射频信号自动识别目标对象获取数据,识别工作不受环境的影响,较传统的接触式IC卡,具有明显的优势,被广泛应用在身份识别、消费等各项服务上,为企业或单位的管理以及人们的生活提供极大的便利。该系统节省了很大一部分人力物理,使考勤统计变得更加方便智能。顽鷙瑪滨廈岘轆庫糞糧。由于本人专业没有过多涉及到PC机知识的学习,所以只设计了下位机部分的硬件设计与软件调试。参考文献[1].凌志浩,张建正.AT89C52单片机原理与接口技术.北京:高等教育出版社,2011[2].张迎新等,单片机原理及应用.北京:高等教育出版社,2009[3].彭伟,单片机C语言程序设计实训100例.北京.电子工业出版社2009[4].欧阳文.ATMEL89系列单片机的原理与开发实践.中国电力出版社,2007[5].孙育才等ATMEL新型AT89C52系列单片机应用.北京:清华大学出版社,2006[6].程曦.RFID应用指南——面向用户的应用模式、标准、编码及软硬件选择.电子工业出版社,2011漬閫熾诀团諳赓戰餛锰。[7].王志良.RFID读写器制作实训教程.机械工业出版社,2013[8].扎拉维著,陈贵灿等译.模拟CMOS集成电路设计,西安交通大学出版社,2003[9].范逸之,陈立元.ViusalBasic与RS一232串行通信控制.中国青年出版,2002[10].米志强.射频识别(RFID)技术与应用.电子工业出版社,2011[11].彭力.无线射频识别(RFID)技术基础北京:北京航空航天大学出版社,2012[12].ThomasL.Floyd著,电子器件,科学出版社2008年北京[13].李朝青.PC机与单片机&DSP数据通信技术选编.北京:北京航空航天大学出版社,2004[14].石蕾,陈敏雅.RFID系统中阅读器的设计与实现[J].电脑开发与应用,2008,(07)鐸輜澠顶嫻塊謂斕痹廪。
[15].张毅刚.单片机原理及接口技术,北京:人民邮电出版社,2011[16].黄宇飞,吴江,秦旭等.单片机单总线技术.单片机与嵌入式系统应用,2001[17].周航慈.单片机应用程序设计技术,北京:航空航天大学出版社,2011[18].何将三,陈国栋.基于MFRC500的射频识别读写器的设计.单片机与嵌应用,2004.11,52~55抢觀淚婭师讴论櫚阵蘚。[19].张克彦.AVR单片机实用程序设计,北京:航空航天大学出版社,2012[20].张大明等.单片机微机控制应用技术(第一版).北京:机械出版社,2006[21].李池水,龚华志等.射频卡数据读写方法.电测与仪表,2000.9,51~52[22].ClausKuhnel,AvrRISCMicrocontrollerHandbook,NewYork:Newnes,1998贼組櫻種愨单蝕渾潷骡。[23]V.Yu.Teplov,A.V.Anisimov.ThermostattingSystemUsingaSingle-ChipMicrocomputerandThermoelectricModulesBasedonthePeltierEffect[J],2002圓漣檸賡捣蕷舻燁錘泽。[24]DennisBrown,RfidImplementation,NewYork:Osborne/McGraw-Hill,2006蟄彎擼鯁棖佇緡癟椠贊。
致谢首先我要感谢老师,正是在老师的指导和帮助下在历时三个多月之后终于将这篇论文完成。在毕业设计的初始和结束期间,我遇到了许多困难和阻碍,是老师不厌其烦的帮助进行论文的修改和改进,最后这些困难和阻碍都在老师和同学的帮助下顺利通过了。义淨擁扪殴胁纸窺钣鳧。另外我要感谢所有给予我帮助的教师,这些老师也为我的论文给我提供了许多的支持与帮助。在此我要向帮助还有指导过我的各位老师给予我最衷心的感谢!绥骅懸缙澀鷂禍紳撻粮。其次还要感谢在这篇论文里涉及到的各位学者,本文引用了一些学者的研究成果和文献,是我能顺利的完成这边论文如果没有各位学者在此之前的研究,我的这篇论文将会很难完成。馒锁開钥焖緒珏編軻錙。我还要感谢我的同学,在毕业设计和论文撰写的过种中给我提供了很多的素材,在论文的写作时在格式排版设计上给我很多帮助。獄质嶇僅痺鲒潰脫帧開。在工业大学信息学院求学的这四年是我人生中最重要,最快乐和
最充实的阶段。在这四年里,我学到了很多知识,顺利地完成了学业,学校里老师们治学严谨的态度还有敬业的精神使我感受颇深,这些都是在我今后工作中我要努力去学习的精神。鍥苋娛殫秽笾殇蕢谬藓。附录附录1单片机控制FM4095部分功能描述:射频卡通过FM4095读卡之后,识别卡号之后AVR控制蜂鸣器发出响声,再由四位数码管显示卡号。杂砖墳雖紜飯曇覡墾騾。#include//芯片头文件#include//延时函数头文件#include//SPI总线头文件/*main程序头文件*//*主要功能:常量定义*/
#ifndef_MAIN_INCLUDED_#define_MAIN_INCLUDED_//常量定义#defineFALSE0#defineTRUE1//FM4095命令码#defineTransceive0x1E//发送接收命令#defineTransmit0x1a//发送命令#defineReadE20x03//读FM4095EEPROM命令#defineWriteE20x01//写FM4095EEPROM命令#defineAuthent10x0c//验证命令认证过程第1步#defineAuthent20x14//验证命令认证过程第2步#defineLoadKeyE20x0b//将密钥从EEPROM复制到KEY缓存#defineLoadKey0x19//将密钥从FIFO缓存复制到KEY缓存#defineRF_TimeOut0xff//发送命令延时时间#defineReq0x01#defineSel0x02//数据类型定义#defineucharunsignedchar#defineuintunsignedint//射频卡通信命令码定义#defineRF_CMD_REQUEST_STD0x26
#defineRF_CMD_REQUEST_ALL0x52#defineRF_CMD_ANTICOL0x93#defineRF_CMD_SELECT0x93#defineRF_CMD_AUTH_LA0x60#defineRF_CMD_AUTH_LB0x61#defineRF_CMD_READ0x30#defineRF_CMD_WRITE0xa0#defineRF_CMD_INC0xc1#defineRF_CMD_DEC0xc0#defineRF_CMD_RESTORE0xc2#defineRF_CMD_TRANSFER0xb0#defineRF_CMD_HALT0x50#defineALL0x01#defineKEYB0x04#defineKEYA0x00#define_AB0x40#defineCRC_A1#defineCRC_B2#defineCRC_OK0#defineCRC_ERR1#defineBCC_OK0#defineBCC_ERR1
//*******************FM4095地址定义********************轼栀嗶鑊绷瘍懔諍訝澤。#definepage_reg0x00#definecommand0x01//开始(停止)命令的执行#definefifodata0x02//64字节FIFO的输入输出#defineprimarystatus0x03//接收器/传送器/FIFO的状态标志尋头厭呛羈阴帥讕匦赞。#definefifolength0x04//FIFO中存储数据的字节数#definesecondarystatus0x05//不同的状态标志#defineinterrupten0x06//使能请求中断传送的控制位訪齙剛玺苏滥夹趕萤凭。#defineinterruptrq0x07//中断请求标志//第1页,控制和状态写韞僂谌虛鍤囈辮褻糝。#definecontrol0x09//不同的控制标志,例如:定时、功耗等罴醬畝饼誊歿凑鈑繳锱。#defineerrorflag0x0A//显示最后一次执行的命令的错误状态的标志鲢診龄師該铃書銨鴇开。#definecollpos0x0B//在RF接口检测到的第一个冲突位的位置磚緙鹅綱谩擞鴻鑌纸蘚。#definetimervalue0x0C//定时器的实际值#definecrcresultlsb0x0D//CRC协处理器寄存器的最低有效字节鬮煒鳍輥賠還鲂隊驼骡。#definecrcresultmsb0x0E//CRC协处理器寄存器的最高有效字节毕懍鲅鵑较惻飾顳矯泾。
#definebitframing0x0F//调整位定向帧//第2页,传送器和编码控制#definetxcontrol0x11//控制天线驱动引脚Tx1、Tx2的逻辑行为钆歷驾无醬赔隽驍韉贈。#definecwconductance0x12//选择天线驱动引脚Tx1、Tx2的电导徠鲣饮脸铄尝鏍鯢炀憑。#definepreset130x13//这些值不可以改变#definepreset140x14//这些值不可以改变#definemodwidth0x15//选择调制脉冲的宽度#definepreset160x16//这些值不可以改变#definepreset170x17//这些值不可以改变//第3页,接收器及解码控制#definerxcontrol10x19//控制接收器行为#definedecodercontrol0x1A//控制解码器行为#definebitphase0x1B//选择接收器和传送器时钟间的位相謂镊颇铵鋃誼铰鸚镉糁。#definerxthreshold0x1C//选择位解码器的阈值#definepreset1d0x1D//这些值不可以改变#definerxcontrol20x1E//控制解码器行为并定义接收器的输入源变赵陧涼镦囑釧亿殮錙。#defineclockqcontrol0x1F//控制时钟产生//第4页,射频时间和通道冗余//#define
rxwait0x21//选择在传送之后,接收器工作之前的时间间隔荟蓥闶漸陸讣轾减鈿異。#definechannelredundancy0x22//选择验证RF通道数据完整性得类型和模式鹏筛镐討颛办費叹摄虏。#definecrcpresetlsb0x23//CRC寄存器预置值的最低有效字节糝殒锔雋駛鶯诼垆辐驄。#definecrcpresetmsb0x24//CRC寄存器预置值的最高有效字节頜层铢壶鲜儀計尧當涇。#definepreset250x25//这些值不可以改变#definemfoutselect0x26//选择应用到MFOUT引脚的内部信号滚伛钮硕鷙耸蒋忆貯赠。#definepreset270x27//这些值不可以改变//第5页,FIFO、定时器及中断引脚配置//#definefifolevel0x29//定义FIFO的大小,是#definetimerclock0x2A//选择时钟的分频#definetimercontrol0x2B//选择定时器的开始和结束条件#definetimerreload0x2C//定义定时器的预置值#defineirqpinconfig0x2D//配置引脚IRQ的输出状态#definepreset2e0x2E//这些值不可以改变#definePreSet2F0x2F//这些值不可以改变//第6页,预留//#definecryptoselect0x31
#endif#definefmqPORTC.2//蜂鸣器,低电平响铣饜酝贻龙鵠臚拧奥凭。#definefm4095rstPORTE.2//FM4095复位管脚定义撾鉬辙魇侨絢绾来诔緊。#definecsPORTB.4//SPI与AVR接口#definesckPORTB.5#definesiPINB.7#definesoPORTB.6ucharreaddata[16];//读写数据缓冲区ucharvalue[4];//增减的数值ucharKeySet;//密码类型uchartagtype[2];//卡片标识字符//*******************FM4095变量定义********************賒調轧憊劌髋糾殡縣锲。ucharm1ok=0;//有无卡标志ucharPRO_SendBuf[16];//发送处理缓冲区16BYTEucharrecvbuf[16];//接收处理缓冲区16BYTEucharbuffer[24];//FM4095命令发送接收缓冲区ucharsecnr=0x0c;//操作块区号=扇区*4+n其中n=(0.1.2.3)ucharkeybuffer[6]={0xff,0xff,0xff,0xff,0xff,0xff};//密钥存放区垒羥赎緙呒窍砀渖虯异。
ucharchangekey[12];//密钥转换成特定格式衅璉贡釙壘颯狽狰侦虜。ucharshuzu[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳极数码管代码畝擱谎为寻瓊涞瞩肾骢。ucharUID[5];//序列号低位到高位排列一共4字节序号,第5字节为校验码ucharreadok=0;//check()函数正确读出卡内信息标志位ucharjobID;//员工的工号,readok=1时有效卡内第14字节数据ucharrights[13];//权限共104位,每位对应每个门,门要检查对应位是否为0,为0表示权限正确。卡内前13字节数据綿嘮诠榉異阌欏箫鹉泾。//***************子函数声明****************************//騶鸲记蒉戗渗摆绞絎贍。voidmain_init();//初始化voidcheck();//寻一次卡函数voidchange(uchara[6],ucharb[12]);//改密钥格式voidpcd_init();//4095准备寻卡前初始化ucharrw_spi(ucharval);//SPI读写voidwrite_byte(ucharadr,uchardata);//写4095形参为地//址+数据现闾袜镒攆錘惻缮騫凱。ucharread_reg(ucharadr_reg);//读REG镄辉蔺敘档檻岂苈祸紧。voidsuccess();//读卡成功声光提示梟裥荞獰淪钲壚蚀颈鍥。
voidfault();//读卡失败声光提示輟绀脑誒滢搂厨议犧異。#defineMOD0xFE00//模式寄存器屡浔缱飛獼轄黨诼鐙虏。#defineCMR0xFE01#defineSR0xFE02#defineIR0xFE03#defineIER0xFE04#defineBTR00xFE06#defineBTR10xFE07#defineOCR0xFE08#defineTEST0xFE09#defineALC0xFE0b#defineECC0xFE0c#defineEWLR0xFE0d#defineRXERR0xFE0e#defineTXERR0xFE0f#defineRXB0xFE10#defineRX10xFE11#defineRX20xFE12#defineRX30xFE13#defineRX40xFE14
#defineRX110xFE15#defineRX120xFE16#defineRX130xFE17#defineRX140xFE18#defineRX150xFE19#defineRX160xFE1a#defineRX170xFE1b#defineRX180xFE1c#defineRMC0xFE1d//RX保伪ㄎ钠数器#defineRBSA0xFE1e//RX缓冲起始地址寄存器#defineCDR0xFE1f//始时钟分频寄存器unsignedchar*MO=(unsignedchar*)MOD;unsignedchar*CM=(unsignedchar*)(CMR);unsignedchar*S1=(unsignedchar*)(SR);unsignedchar*I1=(unsignedchar*)(IR);unsignedchar*IE=(unsignedchar*)(IER);unsignedchar*B0=(unsignedchar*)(BTR0);unsignedchar*B1=(unsignedchar*)(BTR1);unsignedchar*OC=(unsignedchar*)(OCR);unsignedchar*TE=(unsignedchar*)(TEST);unsignedchar*AL=(unsignedchar*)(ALC);unsignedchar*EC=(unsignedchar*)(ECC);
unsignedchar*EW=(unsignedchar*)(EWLR);unsignedchar*RXE=(unsignedchar*)(RXERR);unsignedchar*TXE=(unsignedchar*)(TXERR);unsignedchar*RX=(unsignedchar*)(RXB);unsignedchar*R1=(unsignedchar*)(RX1);unsignedchar*R2=(unsignedchar*)(RX2);unsignedchar*R3=(unsignedchar*)(RX3);unsignedchar*R4=(unsignedchar*)(RX4);unsignedchar*R11=(unsignedchar*)(RX11);unsignedchar*R12=(unsignedchar*)(RX12);unsignedchar*R13=(unsignedchar*)(RX13);unsignedchar*R14=(unsignedchar*)(RX14);unsignedchar*R15=(unsignedchar*)(RX15);unsignedchar*R16=(unsignedchar*)(RX16);unsignedchar*R17=(unsignedchar*)(RX17);unsignedchar*R18=(unsignedchar*)(RX18);unsignedchar*RM=(unsignedchar*)RMC;unsignedchar*RB=(unsignedchar*)(RBSA);unsignedchar*CD=(unsignedchar*)(CDR);//宏定义#defineucharunsignedchar//用uchar代替unsignedchar#defineuintunsignedint//用uint代替unsignedint
//定义全局变量flashucharshuzu1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共阳极数码管代码诏弑缁岘睑慫龜贮沩驏。inta,b;//函数声明voidinit(void);voiddisplay(ucharcom,uchardat);//主函数voidmain(void){main_init();//主函数初始化init();//初始化#asm("sei")while(1){check();//寻卡一次鳧冲经粮籩赂鸡躯铠潔。}}voidmain_init(){
PORTF=0xff;DDRF=0xff;DDRB=0X7f;PORTB=0XFF;PORTD=0XFf;DDRD=0X00;DDRC=0XFF;PORTC=0XFF;DDRA=0XFF;PORTA=0XFF;DDRE=0XFF;PORTE=0XFF;//初始化I/O聰駘絷轳终实騭逻顯赡。change(keybuffer,changekey);//改密钥存储方式,存//入changekey数组中鯧鋱窃鸨緶諏颤钻邇凯。pcd_init();//1702复位,总线选择、初始化准备寻卡}voidcheck(){uchara,x,y,z;ucharb[2];readok=0;
write_byte(bitframing,0x07);//面向BIT的帧格式,最后的字节发送7位write_byte(channelredundancy,0x03);write_byte(control,0x01);//清FIFOwrite_byte(fifodata,RF_CMD_REQUEST_ALL);//寻卡指令write_byte(command,Transceive);//发送并接受命令delay_ms(10);a=read_reg(fifolength);if(a==0x02){b[0]=read_reg(fifodata);//卡返回值低字节放b[0]b[1]=read_reg(fifodata);if(b[0]==0x04)m1ok=1;elsem1ok=0;}elsem1ok=0;if(m1ok)//有卡进入读卡程序{write_byte(fifodata,0x93);//发送//读卡序号指令防冲撞操作碱賢矫攝胆嘮闊锑恺緊。write_byte(fifodata,0x20);write_byte(command,Transceive);//发送并//接受命令
阕蘆画腎藎觉锼镱赉锲。delay_ms(10);x=read_reg(fifolength);if(x==0x05)//接受到卡返回的数据{for(y=0;y<5;y++){UID[y]=read_reg(fifodata);//存卡序号到UID数组低到高排列UID【4】//为校验位溝礬爷銦蝈刚銪霁寧弃。}for(y=0;y<5;y++){z^=UID[y];//卡号检验}write_byte(channelredundancy,0x0f);//选卡操作//CRC发送接收校验奇校验鈣槍滤党許蕁郐饫誥慮。write_byte(control,0x01);//清FIFOwrite_byte(fifodata,0x93);//发送选卡序号指令怿處浊浑诽買躦骟呛骣。write_byte(fifodata,0x70);for(y=0;y<5;y++)
{write_byte(fifodata,UID[y]);//卡号发送}write_byte(command,Transceive);//发送并接受命令delay_ms(10);if(read_reg(fifodata)==0x08)//确认是M1卡{write_byte(control,0x01);//清FIFOfor(y=0;y<12;y++)//装载密钥{write_byte(fifodata,changekey[y]);}write_byte(command,0x19);//从FIFO中装载密钥delay_us(50);if(read_reg(errorflag)==0x00)//密钥装载成功{write_byte(control,0x01);//清FIFOwrite_byte(fifodata,0x60);//A密钥为60控制字,B密钥为61控制write_byte(fifodata,secnr);//操作的扇区块号write_byte(fifodata,UID[0]);write_byte(fifodata,UID[1]);
write_byte(fifodata,UID[2]);write_byte(fifodata,UID[3]);write_byte(command,0X0C);//Authent1指令delay_ms(10);谢齿毁览賬缲财鳞蠼洁。write_byte(command,Authent2);//Authent2指令delay_ms(10);吶韦桢阖践鴟諍齑蘭贍。//write_byte(control,0x01);//清FIFO此时数据被加密不能清除萊郦晋壩辭終裥俠輿擊。write_byte(fifodata,0x30);//读卡命令write_byte(fifodata,secnr);//操作的块号=扇区号*4+0.1.2.3write_byte(command,Transceive);//发送并接受命delay_ms(10);鷲诅捡瞇钗骘蓀剝黃絷。if(read_reg(fifolength)==0x10)//1702中收到该块的16字节数据{for(y=0;y<16;y++){recvbuf[y]=read_reg(fifodata);}for(y=0;y<13;y++){rights[y]=recvbuf[y];}jobID=recvbuf[13];
success();}elsefault();}elsefault();}elsefault();}elsefault();}elsePORTA=0X7F;}voidfault(){PORTA=0XFE;fmq=0;delay_ms(100);PORTA=0XFF;fmq=1;delay_ms(100);PORTA=0XFE;fmq=0;delay_ms(100);PORTA=0XFF;fmq=1;m1ok=0;//清标志位
}voidsuccess(){PORTA=0Xbf;fmq=0;delay_ms(300);PORTA=0XFF;fmq=1;m1ok=0;readok=1;//清标志位}voidchange(uchara[6],ucharb[12]){uchari;for(i=0;i<6;i++){b[2*i]=a[i]>>4;b[2*i]+=~a[i]&0xf0;b[2*i+1]=a[i]&0x0f;b[2*i+1]+=~a[i]<<4;}}voidpcd_init(){
ucharj=1;Fm4095rst=1;delay_ms(200);//复位1702Fm4095rst=0;delay_ms(1);while(j)//总线选择SPI{j=read_reg(command);}write_byte(page_reg,0x80);j=1;while(j)//总线选择SPI{j=read_reg(command);}write_byte(page_reg,0x00);//总线选择完成write_byte(txcontrol,0x5B);//TX1TX2选择反向13.56M调制载波write_byte(decodercontrol,0x28);//接到冲突位后后面都置0}ucharread_reg(ucharadr_reg)//读REG纫绾懔賬鍘禅耧啞绵鍇。{
uchari;cs=0;adr_reg=(adr_reg<<1)|0x80;rw_spi(adr_reg);i=rw_spi(0x00);cs=1;returni;}voidwrite_byte(ucharadr,uchardata1)//写1702形参为地址+数据颟灿忏騅锰顆繡奪鲔棄。{cs=0;adr=(adr<<1)&0x7f;rw_spi(adr);rw_spi(data1);cs=1;delay_us(100);}ucharrw_spi(ucharval){ucharBitCounter;for(BitCounter=8;BitCounter!=0;BitCounter--)
{sck=0;if((val&0x80)==0x80)so=1;elseso=0;sck=1;val<<=1;sck=1;sck=1;//readif(si)val+=1;}sck=0;returnval;}//初始化函数voidinit(void){//SPI总线控制寄存器(使能SPI总线、MSB首先发送、主机模式、空闲//时SCK为低电平、128分频)潛愦巅怼閑貓简巒競虑。SPCR=0x53;EIMSK=0x00;EICRA=0x03;EIFR=0xff;
EIMSK=0x03;}voiddisplay(ucharcom,uchardat)//数码管显示函数{//数码管高位显示//利用AVR单片机内部SPI总线控制74HC595进而控制数码管的段选spi(shuzu[com/10]);PORTB.0=0;PORTB.0=1;//控制数码管的位选PORTF=0xfe;delay_ms(2);//数码管次高位显示//利用AVR单片机内部SPI总线控制74HC595进而控制数码管的段选spi(shuzu1[com%10]);PORTB.0=0;PORTB.0=1;//控制数码管的位选PORTF=0xfd;delay_ms(2);//数码管低位显示//利用AVR单片机内部SPI总线控制74HC595进而控制数码管的段选
spi(shuzu[dat/10]);PORTB.0=0;PORTB.0=1;PORTF=0xfb;//控制数码管的位选delay_ms(2);//利用AVR单片机内部SPI总线控制74HC595进而控制数码管的段选spi(shuzu[dat%10]);PORTB.0=0;PORTB.0=1;//控制数码管的位选PORTF=0xf7;delay_ms(2);}附录2DS1302时钟部分功能描述:通过单片机控制DS1302并且将时间用四位数码管进行显示,如果想调节时间进入中断之后,通过控制按键进行时、分、秒的调节。鏟却审绪鞑闻癬惱颯驏。#include//芯片头文件#include//延时函数头文件#include//SPI总线头文件#include//DS1302头文件/*main程序头文件*/
/*主要功能:常量定义*/#ifndef_MAIN_INCLUDED_#define_MAIN_INCLUDED_Ucharshuzu[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳极数码管代码掳鱘壳郏餳涡烂摻玺灑。//***************子函数声明****************************//赝鐨喾龉骐銻潑櫟闻赢。voidmain_init();//初始化//宏定义#defineucharunsignedchar//用uchar代替unsignedchar#defineuintunsignedint//用uint代替unsignedint//定义DS1302引脚#asm.equ__ds1302_port=0x12;PORTD.equ__ds1302_io=6.equ__ds1302_sclk=5.equ__ds1302_rst=7#endasm//定义全局变量flashucharshuzu1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共阳极数码管代码殼贈叹橈鯛槳栌滄滸击。
ucharh,m,s,r,y,n;//年/月/日y/n/r,时/分/秒h/m/sinta,b;//函数声明voidinit(void);voiddisplay(ucharcom,uchardat);//主函数voidmain(void){main_init();//主函数初始化init();//初始化#asm("sei")while(1){//读取年月日rtc_get_date(&r,&y,&n);//读取时分秒rtc_get_time(&h,&m,&s);//显示分秒display(h,m);}}voidmain_init()
{PORTF=0xff;DDRF=0xff;DDRB=0X7f;PORTB=0XFF;PORTD=0XFf;DDRD=0X00;DDRC=0XFF;PORTC=0XFF;DDRA=0XFF;PORTA=0XFF;DDRE=0XFF;PORTE=0XFF;//初始化I/O襉藍动蔭鹗钣掙濰鋱縶。}//中断函数修改时间interrupt[EXT_INT0]voidext_int0_isr(void){SPCR=0x53;DDRC=0x00;//初始化DS1302PINC=0xff;while(PINC.7==1)//按PC.7进入设置
delay_ms(8);while(PINC.6==1)//按PC.6跳出设置{if(PINC.5==0)//按PC.5设置小时{a++;if(a>24)a=0;//是24则清零while(PINC.5==0)//等待按键恢复display(a,0);//显示小时delay_ms(6);}if(PINC.4==0)//按PC.4设置分钟{b++;if(b>59)b=0;//为60则清零while(PINC.4==0)//键盘等待{display(b,0);//显示}delay_ms(6);}}rtc_init(1,2,3);rtc_set_date(3,29,10);//设置年月日
rtc_set_time(a,b,00);//设置时分秒}附录3CAN接收部分#include#include#include#includeunsignedchari,j;unsignedchara[12];#defineMODXBYTE[0x7000]#defineCMRXBYTE[0x7001]#defineSRXBYTE[0x7002]#defineIRXBYTE[0x7003]#defineIERXBYTE[0x7004]#defineBTR0XBYTE[0x7006]#defineBTR1XBYTE[0x7007]#defineOCRXBYTE[0x7008]#defineTESTXBYTE[0x7009]#defineALCXBYTE[0x700b]#defineECCXBYTE[0x700c]#defineEWLRXBYTE[0x700d]
#defineRXERRXBYTE[0x700e]#defineTXERRXBYTE[0x700f]#defineRXBXBYTE[0x7010]#defineRX1XBYTE[0x7011]#defineRX2XBYTE[0x7012]#defineRX3XBYTE[0x7013]#defineRX4XBYTE[0x7014]#defineRX11XBYTE[0x7015]#defineRX12XBYTE[0x7016]#defineRX13XBYTE[0x7017]#defineRX14XBYTE[0x7018]#defineRX15XBYTE[0x7019]#defineRX16XBYTE[0x701a]#defineRX17XBYTE[0x701b]#defineRX18XBYTE[0x701c]#defineRMCXBYTE[0x701d]#defineRBSAXBYTE[0x701e]#defineCDRXBYTE[0x701f]voidRECIEVE();voiddelay();voidmain(){
P1=0x00;MOD=0x01;CDR=0x88;IER=0x03;OCR=0xAA;BTR0=0x85;BTR1=0xb4;RBSA=0x00;TXERR=0x00;RXB=0xff;RX1=0xff;RX2=0xff;RX3=0xff;RX4=0xff;RX11=0xff;RX12=0xff;RX13=0x0ff;MOD=0x08;while(1){RECIEVE();}
}voidRECIEVE(){j=SR&0xC3;if(j==0xc3)return;i=SR&0x80;if(i==0x80)return;i=IR&0x08;if(i==0x08)return;i=IR&0x01;if(i==0x01)return;i=RXB&0x40;if(i==0x40)return;a[0]=RX1;a[1]=RX2;a[2]=RX3;a[3]=RX4;
a[4]=RX11;a[5]=RX12;a[6]=RX13;a[7]=RX14;a[8]=RX15;a[9]=RX16;a[10]=RX17;a[11]=RX18;for(i=0;i<12;i++){P1=a[i];delay();}}voiddelay(){unsignedcharm,n;for(n=1000;n>0;n--){for(m=100;m>0;m--);}}