电子琴单片机汇编语言程序出错,咨询原因,请专业人士回答.

想制作简单的电子琴,有8个按键,前7个分别对应不同的音阶,最后一个键播放特定音乐。用的STC89C52单片机来下载程序,程序是在网上搜到的 , STC烧录软件显示程序下载成功,可是用蜂鸣器试总是不成功,我用P2口作为8个按键输入口,P1.0作为蜂鸣器的输出口。我想应该是程序出错,但找不出哪里出错,急寻原因。电路图和程序如下,程序字数超过最多,我在后面继续补充的:

程序:ORG 02HMAIN: MOV SP,#60H ;初始化堆栈指针 MOV 30H,#00 ;定时器初值清零 MOV 31H,#00
MOV P1,#0FFH ;设置P1口为输入模式 MOV TMOD,#01H ;设置定时器0为工作模式1 SETB ET0 ;开定时器0中断 SETB EA ;开总中断 CLR TR0 ;CLR是输低电平指令,关闭定时器0START: MOV R3,P2 CJNE R3,#0FFH,KEY1 CLR TR0 SJMP START
KEY1: ;按键 1 ,P2.0 CJNE R3,#0FEH,KEY2 MOV 30H,#0FBH ;定时器初值清零 MOV 31H,#0E9H MOV @R0,#0FBH ;将音阶存放到R0,R1对应的地址中 MOV @R1,#0E9H INC R0 INC R1 LJMP SET_TIMERKEY2: ;按键2 ,P2.1 CJNE R3,#0FDH,KEY3
MOV 30H,#0FCH MOV 31H,#5CH MOV @R0,#0FCH MOV @R1,#5CH INC R0 INC R1LJMP SET_TIMERKEY3: ;按键3 ,P2.2 CJNE R3,#0FBH,KEY4
MOV 30H,#0FCH MOV 31H,#0C1H MOV @R0,#0FCH MOV @R1,#0C1H INC R0 INC R1 LJMP SET_TIMERKEY4: ;按键4 ,P2.3 CJNE R3,#0F7H,KEY5
MOV 30H,#0FCH MOV 31H,#0EFH MOV @R0,#0FCH MOV @R1,#0EFH INC R0 INC R1 LJMP SET_TIMERKEY5: ;按键5 ,P2.4 CJNE R3,#0EFH,KEY6
MOV 30H,#0FDH MOV 31H,#045H MOV @R0,#0FDH MOV @R1,#045H INC R0 INC R1LJMP SET_TIMERKEY6: ;按键6 ,P2.5 CJNE R3,#0DFH,KEY7
MOV 30H,#0FDH MOV 31H,#92H MOV @R0,#0FDH MOV @R1,#92H INC R0 INC R1 LJMP SET_TIMER
KEY7: ;按键7 ,P2.6 CJNE R3,#0BFH,KEY8
MOV 30H,#0FDH MOV 31H,#0D6H MOV @R0,#0FDH MOV @R1,#0D6H INC R0 INC R1 LJMP SET_TIMER
程序继续:
SET_TIMER:
SETB TR0
LJMP START
NOKEY:
CLR TR0
LJMP START
INT_T0:
MOV TH0,30H
MOV TL0,31H
CPL P1.0
RETI
YYBF:
CLR P1.1
numtim equ 20h
gewei equ 21h
shiwei equ 22h
scanled equ 23h
org 1000h
jmp YYstart
org 001bh
LYBF1:
MOV 30H,@R0
MOV 31H,@R1
INC R0
INC R1
CLR P0.0
SETB TR0
LCALL DELAY1
CLR TR0
LJMP LYBF1
RET
DELAY1:
MOV R4,#25
LOOP1:
MOV R5,#248
DJNZ R5,$
DJNZ R4,LOOP1
RET
END

入口地址错误
系统入口0000h
外中断0入口0003h
定时器0入口000bh
外中断1入口0013h
定时器1入口001bh追问

能把改后的具体程序指令写一下吗?麻烦你了。

追答

我把程序顺序理一下,程序本身是否正确还是你自己检查一下。
numtim equ 20h
gewei equ 21h
shiwei equ 22h
scanled equ 23h
org 0000h
LJMP MAIN
org 000bh
LJMP INT_T0
ORG 0500H
MAIN:
MOV SP,#60H ;初始化堆栈指针
MOV 30H,#00 ;定时器初值清零
MOV 31H,#00
MOV P1,#0FFH ;设置P1口为输入模式
MOV TMOD,#01H ;设置定时器0为工作模式1
SETB ET0 ;开定时器0中断
SETB EA ;开总中断
CLR TR0 ;CLR是输低电平指令,关闭定时器0
START:
MOV R3,P2
CJNE R3,#0FFH,KEY1
CLR TR0
SJMP START
KEY1: ;按键 1 ,P2.0
CJNE R3,#0FEH,KEY2
MOV 30H,#0FBH ;定时器初值清零
MOV 31H,#0E9H
MOV @R0,#0FBH ;将音阶存放到R0,R1对应的地址中
MOV @R1,#0E9H
INC R0
INC R1
LJMP SET_TIMER
.................................字多了不让

温馨提示:答案为网友推荐,仅供参考
相似回答