本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
我用以下程序在keil进行编译出现问题。
程序清单:
显示缓冲区
LED1 EQU 6FH
BUFF EQU 6EH
TIMERS1 EQU 6DH ;输入回车的次数
TIMERS2 EQU 6CH ;报警的次数
LED6 EQU 6AH
密码缓冲区
PS1 EQU 69H
PS2 EQU 78H
PS3 EQU 67H
PS4 EQU 66H
PS5 EQU 65H
PS6 EQU 64H
PS7 EQU 63H
PS8 EQU 62H
AT24C02读取缓冲区
AT1 EQU 61H
AT2 EQU 60H
AT3 EQU 5FH
AT4 EQU 5EH
AT5 EQU 5DH
AT6 EQU 5CH
AT7 EQU 5BH
AT8 EQU 5AH
按键标志位
F_0 BIT 20H
F_1 BIT 21H
F_2 BIT 22H
F_3 BIT 23H
F_4 BIT 24H
F_5 BIT 25H
F_6 BIT 26H
F_7 BIT 27H
F_8 BIT 28H
F_9 BIT 29H
CH_STATE BIT 2AH ;系统更改的状态标志位,为1表示busy
FLAG1 BIT 2BH ;功能键标志位,为1表示功能按键。
F_F1 BIT 2CH
F_F2 BIT 2DH
PSW_F BIT 2EH ;密码是否正确的标志位
口资源定义
SPK BIT P2.1
WP BIT P3.5
SDA BIT P3.6 ;定义串口数据端
SCL BIT P3.7
ORG 0000H
AJMP MAIN
ORG 000BH
;AJMP TIMER0
ORG 001BH
;AJMP TIMER1
ORG 0030H
MAIN:MOV SP, #70H
MOV TMOD, #11H
MOV TH0, #3CH
MOV TL0, #0B0H
MOV TH1, #3CH
MOV TL1, #0B0H
CLR F_0 ;清除标志位
CLR F_1
CLR F_2
CLR F_3
CLR F_4
CLR F_5
CLR F_6
CLR F_7
CLR F_8
CLR F_9
CLR BUF_FULL
CLR CH_STATE
CLR FLAG1
CLR F_F1
CLR F_F2
CLR PSW_F
MOV BUFF,#00H ;调用
LCALL INITPS ;初始化环境
LCALL INITAT
LCALL XSA ;调用默认显示
MOV TIMERS1,#00H
NOP
MOV PS1, #11H ;初始化密码830620
MOV PS2, #0AH
MOV PS3, #02H
MOV PS4, #13H
MOV PS5, #0BH
MOV PS6, #02H
START:NOP ;程序开始
LCALL CH_KEY ;检查键盘
AJMP START ;返回
CH_KEY:LCALL KS ;检查有没有按键按下
JNZ LK1
AJMP CH_KEY
LK1:
LCALL T12MS
ACALL KS
JNZ LK2
RET
LK2:
NOP
LCALL SBIE ;按键识别子程序
MOV BUFF, A ;送缓冲区以识别是数字键还是功能键?
LCALL CH_KF ;判断按键功能。
JB FLAG1 ,KEY_FUN ;标志为1,则为功能键
***********数字按键输入并且存放到缓冲区内等待比较******************
KEY_DIG:NOP ;设一标志,辨别输入是否满
;SETB TR0
INC TIMERS ;输入数字的位数
MOV A, TIMERS
CLR C
SUBB A, #01H
JNZ PS_2
MOV PS1, BUFF ;依照顺序存放密码
AJMP NEXT
PS_2:MOV A, TIMERS
SUBB A, #02H
CLR C
JNZ PS_3
MOV PS2, BUFF
AJMP NEXT
PS_3:MOV A, TIMERS
CLR C
SUBB A, #03H
JNZ PS_4
MOV PS3, BUFF
AJMP NEXT
PS_4:MOV A, TIMERS
CLR C
SUBB A, #04H
JNZ PS_5
MOV PS4, BUFF
AJMP NEXT
PS_5:MOV A, TIMERS
CLR C
SUBB A, #05H
JNZ PS_6
MOV PS5, BUFF
AJMP NEXT
PS_6:MOV A, TIMERS
CLR C
SUBB A, #06H
JNZ CH_KEY
MOV PS6, BUFF
NEXT:LCALL XSC
MOV R7, TIMERS ;比较输入的次数。
CJNE R7, #06H ,FULL
FULL:JC NEXT9
SETB BUF_FULL
MOV TIMERS,#06H
CLR L3
NOP
CLR P2.1
LCALL T100MSD
SETB P2.1
NOP
AJMP CH_KEY
NEXT9:CLR P2.1 ;密码输入一位,鸣叫一声。
CLR L3
LCALL T100MSD ;延时100ms
SETB L3
SETB P2.1
AJMP CH_KEY
***************开门子程序 ******************************************
CL:NOP
SETB L3
MOV BUFF, #00H ;消密码缓冲
MOV TIMERS,#00H
LCALL INITPS ;消除AT缓冲,调电存储后一定要加上
LCALL XSC
LCALL BP
LCALL BP
LCALL T100MSD
LCALL BP
CLR FLAG1
AJMP CH_KEY
FU4:NOP
LCALL BP
LCALL T100MSD
LCALL BP
LCALL T100MSD
LCALL BP
LCALL T100MSD
LCALL BP
LCALL T100MSD
LCALL BP
CLR FLAG1
AJMP CH_KEY
FU3:NOP
LCALL BP
LCALL T100MSD
LCALL BP
LCALL KILLXS ;关闭显示
CLR FLAG1
AJMP CH_KEY
FU1:NOP
LCALL XSC
JB F_F1, NEXT_F1
CLR L1
LCALL BP
SETB F_F1
AJMP CH_KEY
NEXT_F1:SETB L1
LCALL BP
CLR F_F1
;LCALL CH_STATE ;查看现在的状态以防误按
;SETB TR1 ;报警限制暂时不开
;INC F_F1
CLR FLAG1
AJMP CH_KEY
FU2:NOP
JB F_F2, NEXT_F2
CLR L2
LCALL BP
SETB F_F2
AJMP CH_KEY
NEXT_F2:SETB L2
LCALL BP
CLR F_F2
CLR FLAG1
AJMP CH_KEY
**************各类子程序********************************
注意清楚缓冲区时AT1...AT8不应在初始化中执行,以
防两缓冲区都为0,相同开锁
********************************************************
CLR_BUF:MOV R7, #06H
MOV R0, #6FH
LOOP1:MOV A, #00H
MOV @R0, A
DEC R0
DJNZ R7,LOOP1
RET
*************初始化显示缓冲区以及其他缓冲区**************
INITPS:PUSH ACC
PUSH PSW
MOV R7, #06H
MOV R1, #PS1
MOV A, #00H
INIT_PS:MOV @R1, A
DEC R1
DJNZ R7, INIT_PS
POP PSW
POP ACC
NOP
RET
INITAT:PUSH ACC
PUSH PSW
MOV R7,#06H
MOV R1,#AT1
MOV A, #00H
INIT_AT:MOV @R1, A
DEC R1
DJNZ R7, INIT_AT
MOV TIMERS,#00H ;密码输入的次数清零。
POP PSW
POP ACC
RET
****************检验密码正误******************************
C_PSW:PUSH PSW
PUSH ACC
MOV R2,#06H
MOV R0,#PS1
MOV R1,#AT1
C_P:CLR C
MOV A,@R0
SUBB A,@R1
JNZ RETURN
DEC R0
DEC R1
DJNZ R2,C_P
NOP
SETB PSW_F
AJMP EXIT7
RETURN:CLR PSW_F
EXIT7:NOP
POP ACC
POP PSW
RET
***************************锁定,鸣笛程序**********************
LOCK_1M:MOV R4,#3CH ;锁定1分钟
M1_LOOP:LCALL SEC
DJNZ R4,M1_LOOP
NOP
RET
WARN2S:PUSH PSW
PUSH ACC
MOV R5, #14H ;调用20次BP,报警2s
WARN:LCALL BP
DJNZ R5,WARN
NOP
POP ACC
POP PSW
NOP
RET
BP:CLR SPK ;鸣笛子程序
LCALL T100MSD
SETB SPK
NOP
RET
***************************
***** 显示子程序 ********
***************************
锁定状态显示。
XSA:PUSH ACC
PUSH PSW
MOV A, TIMERS1
MOV DPTR, #TAB
MOVC A, @A+DPTR
MOV SBUF, A ;送已经输入密码的次数
JNB TI, $
CLR TI
MOV SBUF, #0FEH ;送短线
JNB TI, $
CLR TI
MOV SBUF, #0FEH ;送短线
JNB TI, $
CLR TI ;送F
MOV SBUF, #78H
JNB TI, $
CLR TI
MOV SBUF, #78H
JNB TI, $
CLR TI
MOV SBUF, #11H
JNB TI, $
CLR TI
POP PSW
POP ACC
RET
成功开锁状态显示
XSB:PUSH ACC
PUSH PSW
MOV A, TIMERS1
MOV DPTR, #TAB
MOVC A, @A+DPTR
MOV SBUF, A
JNB TI, $
CLR TI
MOV SBUF, #0FEH
JNB TI, $
CLR TI
MOV SBUF, #0FEH
JNB TI, $
CLR TI
MOV SBUF, #10H
JNB TI, $
CLR TI
MOV SBUF, #10H
JNB TI, $
CLR TI
MOV SBUF, #10H
JNB TI, $
CLR TI
POP PSW
POP ACC
RET
密码输入及修改状态
XSC:PUSH ACC
PUSH PSW
LCALL KILLXS
SETB RS1 ;切换到第三组寄存器。防止操作数读取错误。
MOV R6, TIMERS
MOV A, R6
SUBB A, #01H
JNC SC0
JZ SC1
SC0:MOV SBUF, #0FEH
JNB TI, $
CLR TI
SC1:MOV A, R6
SUBB A, #02H
JNC SC11
JNZ SC2
SC11:MOV SBUF,#0FEH
JNB TI, $
CLR TI
SC2:MOV A, R6
SUBB A, #03H
JNC SC22
JNZ SC3
SC22:MOV SBUF, #0FEH
JNB TI, $
CLR TI
SC3:MOV A, R6
SUBB A, #04H
JNC SC33
JNZ SC4
SC33:MOV SBUF, #0FEH
JNB TI, $
CLR TI
SC4:MOV A, R6
SUBB A, #05H
JNC SC44
JNZ SC5
SC44:MOV SBUF, #0FEH
JNB TI, $
CLR TI
SC5:MOV A, R6
SUBB A, #06H
JNC SC55
JNZ SC6
SC55:MOV SBUF, #0FEH
JNB TI, $
CLR TI
SC6:MOV A, R6
SUBB A, #07H
JNC SC66
JNZ EXIT_C
SC66:MOV SBUF, #0FEH
JNB TI, $
CLR TI
NOP
NOP
EXIT_C:NOP
CLR RS1
POP PSW
POP ACC
NOP
RET
密码输入错误的提示
XSD:PUSH ACC
PUSH PSW
MOV SBUF, #98H
JNB TI, $
CLR TI
MOV SBUF, #79H
JNB TI, $
CLR TI
MOV SBUF, #11H
JNB TI, $
CLR TI
MOV SBUF, #79H
JNB TI, $
CLR TI
MOV SBUF, #79H
JNB TI, $
CLR TI
MOV SBUF, #38H
JNB TI, $
CLR TI
POP PSW
POP ACC
RET
锁定状态显示
XSE:PUSH ACC
PUSH PSW
MOV SBUF, #0FEH
JNB TI, $
CLR TI
MOV SBUF, #54H
JNB TI, $
CLR TI
MOV SBUF, #39H
JNB TI, $
CLR TI
MOV SBUF, #11H
JNB TI, $
CLR TI
MOV SBUF, #3DH
JNB TI, $
CLR TI
MOV SBUF, #0FEH
JNB TI, $
CLR TI
POP PSW
POP ACC
RET
XSF:PUSH ACC
PUSH PSW
MOV SBUF, #98H
JNB TI, $
CLR TI
MOV SBUF, #38H
JNB TI, $
CLR TI
MOV SBUF, #39H
JNB TI, $
CLR TI
MOV SBUF, #39H
JNB TI, $
CLR TI
MOV SBUF, #3DH ;U
JNB TI, $
CLR TI
MOV SBUF, #98H
JNB TI, $
CLR TI
POP PSW
POP ACC
RET
KILLXS:PUSH ACC
PUSH PSW
MOV R7, #06H
LOOP_XS:MOV SBUF, #0FFH
JNB TI, $
CLR TI
DJNZ R7,LOOP_XS
NOP
POP PSW
POP ACC
RET
TAB: DB 11H,0D7H,32H,92H,0D4H,98H,18H,0D1H,10H,90H ,0FFH
****************************************************************
******* 24C02读写程序 ***********
****************************************************************
AT_RADE:PUSH PSW
PUSH ACC
MOV R0,#AT1 ;CPU首地址
MOV R6,#06H ;8字节
MOV R5,#08H ;8位
MOV R7,#00H ;24C02首地址
LCALL READ ;读数据
NOP
NOP
POP ACC
POP PSW
RET
AT_WR:
PUSH PSW
PUSH ACC
MOV R0,#PS1 ;CPU RAM首地址
MOV R6,#06H ;8字节
MOV R5,#08H ;8 BIT
MOV R7,#00H ;24C02 RAM 首地址
LCALL WRT ;先写进
NOP
NOP
POP ACC
POP PSW
RET
****************************************************************
读串行器件 R0:RAM的起始地址,R5:位计数器,
R6:读的字节数,R7:读的起始地址
READ: NOP
NOP
LCALL START0
MOV A,#0A0H
LCALL WRB
LCALL ACK
JB F0,RD_FAIL
MOV A,R7
LCALL WRB
LCALL CHK
JB F0,RD_FAIL
LCALL START0
MOV A,#0A1H
LCALL WRB
LCALL CHK
JB F0,RD_FAIL
RD_N: NOP
NOP
LCALL RDB
MOV @R0,A
DJNZ R6,GO_ACK
LCALL N_ACK
RD_FAIL:NOP
LCALL STOP
MOV A,#0FFH
RET *************read
GO_ACK: NOP
NOP
DEC R0
LCALL ACK
JMP RD_N
写串行器件 R0:RAM的起始地址,R5:位计数器,
R6:写的字节数(页),R7:写的起始地址
WRT: NOP
NOP
LCALL START0
MOV A,#0A0H
LCALL WRBYT
LCALL CHK
JB F0,WR_FAIL
MOV A,R7
LCALL WRBYT
LCALL CHK
JB F0,WR_FAIL |
|