① 单片机的程序
你可能编译器不对,也有可能芯片选的不对,你的这个系统,芯片选AT89C2051足够你用了,用AT89C51 AT89S51……等芯片都是可以的。
以后如果你对51单片机不是很熟悉的话,前面几行最好就照我的这个写法写:
$MOD51 ;8051单片机汇编语言的头文件
ORG 00H ;定义地址为00H
AJMP START;跳到START,跳过所有的中断源入口
ORG 040H ;定义地址
START:
MOV SP,#60H ;初始化堆栈。因为51单片机上电时默认堆栈指针是07H, 这个地
;址不是很好,所以要初始化一下。
……
……
……;省略号处请补上自己需要的代码
END
下面我用Atmel的assemble编译的结果。编译通过了。
010 PAGE 1
1 $MOD51
0000 2 ORG 0000H
0000 0143 3 AJMP START
0040 4 ORG 40H
0040 758160 5 MOV SP,#60H
0043 6 START:
0043 7590FF 7 MOV P1,#0FFH
0046 E590 8 MOV A,P1
0048 F540 9 MOV 40H,A ;暂存于40H
004A 116A 10 ACALL DL10MS ;去抖延时
004C E590 11 MOV A,P1
004E B54009 12 CJNE A,40H,PASS
0051 B4FE0B 13 CJNE A,#0FEH,LAMP1 ;第一键?
0054 75A0FF 14 MOV P2,#0FFH
0057 758000 15 MOV P0,#00H ;点亮第一行发光二极管
005A 12006A 16 PASS: LCALL DL10MS ;延时
005D 0143 17 AJMP START
005F B4FDF8 18 LAMP1: CJNE A,#0FDH,PASS ;第二键?
0062 7580FF 19 MOV P0,#0FFH
0065 75A000 20 MOV P2,#00H
0068 015A 21 AJMP PASS
22 ;延时子程序:
006A 7F08 23 DL10MS:MOV R7,#08h
006C 7EF9 24 LOOP1: MOV R6,#0F9H
006E 00 25 LOOP2: NOP
006F 00 26 NOP
0070 DEFC 27 DJNZ R6,LOOP2
0072 DFF8 28 DJNZ R7,LOOP1
0074 22 29 RET
30 END
VERSION 1.2h ASSEMBLY COMPLETE, 0 ERRORS FOUND
010 PAGE 2
DL10MS . . . . . . . . . . . . . C ADDR 006AH
LAMP1. . . . . . . . . . . . . . C ADDR 005FH
LOOP1. . . . . . . . . . . . . . C ADDR 006CH
LOOP2. . . . . . . . . . . . . . C ADDR 006EH
P0 . . . . . . . . . . . . . . . D ADDR 0080H PREDEFINED
P1 . . . . . . . . . . . . . . . D ADDR 0090H PREDEFINED
P2 . . . . . . . . . . . . . . . D ADDR 00A0H PREDEFINED
PASS . . . . . . . . . . . . . . C ADDR 005AH
SP . . . . . . . . . . . . . . . D ADDR 0081H PREDEFINED
START. . . . . . . . . . . . . . C ADDR 0043H