小白求大神们帮忙看下为何程序没错但是仿真出错
时间:10-02
整理:3721RD
点击:
以下是音乐提示定时器的源程序,我把程序下载到开发板上但是却不能用,求大神们帮忙看看 ORG 0000H
AJMP MAIN
ORG 000BH
LJMP TIMER0_INT
ORG 001BH
LJMP TIMER1_INT
ORG 0030H
SAVE: DB 00H , 00H , 00H , 00H ,00H , 00H ;预留空间备用
MAIN: CLR F0 ;清零用户标志位
MOV 33H , #5H ;默认5分钟倒计时
S1 BIT P2.0 ;标号位地址 便于编程、阅读和接线
S2 BIT P2.1 ;P1口 显示输出
S3 BIT P2.2 ; S?为矩阵键盘列
S4 BIT P2.3
H1 BIT P2.4 ; H?为矩阵键盘行
H2 BIT P2.5
H3 BIT P2.6
H4 BIT P2.7
W1 BIT P0.0 ; W?为矩阵 7段数码管 位选
W2 BIT P0.1
W3 BIT P0.2
W4 BIT P0.3
SETB W1
SETB W2
SETB W3
SETB W4
BELL BIT P3.7
MAIN1: LCALL CHECK_KEYDOWN ;键盘扫描子程序
LCALL TIME_COUNTDOWN_VALUE ;倒计时初值子程序
AJMP MAIN1
;*********************************************************
;子程序 集
;键盘扫描子程序
CHECK_KEYDOWN:
LCALL SHOW ;显示子程序
NOKEY0: MOV P2 , #0FFH ;扫描第一行
CLR H1
LCALL KEYDOWN ;扫描键盘按下子程序
JZ NOKEY1
LCALL SHOW
MOV P2 , #0FFH
CLR H1
LCALL KEYDOWN
JZ NOKEY1
MOV 31H , #00H
LJMP NOKEY4
NOKEY1: MOV P2 , #0FFH ;扫描第二行
CLR H2
LCALL KEYDOWN
JZ NOKEY2
LCALL SHOW
MOV P2 , #0FFH
CLR H2
LCALL KEYDOWN
JZ NOKEY2
MOV 31H , #04H
LJMP NOKEY4
NOKEY2: MOV P2 , #0FFH ;扫描第三行
CLR H3
LCALL KEYDOWN
JZ NOKEY3
LCALL SHOW
MOV P2 , #0FFH
CLR H3
LCALL KEYDOWN
JZ NOKEY3
MOV 31H , #08H
LJMP NOKEY4
NOKEY3: MOV P2 , #0FFH ;扫描第四行
CLR H4
LCALL KEYDOWN
JZ NOKEY4
LCALL SHOW
MOV P2 , #0FFH
CLR H4
LCALL KEYDOWN
JZ NOKEY4
MOV 31H , #0CH
NOKEY4: JB F0 , MUSIC ;用户标志位 为 1 则 播放音乐
JZ CHECK_KEYDOWN
LCALL CHECK ;键盘 列扫描 子程序
ADD A , 31H ;至此可以知道0-F中的哪个键被按
;下键值存A中保存
RET
;*********************************************************
;扫描键盘按下子程序
KEYDOWN: MOV A,P2 ;检查是否有键被按下
ANL A,#0FH ;有键按下A不为0
XRL A,#0FH
RET
;*********************************************************
;键盘 列扫描 子程序
CHECK: CJNE A , #01H , ZERO ;第一列被按下?
MOV A , #00H
LJMP OVER
ZERO: CJNE A , #02H , ONE ;第二列被按下?
MOV A , #01H
LJMP OVER
ONE: CJNE A , #04H , TWO ;第三列被按下?
MOV A , #02H
LJMP OVER
TWO: CJNE A , #08H , OVER ;第四列被按下?
MOV A , #03H
OVER: RET
;*********************************************************
;倒计时初值子程序
TIME_COUNTDOWN_VALUE:
LED0: CJNE A , #00H , LED1 ;30H中存放倒计时时间值
MOV 30H , #5
LJMP LED4
LED1: CJNE A , #01H , LED2
MOV 30H , #10
LJMP LED4
LED2: CJNE A , #02H , LED3
MOV 30H , #20
LJMP LED4
LED3: CJNE A , #03H , LED4
MOV 30H , #60
LED4: MOV A , 30H
LCALL TIME_SHOW ;倒计时初值处理子程序
LCALL INTTIMER0
RET
;*********************************************************
;倒计时初值处理子程序
TIME_SHOW:
MOV B , #10 ;32H存放显示倒计时值分钟的高位
div AB ;33H存放显示倒计时值分钟的低位
MOV 32H , A
MOV 33H , B
RET
;*********************************************************
;音乐播放子程序
MUSIC: MOV TMOD , #10H
SETB EA
SETB ET1
MOV DPTR , #MUSICTABLE
MUSIC_VALUE:
CLR A
MOVC A , @A+DPTR
MOV R1 , A
INC DPTR
CLR A
MOVC A , @A+DPTR
MOV R0 , A
ORL A , R1
JZ MUSIC_STOP
MOV A , R0
ANL A , R1
CJNE A , #0FFH , MUSIC_TIME_START
SJMP MUSIC
;*********************************************************
;定时器1初始化
MUSIC_TIME_START:
MOV TH1 , R1
MOV TL1 , R0
SETB TR1
SJMP MUSIC_T_LONG
MUSIC_STOP:
CLR TR1
MUSIC_T_LONG:
CLR A
INC DPTR
MOVC A , @A+DPTR
MOV R7 , A
TIME_VALUE:
ACALL MUSIC_TIME_DELAY ;
DJNZ R7 , TIME_VALUE ;R7 控制节拍延时次数
INC DPTR
LJMP MUSIC_VALUE
;*********************************************************
;定时器1中断服务程序
TIMER1_INT:
MOV TH1 , R1
MOV TL1 , R0
CPL BELL ;晶振发声
RETI
;*********************************************************
;节拍延迟子程序
MUSIC_TIME_DELAY: ; 节拍 延时 187ms
MOV R6 , #02
D2: MOV R5 , #187
D3: MOV R4 , #248
DJNZ R4 , $
DJNZ R5 , D3
DJNZ R6 , D2
RET
;*********************************************************
;倒计时处理子程序 六十进制处理
TIME_COUNTDOWN:
MOV A , 35H
CJNE A , #-1 , COUNTDOWN1
MOV 35H , #9
DEC 34H
COUNTDOWN1:
MOV A , 34H
CJNE A , #-1 , COUNTDOWN2
MOV 34H , #5
DEC 33H
COUNTDOWN2:
MOV A , 33H
CJNE A , #-1 , COUNTDOWN3
MOV 33H , #9
DEC 32H
COUNTDOWN3: RET
;*********************************************************
;7段显示管显示子程序
SHOW: LCALL TIME_COUNTDOWN
CLR W1 ;显示第一个字符
MOV A , 32H
LCALL SHOW1
SETB W1
CLR W2 ;显示第二个字符
MOV A , 33H
LCALL SHOW1
SETB W2
CLR W3 ;显示第三个字符
MOV A , 34H
LCALL SHOW1
SETB W3
CLR W4 ;显示第四个字符
MOV A , 35H
LCALL SHOW1
SETB W4
RET
;*********************************************************
;字符显示子程序
SHOW1: MOV DPTR , #TABLE ;送显示的字符
MOVC A , @A+DPTR
MOV P1 , A
JB W2 , DELAY
CLR P1.7
DELAY: ;延时 1ms 误差 -0.651041666667us
MOV R6 , #66H
DL0: MOV R5 , #03H
DJNZ R5 , $
DJNZ R6 , DL0
SETB P1.7
RET
;*********************************************************
;定时器0 初始化子程序
INTTIMER0: ;基础定时一分钟,改R4的值即可改变
;定时时间 如(R4=5为定时五分钟)
MOV R4 , 30H ;30H单元存放初值
MOV R3 , #60 ;定时一分钟
MOV R2 , #100 ;定时一秒钟
MOV TMOD , #01H
MOV TH0 , #0DCH;利用基础定时的一秒钟显示倒计时效果
MOV TL0 , #00H ;
SETB EA
SETB ET0
SETB TR0
RET
;*********************************************************
;定时器0 中断服务程序
TIMER0_INT:
MOV TH0 , #0DCH
MOV TL0 , #00H
CJNE R2 , #1 , L1
DEC 35H
MOV R2 , #100
CJNE R3 , #1 , L2
MOV R3 , #60
DJNZ R4 , RTN
SETB F0 ;用户标志位 置 1
CLR TR0
AJMP RTN
L2: DEC R3
AJMP RTN
L1: DEC R2
RTN: RETI
;*********************************************************
;待显示字符集
TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH
;音乐音符数据
MUSICTABLE: DB 0FDH , 80H , 03H , 0FDH , 80H , 01H
DB 0FDH , 0C6H , 04H , 0FDH , 80H , 01H
DB 0FEH , 2AH , 04H , 0FEH , 02H , 04H
DB 00H , 00H , 04H
DB 0FDH , 80H , 03H , 0FDH , 80H , 01H
DB 0FDH , 0C6H , 04H , 0FDH , 80H , 04H
DB 0FEH , 5CH , 04H , 0FEH , 2AH , 04H
DB 00H , 00H , 04H
DB 0FDH , 80H , 03H , 0FDH , 80H , 01H
DB 0FEH , 0C0H , 04H , 0FEH , 84H , 04H
DB 0FEH , 2AH , 04H , 0FEH , 02H , 04H
DB 0FDH , 0C6H , 04H
DB 0FEH , 98H , 03H , 0FEH , 98H , 01H
DB 0FEH , 84H , 04H , 0FEH , 2AH , 04H
DB 0FEH , 5CH , 04H , 0FEH , 2AH , 04H
DB 00H , 00H , 04H
DB 0FFH , 0FFH ; 结束码
END
AJMP MAIN
ORG 000BH
LJMP TIMER0_INT
ORG 001BH
LJMP TIMER1_INT
ORG 0030H
SAVE: DB 00H , 00H , 00H , 00H ,00H , 00H ;预留空间备用
MAIN: CLR F0 ;清零用户标志位
MOV 33H , #5H ;默认5分钟倒计时
S1 BIT P2.0 ;标号位地址 便于编程、阅读和接线
S2 BIT P2.1 ;P1口 显示输出
S3 BIT P2.2 ; S?为矩阵键盘列
S4 BIT P2.3
H1 BIT P2.4 ; H?为矩阵键盘行
H2 BIT P2.5
H3 BIT P2.6
H4 BIT P2.7
W1 BIT P0.0 ; W?为矩阵 7段数码管 位选
W2 BIT P0.1
W3 BIT P0.2
W4 BIT P0.3
SETB W1
SETB W2
SETB W3
SETB W4
BELL BIT P3.7
MAIN1: LCALL CHECK_KEYDOWN ;键盘扫描子程序
LCALL TIME_COUNTDOWN_VALUE ;倒计时初值子程序
AJMP MAIN1
;*********************************************************
;子程序 集
;键盘扫描子程序
CHECK_KEYDOWN:
LCALL SHOW ;显示子程序
NOKEY0: MOV P2 , #0FFH ;扫描第一行
CLR H1
LCALL KEYDOWN ;扫描键盘按下子程序
JZ NOKEY1
LCALL SHOW
MOV P2 , #0FFH
CLR H1
LCALL KEYDOWN
JZ NOKEY1
MOV 31H , #00H
LJMP NOKEY4
NOKEY1: MOV P2 , #0FFH ;扫描第二行
CLR H2
LCALL KEYDOWN
JZ NOKEY2
LCALL SHOW
MOV P2 , #0FFH
CLR H2
LCALL KEYDOWN
JZ NOKEY2
MOV 31H , #04H
LJMP NOKEY4
NOKEY2: MOV P2 , #0FFH ;扫描第三行
CLR H3
LCALL KEYDOWN
JZ NOKEY3
LCALL SHOW
MOV P2 , #0FFH
CLR H3
LCALL KEYDOWN
JZ NOKEY3
MOV 31H , #08H
LJMP NOKEY4
NOKEY3: MOV P2 , #0FFH ;扫描第四行
CLR H4
LCALL KEYDOWN
JZ NOKEY4
LCALL SHOW
MOV P2 , #0FFH
CLR H4
LCALL KEYDOWN
JZ NOKEY4
MOV 31H , #0CH
NOKEY4: JB F0 , MUSIC ;用户标志位 为 1 则 播放音乐
JZ CHECK_KEYDOWN
LCALL CHECK ;键盘 列扫描 子程序
ADD A , 31H ;至此可以知道0-F中的哪个键被按
;下键值存A中保存
RET
;*********************************************************
;扫描键盘按下子程序
KEYDOWN: MOV A,P2 ;检查是否有键被按下
ANL A,#0FH ;有键按下A不为0
XRL A,#0FH
RET
;*********************************************************
;键盘 列扫描 子程序
CHECK: CJNE A , #01H , ZERO ;第一列被按下?
MOV A , #00H
LJMP OVER
ZERO: CJNE A , #02H , ONE ;第二列被按下?
MOV A , #01H
LJMP OVER
ONE: CJNE A , #04H , TWO ;第三列被按下?
MOV A , #02H
LJMP OVER
TWO: CJNE A , #08H , OVER ;第四列被按下?
MOV A , #03H
OVER: RET
;*********************************************************
;倒计时初值子程序
TIME_COUNTDOWN_VALUE:
LED0: CJNE A , #00H , LED1 ;30H中存放倒计时时间值
MOV 30H , #5
LJMP LED4
LED1: CJNE A , #01H , LED2
MOV 30H , #10
LJMP LED4
LED2: CJNE A , #02H , LED3
MOV 30H , #20
LJMP LED4
LED3: CJNE A , #03H , LED4
MOV 30H , #60
LED4: MOV A , 30H
LCALL TIME_SHOW ;倒计时初值处理子程序
LCALL INTTIMER0
RET
;*********************************************************
;倒计时初值处理子程序
TIME_SHOW:
MOV B , #10 ;32H存放显示倒计时值分钟的高位
div AB ;33H存放显示倒计时值分钟的低位
MOV 32H , A
MOV 33H , B
RET
;*********************************************************
;音乐播放子程序
MUSIC: MOV TMOD , #10H
SETB EA
SETB ET1
MOV DPTR , #MUSICTABLE
MUSIC_VALUE:
CLR A
MOVC A , @A+DPTR
MOV R1 , A
INC DPTR
CLR A
MOVC A , @A+DPTR
MOV R0 , A
ORL A , R1
JZ MUSIC_STOP
MOV A , R0
ANL A , R1
CJNE A , #0FFH , MUSIC_TIME_START
SJMP MUSIC
;*********************************************************
;定时器1初始化
MUSIC_TIME_START:
MOV TH1 , R1
MOV TL1 , R0
SETB TR1
SJMP MUSIC_T_LONG
MUSIC_STOP:
CLR TR1
MUSIC_T_LONG:
CLR A
INC DPTR
MOVC A , @A+DPTR
MOV R7 , A
TIME_VALUE:
ACALL MUSIC_TIME_DELAY ;
DJNZ R7 , TIME_VALUE ;R7 控制节拍延时次数
INC DPTR
LJMP MUSIC_VALUE
;*********************************************************
;定时器1中断服务程序
TIMER1_INT:
MOV TH1 , R1
MOV TL1 , R0
CPL BELL ;晶振发声
RETI
;*********************************************************
;节拍延迟子程序
MUSIC_TIME_DELAY: ; 节拍 延时 187ms
MOV R6 , #02
D2: MOV R5 , #187
D3: MOV R4 , #248
DJNZ R4 , $
DJNZ R5 , D3
DJNZ R6 , D2
RET
;*********************************************************
;倒计时处理子程序 六十进制处理
TIME_COUNTDOWN:
MOV A , 35H
CJNE A , #-1 , COUNTDOWN1
MOV 35H , #9
DEC 34H
COUNTDOWN1:
MOV A , 34H
CJNE A , #-1 , COUNTDOWN2
MOV 34H , #5
DEC 33H
COUNTDOWN2:
MOV A , 33H
CJNE A , #-1 , COUNTDOWN3
MOV 33H , #9
DEC 32H
COUNTDOWN3: RET
;*********************************************************
;7段显示管显示子程序
SHOW: LCALL TIME_COUNTDOWN
CLR W1 ;显示第一个字符
MOV A , 32H
LCALL SHOW1
SETB W1
CLR W2 ;显示第二个字符
MOV A , 33H
LCALL SHOW1
SETB W2
CLR W3 ;显示第三个字符
MOV A , 34H
LCALL SHOW1
SETB W3
CLR W4 ;显示第四个字符
MOV A , 35H
LCALL SHOW1
SETB W4
RET
;*********************************************************
;字符显示子程序
SHOW1: MOV DPTR , #TABLE ;送显示的字符
MOVC A , @A+DPTR
MOV P1 , A
JB W2 , DELAY
CLR P1.7
DELAY: ;延时 1ms 误差 -0.651041666667us
MOV R6 , #66H
DL0: MOV R5 , #03H
DJNZ R5 , $
DJNZ R6 , DL0
SETB P1.7
RET
;*********************************************************
;定时器0 初始化子程序
INTTIMER0: ;基础定时一分钟,改R4的值即可改变
;定时时间 如(R4=5为定时五分钟)
MOV R4 , 30H ;30H单元存放初值
MOV R3 , #60 ;定时一分钟
MOV R2 , #100 ;定时一秒钟
MOV TMOD , #01H
MOV TH0 , #0DCH;利用基础定时的一秒钟显示倒计时效果
MOV TL0 , #00H ;
SETB EA
SETB ET0
SETB TR0
RET
;*********************************************************
;定时器0 中断服务程序
TIMER0_INT:
MOV TH0 , #0DCH
MOV TL0 , #00H
CJNE R2 , #1 , L1
DEC 35H
MOV R2 , #100
CJNE R3 , #1 , L2
MOV R3 , #60
DJNZ R4 , RTN
SETB F0 ;用户标志位 置 1
CLR TR0
AJMP RTN
L2: DEC R3
AJMP RTN
L1: DEC R2
RTN: RETI
;*********************************************************
;待显示字符集
TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH
;音乐音符数据
MUSICTABLE: DB 0FDH , 80H , 03H , 0FDH , 80H , 01H
DB 0FDH , 0C6H , 04H , 0FDH , 80H , 01H
DB 0FEH , 2AH , 04H , 0FEH , 02H , 04H
DB 00H , 00H , 04H
DB 0FDH , 80H , 03H , 0FDH , 80H , 01H
DB 0FDH , 0C6H , 04H , 0FDH , 80H , 04H
DB 0FEH , 5CH , 04H , 0FEH , 2AH , 04H
DB 00H , 00H , 04H
DB 0FDH , 80H , 03H , 0FDH , 80H , 01H
DB 0FEH , 0C0H , 04H , 0FEH , 84H , 04H
DB 0FEH , 2AH , 04H , 0FEH , 02H , 04H
DB 0FDH , 0C6H , 04H
DB 0FEH , 98H , 03H , 0FEH , 98H , 01H
DB 0FEH , 84H , 04H , 0FEH , 2AH , 04H
DB 0FEH , 5CH , 04H , 0FEH , 2AH , 04H
DB 00H , 00H , 04H
DB 0FFH , 0FFH ; 结束码
END
已退回4积分