⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tic4.asm

📁 适用51单片机的2401存储器的读写操作
💻 ASM
📖 第 1 页 / 共 4 页
字号:
;=========port  ic card======
ICSDA          BIT      p1.1
ICSCL          BIT      p1.4
ICRST          BIT      p1.5
ICPWR          BIT      p1.6
ICINT          BIT      P1.7
ICPGM          BIT      P1.2
;=========port       24c01===
SCL24          BIT      P3.4
SDA24          BIT      P3.5

;=======ic  card=============
CBUF             EQU      08H                 ;(TEMP)commond  buffer  08h-0Ch bytes
MBUF             EQU      0DH                 ;(TEMP)   0Dh-11H  存放卡效验结果和密码4字节
CHECKIC          EQU      12H                 ;读IC卡数据用(临时变量)
;========24C01===============
DATAR            EQU      21H			;24C01  读子程序使用
DATAW            EQU      22H			;24C01  写子程序使用
CHECKSUM         EQU	  13H                   ;24C01    效验和
TEMP0            EQU      14H		        ;24C01   存放地址(临时变量)
TEMP2            EQU      15H                   ;24C01   存放数据(临时变量)
;----------------------------
DCOUNT	        EQU	  18H	               ;判断上位PC发送的数据是否超时,设置为0.5秒超时
OVTIM           EQU       19H                  ;同一段数据传送次数记录
TEMP10          EQU       1AH	               ;软件定时器,累计到一秒
TEMP11          EQU       1BH	               ;软件定时器,累计到一秒,用于拔卡
STIME           EQU       1CH	               ;软件定时器,累计到一分
STIME1          EQU       1DH	               ;软件定时器,记录分钟数(与小精灵相比较)
TEMPS1          EQU       1EH                  ;解密加密时使用(临时变量)
;============================
DATALONGT       EQU       30H                  ;临时放置总数据长度
DATACHE         EQU       31H                  ;传送总数据效验和
DATALONG        EQU       32H                  ;总数据长度
DATAF           EQU       33H                  ;数据标志(37h---66H)
S1              EQU       34H
S2              EQU       35H
DATAL           EQU       36H                  ;有效数据长度
R               EQU       37H
DATACON         EQU       38H                  ;数据内容 (37h---66H)
DATACON1        EQU       39H
DATACON2        EQU       3aH
DATACON3        EQU       3bH
;============================
FLAG1           EQU     23H    ;flag1.0--是否有卡插入                    (1)
                               ;flag1.1--小精灵有通讯                    (1)
                               ;flag1.2--自由上机状态                    (1?)
                               ;flag1.3--错卡或坏卡                      (1)
                               ;flag1.4--发送卡拔出消息
                               ;flag1.5--小精灵有通讯用于程序进入工作    (1)
                               ;flag1.6--读写2401,ic失败                (1)
                               ;flag1.7--是否开始发送数据                (1)

RFLAG           EQU     24h    ;RFLAG.0--接收数据开始
			       ;RFLAG.1--需要向PC发数据
                               ;RFLAG.2--5次超时到
                               ;RFLAG.3--第一次超时
                               ;RFLAG.4--发送数据有反馈
                               ;RFLAG.5--已接收上位机发送下来的完整数据(1)
                               ;RFLAG.6--IC卡已经处理过(效验密码)
                               ;rflag.7--接收数据结束不包含效验
TEMP1          EQU       20H   ;TEMP1.0--
                               ;TEMP1.1--新卡(1)

;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;程序复位执行
              ORG    0000H
              LJMP    START
;定时器处理程序
              ORG     000BH
              LJMP    EINT

;串口处理程序
              ORG     0023H
              LJMP    SERVICE
;======================================
;主程序
;======================================
              ORG       0030H
START:
              MOV       SP,#66H               ;设置堆栈指针
           ;   LCALL     NORMALLIGHT
;SEED DOG
              LCALL      SEDOG

;光藕保持正常状态
             LCALL      RESTORE
; 选择寄存器组
             LCALL      CHOSERES
;关IC卡电源
             LCALL      CLOSE_IC         	;关IC卡电源
             LCALL      INITIC                  ;IC卡端口初始化

;初始化变量
             LCALL     INICLR                   ;清理寄存器
             LCALL     INITCOMM                 ;初始化串行口
             LCALL     INIT0                    ;初始化定时器

             MOV      DATACON,#20H
             MOV      DATACON1,#06H
             MOV      R0,#06H
             MOV      R1,#DATACON2
TEIC24:      MOV      @R1,#38H
             INC      R1
             DJNZ     R0,TEIC24
            LCALL      WRITESAVE           ;向2401中写数据
            MOV        DATACON2,#44H
            MOV      DATACON,#23H
            MOV      DATACON1,#05H
            LCALL      GETPARA             ;读2401中数据
            JNB        FLAG1.6,TEIC241
            CLR        FLAG1.6
            SJMP       TEIC242
TEIC241:    NOP
TEIC242:    SJMP          $
;=======主循环程序========
MAIN_LOOP:
             LCALL      SEDOG
             JNB        RFLAG.0,MAIN_2          ;开始接收数据否
             CLR        ET0
             CLR        TR0
             MOV        R7,#0FFH                 ;如果超过200ms没收到则清除标志
             MOV        R6,#0FFH
MAIN_1:      JB         RFLAG.5,MAIN_11          ;数据接收完否
             DJNZ       R6,MAIN_1
             NOP
             MOV        R6,#0FFH
             DJNZ       R7,MAIN_1
             SETB       ET0
             setb       tr0
             CLR        RFLAG.0
             CLR        RFLAG.7
             LCALL      SEDOG
             SJMP       MAIN_2

;处理上位命令时关串口中断
MAIN_11:
             CLR        ET0
             CLR        TR0
             CLR        ES                         ;上位有数据发送下来
             LCALL      SEDOG
             CLR        RFLAG.5                    ;清除有数据标志
             LCALL      DEALPC                     ;处理从上位发送下来的命令
             SETB       ET0
             SETB       TR0
             SETB       ES

MAIN_2:      JNB        RFLAG.1,MAIN_2_0       ;有没有需要向上位发送的数据
             JB         RFLAG.0,MAIN_OUT       ;是否正在接收上位发下来的数据
             JB         FLAG1.7,SENDTE         ;重复向上位发送数据
             SETB       FLAG1.7
             MOV        OVTIM,#00H
             LCALL      SENDTOPC
             aJMP       MAIN_2_0

SENDTE:      JB         RFLAG.4,CLRSENT
             CLR        C
             MOV        A,DCOUNT
             SUBB       A,#32h                  ;500MS到否
             JC         MAIN_2_0                ;判断向上位发送的数据是否超时
             LCALL      OVERTIME                ;传送超时
             JB         RFLAG.2, CLRSENT        ;5次传送超时
             LCALL      SENDTOPC
             AJMP       MAIN_2_0
CLRSENT:     CLR         RFLAG.2
             CLR         FLAG1.7
             CLR         RFLAG.1
             CLR         RFLAG.4
MAIN_2_0:  ;  JNB         FLAG1.5,MAIN_OUT      ;客户端是否开始工作
             LCALL       ICTEST
             JB          FLAG1.0,MAIN_IN      ;   有卡插入否
          ;   LCALL       NORMALLIGHT            ;无卡的灯
             AJMP        MAIN_OUT
MAIN_IN:
             JB          RFLAG.6, MAIN_OUT         ;IC处理过吗
             JB          RFLAG.0,MAIN_OUT          ;是否正在接收上位发下来的数据
             LCALL       READICT                 ;处理新插入的卡
MAIN_OUT:    LJMP        MAIN_LOOP
;======初始化读卡类型=====
READICT:
             CLR           ET0
             CLR           TR0
             CLR           ES
             SETB          RFLAG.6     ;卡处理过标志
             CLR           FLAG1.3     ;不是错卡
             CLR           TEMP1.1     ;不是新卡

READICT_1:
             LCALL           DELAY_PC
             MOV             R5,#1BH                       ;(IN IC)
             MOV             R7,#1                         ;
             MOV             R6,#CHECKIC                 ;(IN RAM)
             LCALL           READ_CARD
             MOV             A,CHECKIC
             CJNE            A,#0BBH,READICT_2	        ;判断是否在服务器上处理过或本系统的卡
             LCALL 	     CARDCHECK	         ;校验卡密码
             JB              FLAG1.3,ICINTW
         ;   LCALL           GREENLIGHT                   ;正常插卡的灯
             LCALL           IN_IC
             AJMP            ICINT_OUT0
READICT_2:   CJNE            A,#0FFH,READICT_3
             LCALL 	     CARDCHECK1	         ;校验是否新卡密码
             JB              FLAG1.3,ICINTW
             LCALL           IN_NEWIC
             SETB            TEMP1.1
             AJMP            ICINT_OUT0
READICT_3:   JB              FLAG1.3,ICINTW               ;再次判断以防刚插入抖动误判
             setb            flag1.3
             AJMP            READICT_1
ICINTW:   ;  LCALL           REDLIGHT                          ;错卡红灯烁
             LCALL           WRONGICSEND
ICINT_OUT0:  SETB            RFLAG.1
             SETB            ET0
             SETB            TR0
             SETB            ES
             RET

;======向PC发送数据========
SENDTOPC:  CLR          ET0
           CLR          TR0
           CLR          ES
           LCALL        SEDOG
           MOV          R0,#DATALONG
           MOV          A,@R0
           LCALL        SENDBYTE
           MOV          R0,#DATAF
           MOV          R1,#00H
SENTOPC1:
           MOV          A,@R0
           LCALL        SENDBYTE
           LCALL        DELAY_20
           INC          R1
           INC          R0
           MOV          A,R1
           CJNE         A,DATALONG,SENTOPC1
           LCALL        DELAY_20
           MOV          R0, #DATACHE
           MOV          A,@R0
           LCALL        SENDBYTE
           MOV          DCOUNT,#00H
           SETB         ES
           SETB         ET0
           SETB         TR0
           RET

 ;===============向PC发送一个字节=========
SENDBYTE:
                CLR        TI
                MOV        SBUF,A
                JNB        TI,$
           	CLR        TI
        	RET


;===========串口中断处理程序==============
SERVICE:
                PUSH       PSW
                PUSH       ACC
                CLR        ET0
                CLR        TR0
                CLR        ES
                NOP
                NOP
                CLR        RI
                MOV        A,SBUF
SERVICES:       JB         RFLAG.0,SERVICE1     ;接收第一字节否
                SETB       RFLAG.0
                CLR        RFLAG.7
                MOV        DATALONG,A
                MOV        DATALONGT,#00H
                SJMP       SERVICEOUT
SERVICE1:
                JB         RFLAG.7,SERVICE2     ;接受数据完否
                MOV        R0,#DATAF
                PUSH       A
                MOV        A,R0
                ADD        A,DATALONGT
                MOV        R0,A
                POP        A
                MOV        @R0,A
                INC        DATALONGT
                MOV        A,DATALONGT
                CJNE       A,DATALONG,SERVICEOUT
                MOV        DATALONGT,#00H
                SETB       RFLAG.7
                SJMP       SERVICEOUT
SERVICE2:
                MOV        DATACHE,A
                CLR        RFLAG.7
                CLR        RFLAG.0
                SETB       RFLAG.5
SERVICEOUT:     SETB       ET0
                SETB       TR0
                setb       es
                pop        acc
                pop        psw
                reti
;===============PC机发送的命令处理程序=========
DEALPC:
                MOV        R0,#DATAF
                MOV        R1,DATALONG
                MOV        A,#00H
                CLR        C
DATACHECK:      ADD        A,@R0
                INC        R0
                DJNZ       R1,DATACHECK
                CJNE       A,DATACHE,DEALPCOUT1
                LCALL      PASSKEY           ;解密码
                MOV        A,DATAF
                CJNE       A,#0AAH,BEPCDEAL    ;是否是PC反馈信号
                SETB       RFLAG.4
                CLR        RFLAG.1
                CLR        FLAG1.7
                AJMP       DEALPCOUT1
BEPCDEAL:       CJNE       A,#51H,DEALPC1
                SETB       FLAG1.1
                SETB       FLAG1.5
                LCALL      RERIGHT
                AJMP       DEALPCOUT
DEALPC1:
                CJNE       A,#52H,DEALPC2
                NOP                             ;  待扩展
                AJMP       DEALPCOUT1
DEALPC2:
                CJNE       A,#53H,DEALPC3
                LCALL      GETPARA         ;读2401中数据
                LCALL      GETPARA_RE
                AJMP       DEALPCOUT
DEALPC3:
                CJNE       A,#54H,DEALPC4
                LCALL      WRITESAVE           ;向2401中写数据
                LCALL      GETPARA             ;读2401中数据
                JNB        FLAG1.6,DEALPC7
                CLR        FLAG1.6
                LCALL      WRREADIC                 ;无法正确读出数据
                AJMP       DEALPCOUT
DEALPC7:        LCALL      RIGHTSAVE
                AJMP       DEALPCOUT

DEALPC4:
                CJNE       A,#55H,DEALPC5
                LCALL      READICCARD           ;读IC卡中数据
                LCALL      GETPARA_RE

                AJMP       DEALPCOUT
DEALPC5:
                CJNE       A,#56H,DEALPC6
                LCALL      WRITEICCARD          ;向IC卡中写数据
                LCALL      READICCARD           ;读IC卡中数据
                JNB        FLAG1.6,DEALPC9
                CLR        FLAG1.6
                LCALL      WRREADIC                 ;无法正确读出数据
                AJMP       DEALPCOUT
DEALPC9:        LCALL      RIGHTSAVE
                AJMP       DEALPCOUT
DEALPC6:        CJNE       A,#59H,DEALPCOUT1
                LCALL      RERIGHT
                LCALL      SENDTOPC
                LCALL      CLOSESTORE      ;  关机
                LCALL      DELAY_PC
                AJMP       DEALPCOUT1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -