谁能帮我检查下,这个C51单片机的汇编语言有什么错误!

是一个 电子密码锁。
ORG 0000H
AJMP START
ORG 0030H
START:ACALL BP
MOV R0,#31H
MOV R2,#8
SET: MOV P1,#0FFH
MOV A,P1
CJNE A,#0FFH,L8
AJMP SET
L8: ACALL DELAY
CJNE A,#0FFH,SAVE
AJMP SET
SAVE: ACALL BP
MOV @R0�A
INC R0
DJNZ R2,SET
MOV R5,#16
D2S: ACALL BP
DJNZ R5,D2S
MOV R0,#31H
MOV R3,#3
AA1: MOV R2,#8
AA2: MOV P1,#0FFH
MOV A,P1
CJNE A,#0FFH, L9
AJMP AA2
L9� ACALL DELAY
CJNE A,#0FFH,AA3
AJMP AA2
AA3: ACALL BP
CLR C
SUBB A, @R0
INC R0
CJNE A,#00H,AA4
AJMP AA5
AA4: SETB 00H
AA5: DJNZ R2,AA2
JB 00H�AA6
CLR P3.5
L3� MOV R5,#8
ACALL BP
DJNZ R4,L3
MOV R3,#3
SETB P3.5
AJMP AA1
AA6: DJNZ R3,AA7
MOV R5,#24
L5: MOV R4,#200
L4: ACALL BP
DJNZ R4,L4
DJNZ R5,L5
MOV R3,#3
AA7: MOV R5,#40
ACALL BP
DJNZ R5,AA7
AA8: CLR 00H
AJMP AA1
BP: CLR P3.7
MOV R7,#250
L2: MOV R6,#124
L1: DJNZ R6,L1
CPL P3.7
DJNZ R7,L2
SETB P3.7
RET
DELAY�MOV R7,#20
L7: MOV R6,#125
L6: DJNZ R6,L6
DJNZ R7,L7
RET
END

存在以下几个问题:
1. 在按键的延时去抖动后,没有重新读取按键键值,即:
L8: ACALL DELAY
CJNE A,#0FFH,SAVE
这两条指令中间应插入:MOV A, P1,否则你用来比较的A还是第一次读到的A

2. 你在检测到按键按下后,没有等待键释放再去检测下一个按键。从你的程序中看,检测到按键按下后,蜂鸣器会响,除非你能很好的控制你按键按下的时间,不能超过蜂鸣器鸣叫的时间。所以这里建议你增加等待键释放,即:
INC R0
DJNZ R2,SET
这两条指令中插入:
RELEASE: MOV A, P1
CJNE A, #0FFH, RELEASE ; 检测到键仍按下则继续检测直至松开
ACALL DELAY ; 继续延时去抖动
MOV A, P1
CJNE A, #0FFH, RELEASE ; 去抖动后再确认一次按键已释放

你后面的代码看上去很混乱,我大致的理解是:你开始读了8次键值,存入31H开始的单元,然后后面的循环中有执行了3次 再读8次键值的事情,并且只要这8次中有一次按对了(分别与开始的第1、2、3个键值相同),就将00H这位置为有效,然后蜂鸣器响一响,没有什么实质性的工作。
另外,你的原理图中P3.2是控制线,程序中没有看到P3.2,却有P3.5。

希望你具体说明你的需求,以及你自己的编程思路,才能让别人帮到你,只会贴贴程序是没有意义的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-10-18
ORG 0000H
AJMP START
ORG 0030H
START: ACALL BP
MOV R0,#31H
MOV R2,#8
SEET: MOV P1,#0FFH
MOV A,P1
CJNE A,#0FFH,L8
AJMP SEET
L8: ACALL DELAY
CJNE A,#0FFH,SAVE
AJMP SEET
SAVE: ACALL BP
MOV @R0,A
INC R0
DJNZ R2,SEET
MOV R5,#16
D2S: ACALL BP
DJNZ R5,D2S
MOV R0,#31H
MOV R3,#3
AA1: MOV R2,#8
AA2: MOV P1,#0FFH
MOV A,P1
CJNE A,#0FFH, L9
AJMP AA2
L9: ACALL DELAY
CJNE A,#0FFH,AA3
AJMP AA2
AA3: ACALL BP
CLR C
SUBB A, @R0
INC R0
CJNE A,#00H,AA4
AJMP AA5
AA4: SETB 00H
AA5: DJNZ R2,AA2
JB 00H,AA6
CLR P3.5
L3: MOV R5,#8
ACALL BP
DJNZ R4,L3
MOV R3,#3
SETB P3.5
AJMP AA1
AA6: DJNZ R3,AA7
MOV R5,#24
L5: MOV R4,#200
L4: ACALL BP
DJNZ R4,L4
DJNZ R5,L5
MOV R3,#3
AA7: MOV R5,#40
ACALL BP
DJNZ R5,AA7
AA8: CLR 00H
AJMP AA1
BP: CLR P3.7
MOV R7,#250
L2: MOV R6,#124
L1: DJNZ R6,L1
CPL P3.7
DJNZ R7,L2
SETB P3.7
RET
DELAY: MOV R7,#20
L7: MOV R6,#125
L6: DJNZ R6,L6
DJNZ R7,L7
RET
END
第2个回答  2010-10-18
子程序L9和L3后面少了冒号。
第3个回答  2010-10-19
我劝你不要学编程了
相似回答