① 單片機的程序
你可能編譯器不對,也有可能晶元選的不對,你的這個系統,晶元選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