51单片机设计闹钟时,在闹钟到时后,如何编写音乐子程序。

czh5880 2009-09-22 02:01:18
我设计了一个闹钟,闹钟到时后播放音乐,但这个音乐播放后如何返回主程序呢?
...全文
1051 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxdplxd 2011-07-29
  • 打赏
  • 举报
回复
Z0 EQU 255

L1 EQU 0
L2 EQU 1
L3 EQU 2
L4 EQU 3
L5 EQU 4
L6 EQU 5
L7 EQU 6

M1 EQU 7
M2 EQU 8
M3 EQU 9
M4 EQU 10
M5 EQU 11
M6 EQU 12
M7 EQU 13

H1 EQU 14
H2 EQU 15
H3 EQU 16
H4 EQU 17
H5 EQU 18
H6 EQU 19
H7 EQU 20

S1 EQU 21


DELAY EQU 30H ; 节拍的延时
VOICE EQU 31H ; 音符

; Counters
SongFlag equ 36h
sptr equ 37h ;
i equ 38h ;
J equ 39h ;
;interface of Play()
SONGH EQU 40H
SONGL EQU 41H
TIMEH EQU 42H
TIMEL EQU 43H
SIZE EQU 44H

;.....................................................
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP TIMER0
ORG 001BH
AJMP TIMER1
;.....................................................
ORG 0030H
MAIN:
MOV IE,#00H ; Close Interrupt
MOV SP,#60H ; Set Stack Pionter SP = 40h
MOV P1,#00H ; Clean P1

; 初始化 Timers
MOV TMOD, #11H ; 都工作在方式1
SETB EA
SETB ET0
SETB ET1

mov sptr,#0
WAITING:
MOV DPTR,#Song
mov SONGH,dph
mov SONGL,dpl
MOV DPTR,#time
mov TIMEH,dph
mov TIMEL,dpl
mov a , TIMEL
clr c
subb a, SONGL
mov SIZE,a
ACALL Play

MOV DPTR,#SONG_0
mov SONGH,dph
mov SONGL,dpl
MOV DPTR,#CTIME_0
mov TIMEH,dph
mov TIMEL,dpl
mov a , TIMEL
clr c
subb a, SONGL
mov SIZE,a
ACALL Play

MOV DPTR,#SONG_1
mov SONGH,dph
mov SONGL,dpl
MOV DPTR,#CTIME_1
mov TIMEH,dph
mov TIMEL,dpl
mov a , TIMEL
clr c
subb a, SONGL
mov SIZE,a
ACALL Play

AJMP WAITING

Play: ; Input SONGH , SONGL , TIMEH, TIMEL ,SIZE
MOV sptr,#0
CLR TR0
Play_01:
MOV DPH,SONGH
MOV DPL,SONGL
MOV A,sptr
MOVC A,@A+DPTR

MOV VOICE ,A

MOV DPH,TIMEH
MOV DPL,TIMEL
MOV A,sptr
MOVC A,@A+DPTR
MOV DELAY,A
MOV A,#10h
CLR C
SUBB A,DELAY
ANL A,#0FH
INC A
MOV DELAY ,A

INC sptr

MOV A,sptr
CJNE A,SIZE,PLAY_CONTINUE
MOV P1,#0
RET
PLAY_CONTINUE:
MOV SongFlag,#0
MOV TH0,#0EFH
MOV TL0,#0E0H
SETB TR0
PLAY_wwwS:
MOV A,SongFlag
CJNE A,#1,PLAY_wwwS
AJMP Play_01

TIMER0:
PUSH A
CLR TR0
CPL P1.3
MOV TH0,#0C2H
MOV TL0,#0F7H

DJNZ DELAY,timer0_01
MOV SongFlag,#1
CLR TR0
CLR P1.3
timer0_01:
MOV A,VOICE
CJNE A,#0,timer0_02 ; 是否是休止符
CLR TR1 ; 是 则 clear TR1
AJMP timer0_03
timer0_02:
SETB TR1 ; 不是则 set TR1
timer0_03:
SETB TR0
POP A
RETI
;......................................
TIMER1:
PUSH A
push dpl
push dph
CLR TR1
MOV DPTR , #Ttable
MOV A, VOICE
RL A
ANL A,#0FEH
MOV J, A

MOVC A,@A+DPTR
MOV TH1,A
MOV A,J
INC A
MOVC A,@A+DPTR
MOV TL1,A
CPL P1.7
CPL P1.6
CPL P1.5
CPL P1.4

SETB TR1
pop dph
pop dpl
POP A
RETI
Ttable: DB 0F8H, 08BH , 0F9H, 05BH , 0FAH, 014H , 0FAH, 06BH ,
DB 0FBH, 004H , 0FBH, 08FH , 0FCH, 00BH , 0FCH, 045H ,
DB 0FCH, 0ADH , 0FDH, 00AH , 0FDH, 033H , 0FDH, 082H ,
DB 0FDH, 0C7H , 0FEH, 003H , 0FEH, 021H , 0FEH, 056H ,
DB 0FEH, 084H , 0FEH, 099H , 0FEH, 0C0H , 0FEH, 0E3H ,
DB 0FFH, 001H , 0FFH, 010H ,
; 《 Yesterday Once More 》、 《你的样子》
Song :
DB M5,M3,M1,M1,M1,M2,M3,M5,M5,M3,M5,M3
DB M6,M5,M5,M2,M3,M3,M5,M6,M7,M3,M5,M5
DB M6,M6,M6,M3,M5,M6,H3,H2,H1,M6
DB M7,M5,M3,M5,M3,M2,M2,M2
DB L7,M2,L6,L5,L5,M1,M1,M2,M3,M5,M5,M5,M3,M5,M3
DB M6,M5,M2,M3,M3,M5,M6,M7,M3,M5,M5
DB M6,M6,M7,H2,H1,M7,M7,M6,M6,M6,M7
DB H1,M7,M7,M6,M6,M7,H1,H1,M6,H1,M6
DB H2,H2,H1,H2,H3,H3,H3,H3,H3,H2,H1

DB M7,H1,M7,M6,M6,M3,M5,M5,M5,M5,M5,M5,M5,M5,H1,H2
DB H3,H3,H3,H3,H3,H2,H1,M7,H1,M7,M6,M6,M3,M5
DB M5,M5,M5,M5,M5,M5,M5,M6,M7,H1,M7,H1,H2,H1,M7
DB H1,M7,H1,H2,H1,H2,H3,H3,H2,H1,M6
DB M6,Z0,M3,M3,M6,M3,M5,M5,M5,M5,M5
DB M5,M5,M2,M3,M2,M2,M1,M2,M3,M3,M3,M3
DB M2,M2,M5,M5,H1,H2
DB H3,H3,H3,H3,H3,H2,H1,M7,H1,M7,M6,M6,M3,M5
DB M5,M5,M5,M5,M5,M5,M5,H1,H2,H3,H3,H3,H3,H3,H2,H1
DB M7,H1,M7,M6,M6,M3,M5,M5,M5,M5,M5
time :
DB 2 ,2 ,4 ,4 ,4 ,4 ,3, 4 ,4 ,4 ,4 ,4
DB 4 ,4 ,4 ,4 ,2 ,4 ,4 ,2 ,2 ,4 ,4 ,4
DB 2 ,2 ,2 ,4 ,4 ,2 ,2 ,4 ,2 ,4
DB 3 ,4 ,4 ,2 ,4 ,2 ,2 ,2
DB 4 ,4 ,4 ,4 ,4 ,4 ,4 ,4 ,4 ,2 ,4 ,4 ,4 ,4 ,4
DB 4 ,2 ,4 ,2 ,4 ,4 ,2 ,2 ,4 ,2 ,4
DB 2 ,2 ,2 ,2 ,4 ,2 ,4 ,2 ,4 ,8 ,8
DB 4 ,2 ,4 ,2 ,4 ,4 ,2 ,2 ,4 ,2 ,4
DB 2 ,2 ,2 ,2 ,4 ,4 ,4 ,4 ,2 ,4 ,4

DB 4 ,4, 4 ,4, 2 ,4 ,4 ,2 ,2 ,2 ,2, 2, 2 ,2, 4, 4
DB 4 ,4 ,4 ,4 ,2 ,4 ,4 ,4, 4 ,4 ,4 ,2 ,4 ,4
DB 2 ,2 ,2 ,2 ,2 ,2 ,2 ,4 ,4 ,4 ,4 ,4 ,3 ,4 ,4
DB 4 ,4 ,4 ,3 ,4 ,4 ,2 ,2 ,4 ,2 ,4
DB 2 ,4 ,4 ,4 ,4 ,4 ,4 ,2 ,2 ,2 ,2
DB 2 ,4 ,4 ,4 ,8 ,8 ,4 ,4 ,2 ,2 ,2 ,2
DB 2 ,2 ,2 ,2 ,2 ,2
DB 4 ,4 ,4 ,4 ,2 ,4 ,4 ,4 ,4 ,4 ,4 ,2 ,4 ,4
DB 2 ,2 ,2 ,2 ,2 ,2 ,2 ,4 ,4 ,4 ,4 ,4 ,4 ,2 ,4 ,4
DB 4 ,4 ,4 ,4 ,2 ,4 ,4 ,2 ,2 ,2 ,2
SONG_0:
DB Z0,Z0,Z0,Z0,M3,M6,M6,M6,M6,M6,M5,M6,M7,M6,M6,M6,M6
DB M5,M3,M3,M3,M3,M3,M2,M3,M3,Z0,M3,M6,M6,M6,M6,M6,M5,M6,M7,M6,M6,M6,M6
DB M5,M3,M3,M3,M3,M3,M2,M3,M3,M5,M3,M2,M2,M2,M2,M3,M2,M1,M3,M5,Z0,M3
DB M7,M6,M6,M6,M6,M7,M6,M5,M5,M3,Z0,M5,M3,M2,M2,M2,M2,M3,M2,M1,M3,L7,L7,L7,L7,L7,L5
DB L6,L6,L6,L6,L5,L6,L7,L6,L6,Z0,M3,M6,M6,M6,M6,M6,M5,M6,M7,M6,M6,M6,M6
DB M5,M3,M3,M3,M3,M3,M2,M3,M3,Z0,M3,M6,M6,M6,M6,M6,M6,M5,M6,M7,M6,M6,M6,M6,M6
DB M5,M3,M3,M3,M3,M3,M2,M3,M3,M5,M3,M2,M2,M2,M2,M3,M2,M1,M3,M5,Z0,M3
CTIME_0:
DB 2 ,2 ,2 ,3 ,8 ,4 ,4 ,4 ,8 ,8 ,8 ,8 ,8 ,8 ,4 ,8 ,8
DB 8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,1 ,8 ,8 ,4 ,4 ,4 ,8 ,8 ,8 ,8 ,8 ,8 ,4 ,8 ,8
DB 8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,1 ,8 ,8 ,4 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,4 ,4 ,8
DB 8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,4 ,4 ,8 ,8 ,4 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,4 ,8 ,8 ,8 ,8 ,8
DB 8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,3 ,8 ,8 ,4 ,4 ,4 ,8 ,8 ,8 ,8 ,8 ,8 ,4 ,8 ,8
DB 8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,3 ,8 ,8 ,4 ,4 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8
DB 8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,3 ,8 ,8 ,4 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,4 ,4 ,8
SONG_1:
DB M7,M6,M6,M6,M6,M7,M6,M5,M5,M3,Z0,M5,M3,M2,M2,M2,M2,M3,M2,M1,M3,L7,L7,L7,L7,L7,L5
DB L6,L6,L6,L6,L5,L6,L7,L6,L6,L6,H1,M7,M6,M3,M3,M6,M6,M5,M3,M3,M2,M1,M2,M3,M3,M3
DB M6,M5,M3,M2,M3,M3,M1,M2,M3,M3,M2,M1,M2,L7,L7,L7,H1,M7,M6,M3,M3,M6,M6,M5
DB M3,M3,M2,M1,M2,M3,M3,M3,M6,M5,M3,M2,M3,M3,M1,M2
DB M3,M3,M2,M1,M2,L7,L7,M3,M3,M3,M3,M3,M3,M3,M3,M3
CTIME_1:
DB 8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,4 ,4 ,8 ,8 ,4 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,4 ,8 ,8 ,8 ,8 ,8
DB 8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,2 ,2 ,2 ,8 ,8 ,2 ,8 ,8 ,8 ,8 ,4 ,8 ,8 ,8 ,4 ,8 ,2 ,2
DB 1 ,8 ,8 ,8 ,3 ,4 ,8 ,8 ,4 ,8 ,8 ,8 ,4 ,8 ,2 ,2 ,1 ,8 ,8 ,2 ,8 ,8 ,8 ,8
DB 4 ,8 ,8 ,8 ,4 ,8 ,2 ,2 ,1 ,8 ,8 ,8 ,4 ,4 ,8 ,8
DB 4 ,8 ,8 ,8 ,4 ,8 ,1 ,8 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2

END
quilt1120p 2011-07-28
  • 打赏
  • 举报
回复
同时用两个定时器,一个设置时间,一个设置频率
iamsheldon 2011-07-28
  • 打赏
  • 举报
回复
发现,现在问问题水平有点低
phoenix103 2011-07-28
  • 打赏
  • 举报
回复
通过一个IO,以一定频率给喇叭发电平,则喇叭会出一个声音,估计这是楼主不解的地方吧,做单片机这些东西,软硬结合才行。
xdhebin0 2011-07-26
  • 打赏
  • 举报
回复
。。。音乐子程序放在后台运行就可以了,最好不要放中断容易出现中断嵌套。C里面函数会自动返回,汇编里面可以使用CALL之类的语句跳转回去。
用户 昵称 2011-07-26
  • 打赏
  • 举报
回复
怎么闹的时钟,就怎么闹音乐啊。
zls_qiji 2011-07-26
  • 打赏
  • 举报
回复
通过AD\DA来解释PWM格式音频文件就可以了,喇叭是少不了的,硬件上加个功放。
s021713 2011-07-22
  • 打赏
  • 举报
回复
用3个定时器的单片机来实现,两个定时器用来产生音乐(网上有程序),一个定时器用来做时钟
LUO20102011 2011-07-22
  • 打赏
  • 举报
回复
你们好,请问闹钟数据设置存储在哪里?和时钟一样存在DS1302?
qykgwgbs 2011-07-09
  • 打赏
  • 举报
回复
显示问题
cadcjl 2011-05-31
  • 打赏
  • 举报
回复
可以写一个中断程序啊,就是说到一定的时间,调用这个音乐程序,然后调用结束后返回,这样就返回主程序了。
我以前接触过一点音乐方面的东西,感觉难度比较大。因为你要对每个音节都要熟悉,然后用定时器输出一定占空比的方波来模拟这个音节。。。。
chailiyh 2011-05-30
  • 打赏
  • 举报
回复
isd模块,还能反复录音....貌似20块一个
ASDXB_123 2011-05-27
  • 打赏
  • 举报
回复
很不错
Anjal2010 2011-03-11
  • 打赏
  • 举报
回复
中断定时啊!
shuwang1234 2011-03-10
  • 打赏
  • 举报
回复
要想实现音乐播放功能,可用定时器来做,每个音符对应的频率不一样,利用定时器输出不同频率的方波,就能驱动蜂鸣器发出音乐了.
如果要做的更好,就要用音频芯片了!
不知道说得对不?
hydys 2011-03-07
  • 打赏
  • 举报
回复
路人丁 音符 这个东西如果只用喇叭和单片机实现还是有相当的难度啊
每个音符频率和音长不同 通过调节 可以做出来不过这个难度 如C2 这个音 频率为65
wslzq 2011-02-15
  • 打赏
  • 举报
回复
闹钟到时,标志位置1,音乐程序判断到标志位为1后开始执行,执行完将标志位置0,主程序照常
nsy7758258 2011-02-14
  • 打赏
  • 举报
回复
不明白
bailingniaolll 2011-01-13
  • 打赏
  • 举报
回复
我也想知道怎么返回啊~~~~~~~~~~~
splendid08 2010-03-05
  • 打赏
  • 举报
回复
路人乙!!!!!!!!!!!!!
加载更多回复(10)

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧