📄 project(9.18).asm
字号:
;数组首址
SEC EQU 0C801H
KK EQU 0C200H
ALF EQU 0C300H
AJH EQU 0C350H
KEYQUA EQU 0C800H ;存储EEPROM样本个数的计数值
;端口地址
DISPORT EQU 07FFFH ;显示锁存器地址
GD1PORT EQU 0DFFFH
GD2PORT EQU 0E7FFH
GD3PORT EQU 0EFFFH
GD4PORT EQU 0F7FFH
LOCKPORT1234 EQU 0EFFFH ;电磁锁和步进电机锁端口,端口0带步进电机;端口1带电磁锁
;位变量地址
KEYERR BIT P1.5 ;"重插"指示灯
KEYIN BIT P1.3 ;卡插入判断端口
POWER BIT P1.4 ;+5V OFF
BIPORT BIT P3.4 ;音乐脉冲输入端
SENDPOWER BIT P3.5 ;采样电源
DSP0 BIT P1.6 ;显示管0位选
DSP1 BIT P1.7 ;显示管1位选
CT0FLAG BIT 7CH ;定时器限时标志
ROWST BIT 74H ;行点色标志
CRIFLAG BIT 77H ;临界区EEPROM访问标志
RF BIT 78H ;匹配成功标志
TF BIT 79H ;像卡有效标志
PRTF BIT 7AH ;有效时间打印标志
LAEND BIT 7BH ;像卡逻辑分析结束标志
MF BIT 7CH ;步进电机旋转方向指示标志
T_CLK Bit P1.0 ;实时时钟时钟线引脚
T_IO Bit P1.1 ;实时时钟数据线引脚
T_RST Bit P1.2 ;实时时钟复位线引脚
;片内RAM工作单元
MINBUF EQU 1BH ;三个计时工作单元
SECBUF EQU 1CH
MSBUF EQU 1DH
LED0 EQU 20H ;二个显示工作单元
LED1 EQU 21H
T1COUNT EQU 22H ;定时器1中断次数计数单元
CT0 EQU 23H ;开门维持时间工作单元
;FLAG EQU 20H ;定义标志寄存器
;RINT BIT 20H.0 ;接收中断标志=1为接收中断,用来在主程序中判断是否有过中断
;TINT BIT 20H.1 ;发送中断标志=1为发送中断,用来在主程序中判断是否有过中断
;RBUF EQU 30H ;接收数据存放寄存器
;TBUF EQU 31H ;发送数据存放寄存器
PERTY EQU 2DH
CHECK EQU 24H ;存放发布信息校验码, 初始为00H,发完后需复位
COUNT EQU 25H ;存放发布信息计数值,初始为66,发完后需复位
;40h--46h 存放 "秒 分 时 日 月 星期 年 "
Second EQU 40H
;常量
AGTIMES EQU 15 ;重插次数计数单元
DIMENVOL EQU 66 ;60维向量所占字节数
ORG 0000H ;程序运行起始地址
LJMP START
ORG 0003H ;中断服务程序入口
LJMP INTOP
ORG 000BH ;定时器0入口
LJMP CT0P
ORG 001BH ;定时器1中断入口
LJMP CT1P
ORG 0023H ;串口中断
LJMP INT_COM
ORG 0030H
START:
SETB POWER ;关电源
START1:
CLR POWER ;开电源
START2:
MOV SP,#30H
CLR ES
CLR EA
;LCALL GET1302
;sjmp start2
MOV DPTR,#LOCKPORT1234 ;初始时将所有电磁锁关闭
MOV A,#00H
MOVX @DPTR,A
; MOV R2,#00H
; LCALL OPENLOCK
CLR RF ;关匹配成功标志
CLR TF ;关像卡时间有效标志
CLR PRTF ;清有效时间打印标志
SETB CRIFLAG ;关EEPROM临界区访问标志
CLR SENDPOWER ;关采样电源
MOV LED0,#0
CLR DSP0 ;关显示器
CLR DSP1
;============================复位函数==========================
;定时器工作方式以及赋初值
RESET:
CLR CT0FLAG ;定时形式位参数,=0时为2分钟限时复位,=1由外给定定时值
MOV TMOD,#21H ;定时器0工作方式1/定时器1工作方式2,用于波特率发生
MOV TL0,#0B0H ;定时100MS
MOV TH0,#3CH
MOV TL1,#0F3H ;波特率为2400
MOV TH1,#0F3H
MOV PCON,#80H ;PCON最高位为1,波特率加倍
SETB TR1 ;启动波特率发生定时器1
; MOV TL1,#0FFH
; MOV TH1,#0FFH
MOV SCON,#0F0H ;串口通信工作方式3
MOV DPTR,#LOCKPORT1234 ;初始时将所有锁位机关闭
MOV A,#00H
MOVX @DPTR,A
CLR TI
SETB EA ;开总中断
SETB ET0 ;允许T0中断
; LCALL RESCT0 ;调用计时复位程序
MOV IP,#10H ;设置串口中断为最高优先级
CLR SENDPOWER
CLR IT0
; SETB ES ;开串口中断
MOV CHECK,#00H ;异或校验字,存放24H单元
MOV COUNT,#DIMENVOL ;接收字节计数器值存放于R0
MOV 23H,#0C4H ;设置接收数据指针DPH
MOV 22H,#00H ;DPL
RESET1:
MOV DPTR,#ALF ;ALF,AJH共84个单元清0
MOV A,#0
MOV R0,#84
RESET2:
MOVX @DPTR,A
INC DPTR
DJNZ R0,RESET2
PUSH PSW
;主程序
MAIN:
; SETB KEYERR ;灭"重插"指示灯
MOV DPTR,#LOCKPORT1234 ;初始时将所有锁位机关闭
MOV A,#00H
MOVX @DPTR,A
MOV LED0,#31H
MOV LED1,#07H
SETB EA ;开总中断
SETB ET0 ;允许T0中断
LCALL RESCT0 ;调用计时复位程序
MOV IP,#10H ;设置串口中断为最高优先级
CLR IT0
SETB ES ;开串口中断
CL_DL:
LCALL DISPLAY
; MOV DPTR,#LOCKPORT1234 ;初始时将所有锁位机关闭
; MOV A,#00H
; MOVX @DPTR,A
JNB KEYIN,CL_DL ;判断像卡是否插入,否则等待,调用显示
SETB KEYERR ;灭重插指示灯
MOV DPTR,#LOCKPORT1234 ;初始时将所有锁位机关闭
MOV A,#00H
MOVX @DPTR,A
LCALL DL100MS
LCALL DL100MS
; LCALL DL100MS
; LCALL DL100MS
; LCALL DL100MS
LCALL CJ ;调用采集子程序
LCALL DIFFEREN ;GA->GB, 图域整定
LCALL GSTAN ;GB->GC,规范化
LCALL LEVEL ;调用去躁子程序
LCALL TAK ;调用特征提取子程序
LCALL MATEE
;SETB RF
JB RF,CL_DL1 ;判断RF=1?
CLR KEYERR ;否,则开重插指示灯,直到有卡插入
MOV DPTR,#DAT
LCALL MUSIC ;调出错音乐子程序
; MOV A,SECBUF ;取计时值
; CJNE A,#5H,CJ2 ;是否等于5秒
CLR POWER ;开电源
MOV DPTR,#LOCKPORT1234 ;初始时将所有锁位机关闭
MOV A,#00H
MOVX @DPTR,A
DJNZ AGTIMES,MAIN ;判重插是否达到15次,是则锁位机
SJMP CL_DL2
CL_DL1:
LCALL CALTIME ;计算持卡有效时间,并置卡有效标志TF
LCALL SECADMIN ;根据TF,管理动态数组
CL_DL2:
POP PSW
LJMP START1 ;返回主程序,等待下次插卡
;MAIN:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
;数据采集部分,共128x4个字节,存放于外部RAM C000H-C1FFH共512个单元 ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CJ:
PUSH 00H ;R0压栈
PUSH 06H
PUSH PSW
MOV DPTR,#LOCKPORT1234 ;初始时将所有锁位机关闭
MOV A,#00H
MOVX @DPTR,A
; SETB KEYERR
MOV R6,#00H ;采样字节计数单元赋初值0
MOV R0,#00H ;
MOV P2,#0C0H ;外部RAM起始单元 0C000H
; LCALL RESCT0 ;调用计时复位程序
CJ1:
MOV LED0,#39H
MOV LED1,#1EH
LCALL DISPLAY
SETB SENDPOWER
CLR EX0 ;关INT0
; MOV A,SECBUF ;取计时值
; CJNE A,#5H,CJ2 ;是否等于5秒
; CLR KEYERR ;亮"重插"指示灯
; SETB POWER ;关电源
; LJMP START1 ;重新插卡
CJ2:
SETB IT0 ;IT0边沿申请有效
SETB EA ;开总中断允许控制位
SETB EX0 ;开INT0
CJNE R6,#80H,CJ1 ;R6为采样计数值,不等于128次则继续采样
CLR SENDPOWER
CLR EX0 ;采样完则关中断
POP PSW
POP 06H
POP 00H ;R0出栈
RET
;显示子程序
DISPLAY:
PUSH 03H
PUSH 04H
PUSH 05H
PUSH DPH
PUSH DPL
MOV DPTR,#LOCKPORT1234 ;初始时将所有锁位机关闭
MOV A,#00H
MOVX @DPTR,A
; LCALL RESCT0 ;调用计时复位程序
MOV R4,#1
DISP:
CLR DSP0
CLR DSP1
SETB DSP0
CLR DSP1
MOV DPTR,#DISPORT
MOV A,LED0
MOVX @DPTR,A
MOV R5,#0
DJNZ R5,$
SETB DSP1
CLR DSP0
MOV A,LED1
MOVX @DPTR,A
MOV R3,#0
DJNZ R3,$
DJNZ R4,DISP
POP DPL
POP DPH
POP 05H
POP 04H
POP 03H
RET
;//////////////////////////////////////////////////////////////
;===============================================================
; 串口中断函数 ;
; 接收上位机发布信息、销卡处理 ;
;===============================================================
INT_COM:
CLR TR0
CLR EA ;关中断
; PUSH PSW ;入栈,保护现场
PUSH ACC
PUSH 03H
PUSH 04H
PUSH 05H
PUSH 07H
PUSH 06H
INT1:
JB RI,R11 ;判断是否接收
INT2:
CLR TI ;发送则中断返回
POP 06H
POP 07H
POP 05H
POP 04H
POP 03H
POP ACC
; POP PSW
SETB TR0
SETB EA
RETI
R11:
CLR RI
JNB SM2,R14 ;判SM2,为1则接收地址,为0则接收命令或者数据
MOV A,SBUF
CJNE A,#01H,R12 ;判地址是否相符,否则中断返回
CLR SM2 ;清SM2,准备接收命令或者数据
MOV SBUF,#01H ;地址相符则回送本地址
JNB TI,$
CLR TI
R12:
AJMP INT_END ;中断返回
R13:
MOV A,CHECK ;取校验码并发送到上位机
MOV CHECK,#00H ;校验码复位
MOV SBUF,A
JNB TI,$
CLR TI
JNB RI,$ ;接收校验结果
CLR RI
MOV A,SBUF
XRL A,#0FEH ;=FEH则校验正确
JZ T11
MOV CHECK,#00H ;异或校验字,存放24H单元
MOV COUNT,#DIMENVOL ;接收字节计数器值存放于R0
MOV 23H,#0C4H ;设置接收数据指针DPH
MOV 22H,#00H ;DPL
MOV SBUF,#0FFH ;校验不正确则发送FFH到上位机
JNB TI,$
CLR TI
SETB SM2 ;恢复SM2
AJMP INT_END
R14:
JB RB8,R15 ;RB8=0则接收数据,RB8=1则响应销卡处理
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -