




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
上海师范大学电子信息工程 非接触式只读IC卡读卡系统设计第一章 非接触式只读IC卡概述1.1 非接触式IC卡简介1.1.1 什么是非接触式IC卡非接触式IC卡简称射频卡(Radio Frequency),又名感应卡,诞生于90年代初,由于存在着与磁卡和接触式IC卡不可比拟的优点,由于成功地解决了无源(卡中无电源)和免接触这一难题,使之一经问世,便立即引起广泛的关注,并以惊人的速度得到大面积的推广应用。目前,非接触卡大多使用125KHz和13.56MHz两种载波频率.前者的频率较低,又称为低频卡,主要有台湾GK和瑞士EM电子生产;后者以飞利普半导体公司(Philips Semiconductors)的MIFARE系列可读写的射频卡被最广泛的使用(我校新版学生证就是使用这个系列芯片制作)。非接触卡有只读和可读写的,只读IC卡又名ID卡,本设计只做了只读的低频卡。1.1.2 IC卡的优点磁卡由于其结构简单,存储容量小,安全保密性差,读写设备复杂且维护费用高,作为七、八十年代技术水平的产品已风光不再。现在磁卡电话已经消失,中国电信已经回收磁卡了。 接触式IC卡与磁卡相比,更加安全可靠,除了存储容量大,还可一卡多用,同时可靠性比磁卡高,寿命长。读写机构比磁卡读写机构简单可靠,造价便宜,维护方便,容易推广。正由于以上优点,使得接触式IC卡市场遍布世界各地,风靡一时。然而,当前风头正健的接触式IC卡面临着后来者非接触式IC卡的强劲挑战。 非接触式IC卡与传统的接触式IC卡相比,它在继承了接触式IC卡的优点的同时,如大容量、高安全性等,又克服了接触式所无法避免的缺点,如读写故障率高,由于触点外露而导致的污染、损伤、磨损、静电以及插卡这个不便的读写过程等。非接触式IC卡完全密封的形式及无接触的工作方式,使之不受外界不良因素的影响,从而使用寿命完全接近IC芯片的自然寿命,因而卡本身的使用频率和期限以及操作的便利性都大大的高于接触式IC卡。可见,非接触式IC卡不仅代表着卡技术发展多年的结晶,也是象征着卡的应用又提高到一个新阶段的里程碑。 非接触IC卡国际标准ISO14443的诞生,为非接触IC卡带来了无穷无尽的潜力。毫无疑问,集众家之大成的非接触IC卡将在身份识别、金融、电子货币、公共交通、智能楼宇、小区物业、社会保障诸多领域独领风骚。 非接触式智能卡以其高度安全保密性、通信高速性、使用方便性,成本日渐低廉等而受到广泛使用,给我们的生活质量带来了很大的提高。其性能稳定可靠,价格低廉,使其迅速发展。由于以上优点,现在第二代公民身份证也开始使用非接触式IC卡。1.1.3 射频卡的主要工作原理射频卡工作的基本原理是:射频读写器向IC卡发一组固定频率的电磁波,卡片内有一个IC串联谐振电路,其频率与读写器发射的频率相同,这样在电磁波激励下,LC谐振电路产生共振,从而使电容内积存了电荷;在这个电荷的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内存储,当所积累的电荷达到2V时,此电容可作为电源,为其它电路提供工作电压,将卡内数据发射出去或接收数据。1.2 非接触式IC卡的应用: 公司企业一卡通 智能小区智能门禁, 巡更管理系统 考勤系统 防盗门,保险柜,密码箱 个人识别 汽车(机动车辆)防盗 其它一些需要身份识别和保密的方面的应用正因为非接触式IC卡有着广泛的应用和便宜的价格。才决定做这样一个系统。1.3 EM公司的125K非接触只读IC卡简介非接触IC卡主要有台湾(GK)4001卡和瑞士EM MICROELECTRONIC-MARIN SA(www.EM)H4001卡、EM4100。它们都采用125kHz的典型工作频率,有64位激光可编程ROM,调制方式为曼彻斯特码(Manchester)调制,位数据传送周期为512s,其包含64位数据,下面以瑞士EM4100为例子1.3.1 简介EM4100(先前命名H4100)CMOS集成电路,用于只读RF发射器。卡的电路能源是由被放置在电磁场内的外部电感线圈提供的。并且通过线圈终端得到主时钟。以电流的开和关来调制,片子会传回预先光刻的64位数据阵列。EM4100芯片是由激光烧录在每片上的储存单元,代码唯一,数据以曼彻斯特编码,二相或者PSK编码发送。为了做到低功耗,电容缓冲区都不要求。只要外部的线圈,并且74pF的谐振电容也被整合了。 64位激光可编程序记忆阵列 可提供几种可选择的数据传输速度和编号 共振电容器在芯片上被整合了 在芯片上提供了缓冲电容 在芯片整合电压限制器 全波调制发射 大的调制深度和低阻抗 工作频率100-150kHz 小的芯片尺寸,小的能量消耗,1.3.2 IC卡的典型的工作外型和针脚定义图1-1 典型的针脚定义 从图上可以看出,电路非常的简单,只要接上一个21.9mH的线圈就可以了,其他什么元件都不需要了,一张非接触式IC卡就这么简单。就是因为这样,所以IC卡发展才这样好。1.3.3 整个读卡的接收系统原理框图读卡过程要经过检波-滤波,获得数据-数据编码-数据发送图1-2 读卡的接收系统原理框图1.3.4 EM4100卡的数据编码图1-3 64位激光可编程ROM数据结构为了更加可靠的得到正确的数据,IC卡输出数据的编码采用了图1-3所示的数据编码。他们都采用125kHz的典型工作频率,有64位激光可编程ROM,调制方式为曼彻斯特码(Manchester)调制,位数据传送周期为512s,其64位数据结构如图1-3所示。 连续9位“1”作为头数据,是读取数据时的同步标识;D00D93位是用户定义数据位;P0P9是行奇校验位,PC0PC3是列奇校验位,最后位“0”是结束标志。非接触ID卡的这种数据结构非常有利于判断读出数据的正确性。图二也可以清楚的看到开始的9位都是1,最后一位是0,然后再是9个1,一直循环。1.3.5 曼彻斯特码(Manchester)调制 根据曼彻斯特码的编码原则,非接触IC卡采用上升沿对应着位数据“0”,下降沿对应着位数据“1”,微控制器通过检测125k非接触IC卡读卡器输出数据位的跳变来实现对曼彻斯特码的译码。数据读以后,根据前面所提到的非接触IC卡的数据结构,通过比较奇校验算法与读出数据中的奇校验位来验证出数据的正确性。在工作状态下,只要125K读卡头电路不断电,非接触IC卡在读卡区内,非接触IC卡将循环发送64位数据,而125K读卡头也循环发送64位数据。采用曼码调制的数据表达方式由图1-4可知,位数据的传送周期(1P)规定了每传送1位数据的时间是固定的,载波频率fOSC125kHz,位数据传送率RF/64是固定的,则每传送一位的时间(周期)1P=1/(125kHz64)=512s图1-4 起始标识时序1.3.6 非接触只读IC卡数据读取及校验程序 根据曼彻斯特码的编码原则非接触IC卡采用上升沿对应着位数据“0”,下降沿对应着位数据“1”,微控制器通过检测读卡头输出数据位的跳变来实现对曼彻斯特码的译码。在现实工作中,数据信号会受到调制、解调、噪声各种效应的影响,其上升沿和下降沿存在抖动,可采用键盘消抖的办法来消除抖动的影响。根据非接触IC卡64位数据循环发送以及其数据结构特点,即数据流中第64位为“0”,第1位至第9位为“1”。据此,将“0111111111”作为读数据的起始标识。只要找到这个头,就可以开始读取IC卡卡号信息了。 为了便于对读出数据进行奇校验,读出数据每5位作为一个字节。因为确定起始标识和读取数据对时钟有严格要求,所以寻找起始标识和读取数据部分程序采用汇编语言编写。数据读以后,根据前面所提到的非接触IC卡的数据结构,通过比较奇校验算法与读出数据中的奇校验位来验证出数据的正确性。若错误则程序重新寻找卡号的信息头、读卡号。非接触IC卡的数据读取程序在2.3中。 只有在正确找到数据的起始标识和通定合适的时间间隔常数后,才能正确读出非接触IC卡的数据。上面已经阐述,位传送周期为:1P=512s图15 曼彻斯特码编码根据得到的器件,采用曼彻斯特码调制的数据,位数据1对应着电平下跳(先高电平,在低电平),位数据0对应着电平上跳在一串传送的数据序列中,两个相邻的位数据传送跳变时间间隔应为1P(1/125K=8us)。若相邻的位数据极性相同,则在该两次位数据传送的电平跳变之间,有一次非数据传送的、预备性的(电平)空跳。电平上跳、电平下跳和两个相邻的同极性位数据之间的预备性空跳是确定位数据传送特征的判据。 读卡头输出信号为原卡的曼彻斯特码,(用示波器接读卡头输出可以观测IC卡的输出波形)它和其它公司的125K读卡头(输出信号为原卡的曼彻斯特码)是兼容的,可以相互替换,不用修改程序。 读卡头也可以读可擦写的125k非接触IC卡,如当读E5550时,本读卡系统是只读,不能发数据。第二章 只读IC卡读卡系统设计 做这样一个读卡系统,很显然,不管从系统的成本,开发周期,系统成本等方面考虑,单片微控制器是最合适的选择了,现在的问题是选择哪个型号的单片机和其他电路的设计。2.1 器件的选择2.1.1 单片机的选择对于这样一个系统,单片机是最好的选择了。首要是选单片机,考虑到要与PC通信,所以串口是必须的。因为这个系统很简单,所以单片机的I/O针脚不要多,多了不但增加了单片机本身的成本,还增加了PCB的成本,占用了仪表内部本来就小的地方。还有,最好有WatchDog,这样,价格上比较有优势。从上面的要求看,似乎MICROCHIP的PIC是比较好的选择。但是,本人虽然自学过PIC,还没有实际做过工程,没有很大的把握,还有,身边没有PIC的编程器,最后觉得可能不是很适合,还是没选择这个单片机。图2-1 ATMEL AT89C2051考虑到实际情况,还是选择了MCS-51系列的单片机,像AT89C51的芯片显然是针脚太多太大。最后选择了ATMEL AT89C2051,这个单片机是MCS-51的简化版,除了I/O针脚比AT89C51少,FLASH也比AT89C51少,其他都一样。对于这个CPU,有一个可编程的串口,加上一块232或者485的通信芯片,就可以跟PC通信了。带2K FLASH ROM 方便程序的反复写入调试(身边也没有硬件防真机,程序的反复写入是必须的),还有2K的FLASH对这个系统估计也够用了,最后实际使用了1K左右。DIP-20的封装,还有15个I/O口,还算很小,价格也便宜,货源充足。身边正好有这个的编程器,本人也做个几个MCS-51的项目。所以,最后使用了AT89C2051(如右图)。对于WatchDog,这个系统不是必须的,即使需要,我们可以外接一个X25045,或者MAX813L解决这个问题。2.1.2 读卡头的选择看了EM4100的工作原理的框图,觉得自己去开发这样一个读卡头不是很经济合算,主要因为开发周期长,做一个成熟的产品也要一定的时间。现在已经做的成熟的产品的也不少,既便宜性能也很不错,就决定买现成的读卡模块做二次开发,其中有浙江台州梁永沛的读卡头,还有我国台湾省SMARTCHIP(.tw)公司SMC51489模块,都是很不错的选择,因为SMC51489模块在快递过程中不幸遗失,最后,选择了梁永沛的读卡模块。图2-2 读卡模块梁永沛的读卡模块,如图,一共有五个针脚,其中右边两个是接一个345H的线圈,左边三个,两个是接电源的,还有,一个是串行输出口,输出信号为原卡的曼彻斯特码,(用示波器接读卡头输出可以观测ID卡的输出波形),将读卡头的输出端与AT89C2051的P1.0相连,再经过适当的软件处理,我们就可以读到IC卡的卡号了。2.1.3 通信芯片的选择图2-3 MAX481针脚与PC通信,当然是RS-232最方便了,但是,虽然RS-232也能做到多机通讯,但是通信距离只有几十米,RS-232通信要三根通信线,比起RS-485,差分方式,只要两根通信线,传输距离可以达到上千米,显然RS-485优秀的多,当然选择RS-485。因为RS-485是半双工方式通信的,所以选择MAX481,MAX483、 MAX485、 MAX487、 MAX1487都是可以的。(比较相信MAXIM的器件,所以都是MAXIM的器件,在通信波特率不是很高、从机不多的情况下,这几个器件对使用者来说没有多大的区别,最后我们购买了MAX483,因为这个最便宜)。2.2 外围电路的设计2.2.1多机通信的连接(没有光隔)如图2-4,在AT89C2051的RXD,TXD分别接在MAX481的RO、DI端,还有AT89C2051的一个脚作为控制端(P3.3)与MAX481的/RE、DE端相连(控制脚、/RE、DE三者连在一起。),把所有通信输出线A、B分别连起来,接到RS-485/RS-232转换器上,与PC的串口连接就可以了。MAX483 图2-4 多机通信的连接每个从机不能主动发送数据,不然可能造成总线的数据冲突,采用主从方式的协议,整个总线的分配使用权由总线上的主机控制,从机只有在接收到主机要求发送数据的时候在占用总线,当发送完数据,马上归还总线资源,将DE保持低,让总线保持高阻状态,(要是DE保持高的话,即使TXD上即使没有数据发送,总线上的其他机器也会认为总线上有一连串的0,造成错误。)在总线末端接一个匹配电阻(一般电阻的大小在100200,由总线的分布电容决定),吸收总线上的反射信号,保证正常传输信号干净、无毛刺。匹配电阻的取值应该与总线的分布电容点匹配,太大太小都对通信有不良的影响。 说明一点,当单片机上电复位时,P口的电平是高电平,就是说,控制端处于高电平,MAX483就处于发送状态,虽然单片机的TXD上没有发送数据,但是,总线上还有会有“假数据”,合理的硬件连接应该在单片机的控制脚接一个非门,再与MAX483的使能端连接。实际发现,这个非门没有多大的意义,只要适当的设计主机的软件,完全可以忽略这个数据的,省略这个反向器,简化PCB,节约了成本。本系统就是没有加这个反向器,经实践检验,完全可以使用。另外,在主从机软件上也应附加若干处理措施,如:上电时或正式通信之前,对串行口做几次空操作,清除端口的非法数据和命令。程序举例:CONTL BIT P3.3 Send: SETB CONTL; CONTL为控制线,转入发送状态,占用总线。MOV SBUF,A;将ACC的数据发送出去。JNB TI,$;没有发送完毕,一直等待。直到完成发送。CLR TI ;发送结束,软件清零CLR CONTL;继续转入接收状态,腾出总线给其他设备。RET(在调用函数前,先把要发送的数据放入ACC) 2.2.2 光隔电路U2A图2-5 光隔电路如图,当TXD为高电平时,TIL117的1和2脚之间不导通,4和5脚之间也不导通,4脚低电平,经过74HC14史密特反向器以后,变成高电平,则DI为高电平,也TXD相同,同理,当TXD为低电平,TIL117的1和2脚之间导通,4和5脚之间就导通,4脚高电平,经过74HC14反向器以后,变成低电平,DI也为低电平,DI 的逻辑与TXD逻辑相同,符合设计要求。MAX483,U1(74HC14)用同一路电源,U2(74HC14)、AT89C2051用一路电源。2.2.3 硬件原理图插入图片2.3 应用系统的设计2.3.1 I/O口的分配AT89C2051一共有15个I/O口,其中P1.0 是读卡头相连接的,其他7个P口为波特率和地址的设定,P1.0读卡头输入P3.0RXDP1.1设定波特率P3.1TXDP1.2设定波特率P3.2清WatchDogP1.3设定地址P3.3通信控制端P1.4设定地址P3.4LED2P1.5设定地址P3.5LED1P1.6设定地址P3.6P1.7设定地址P3.7TTL输出,蜂鸣器2.3.2 地址和波特率的设定方式这个系统是用于现场的,根据现场施工人员的要求,要求这个系统的波特率和地址是可以现场变化的,所以,直接把地址和波特率写入FLASH是不符合要求的,如何解决这个问题?有两个方案:a)将单片机设定一个广播地址,默认波特率,比如(FFH、9600bps),出厂的时候,所有的机器都设定这个初始值,到现场时,用电脑通过PC的串口,对从机一个一个的设定波特率和地址,单片机再把这些设定的地址和波特率写入EEPROM,或者FLASHROM中,这样,这个地址就可以长久的留在单片机中了。这个方法的优点是:从机地址可以比较多(256个,但是硬件不允许接这么多机器,实际也不需要),波特率的设定可以是任意(不高于1000Kbps)标准波特率都可以实现,应该说这个方法是比较好的。我本人也比较支持这个方案。b)另外一个方法是,在单片机的I/O口上,接几个跳线,根据现场的需要,当单片机启动的时候读取这个值,地址和波特率就根据这个值设定,这个方法的优点是:软硬件简单、直观、方便,操作方便,也可以说是个不错的方法。最后,经过与多人的沟通,I/O口确实富余,所以还是选择了这个方案。硬件图如右图,当JP于J1连接的时候,相应的P口数据为1,与J2连接的时候,相应的P口数据为0,在这七根数据线,2根是设定波特率的,可以设定四个不同的波特率。5根是设定从机地址的,可以最多给32个从机设定地址,图2-7 硬件图P1.2 P1.10 0 2400bps 0 1 4800bps1 0 9600bps1 1 19200bps 若P1口 的数据为1001 110* 前面五位10011表示地址为13H;后面10表示9600bps 在单片机上电复位时,将P1口的数据读入,可能由于电压的波动,或者其他外部因素干扰,单片机没有正确的读入数据,导致通信问题。现决定,分两次读入数据,(中间等待一点时间)将两次的数据比较,要是数据不同,则重新读,直到两次结果相同。为了可靠,设定波特率和地址需要重新启动机器。 程序举例:波特率地址的读入10 上海师范大学00电子信息工程 金海荣G_A_BPS:MOV P1,#0FFHMOV A,P1ANL A,#0FEHMOV TP,ALCALL DELY300MSMOV P1,#0FFHMOV A,P1ANL A,#0FEHSUBB A,TPJNZ G_A_BPS ;不同,重新读MOV A,TPMOV A_BPS,ARET非接触式只读IC卡读卡系统设计波特率的设定21LCALL G_A_BPSRR ARR ARR AANL A,#01FHMOV ADDR,AMOV A,A_BPSRR AANL A,#03HCJNE A,#00H,BPS1MOV TH1,#0F4HMOV PCON,#00HLJMP BPS4BPS1:CJNE A,#01H,BPS2MOV TH1,#0FAHMOV PCON,#00HLJMP BPS4BPS2:CJNE A,#02H,BPS3MOV TH1,#0FDHMOV PCON,#00HLJMP BPS4BPS3:CJNE A,#03H,BPS4MOV TH1,#0FDHMOV PCON,#80HBPS4:2.3.3 状态显示方式LED1,LED2用于表示读卡器现在的工作状态,,开机(单片机复位)先LED1亮一秒左右,熄灭;然后LED2亮一秒左右,熄灭;LED2闪烁一下,最后LED2一直保持亮的状态,表示读卡系统准备就绪了。,卡号读入LED2熄灭,LED1亮,下面分两个情况l 主机读到从机的卡号,并且发送了“10”内部命令,则LED1闪烁几下,熄灭。表示主机已经正确的读到卡号了 .LED2亮,从机等待下次读卡。l 从机在几秒内没有收到主机发送的“10”内部命令,则LED1灭,LED2亮,从机同时清楚内部的卡号。从机等待下次读卡。l 在LED2灯亮和闪烁的时候,拒绝接收任何卡号。n LED1:准备就绪指示灯n LED2:忙指示灯2.3.4 通信协议,主机扫描命令的组成主机扫描命令由一个字节组成,一共8位,其中,D7为校验码(1+7方式的偶校验);D6D5为内部命令;D4D3D2D1D0为从机地址。串口第9位数据为“1”(底层硬件规范,PC编程的时候可以设定串口为Mark方式通信。不用人工干预第9位数据。),内部命令的规定l 01 :读卡号,若单片机没有最近读到卡号,以两个“00H”代替卡号位数据。l 10 :清除单片机内读到的卡号,并让LED闪烁数秒,表示主机已经准确地收到了卡号。并且返回02H,原命令,00H,00H,帧校验(就是原命令),03Hl 11:保留l 00:保留,举例:a,发送01内部命令给13H号从机。0 1+ 1 0 0 1 1-0 1 1 0 0 1 1 (7bit)有四个“1”,所以,最高位是0,主机扫描命令为00110011(33H)b,发送内部11命令给08号从机 1 1 + 0 1 0 0 0- 1 1 0 1 0 0 0 (7bit)有三个“1”,协议规定为偶检验,所以最高位是“1”,成为一个偶校验的数据,主机扫描命令为 11101000(E8H),,从机返回数据结构从机收到主机的准确命令后,从机返回6个字节,格式如下:02H ,原命令,卡号1,卡号0,帧校验,03H。其中: 02H、03H:分别为头和尾标志,方便主机写程序。 原命令:主机的命令返回,为了更加可靠的通信。 卡号1,卡号0:比如,卡号为 “021500B80A”,则卡号1为:“B8”,卡号0为:“0A” 帧校验:如主机发了 33H 命令,校验为 33+B8+0A=116,取16。(假设卡号为B80A)完整的返回数据如下: 02 33 B8 0A 16 03。*每个字节的第九位数据都是0(bit),那么,不会让其他的从机产生串口中断。2.3.5 P3.7的作用P3.7口的使用,在读卡器正确读完卡号以后,P3.7会以1000bps串行输出卡号,为了以后在这个系统上再扩展新的器件,作为其他的用途。现在,可以将P3.7接一个三极管的b极,让三极管工作在饱和和截止区域,控制蜂鸣器。当正确读完卡号以后,P3.7的串行输出的高低电平会让蜂鸣器工作,表示正确读完卡号。中断处理从机产生中断,且返回数据的条件 从机收到数据的第9位是“1”的数据,才能产生中断。所以,从机返回给主机的数据都不会让其他从机产生错误的中断 从机收到的一个字节的非偶校验的数据,将丢弃数据,不做任何处理 若从机收到的数据不是本机的地址,将丢弃数据,不做任何处理2.4 程序的设计2.4.1 程序框图开机演示,LED闪烁预定义开始单片初始化读取P1口数据设定波特率试发送数据读卡号设定本机地址行校验正确?判断卡号头?列校验正确?设定波特率延时5秒等待串口中断?清除卡号发到本机地址?00或11命令01命令?空操作返回6字节数据10命令?清空卡号返回6位数据LED1闪烁3秒压缩卡号数据P3.7TTL输出LED1亮,LED2暗偶校验? LED2亮,LED1暗2.4.2程序清单Version ;AT89C2051 11.0592MHzTLL EQU 2DH; TLH EQU 50HTHL EQU 62HTHH EQU 091HTDL EQU 98HTDL1 EQU 2DHBLK1 EQU 70H;addOK BIT 79H;找到头标志OUT BIT P1.0 ;信号输入READED BIT 7EH;未使用CLEARED BIT 7FHFLAG BIT 7AHDAT1 BIT P3.4;指示灯DAT2 BIT P3.5TTL EQU P3.7;tt;输出RE EQU P3.3;485通讯使能端READED BIT 04HADDR EQU 66HD0 EQU 6FH;放sbuf接受数据.D1 EQU 6EH;未使用以后可以使用D2 EQU 6DHD3 EQU 6CHD4 EQU 6BHD5 EQU 6AHA_BPS EQU 67H;波特率TP EQU 68H;临时变量C2S equ 69h ;1+2+5校验IDN0 EQU 7bH ;10位卡号IDN1 EQU 7cHIDN2 EQU 7dHIDN3 EQU 7eHIDN4 EQU 7fHCHECK EQU 22H;帧校验字节ORG 0000HLJMP MAIN0ORG 023HLJMP SeRecMAIN0:CLR RECLR DAT2 ;KAI JI;SETB DAT1clr ttlLCALL DELY1SCPL DAT2CPL DAT1LCALL DELY1SSETB DAT1SETB DAT2LCALL DELY1SCLR DAT1SETB DAT2LCALL DELY1SSETB TTLlcall ttl_send;初始化MOV TMOD,#22HMOV SCON,#0e0HMOV TH1,#0FAH ;MOV PCON,#80HSETB TR1SETB RENMOV IE,#90HCLR RE;设定波特率和地址LCALL G_A_BPSRR ARR ARR AANL A,#01FHMOV ADDR,AMOV A,A_BPSRR AANL A,#03HCJNE A,#00H,BPS1MOV TH1,#0F4HMOV PCON,#00HLJMP BPS4BPS1:CJNE A,#01H,BPS2MOV TH1,#0FAHMOV PCON,#00HLJMP BPS4BPS2:CJNE A,#02H,BPS3MOV TH1,#0FDHMOV PCON,#00HLJMP BPS4BPS3:CJNE A,#03H,BPS4MOV TH1,#0FDHMOV PCON,#80HBPS4:;处理bpsLCALL DELY1SCPL DAT1LCALL DELY1SCPL DAT1LCALL DELY1SCPL DAT1LCALL DELY1SCPL DAT1;用新的波特率发送数据,CLR REMOV A,ADDRMOV C2S,AMOV 70H,#00H;卡好临时寄存器MOV 71H,#00HMOV 72H,#00HMOV 73H,#00HMOV 74H,#00HMOV 75H,#00HMOV 76H,#00HMOV 77H,#00HMOV 78H,#00HMOV 79H,#00HMOV 7AH,#00HRDDD: SETB OUTRDD: LCALL EDGEMu;判断头JB OK,RDOKRDD0:CLR OKLJMP RDDRDOK: NOPCLR ES ;读卡号RDD1: MOV R0,#BLK1RDDL0:MOV R6,#0BH;RBL:CLR AMOV R0,ARDDL1:MOV R5,#05HRDDL2:JB OUT, RDDL5MOV A,#00HRDDL3:CJNE A,#TDL1,RDDL4LJMP RDD0RDDL4:JB OUT ,RDDLKINC ANOPSJMP RDDL3RDDL5:MOV A,#00HRDDL51:CJNE A,#TDL1,RDDL6LJMP RDD0RDDL6:JNB OUT, RDDLKINC ANOPSJMP RDDL51RDDLK: MOV C,OUTCPL CMOV A,R0RLC AMOV R0,AMOVR1,#TDL; ;延时TNEXTNOPDJNZ R1,$DJNZ R5,RDDL2INC R0DJNZ R6,RBL;10 行奇校验DC: MOV R6,#0AHD2C:MOV R0,#70HD2C1:MOV A,R0RRC AANL A,#0FHMOV 20H,CANL C,/PSW.0MOV 21H,CMOV C,20HCPL CANL C,PSW.0ORL C,21HJC D2C2MOV R0,AINC R0DJNZ R6,D2C1AJMP D2D0;行奇校验正确转列奇校验D2C2: AJMP RDD;行奇校验出错反回;4列奇校验D2D0: MOV R7,#04H ;MOV A,7AHRR AMOV 7AH,AANL 7AH,#0FHD2D:MOV R6,#0AHCLR CMOV R0,#70HD2D2: MOV A,R0RL AJNB ACC.4,D2D1CPL CD2D1:MOV R0,AINC R0DJNZ R6,D2D2MOV A,7AHRL AMOV 7AH,AJB ACC.4,D2D3JC D2D4D2D5:DJNZ R7,D2DAJMP XXXXD2D3: JC D2D5D2D4: AJMP RDD3XXXX: MOV B,#0FHAJMP XX1RDD3:AJMP RDDDXX1:SETB DAT1CLR DAT2SETB ESRDRET: clr esYSSJ:MOV A,71HSWAP AADD A,70HMOV IDN0,AYSSJ0:MOV A,73HSWAP AADD A,72HMOV IDN1,AYSSJ1:MOV A,75HSWAP AADD A,74HMOV IDN2,AYSSJ2:MOV A,77HSWAP AADD A,76HMOV IDN3,AYSSJ3:MOV A,79HSWAP AADD A,78HMOV IDN4,AYSSJ4:MOV A,ADDRMOV C2S,A ;取地址;1+7JIAOYAN FAsetb esclr esMOV A,#55HLCALL TTL_SENDMOV A,#0AAHLCALL TTL_SENDLCALL TTL_OUTMOV A,#55HLCALL TTL_SENDMOV A,#0AAHLCALL TTL_SENDLCALL TTL_OUTNOPsetb esMOV R3,#40MAIN1:LCALL DELY300MSDJNZ R3,MAIN1clr dat1setb dat2MOV idn0,#00hMOV idn1,#00hMOV idn2,#00hMOV idn3,#00hMOV idn4,#00hlJMP RDDD;-取头函数-EDGEMu : MOV R7,#0ffhEDGE0: MOV R1,#08HNOPDJNZ R7,EDGE3EDGER:CLR OKRETEDGE3:MOV A,#00HEDGER0: INC AJZ EDGERJNB OUT,EDGER0MOV DPTR,#0000HEDGE4: INC DPTRJB OUT, EDGE4MOV A, DPLCLR CSUBB A,#TLHJNC EDGE0MOV A, DPHJNZ EDGERMOV A,DPLCLR CSUBB A,#TLLJC EDGERMOV A, DPLCLR CSUBB A,#TLHJNC EDGE0DJNZ R1,EDGE3MOV R1,#TDLDJNZ R1,$SETB OKRETJY17: ;1+7校验生成器MOV C,PSW.0JNC JY171SETB ACC.7JY171:RET SeRec: ;串口中断PUSH ACCJNB RI,$CLR RIMOV R0,#D0MOV A,SBUFMOV R0,SBUFMOV A,R0;JIANYAN PANDUANMOV C,PSW.0JNC JY_OKLJMP JY_ERRJY_OK:MOV A,D0ANL A,#1FH ;取地址CJNE A,ADDR,SeRec2SeRec1:MOV A,D0ANL A,#60HRR ARR A;swap a rr a 更好RR ARR ARR AANL A,#03H;取命令FUNCT0:;命令处理CJNE A,#00H,FUNCT1LCALL FUN_1LJMP SeRec2FUNCT1:CJNE A,#01H,FUNCT2LCALL fun_2LJMP SeRec2FUNCT2:CJNE A,#02H,FUNCT3LCALL FUN_3CLR DAT1SETB DAT2LCALL CLEAMOV R3,#01HLJMP SeRec2FUNCT3:CJNE A,#02H,FUNCT4LCALL fun_4LJMP SeRec2;下面的语句不是很合适,当协议定以后就改一下FUNCT4:NOPNOPLJMP SeRec2SeRec2: ;离开串口中断POP ACCCLR RERETI;-发送串口数据函数,一位-Send:SETB REMOV SBUF,AJNB TI,$;CLR TI ;CLR RERET;-校验错误,跳出中断-JY_ERR:NOPNOPNOPljmp SeRec2;四个命令FUN_1:NOPNOPRETFUN_2:PUSH ACC MOV A,#02HLCALL SendPOP ACCANL C2S,#1FHMOV A,C2SADD A,#20HMOV C2S,A;LCALL JY17MOV C2S,ALCALL SendMOV R1,#2 ;WU WEI SHU JUMOV R0,#IDN3FUNCT11:MOV A,R0LCALL SendINC R0DJNZ R1,FUNCT11;JIAOYANMOV A,IDN3ADD A,C2SADD A,IDN4CLR CLCALL SendMOV A,#03HLCALL SendRET;-FUN_3: ;10 MINGLINGPUSH ACC MOV A,#02HLCALL SendPOP ACCANL C2S,#1FHMOV A,C2SADD A,#40HMOV C2S,A;LCALL JY17MOV C2S,ALCALL SendMOV IDN0,#00HMOV IDN1,#00HMOV IDN2,#00HMOV IDN3,#00HMOV IDN4,#00HMOV R1,#2 ;两位数据 WEI SHU JUMOV R0,#IDN3FUNCT31:MOV A,R0LCALL SendINC R0DJNZ R1,FUNCT31 ;JIAOYANMOV A,IDN3ADD A,C2SADD A,IDN4CLR CLCALL SendMOV A,#03HLCALL SendNOPNOPRETFUN_4:NOPNOP;可以加入新的命令NOPRET;取得波特率和读卡机的地址G_A_BPS:NOPNOPMOV A,P1ANL A,#0FEHMOV TP,AMOV R7,#00HDJNZ R7,$MOV A,P1ANL A,#0FEHSUBB A,TPJNZ G_A_BPSMOV A,TPMOV A_BPS,ARET;总的输出函数TTL_OUT:MOV A,#02HLCALL TTL_SENDMOV A,IDN3LCALL TTL_SENDMOV A,IDN4LCALL TTL_SENDMOV A,02HMOV TP,AMOV A,IDN3ADD A,TPADD A,IDN4CLR CLCALL TTL_SENDMOV A,#03HLCALL TTL_SENDRET;ttl 输出,可以认为是喇叭,也可以继续扩展使用TTL_SEND:;一个byte的输出MOV R6,#08HCLR CCLR TTLLCALL DELY1MSTS3:RRC AJC TS1CLR TTLSJMP TS2TS1:SETB TTLTS2:LCALL DELY1MSDJNZ R6,TS3SETB TTLLCALL DELY1MSRETDELY1MS:MOV R7,00HDJNZ R7,$MOV R7,#238DJNZ R7,$RET;延迟一秒DELY1S:MOV R6,#00HDELY1S1:LCALL DELY1MSLCALL DELY1MSLCALL DELY1MSLCALL DELY1MSDJNZ R6,DELY1S1RET;延迟300msDELY300MS:MOV R4,#00HDELY300MS1:LCALL DELY1MSDJNZ R6,DELY300MS1RET;清空程序CLEA:MOV R5,#40CLEA2: LCALL DELY300MSCPL DAT2DJNZ R5,CLEA2CLEA1:MOV IDN0,#00HMOV IDN1,#00HMOV IDN2,#00HMOV IDN3,#00HMOV IDN4,#00HCLR DAT1SETB DAT2NOPNOPRETEND小结 两点创新1,调试过程没有硬件防真机,软件调试效果不是很好,怎么样做才最方便,快捷,符合现实情况调试呢?第一个想到的是用7段数码管,将想要知道的过程数据显示出来,但是想要知
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 私人房产买卖协议(含贷款利率及还款期限)
- 秦娜与丈夫离婚协议中的房产过户及子女抚养协议
- 财产线索合同4篇
- 人工智能与自动化对就业市场的影响-洞察及研究
- 化学竞赛初试题目及答案
- 2025年河南艺术考试题目及答案
- 中小学竞赛试题及答案
- 会议活动大数据挖掘与应用-洞察及研究
- 3D打印航空航天部件-洞察及研究
- 2025年购销合同试题及答案
- 2023年二级保密资格评分标准具体操作方法
- 商户收单业务培训
- 无机及分析化学课件(第四版)第一章学习资料
- 26个英文字母书写动态演示课件
- 电路学课件:1-6 电压源和电流源
- 奥的斯GeN2-故障查找手册-1-CN
- 区妇联家庭教育工作的调研报告
- 劳保用品发放表格及管理
- 江苏省盐城市各县区乡镇行政村村庄村名居民村民委员会明细
- Q∕SY 01004-2016 气田水回注技术规范
- TSG Z8002-2022 特种设备检验人员考核规则
评论
0/150
提交评论