设为首页 | 成都一卡通
当前位置: 首页 > 一 卡 通 > 其他一卡通 >
其他一卡通
ID卡读卡器源程序
发布时间:2013-04-26 来源:未知
;程序说明:本程序为读写器程序。;下面将本程序所用变量及含义定义如下:;定义SBUF(N)为串行通讯的缓冲区。;定义CBUF(N)为读卡卡号的缓冲区。;;通讯缓冲区定义BEGIN_FLAG EQU 20HEND_FLAG EQU 21HNUM_ADD EQU 22HJISHU EQU 23HCARD_FLAG EQU 24HFIRST_HAND EQU 25H ;较好的次握手标志,为FF为有握手,为00表示无。SECOND_HAND EQU 26H ;第二次握手标志,为FF为有握手,为00表示无。COMMAND_FLAG EQU 27H ;命令标志,表示什么命令。S_DATA EQU P3.2RESET_K4 EQU P1.7RED_LED EQU P1.6GREEN_LED EQU P1.5BEEP EQU P1.4SBUF1 EQU 40HSBUF2 EQU 41HSBUF3 EQU 42HSBUF4 EQU 43HSBUF5 EQU 44HSBUF6 EQU 45HSBUF7 EQU 46HSBUF8 EQU 47HSBUF9 EQU 48HSBUF10 EQU 49HSBUF11 EQU 4AHSBUF12 EQU 4BHSBUF13 EQU 4CHSBUF14 EQU 4DHSBUF15 EQU 4EHSBUF16 EQU 4FH;读卡缓冲区定义CBUF1 EQU 50HCBUF2 EQU 51HCBUF3 EQU 52HCBUF4 EQU 53HCBUF5 EQU 54HCBUF6 EQU 55HCBUF7 EQU 56HCBUF8 EQU 57HCBUF9 EQU 58HCBUF10 EQU 59HCBUF11 EQU 5AHCBUF12 EQU 5BHCBUF13 EQU 5CHCBUF14 EQU 5DHCBUF15 EQU 5EHCBUF16 EQU 5FH;----------------ORG 0000HLJMP STARTORG 0003H ;INT0入口地址LJMP INT_0ORG 000BH ;T0入口地址LJMP TIME0ORG 0013H ;INT1入口地址LJMP STARTORG 001BH ;T1入口地址LJMP STARTORG 0023H ;串行中断S入口地址LJMP SERIALSTART:CLR BEEPlcall dh150msSETB RED_LEDmov p1,#0ffhMOV SP,#05FH ;设置堆栈为高64字节CLR EA ;关闭所有中断MOV PCON,#00H ;电源控制寄存器设初值MOV TCON, #00H ;定时寄存器设初值MOV TMOD,#21H ;定时方式寄存器设初值MOV TH1,#0FDH ;设置波特率:9600bpsMOV TL1,#0FDHMOV TH0,#0FFHMOV TL0,#0FFHMOV SCON,#0F0H ;设置串行中断工作在方式2状态。当SM2=1时,只接收地址信息,MOV NUM_ADD,#31HMOV IE,#0F3HSETB ESSETB EASETB ET0SETB ET1SETB TR0MOV IP, #03HSETB SM2SETB BEEPCLR GREEN_LEDMOV JISHU,#50H ;为缓冲区设置初始值。MOV CARD_FLAG,#00H ;无卡标志置0。LCALL DH150MSCLR EX0MOV IE,#00HSETB TR1SETB ET0; CLR ET0SETB ESSETB EAMAIN:LCALL DH70MS; LCALL READ_CARD; LCALL DH70MS; LCALL TIME0LJMP MAIN ; JB S_DATA,MAIN ;有卡,S_DATA变低。; AJMP MAIN; LCALL GET_CHAR ;读一字节卡数据。READ_CARD:LCALL RESET ;对MTP-K4进行复位。LCALL CLEAR ;首先对读卡空间和卡标志初始化.SETB EX0LCALL DH70MS ;等待70MS从INT0接收数据CLR EX0MOV A,50HCJNE A,#02,NO_BEGIN ;如果接收到02,表示有开始位MOV A,5CHCJNE A,#03,NO_END ;如果接收到03,表示有结束位MOV CARD_FLAG,#0FFH ;标志有卡。MOV JISHU,#50HLJMP READ_END NO_BEGIN:MOV CARD_FLAG,#00HMOV JISHU,#50H; LCALL CLEAR ;首先对读卡空间和卡标志初始化.LJMP READ_ENDNO_END:MOV CARD_FLAG,#00HMOV JISHU,#50H; LCALL CLEAR ;首先对读卡空间和卡标志初始化.LJMP READ_END READ_END:RET;--------------------------CLEAR:MOV R1,#5CHCLR_1: MOV A,#0FFHMOV @R1,ADEC R1MOV A,R1CJNE A,#49H,CLR_1RET;======================================;得到字节子程序GET_CARD_CHAR:PUSH 01H;R1入栈PUSH 02H;R2入栈; JB S_DATA,$LCALL DH10USLCALL DH10USMOV R2,#08LOOP: LCALL DH104USMOV C,S_DATARRC ADJNZ R2,LOOP; LCALL DH104USPOP 02HPOP 01HRET;=====================================;中断读卡程序INT_0:PUSH ACCLCALL GET_CARD_CHAR ;读一字节卡数据在A中。MOV R0,JISHUMOV @R0,AINC R0MOV JISHU,R0POP ACC; CLR BEEP ;蜂鸣器发声; SETB GREEN_LED ;绿色LED发光。; LCALL DH150MS; CLR GREEN_LED; SETB BEEP; CLR RESET_K4 ;对MTP-K4进行复位操作。; SETB RESET_K4RETI;======================================;串口得到字符程序,所得字符在A中,并清除串行中断。COM_GET_CHAR:MOV A,SBUFCLR RIRET;------------------------;串口发送字符程序,所发字符在A中,并等待发送完成。COM_SEND_CHAR:MOV SBUF,AJNB TI,$CLR TIRET;-------------------------COM_CARD: RETSOUND_1:CLR BEEPLCALL DH70MSSETB BEEPLCALL DH70MSRET;======================================;串行中断子程序SERIAL:; SETB GREEN_LEDCLR RIPUSH ACCMOV A,SBUFCJNE A,#00,COMMAND_01;指令为与读写器连接MOV A,#00HLCALL COM_SEND_CHARPOP ACCRETICOMMAND_01:CJNE A,#01,COMMAND_02;指令为读模块版本号。MOV A,#56HLCALL COM_SEND_CHARMOV A,#31HLCALL COM_SEND_CHARMOV A,#2EHLCALL COM_SEND_CHARMOV A,#30HLCALL COM_SEND_CHARMOV A,#32HLCALL COM_SEND_CHARPOP ACCCLR GREEN_LEDRETICOMMAND_02:CJNE A,#02H,COMMAND_03LCALL READ_CARDMOV A,CARD_FLAGCJNE A,#0FFH,COMMAND_02_ERRMOV A,51HLCALL COM_SEND_CHARMOV A,52HLCALL COM_SEND_CHARMOV A,53HLCALL COM_SEND_CHARMOV A,54HLCALL COM_SEND_CHARMOV A,55HLCALL COM_SEND_CHARMOV A,56HLCALL COM_SEND_CHARMOV A,57HLCALL COM_SEND_CHARMOV A,58HLCALL COM_SEND_CHARMOV A,59HLCALL COM_SEND_CHARMOV A,5AHLCALL COM_SEND_CHARMOV A,5BHLCALL COM_SEND_CHARPOP ACCRETI COMMAND_02_ERR:MOV A,#02HLCALL COM_SEND_CHARPOP ACCRETICOMMAND_03: CJNE A,#03H,COMMAND_11POP ACCRETICOMMAND_11:CJNE A,#011H,COMMAND_12MOV A,#011HLCALL COM_SEND_CHARLCALL SOUND_1POP ACCRETICOMMAND_12:CJNE A,#012H,COMMAND_13MOV A,#012HLCALL COM_SEND_CHARLCALL SOUND_1LCALL SOUND_1POP ACCRETICOMMAND_13:CJNE A,#013H,COMMAND_21MOV A,#013HLCALL COM_SEND_CHARLCALL SOUND_1LCALL SOUND_1LCALL SOUND_1POP ACCRETICOMMAND_21:CJNE A,#0B1H,COMMAND_22MOV A,#0B1HLCALL COM_SEND_CHARSETB GREEN_LEDLCALL DH70MSCLR GREEN_LEDPOP ACCRETICOMMAND_22:POP ACCRETI;SERIAL:; PUSH ACC; LCALL COM_GET_CHAR; CJNE A,#23H,NO_FIRST_HAND;如果等于23H为较好的次握手信号,否则不是。; MOV A,#45H; LCALL COM_SEND_CHAR; MOV FIRST_HAND,#0FFH;较好的次握手标志,成功。; MOV COMMAND_FLAG,#00H;清除命令标志。; LJMP SER_END;NO_FIRST_HAND:; CJNE A,#0AAH,NO_READ_ID;AA为取ID卡号命令。; MOV COMMAND_FLAG,#0AAH; MOV A,#67H; LCALL COM_SEND_CHAR; LJMP SER_END;NO_READ_ID:; CJNE A,#89H,NO_SECOND_HAND; MOV A,COMMAND_FLAG; CJNE A,#0AAH,NEXT_COMMAND;如果为AA指令,发送卡号。并清除指令。; LCALL COM_SEND_ID; ;NEXT_COMMAND:; MOV COMMAND_FLAG,#00H ;命令出错,清除所有标志。; MOV FIRST_HAND,#00H; MOV SECOND_HAND,#00H; LJMP SER_END ;SER_END: ; POP ACC; RETI;=======================================RESET:CLR RESET_K4; NOPSETB RESET_K4RET;======================================= DH104US:MOV R1,#47DJNZ R1,$RETDH10US:MOV R1,#04DJNZ R1,$RET;------------------DH70MS:MOV R1,#09FHD10: MOV R2,#0FFHDJNZ R2,$DJNZ R1,D10RET;------------------DH150MS:MOV R1,#0FFHDH2: MOV R2,#0FFHDJNZ R2,$DJNZ R1,DH2RET;-----------------------;未用TIME0:CPL RED_LED; PUSH ACC; MOV A,CARD_FLAG; CJNE A,#00H,LED_L; CLR GREEN_LED; setb beep; POP ACC; RETI;LED_L: SETB GREEN_LED; clr beep; POP ACCRETIEND