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

📄 project(9.18).asm

📁 一个基于51单片机的报警系统。包含有电路图
💻 ASM
📖 第 1 页 / 共 5 页
字号:
       MOV     A,SBUF            ;接收66个字节的数据
       MOV     DPH,23H           ;将数据暂存在C400H-C441H单元
       MOV     DPL,22H
       MOVX    @DPTR,A
       MOV     R7,CHECK          ;校验码计算
       XRL     A,R7
       MOV     R7,A
       MOV     CHECK,R7
       INC     DPTR
       MOV     23H,DPH
       MOV     22H,DPL
       MOV     A,SBUF
       MOV     SBUF,A
       JNB     TI,$
       CLR     TI
       MOV     R6,COUNT
       DJNZ    R6,R18
       LJMP    R13                ;转发送校验码
R15:                              ;销卡处理
       MOV     A,SBUF            ;接收RoomID,保存在27单元
       MOV     27H,A
       MOV     SBUF,A
       JNB     TI,$
       CLR     TI
       JNB     RI,$
       CLR     RI
       MOV     A,SBUF            ;接收CardID,保存在28H单元
       MOV     28H,A

;调用销卡结帐程序
R16:
       JNB     CRIFLAG,R17       ;判临界区访问标志可用否?
       CLR     CRIFLAG           ;关临界区
       LCALL   DELIIC
       SETB    CRIFLAG           ;开临界区
       SJMP    T11A
R17:
       LCALL   DL100MS
       SJMP    R16
R18:
       MOV     COUNT,R6
       AJMP    INT_END
T11A:
;       MOV     SBUF,#0FCH        ;销卡成功,回送FCH
       SETB    SM2               ;恢复SM2
       AJMP    INT_END
T11:
       MOV     CHECK,#00H         ;异或校验字,存放24H单元
       MOV     COUNT,#DIMENVOL    ;接收字节计数器值存放于R0
       MOV     23H,#0C4H          ;设置接收数据指针DPH
       MOV     22H,#00H           ;DPL
       MOV     SBUF,#0FCH        ;数据发布成功,回送FCH
       JNB     TI,$
       CLR     TI

WRTEEPROM:
       JNB     CRIFLAG,WRTEEPROM1;判临界区访问标志可用否?
       CLR     CRIFLAG           ;关临界区
       MOV     DPTR,#KEYQUA      ;EEPROM首地址C800H存放样本计数值KEYQUA
       MOVX    A,@DPTR
       MOV     R0,A
       INC     A
       MOV     DPTR,#KEYQUA      ;EEPROM首地址C800H存放样本计数值KEYQUA
       MOVX    @DPTR,A           ;存放更新后的KEYQUA值
       LCALL   WRDELAY

            ;R0为样本的行号(以此确定该样本的地址)
       LCALL   WEEPROM           ;调用写EEPROM延时

       SETB    SM2              ;恢复SM2
       SETB    CRIFLAG          ;开临界区
       SJMP    INT_END
WRTEEPROM1:
       LCALL   DL100MS           ;延时等待临界区访问标志可用
       SJMP    WRTEEPROM
INT_END:
       POP     06H
       POP     07H
       POP     05H
       POP     04H
       POP     03H
       POP     ACC
;       POP     PSW               ;恢复PSW,使用寄存器0
       SETB    EA                ;开中断
       MOV     IP,#10H           ;设置串口中断为最高优先级
       SETB    TR0

       RETI
;///////////////////////////////////////////////////////////////////////////////

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                            图域整定模块,GA-->GB                              ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DIFFEREN:
       PUSH    00H
       PUSH    01H
       PUSH    02H
       PUSH    03H
       PUSH    04H


       MOV     R0,#40H          ;建立片内RAM 2x4数组首地址
       MOV     R2,#00H          ;GA合成次数 计数器
       MOV     R3,#00H          ;GA地址缓冲器
       MOV     R4,#0C0H
       MOV     DPTR,#0C000H        ;建立GA的初始地址

DIFF1:
       MOVX    A,@DPTR          ;从扩展RAM取GA两行到片内RAM
       MOVX    @R0,A
       CJNE    R0,#47H,DIFF2
       MOV     R0,40H           ;两行像素进行"或"关系合成
       MOV     A,44H
       ORL     A,R0
       MOV     40H,A
       MOV     R0,41H
       MOV     A,45H
       ORL     A,R0
       MOV     41H,A
       MOV     R0,42H
       MOV     A,46H
       ORL     A,R0
       MOV     42H,A
       MOV     R0,43H
       MOV     A,47H
       ORL     A,R0
       MOV     43H,A
       PUSH    DPH                 ; DPH=0C0H,DPL=48H  ......
       PUSH    DPL
       MOV     R1,#40H
       MOV     DPH,R4
       MOV     DPL,R3
       SJMP    DIFF4               ;合成完毕后转去送回GA
DIFF2:
       INC     R0
DIFF3:
       INC     DPTR
       SJMP    DIFF1
DIFF4:
       MOVX    A,@R1               ;片内RAM 2x4工作数组内容回送GA
       MOVX    @DPTR,A
       CJNE    R1,#43H,DIFF5
       INC     DPTR
       MOV     R4,DPH
       MOV     R3,DPL
       POP     DPL                  ;DPH=0C0H,DPL=07H
       POP     DPH
       CJNE    R2,#7FH,DIFF6        ;128行合成完毕否?完毕则返回,未完则转DIFF6继续
       POP     04H
       POP     03H
       POP     02H
       POP     01H
       POP     00H
       RET
DIFF5:
       INC     R1
       INC     DPTR
       SJMP    DIFF4
DIFF6:
       INC     R2
       MOV     R0,#40H
       SJMP    DIFF3
;图像规范化模块,GB-->GC
GSTAN:
       CLR     TR0
       PUSH    00H
       PUSH    01H
       PUSH    02H
       PUSH    03H
       PUSH    04H
       PUSH    05H
       PUSH    06H
       MOV     R0,#0
       MOV     R1,#31*4        ;建立第一个被整定位的单元地址
       MOV     R2,#0
       MOV     R3,#0
       MOV     R4,#0
       MOV     R5,#1           ;建立仅有一个1的逻辑工作向量
       MOV     R6,#0FEH        ;建立仅有一个0的逻辑工作向量
       MOV     P2,#0C0H        ;确定GB各单元的高8位地址码
GSTAN1:
       MOVX    A,@R1           ;用逻辑运算方式在GB中提取有效像素位
       ANL     A,R5            ;具体算法见论文
       JZ      GSTAN2
       MOVX    A,@R0
       ORL     A,R5
       SJMP    GSTAN3
GSTAN2:
       MOVX    A,@R0
       ANL     A,R6
GSTAN3:
       MOVX    @R0,A           ;将提取的有效像素放入GC的规定位
       CJNE    R2,#31,GSTAN4   ;一列整定完毕否?(R2=31?)未完继续
       SJMP    GSTAN5          ;整定完转去换列
GSTAN4:
       INC     R2
       INC     R1              ;增加4个字节,换到同列下一个被整定位的单元
       INC     R1
       INC     R1
       INC     R1
       INC     R0              ;目的地址相应增加4个字节
       INC     R0
       INC     R0
       INC     R0
       SJMP    GSTAN1
GSTAN5:
       CJNE    R3,#7,GSTAN6    ;8列整定完否?未完换小列
       SJMP    GSTAN7          ;整完,转判是否全部整完
GSTAN6:
       MOV     R2,#0           ;换小列
       INC     R3
       MOV     A,R1            ;修正待整定的有效像素位的单元地址
       SUBB    A,#4*(32+32/8-1)-1; X2<-X2 -(N+N/K-1)
       MOV     R1,A
       MOV     A,R0            ;修正目的区域地址
       SUBB    A,#4*(32-1)      ; X3<-X3 -(N-1)
       MOV     R0,A
       SJMP    GSTAN9
GSTAN7:
       CJNE    R4,#3,GSTAN8    ;未全部整定完换大列
       SJMP    GSTAN11          ;否则转返回
GSTAN8:
       MOV     R2,#0
       MOV     R3,#0
       INC     R4
       MOV     A,R1
       SUBB    A,#(4*32/8)-1     ;X2<-X2 -N/K
       MOV     R1,A
       MOV     A,R0
       SUBB    A,#4*(32-1)      ;X3<-X3 -(N-1)
       MOV     R0,A
GSTAN9:
       MOV     A,R6            ;R5(X5)和R6(/X5)分别循环左移一位
       RL      A
       MOV     R6,A
       MOV     A,R5
       RL      A
       MOV     R5,A
       CJNE    R5,#1,GSTAN10    ;R5=00000001?整完一个字节?
       INC     R1              ;跨到左边隔壁单元
       INC     R0
GSTAN10:
       AJMP    GSTAN1
GSTAN11:
       POP     06H
       POP     05H
       POP     04H
       POP     03H
       POP     02H
       POP     01H
       POP     00H
       SETB    TR0
       RET

;*********************************************************
;图像去躁子程序
;R1:先用于图域GC末尾加一行0处理的地址指针;后用于全图域
;处理的地址指针。
;*********************************************************
LEVEL:
       PUSH    01H
       PUSH    ACC
       PUSH    B
       MOV     R1,#80H     ;GC的范围0C000H~0C07FH
       MOV     P2,#0C0H    ;增加全为0的一行(4个字节C080H~C083H)
       MOV     A,#0
LEVEL1:
       MOVX    @R1,A
       CJNE    R1,#83H,LEVEL2
       AJMP    LEVEL3
LEVEL2:
       INC     R1
       AJMP    LEVEL1
LEVEL3:
       MOV     R1,#08H     ;将GDBUF(内部RAM 08H~13H)清0
LEVEL30:
       MOV     @R1,A
       CJNE    R1,#13H,LEVEL31
       AJMP    LEVEL32
LEVEL31:
       INC     R1
       AJMP    LEVEL30
LEVEL32:
       MOV     R1,#0
       LCALL   GCTOGBUF
LEVEL4:
       LCALL   GCTOGBUF
       LCALL   FLABBY
       LCALL   PROPERTY
       LCALL   CENCON
       DEC     R1          ;在GCTOGBUF中,R1地址指针因读数据向前
       DEC     R1          ;移动4个字节,现要将去躁后的数据写回
       DEC     R1          ;原地址,故要向后移动4个字节
       DEC     R1
       LCALL   GBUFTOGC
       INC     R1
       INC     R1
       INC     R1
       INC     R1
       CJNE    R1,#131,LEVEL5       ;(32*32/8)+4=132 (0~131)
       POP     B
       POP     ACC
       POP     01H
       RET
LEVEL5:
       INC     R1
       LCALL   PAARR
       AJMP    LEVEL4


;***********************************************************************
;特征提取模块
;ROWST:行点色标志。ROWST=0,表示前一点为白点,反之为黑色
;C250H,C251H,C252H,C253H这4个工作单元为列点色标志,c250H(31--24列),
;c251H(23--16列),c252H(15--8列),c253H(7--0列).
;32行行穿透次数直接存入KK中的C200H--C21FH单元。32列列穿透次数暂存在
;以C254H开始的32个单元,提完特征后再选奇数列存入KK中的的C220H--C22FH单元
;GC(C000H--C07FH),片外工作数组(C250H--?),KK(C200H--C22FH)
;***********************************************************************
TAK:
       CLR     TR0
       PUSH    00H
       PUSH    01H
       PUSH    03H
       PUSH    04H
       PUSH    05H
       PUSH    06H
       PUSH    07H


       MOV     P2,#0C2H        ;建立片外工作数组& KK首地址高8位
       MOV     R7,#32          ;32个临时列穿透计数单元
       MOV     R0,#54H         ;建立片外工作数组首地址低8位
       MOV     R1,#00H         ;建立KK中行穿透计数单元首地址低8位(行穿透:C200H~C21FH)
       MOV     A,#0
TAK1:
       MOVX    @R0,A           ;工作数组,KK清0
       MOVX    @R1,A
       INC     R0
       INC     R1
       DJNZ    R7,TAK1

       MOV     R0,#50H
       MOV     A,#0FFH
TAK1A:
       MOVX    @R0,A           ;对4个列点色标志字节置1
       INC     R0
       CJNE    R0,#54H,TAK1A


       MOV     R0,#7FH         ;建立GC首地址低8位,从最后一个单元开始提取特征,32*4-1=127
       MOV     R5,#50H         ;建立片外工作数组首地址低8位
       MOV     R4,#00H         ;建立KK中行穿透次数计数单元首地址低8位
       MOV     R3,#54H         ;连续白点计数单元首地址低8位
       MOV     R6,#80H         ;R6用来提位,初始为10000000
       SETB    ROWST           ;白点标志置1,上跳沿计数

TAK2:
       MOV     P2,#0C0H        ;建立图域GC首地址高8位
       MOVX    A,@R0           ;从GC提取一个字节
       ANL     A,R6            ;提取该字节要判断的位
       MOV     P2,#0C2H        ;在跳转之前,修改页地址
       JZ      TAK4            ;是白点则转TAK4
       JB      ROWST,TAK3      ;本点为黑点,判同行的前一点是否为黑点,若为黑点,转TAK3
       SETB    ROWST           ;同行:白/黑,同行前一点为白点,则置黑点标志
       MOV     A,R4            ;由白变黑,该行穿透次数加1
       MOV     R1,A
       MOVX    A,@R1           ;KK[R4]<-KK[R4]+1,一个字节的行跳沿次数达到4次的
       MOV     B,A             ;只记做3次
       ANL     A,#03H
       SUBB    A,#03H          ;若已达到3次,则不作修改,直接跳到TAK3
       JZ      TAK3
       MOV     A,B             ;否则照常+1
       INC     A
       MOVX    @R1,A
TAK3:                          ;同行:黑/黑
       MOV     A,R5           ;判同列的前一点(该点是上一行中同列的点,若上一点为白点,
       MOV     R1,A
       MOVX    A,@R1           ;现在这行的点又为黑点,既完成了一个跳沿)是否为白点?
       ANL     A,R6            ;(R5)=50H/51H/52H/53H 列点色标志
                                ;         53H           52H        51H        50H
       JNZ     TAK5            ;       31----24      23----16   15----8     7----0
                                ;       ........      ........   ........   ........
                                ;       ........      ........   ........   ........
                               ;上一点为白点
       MOVX    A,@R1           ;现在的点是黑点,用1在列点色标志相应位标记
       ORL     A,R6
       MOVX    @R1,A
       MOV     A,R3           ;该列的穿透次数加1,
       MOV     R1,A
       MOVX    A,@R1
       MOV     B,A            ;一列的每8个像素跳沿次数达到4次的只记做3次
       ANL     A,#03H
       SUBB    A,#03H
       JZ     TAK5
       MOV     A,B
       INC     A
       MOVX    @R1,A
       SJMP    TAK5
TAK4:
       CLR     ROWST           ;置相应位为白点标志0
       MOV     A,R6
       CPL     A
       MOV     B,A
       MOV     A,R5
       MOV     R1,A
       MOVX    A,@R1
       ANL     A,B
       MOVX    @R1,A
TAK5:
       INC     R3             ;列穿透计数单元地址+1
       MOV     A,R6           ;调整R6的提位位
       CLR     C
       RRC     A

⌨️ 快捷键说明

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