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

📄 2.asm

📁 RC500制作读卡器的全套电路及PCB板图
💻 ASM
字号:
  ;   如读数据成功P1.3会由高电平变成低电平几秒,LED发光管亮,;后再变高电平 ,然后又开始读数据
   ;   读到的数据通过串口送到电脑显示,波特率是9600
 ;;;;MCU:89S51    COLCK:11.0592MHZ
   DATA0   BIT  p3.2;  WG26的D0接外部中断0
   DATA1   BIT  P3.3;  WG26的D1接外部中断1
   WG26OK    BIT  30H; WG26OK=1表示读完26位数据
   WG26ST    BIT  31H; WG26ST=1表示开始读WG26位数据


            ORG     0000H
            AJMP    MAA
            ORG     0003H;      ;INT0中断程序
            AJMP    INT00      ;
            ORG     0013H;      ;INT1中断程序
            AJMP    INT01      ;

     MAA:   CLR     P1.3      ;
            ACALL   DL
            MOV     P3,#0FFH       ;程序开始
            MOV     P1,#0FFH
            CLR     WG26ST       ;清WG26的标志位
            CLR     WG26OK
            SETB    IT1;      ;允许中断
            SETB    IT0
            SETB    EX0
            SETB    EX1;
            SETB    EA
             MOV    R5,#00
             MOV    B,#00


  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;WG26的数据初始化,就是清0
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    YS:      MOV    37H,#00
             MOV    38H,#00H
             MOV    39H,#0H
             MOV    3AH,#00H
             MOV    3BH,#00H
             MOV    3CH,#00H
             MOV    3DH,#00
             MOV    R7,#00
             MOV    R1,#00
   ;;;;;;
    MAIN:    JNB    WG26ST,$ ;开始读WG26?不是继续等待
             MOV    R4,#3;5    ;读WG26信号的时间限制,只有在63ms管定的时间
   YS300MS:  MOV    R3,#254  ;内读到26个信号才算是有效的数据,否则就是非法数据
   YS300MS1: ACALL  A250US
             JB     WG26OK,YS1
             DJNZ   R3,YS300MS1
             DJNZ   R4,YS300MS
             CLR    WG26ST    ;超时数据出错,清WG26的标志
             CLR    WG26OK
             clr    p2.3
             ACALL  DL
             ACALL  DL
             setb   p2.3
             AJMP   YS        ;返回从新读数据
   YS1:      CLR    WG26ST
             CLR    WG26OK
             NOP
             NOP
  ;校验
             MOV    R3,#00
             MOV    A,39H
             MOV    C,P
             CLR    A
             RLC    A
             XRL    A,R3
             MOV    R3,A
             MOV    A,3AH
             ANL    A,#0F0H
             MOV    C,P
             CLR    A
             RLC    A
             XRL    A,R3
             JZ     WG262
             MOV    37H,#0FFH   ;偶校验位,FFH表示1,00H表示0
             AJMP   WG263
     WG262:  MOV    37H,#00     ;偶校验位,FFH表示1,00H表示0
     WG263:  MOV    R3,#00
             MOV    A,3AH
             ANL    A,#0FH
             MOV    C,P
             CLR    A
             RLC    A
             XRL    A,R3
             MOV    R3,A
             MOV    A,3BH
             MOV    C,P
             CLR    A
             RLC    A
             XRL    A,R3
             JZ     WG265
             MOV    3DH,#00    ;奇校验位,FFH表示1,00H表示0
             AJMP   FSWG
     WG265:  MOV    3DH,#0FFH  ;奇校验位,FFH表示1,00H表示0
      FSWG:  MOV    A,37H
             XRL    A,38H      ;判断数据的偶校验位是否相等?
             JNZ    MAINN      ;不等转MAINN
             MOV    A,3CH
             XRL    A,3DH      ;判断数据的奇校验位是否相等?
             JNZ    MAINN      ;不等转MAINN
             AJMP   D2D0       ;校验相等
      MAINN: AJMP   MAIN      ;校验出错返回
      D2D0:  CLR    P1.3      ;提示成功
             ACALL  DL
             acall  AS1MS
             acall  AS1MS
             ;setb   p1.3
             acall  AS1MS
             clr    IT1;      ;允许中断
             acall  AS1MS
             acall  AS1MS
             acall  AS1MS
             acall  AS1MS
             acall  AS1MS
             acall  AS1MS
             acall  AS1MS
             acall  AS1MS
             acall  AS1MS
             acall  AS1MS
             ;;;;;;;把卡号通过串行口发送波特率为9600
             MOV    TMOD,#20H;设定T1为定时方式2
             MOV    TH1,#0FDH;定时初值
             MOV    TL1,#0FDH;
             MOV    PCON,#00;波特率为9600
             SETB   TR1;;;;;启动定时器
             MOV    SCON,#50H;串口方式1
             MOV    R0,#39h;;数据地址指针
             MOV    R7,#3;;;数据长度
   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     AAA0: MOV   A,@R0
           SWAP  A
           ANL   A,#0FH
           MOV   DPTR,#CARDASCII
           MOVC  A,@A+DPTR
           MOV   SBUF,A;@R0;发送一个数据
           JNB   TI,$;;;
           CLR   TI
           MOV   A,@R0
           ANL   A,#0FH
           MOV   DPTR,#CARDASCII
           MOVC  A,@A+DPTR
           MOV   SBUF,A;@R0;发送一个数据
           JNB   TI,$;;;
           CLR   TI
           INC   R0
    AAA2:  DJNZ  R7,AAA0;;数据发送完了吗?
           SETB  IT1;      ;允许中断
           MOV   A,#" "
           MOV   SBUF,A;@R0;发送一个数据
           JNB   TI,$;;;
           CLR   TI
           MOV   A,#" "
           MOV   SBUF,A;@R0;发送一个数据
           JNB   TI,$;;;
           CLR   TI
           AJMP  MAA




  CARDASCII :DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,41H,42H,43H,44H,45H,46H
          ;HEX:00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH

     ;;;;;读WG26信号的子程序
     ;;;注意:R1,R7和B在这里已设为专用,且r7初始时清零.如果在
     ;;主程序中要用到r1及r7,则在子程序中要加入退出时保存
     ;;进入时恢复的指令。以免再次进入中断时不能正常工作。
     ; WG26ST=1表示开始读WG26位数据
     ; WG26OK=1表示读完26位数据
     ;;;;;38H存放第一位数据,是2-13位的偶校验位,FFH表示1,00H表示0
     ;;;;;39H存放第2-9位数据
     ;;;;;3AH存放第10-17位数据
     ;;;;;3BH存放第18-25位数据
     ;;;;;3CH存放第26位数据,是14-25位的奇校验位,FFH表示1,00H表示0
     INT00:  PUSH   ACC
             PUSH   PSW
             SETB   WG26ST
             SETB   DATA0
              NOP
              NOP
              MOV   C,DATA0   ;读WG26的数据

              MOV   B.0,C     ;保存C值
              INC   R7        ;位数加一
             CJNE   R7,#1H,NE1;不是第一位转
              MOV   R1,#38H     ;是第一位
   EVENODD:   MOV   C,B.0       ;存奇偶校验位
              JNC   DY0
              MOV   @R1,#0FFH
             AJMP   RET0
       DY0:   MOV   @R1,#00H
             AJMP   RET0
       NE1:  CJNE   R7,#02H,NE2;不是第二位转
              INC   R1          ;产生新地址
             SJMP   NE19
       NE2:  CJNE   R7,#0AH,NE0A;不是第10位转
              INC   R1          ;产生新地址
             SJMP   NE19
      NE0A:  CJNE   R7,#012H,NE12;不是第18位转
              INC   R1          ;产生新地址
             SJMP   NE19
      NE12:  CJNE   R7,#01AH,NE19;不是第26位转
              MOV   R7,#0H       ; 是第26位清R7
              INC   R1          ;产生新地址
              SETB  WG26OK        ;读完26位,WG26标志位置1
              SJMP  EVENODD
      NE19:    MOV  A,@R1        ;处理数据
                RL  A            ;左移一位
               MOV  C,B.0
               MOV  ACC.0,C      ;新数据存入低位
               MOV  @R1,A
      RET0:    POP  PSW
               POP  ACC
               RETI               ;退出中断


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;
INT01:  PUSH   ACC
             PUSH   PSW
             SETB   WG26ST
             SETB   DATA1
              NOP
              NOP
              MOV   C,DATA1   ;读WG26的数据
              CPL   C
              MOV   B.0,C     ;保存C值
              INC   R7        ;位数加一
             CJNE   R7,#1H,NE11;不是第一位转
              MOV   R1,#38H     ;是第一位
   EVENODD1:   MOV   C,B.0       ;存奇偶校验位
              JNC   DY0
              MOV   @R1,#0FFH
             AJMP   RET0
             MOV   @R1,#00H
             AJMP   RET01
       NE11:  CJNE   R7,#02H,NE21;不是第二位转
              INC   R1          ;产生新地址
             SJMP   NE19
       NE21:  CJNE   R7,#0AH,NE0A1;不是第10位转
              INC   R1          ;产生新地址
             SJMP   NE19
      NE0A1:  CJNE   R7,#012H,NE121;不是第18位转
              INC   R1          ;产生新地址
             SJMP   NE19
      NE121:  CJNE   R7,#01AH,NE191;不是第26位转
              MOV   R7,#0H       ; 是第26位清R7
              INC   R1          ;产生新地址
              SETB  WG26OK        ;读完26位,WG26标志位置1
              SJMP  EVENODD1
      NE191:    MOV  A,@R1        ;处理数据
                RL  A            ;左移一位
               MOV  C,B.0
               MOV  ACC.0,C      ;新数据存入低位
               MOV  @R1,A
      RET01:    POP  PSW
               POP  ACC
               RETI               ;退出中断
       ;延时程序
      A250US: MOV  R5,#6EH
               DJNZ  R5,$
               RET
  DL:                         ;延时程序
        MOV    25H  , #01H
        MOV    24H  , #050
DL0:
        MOV    R6   , 24H   ;2
        MOV    A    , 25H   ;1
        DEC    25H          ;1
        JNZ    DL1          ;2
        DEC    24H          ;1
DL1:
        ORL    A    , R6    ;1
        JZ     DL2          ;2
        SJMP   DL0          ;2
DL2:
        RET
AS1MS:   MOV  R6,#0E5H
 AS1MS1:  NOP
          NOP
          DJNZ  R6,AS1MS1

          RET

⌨️ 快捷键说明

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