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

📄 project(9.18).asm

📁 一个基于51单片机的报警系统。包含有电路图
💻 ASM
📖 第 1 页 / 共 5 页
字号:
       MOV     R6,A
       JNC     TAK2
       RRC     A              ;一个字节已处理完
       MOV     R6,A
       SETB    ROWST          ;行点色标志置1,使不影响同行下一个字节上跳沿计数
       MOV     A,R4           ;每个字节的行穿透次数占行计数单元的2位,
       MOV     R1,A           ;一个字节已处理完,行计数单元的低2位要清0,
       MOVX    A,@R1          ;故要循环右移2位,为同行下个字节跳沿计数作准备
       RR      A
       RR      A
       MOVX     @R1,A
       DEC     R0             ;修正待提特征的字节单元的地址
       INC     R5             ;修正列点色标志单元的地址
       CJNE    R5,#54H,TAK2
       MOV     R5,#50H        ;完成一行
       MOV     R3,#54H
       INC     R4

;每处理完8行,要对54H开始的32个列穿透计数单元,都循环左移2位,
;为每列的下一8位保持列计数单元的低2位为0,且要对列点色标志(50H~54H)置1
;不影响下8行的跳沿计数
TAK6:
       MOV     A,R0
       INC     A              ;回到上一行的最后一个单元
       MOV     B,#32          ;置除数
       DIV     AB
       MOV     A,B            ;B中放余数,若为0,则(R0)=96/64/32/0,
       JNZ     TAK9           ;要对32个列穿透计数单元进行循环右移2位的操作
       MOV     R7,#32
       MOV     R1,#54H
TAK7:
       MOVX    A,@R1
       RR      A
       RR      A
       MOVX    @R1,A
       INC     R1
       DJNZ    R7,TAK7

       MOV     R1,#50H             ;对50H,51H,52H,53H四个列点色标志置1
       MOV     A,#0FFH
TAK8:
       MOVX    @R1,A
       INC     R1
       CJNE    R1,#54H,TAK8
TAK9:
       CJNE    R0,#0FFH,TAK90      ;判GC中数据都处理完否?
       SJMP    TAK91
TAK90:
       LJMP    TAK2

;将54H开始的32列列穿透计数单元内容加到KK中
TAK91:
       MOV     R7,#32
       MOV     P2,#0C2H
       MOV     R0,#20H        ;KK中列穿透计数单元首地址低8位
       MOV     R1,#54H
TAK10:
       MOVX    A,@R1
       MOVX    @R0,A
       INC     R1
       INC     R0
       DJNZ    R7,TAK10

        ;只取奇数列的列穿透单元,并存放于从c220H开始的16个连续单元中
       MOV     R7,#16
       MOV     R1,#20H
       MOV     R0,#20H
TAK11:
       MOVX    A,@R1
       MOVX    @R0,A
       INC     R1
       INC     R1
       INC     R0
       DJNZ    R7,TAK11


       POP     07H
       POP     06H
       POP     05H
       POP     04H
       POP     03H
       POP     01H
       POP     00H
       SETB    TR0
       RET



;中断采样程序,一次硬采样4组,再软采样4组
INTOP:
       SETB    SENDPOWER           ;开采样电源
       PUSH    ACC
       PUSH    01H
       MOV     R1,#20               ;延时5MS
       DJNZ    R1,$
       LCALL   RDATA                ;硬采样4组数据
       MOV     R1,#20               ;延时5MS
       DJNZ    R1,$
       CLR     P3.4                 ;软采样脉冲
       NOP
       SETB    P3.4
       NOP
       CLR     P3.4
       LCALL   RDATA                ;软采样4组数据
       POP     01H
       POP     ACC
       RETI

;每次采集4组数据,存放在外部RAM 0C000H-0C1FFH单元中,共占512个单元
RDATA:
       MOV     DPTR,#GD1PORT
       MOVX    A,@DPTR
       MOVX    @R0,A
       CJNE    R0,#0FFH,IN1
       MOV     P2,#0C1H
IN1:
       INC     R0
       MOV     DPTR,#GD2PORT
       MOVX    A,@DPTR
       MOVX    @R0,A
       CJNE    R0,#0FFH,IN2
       MOV     P2,#0C1H
IN2:
       INC     R0
       MOV     DPTR,#GD3PORT
       MOVX    A,@DPTR
       MOVX    @R0,A
       CJNE    R0,#0FFH,IN3
       MOV     P2,#0C1H
IN3:
       INC     R0
       MOV     DPTR,#GD4PORT
       MOVX    A,@DPTR
       MOVX    @R0,A
       CJNE    R0,#0FFH,IN4
       MOV     P2,#0C1H
IN4:
       INC     R0
       INC     R6
       RET



;********************************************************
;匙膜识别模块子程序
;RF:输出标志信息实参。RF=0,匹配失败;RF=1,匹配成功。
;R2:为带出实参,是被识别的行号。
;********************************************************
MATEE:
       CLR     TR0
       PUSH    00H
       PUSH    01H
       PUSH    03H
       PUSH    04H
       PUSH    05H
       PUSH    06H
       PUSH    07H

       MOV     DPTR,#KEYQUA         ;KEYQUA用来存放SEC中的元素数目
       MOVX    A,@DPTR
       MOV     R3,A
       CLR     RF
       MOV     R2,#0                ;行号变量
       MOV     R4,#0                ;列号变量
       CLR     C
       SUBB    A,#0                 ;判SEC是否非空

       JNZ     MATEE1A              ;是则转去置匹配失败并退出
       LJMP    MATEE11

;KK中各基元与SEC中各向量的相应基元比较,匹配成功次数送TEMP=0C002H开始的偶数单元。
;相应向量的行号送0C003H开始的奇数单元。

MATEE1A:
       MOV     DPTR,#0C002H
       MOV     R1,#0                ;基元匹配成功次数 计数变量

MATEE1:
       LCALL   SECKBP
       CLR     C
       SUBB    A,R5
       JNZ     MATEE2
       INC     R1                   ;基元匹配成功次数加1

MATEE2:
       INC     R4                   ;修改列号
       CJNE    R4,#48,MATEE1

       MOV     A,R1
       MOVX    @DPTR,A              ;基元匹配成功次数送偶数单元
       INC     DPTR                 ;到相应的行号存储单元
       MOV     A,R2
       MOVX    @DPTR,A              ;相应向量的行号送奇数单元
       INC     DPTR
       MOV     R1,#0                ;计数单元清0
       MOV     R4,#0                ;列号重置为0
       INC     R2                   ;修改行号
       MOV     A,R2
       CJNE    A,03H,MATEE1         ;判断是否到最后一个向量?否,换下一个向量处理


;对0C002H开始偶数单元存储的各向量匹配成功次数进行由大到小的排序,行号也需跟随匹配
;次数一起移动。采用直接插入排序算法,0C000H存"哨兵"数据,0C001H为"哨兵"行号.
;R0为前地址指针,R1为后地址指针

       PUSH    03H
       CJNE    R3,#02H,MATEE3A      ;判断有多少个与SEC中各向量计算的匹配成功
MATEE3A:
       JC      MATEE5A              ;次数,若<2个则跳过排序过程
       DEC     R3                   ;N个数据需比较N-1次
       MOV     P2,#0C0H
       MOV     R0,#02H              ;假定SEC中至少有一个向量
       MOV     R1,#04H

MATEE3:
       MOVX    A,@R0                ;取前地址的内容
       MOV     B,A
       MOVX    A,@R1                ;取后地址的内容
       CJNE    A,0F0H,MATEE4        ;F0H为B寄存器的地址
MATEE4:
       JC      MATEE5               ;前>后,正常,不做操作
          ;前<后
       MOV     DPTR,#0C000H         ;"哨兵"数据
       MOVX    @DPTR,A              ;L.r[0]=L.r[i]
       INC     DPTR
       INC     R1
       MOVX    A,@R1                ;"哨兵"行号
       MOVX    @DPTR,A
       DEC     R1

       LCALL   DATAMOV              ;调用单元移动子程序

       PUSH    00H
       MOV     R0,A                 ;将待插元素及绑定行号插入所得位置
       MOV     DPTR,#0C000H
       MOVX    A,@DPTR
       MOVX    @R0,A
       INC     DPTR
       INC     R0
       MOVX    A,@DPTR
       MOVX    @R0,A
       POP     00H

MATEE5:
       INC     R0
       INC     R0
       INC     R1
       INC     R1
       DJNZ    R3,MATEE3            ;判排序是否完成?
MATEE5A:
       POP     03H

;进入匹配过程
       MOV     R1,#0                ;与若干个向量的一级匹配率不小于60%的计数变量
       MOV     R4,#0                ;列号变量

       MOV     R0,#0                ;"子基元0距离匹配正确的总次数"
       MOV     R6,#0                ;"子基元有效匹配的总次数"

       MOV     DPTR,#0C002H         ;定位到第一个向量的数据位
       MOVX    A,@DPTR
       CLR     C
       SUBB    A,#48                ;判最大匹配成功次数是否等于48?
       JNZ     MATEE6A
       LJMP    MATEE7B              ;是,直接找到匹配向量,转MATEE7B
MATEE6A:
       MOVX    A,@DPTR              ;读入相应向量的数据位
       MOV     B,#10
       MUL     AB
       MOV     R6,#48
       LCALL   DIVIDE
       CJNE    A,#05H,MATEE6B       ;判是否超过一级匹配率
       SJMP    MATEE6C
MATEE6B:
       JC      MATEE7             ;小于一级匹配率,提前跳出
MATEE6C:
       INC     R1                   ;大于或等于一级匹配率,计数变量增1
       INC     DPTR                 ;指向本向量的绑定行号
       INC     DPTR                 ;指向下一向量的数据位置
       DJNZ    R3,MATEE6A
MATEE7:
       CJNE    R1,#00H,MATEE7A
       LJMP    MATEE11           ;采集特征与LKEY中各向量的一级匹配率都不过60%则拒识该卡
MATEE7A:
       CJNE    R1,#01H,MATEE7C
MATEE7B:
       MOV     DPTR,#0C003H
       MOVX    A,@DPTR
       MOV     R2,A
       SJMP    MATEE9A           ;只与一个向量的一级匹配率超过60%,则找到匹配向量
MATEE7C:                         ;与若干个向量的一级匹配率都超过60%,则进入二级匹配
       MOV     R0,#0
       MOV     R6,#0
       MOV     DPTR,#0C000H      ;哨兵单元的匹配成功次数清0
       MOV     A,#0
       MOVX    @DPTR,A
       MOV     DPTR,#0C003H      ;定位到第一个向量的绑定行号地址

MATEE8:
       PUSH     DPH
       PUSH     DPL
       MOVX    A,@DPTR
       MOV     R2,A              ;给定行号



       MOV     DPTR,#SEC         ;定位相应向量的Kη的单元地址
       MOV     A,R2
       MOV     B,#DIMENVOL       ;给定66维向量的所占字节数
       MUL     AB
       ADD     A,#53
       JNC     MATEE8A
       INC     B
MATEE8A:
       ADD     A,DPL
       MOV     DPL,A
       MOV     A,B
       ADDC    A,DPH
       MOV     DPH,A
       MOVX    A,@DPTR
       MOV     R7,A              ;调Kη入R7


;二级匹配,若有多个匹配比率值都超过二级匹配率,则在超过了二级匹配率的匹配值中选择最大的
;将相应的行号赋给R2带出,即为匹配向量的行号
MATEE8B:
       LCALL   SECKBP            ;进入二级匹配,将KK中的基元与SEC中向量相应基元进行子基元匹配
       LCALL   CHILDELT
       INC     R4
       CJNE    R4,#48,MATEE8B
                                        ;48个基元比较完,同时完成一个向量
       MOV     A,R0                     ;再次计算ε=R0/R6*100%
       MOV     B,#10
       MUL     AB
      ;MOV     R6,#192
       LCALL   DIVIDE

       CJNE    A,07H,MATEE8C            ;判ε<Kη否?

MATEE8C:
       JC      MATEE8E
       MOV     DPTR,#0C000H             ;现有匹配值>哨兵单元匹配值,覆盖哨兵单元
       MOVX    A,@DPTR                  ;匹配值
       CJNE    A,00H,MATEE8D
       SJMP    MATEE8E
MATEE8D:
       JNC     MATEE8E
       MOV     A,R0
       MOVX    @DPTR,A                  ;将较大的匹配值写入哨兵单元
       INC     DPTR
       MOV     A,R2                     ;将相应的行号写入哨兵单元
       MOVX    @DPTR,A

MATEE8E:
       POP     DPL
       POP     DPH
       MOV     R4,#0                    ;列号清0
       MOV     R0,#0                    ;R0,R6清0
       MOV     R6,#0
       INC     DPTR                     ;指向下一个向量的匹配成功次数 位置
       INC     DPTR                     ;指向下一个向量的绑定行号 位置

       DJNZ    R1,MATEE8


MATEE9:
       MOV     DPTR,#0C001H
       MOVX    A,@DPTR                ;将匹配向量的行号赋给R2带出
       MOV     R2,A
MATEE9A:
       SETB    RF
MATEE10:
       POP     07H
       POP     06H
       POP     05H
       POP     04H
       POP     03H
       POP     01H
       POP     00H
       SETB    TR0
       RET
MATEE11: ;LCALL    REFUSEMUS                ;播放拒识音乐
       SJMP    MATEE10

;******************************************************
;动态数组管理模块:
;带入参数:TF,持卡时间有效标志
;
;匹配成功进入本模块:
;像卡逻辑关系处理
;1.持卡时间有效-->开锁-->刷新相应向量的48维特征向量
;2.持卡时间无效-->删除该向量,调整SEC空间,且对临界变量
;  "KEYQUA"减1
;******************************************************

SECADMIN:
       CLR     TR0
SECADMIN1:
       ;SETB    TF
       JNB     TF,SECADMIN2       ;判像卡有效否?
       ;逻辑关系处理
       LCALL   LAP                ;进行匙膜逻辑分析,匙膜逻辑分析结果为2,即AND

       ;CLR     LAEND
       JNB     LAEND,LOGICEND
       LJMP    MAIN               ;关系处理尚未完成,转MAIN,等待下张卡继续插入

LOGICEND:
       LCALL   OPENLOCK           ;开锁;
       JNB     CRIFLAG,SECADMIN3  ;判断临界区EEPROM访问标志可用否?
       CLR     CRIFLAG            ;关临界区
       LCALL   REFRESH            ;将KK替换SEC中找到的向量的48维特征,完成像卡自学习
       SJMP    SECADMIN4

⌨️ 快捷键说明

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