单片机 音乐程序编写 歌曲《小星星》

歌曲《小星星》1155665-4433221-5544332-5544332-1155665-4433221-要求编写出的程序能够让单片机的喇叭按着这些个节奏响。要是可以... 歌曲《小星星》
11 55 66 5-
44 33 22 1-
55 44 33 2-
55 44 33 2-
11 55 66 5-
44 33 22 1-
要求编写出的程序能够让单片机的喇叭按着这些个节奏响。
要是可以的话,另外再写一个能够即响喇叭又能够根据节奏闪烁 LED灯(那种八个led灯的)的程序。
注,不是C语言程序,是单片机程序,大神谢谢你啦!
展开
 我来答
tingtinga8
推荐于2017-10-10 · TA获得超过216个赞
知道答主
回答量:85
采纳率:0%
帮助的人:98.9万
展开全部

只有音乐发声汇编程序,没有加入LED灯,供参考。数据代码已改为小星星发声

;**********************************************

ORG 0000H

SJMP MAIN

ORG 0BH

AJMP TIME0


;*************主程序************************


MAIN: MOV SP,#60

MOV TMOD,#01H ;T0定时工作方式

MOV IE,#82H ;CPU 中断允许,T0中断允许


START0: MOV 30H,#00H ;TABLE 相对地址指针

NEXT: MOV A,30H

  MOV DPTR,#TABLE ;到TABLE处取 简谱码  节拍 码

MOVC A,@A+DPTR

MOV R2,A ;取到的简谱码  节拍码 暂存于R2中


JZ ENDF ;取到 00 结束

ANL A,#0FH ;否,取低四位 节拍 码

MOV R5,A ;将节拍码存于R5中

MOV A,R2 ;简谱码  节拍 码 给A

SWAP A ;高4位 与 低4位 交换

ANL A,#0FH ;取简谱 码

JNZ SING ;取到的简谱 码不是0,则去发声

CLR TR0 ;取到0 则不发声

SJMP DLY1 ;节拍延时子程序( 随节拍码变化,延时时间不同)


;---------------发声-----------------------

SING: DEC A ;取到的简谱码减1 

;(简谱码计数值16位数据存储首地址从TABLE1 《相对地址》0处开始放起,所以要减1)

MOV 22H,A ;存入(22H)中

RL A ;乘2 因为取的数据占两字节(16位)

;所以指针增加量要乘2


MOV DPTR,#TABLE1

;...........简谱码转换为相应定时器16位计数值.............

MOVC A,@A+DPTR ;到TABLE1取相应的高字节计数值

MOV TH0,A ;高字节计数值存入TH0和(21H)中

MOV 21H,A

MOV A,22H ;减1的简谱码给A

RL A ;乘2 因为取的数据占两字节(16位)

;所以指针增加量要乘2

INC A ;A 增加 取下一个字节计数值


;...........简谱码转换为相应定时器16位计数值.............

MOVC A,@A+DPTR ;到TABLE1取相应的低字节计数值

MOV TL0,A ;低字节计数值存入TL0和(20H)中

MOV 20H,A

SETB TR0 ;启动T0定时器让喇叭发出不同频率声音


;---------------节拍延时-------------------

DLY1: ACALL DELAY ;基本单位时间为1/4拍 187ms

INC 30H ;取下一个简谱码  节拍 码

SJMP NEXT


;---------------歌放完结束---------------

ENDF: CLR TR0 ;关闭T0定时器

AJMP START0 ;反复循环



;****T0中断子程序(用来驱动喇叭发出不同频率声音)**************

TIME0: PUSH ACC

PUSH PSW

MOV TL0,20H ;重装计数值

MOV TH0,21H

CPL P3.7 ;驱动发声

POP PSW

POP ACC

RETI



;******************节拍延时187ms****************************

DELAY: MOV R7,#187 ;187ms延时子程序

DLY2: MOV R4,#02

DLY3: MOV R3,#248

DJNZ R3,$

DJNZ R4,DLY3

DJNZ R7,DLY2

DJNZ R5,DELAY

RET



;*******音符T值表(用来让定时器发出不同的频率)**DW 表示一个 计数值 占两个字节存储单元***************


TABLE1: DW 64260,64400,64524,64580,64684 ;低音SO 低音LA 低音SI  /中音DO 中音RE 

DW 64777,64820,64898,64968,65030 ;中音MI 中音FA 中音SO 中音LA 中音SI

DW 65058,65110,65157,65178,65217 ;高音DO 高音RE 高音MI 高音FA 高音SO



;*********简谱码  节拍码(高4位简谱码 ,低4位节拍码)*************


TABLE: DB 44H,44H,84H,84H   ; 1 1 5 5        

DB 094H,094H,88h                    ; 6 6 5 -        


DB 74H,74H,63H,63H                ;  4 4 3 3 

DB 52H,52H,48h                        ;  2 2 1-


DB 84H,84H,74H,74H                 ; 5 5 4 4

DB 64H,64H,58h                         ; 3 3 2-


DB 84H,84H,74H,74H                 ; 5 5 4 4

DB 64H,64H,58h                         ; 3 3 2-


DB 44H,44H,84H,84H                 ; 1 1 5 5         

DB 094H,094H,88h                     ; 6 6 5 -    


DB 74H,74H,63H,63H                 ;  4 4 3 3 

DB 52H,52H,48h                         ;  2 2 1-


END




加入了LED灯,水平有限,效果有点不太好

;**********************************************

ORG 0000H

SJMP MAIN

ORG 0BH

AJMP TIME0


;*************主程序************************


MAIN: MOV SP,#60

MOV TMOD,#01H ;TO定时工作方式

MOV IE,#82H ;CPU 中断允许,TO中断允许


START0: MOV 30H,#00H ;TABLE 相对地址指针

NEXT: MOV A,30H

  MOV DPTR,#TABLE ;到TABLE处取 简谱码  节拍 码

MOVC A,@A+DPTR

MOV R2,A ;取到的简谱码  节拍码 暂存于R2中


JZ ENDF ;取到 00 结束

ANL A,#0FH ;否,取低四位 节拍 码

MOV R5,A ;将节拍码存于R5中

MOV A,R2 ;简谱码  节拍 码 给A

SWAP A ;高4位 与 低4位 交换

ANL A,#0FH ;取简谱 码

JNZ SING ;取到的简谱 码不是0,则去发声

CLR TR0 ;取到0 则不发声

SJMP DLY1 ;节拍延时子程序( 随节拍码变化,延时时间不同)


;---------------发声-----------------------

SING: DEC A ;取到的简谱码减1 

;(简谱码计数值16位数据存储首地址从TABLE1 《相对地址》0处开始放起,所以要减1)

MOV 22H,A ;存入(22H)中

RL A ;乘2 因为取的数据占两字节(16位)

;所以指针增加量要乘2


MOV DPTR,#TABLE1

;...........简谱码转换为相应定时器16位计数值.............

MOVC A,@A+DPTR ;到TABLE1取相应的高字节计数值

MOV TH0,A ;高字节计数值存入TH0和(21H)中

MOV 21H,A

MOV A,22H ;减1的简谱码给A

RL A ;乘2 因为取的数据占两字节(16位)

;所以指针增加量要乘2

INC A ;A 增加 取下一个字节计数值


;...........简谱码转换为相应定时器16位计数值.............

MOVC A,@A+DPTR ;到TABLE1取相应的低字节计数值

MOV TL0,A ;低字节计数值存入TL0和(20H)中

MOV 20H,A

SETB TR0 ;启动T0定时器让喇叭发出不同频率声音


;---------------节拍延时-------------------

DLY1: ACALL DELAY ;基本单位时间为1/4拍 187ms

INC 30H ;取下一个简谱码  节拍 码


CPL P1.0   LED灯 闪烁

CPL P1.1  

CPL P1.2

CPL P1.3

CPL P1.4

CPL P1.5

CPL P1.6

CPL P1.7


SJMP NEXT


;---------------歌放完结束---------------

ENDF: CLR TR0 ;关闭T0定时器

AJMP START0 ;反复循环



;****T0中断子程序(用来驱动喇叭发出不同频率声音)**************

TIME0: PUSH ACC

PUSH PSW

MOV TL0,20H ;重装计数值

MOV TH0,21H

CPL P3.7 ;驱动发声

POP PSW

POP ACC

RETI



;******************节拍延时187ms****************************

DELAY: MOV R7,#187 ;187ms延时子程序

DLY2: MOV R4,#02

DLY3: MOV R3,#248

DJNZ R3,$

DJNZ R4,DLY3

DJNZ R7,DLY2

DJNZ R5,DELAY

RET



;*******音符T值表(用来让定时器发出不同的频率)**DW 表示一个 计数值 占两个字节存储单元***************


TABLE1: DW 64260,64400,64524,64580,64684 ;低音SO 低音LA 低音SI  /中音DO 中音RE 

DW 64777,64820,64898,64968,65030 ;中音MI 中音FA 中音SO 中音LA 中音SI

DW 65058,65110,65157,65178,65217 ;高音DO 高音RE 高音MI 高音FA 高音SO



;*********简谱码  节拍码(高位简谱码 ,低位节拍码)*************


TABLE: DB 44H,44H,84H,84H   ; 1 1 5 5        

DB 094H,094H,88h ; 6 6 5 -        -表示有节拍


DB 74H,74H,63H,63H ;  4 4 3 3 

DB 52H,52H,48h ;  2 2 1-


DB 84H,84H,74H,74H ; 5 5 4 4

DB 64H,64H,58h ; 3 3 2-


DB 84H,84H,74H,74H ; 5 5 4 4

DB 64H,64H,58h ; 3 3 2-


DB 44H,44H,84H,84H   ; 1 1 5 5         

DB 094H,094H,88h ; 6 6 5 -    


DB 74H,74H,63H,63H ;  4 4 3 3 

DB 52H,52H,48h ;  2 2 1-


END


机年90
2020-03-30
知道答主
回答量:1
采纳率:0%
帮助的人:627
展开全部
要把想小星星的歌剧改成英语剧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式