51单片机汇编语言教程:28课音乐程序设计
革命歌曲演奏程序《汇编语言程序设计》课程设计报告
革命歌曲演奏程序《汇编语言程序设计》课程设计报告题目: 革命歌曲演奏程序初始条件:理论:学完“汇编语言程序设计”、“课程计算机概论”、“高级语言程序设计”和“数字逻辑”。
实践:计算机学院科学系实验中心提供计算机和软件平台。
如果自己有计算机可以在其上进行设计。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)编写用键盘选择计算机演奏歌曲的程序,歌曲清单至少包括3首。
(2)程序应有操作提示、输入和输出,界面追求友好,最好是菜单式的界面。
(3)设计若干用例(测试数据),上机测试程序并分析(评价)所设计的程序。
(4)设计报告格式按附件要求书写。
课程设计报告书正文的内容应包括:在正文第一行写课程设计题目;1.需求说明(要求、功能简述)或问题描述;2.设计说明(简要的分析与概要设计);3.详细的算法描述;4.源程序与执行结果(含测试方法和测试结果);5.使用说明;6.总结,包括设计心得(设计的特点、不足、收获与体会)和展望(该程序进一步改进扩展的设想)。
时间安排:设计时间一周:周1:查阅相关资料。
周2:系统分析,设计。
周3~4:编程并上机调试周5:撰写课程设计报告。
设计验收安排:21周星期五8:00起到计算机学院科学系实验中心进行上机验收。
设计报告书收取时间:21周的星期五下午5:00之前。
指导教师签名: 2007年1月18日系主任(或责任教师)签名: 2007年1月 18日革命歌曲演奏程序1 需求说明这次《汇编语言程序设计》课程设计要求通过一个较大型实用程序的设计与实现,综合运用所学知识,加深理解和掌握。
同时培养学生分析问题和解决问题的能力,以及自学能力。
我选择的题目是《革命歌曲演奏程序》,要求完成的主要任务有:(5)编写用键盘选择计算机演奏歌曲的程序,歌曲清单至少包括3首。
(6)程序应有操作提示、输入和输出,界面追求友好,最好是菜单式的界面。
(7)设计若干用例(测试数据),上机测试程序并分析(评价)所设计的程序。
单片机音乐课程设计
单片机音乐课程设计一、课程目标知识目标:1. 让学生掌握单片机的基本原理和编程方法,理解音乐信号产生的机理;2. 培养学生运用单片机实现音乐播放的基本技能,了解音符、节奏与编程之间的关系;3. 使学生掌握音乐基础知识,如音阶、音名、节拍等,并能将其运用到单片机音乐编程中。
技能目标:1. 培养学生动手操作能力,能独立完成单片机音乐编程和电路连接;2. 培养学生运用所学知识解决实际问题的能力,如设计具有一定音乐效果的程序;3. 提高学生的团队协作能力,通过分组合作完成课程设计任务。
情感态度价值观目标:1. 培养学生对单片机编程的兴趣和热情,激发其创新精神;2. 培养学生积极向上的学习态度,勇于面对挑战,不断探索新知识;3. 增强学生的集体荣誉感,培养其团结协作、互相帮助的品质。
本课程针对高年级学生,结合单片机技术和音乐知识,旨在提高学生的编程技能和实际操作能力。
通过本课程的学习,使学生能够将所学的单片机知识与音乐相结合,创作出具有个性化的音乐作品,培养学生的创新思维和团队协作能力。
同时,注重学生情感态度的培养,使其在学习过程中始终保持积极、主动的态度,为未来的学习和生活打下坚实基础。
二、教学内容1. 单片机基础理论:介绍单片机的组成、工作原理,重点讲解内部结构、指令系统、编程方法等;2. 音乐基础知识:讲解音阶、音名、节拍等基本概念,分析音乐信号产生的机理;3. 单片机音乐编程:结合教材相关章节,教授如何编写音乐播放程序,包括音符、节奏的控制;4. 电路设计与连接:指导学生设计音乐播放电路,学会使用相关电子元器件,完成电路连接;5. 实践操作:分组进行实际操作,让学生动手编写音乐程序,调试并优化程序;6. 创新设计:鼓励学生发挥创意,设计具有一定音乐效果的程序,展示个人作品;7. 团队协作:组织学生分组合作,共同完成课程设计任务,培养学生的团队协作能力。
教学内容按照教材章节进行安排,结合课程目标,注重理论与实践相结合。
51单片机汇编语言教程:28课音乐程序设计
51单片机汇编语言教程:第28课-音乐程序设计下面给出程序序清单,可直接在TD-III型学习机上演奏,对其它不一样型号的学习机,只需对应地改变一下地址即可。
本程序演奏的是民歌“八月桂花遍地开”,C调,节奏为94拍/分。
读者也能自行找出一首歌,按表1和表2给定的常数,将乐曲翻译成码表输入机器,而程序不变。
本实验办法简便,即使不懂音乐的人,将一首陌生的曲子翻译成代码也是易事,和着机器的演奏学唱一首歌曲,其趣味无穷。
程序清单(略,请参看源程序的说明)。
程序框图如图2所示。
<单片机音乐程序的设计图>本课由单片机教程网提供,有问题指出.硬件连接说明:随便找一个仿真机或者什么单片机实验板,只要能工作的就行,将程序输入,运行,然后找个音箱(你计算机旁边应当就有一对吧)拨出插头,插头的前端接在P1。
0上,后面部分找根线接单片机的地,就应当有声了,然后怎么改进硬件连接就是你的事了。
音乐程序汇编代码代码1-------------Voice.asm--------------------------ORG0000HLJMP STARTORG000BHINC20H;中断服务,中断计数器加1MOV TH0,#0D8HMOV TL0,#0EFH;12M晶振,形成10毫秒中断RETISTART:MOV SP,#50HMOV TH0,#0D8HMOV TL0,#0EFHMOV TMOD,#01HMOV IE,#82HMUSIC0:NOPMOV DPTR,#DAT;表头地址送DPTRMOV20H,#00H;中断计数器清0MOV B,#00H;表序号清0MUSIC1:NOPCLR AMOVC A,@A+DPTR;查表取代码JZ END0;是00H,则结束CJNE A,#0FFH,MUSIC5LJMP MUSIC3MUSIC5:NOPMOV R6,AINC DPTRMOV A,BMOVC A,@A+DPTR;取节拍代码送R7MOV R7,ASETB TR0;启动计数MUSIC2:NOPCPL P1.0MOV A,R6MOV R3,ALCALL DELMOV A,R7CJNE A,20H,MUSIC2;中断计数器(20H)=R7否?;不等,则继续循环MOV20H,#00H;等于,则取下一代码INC DPTR;INC BLJMP MUSIC1MUSIC3:NOPCLR TR0;休止100毫秒MOV R2,#0DHMUSIC4:NOPMOV R3,#0FFHLCALL DELDJNZ R2,MUSIC4INC DPTRLJMP MUSIC1END0:NOPMOV R2,#64H;歌曲结束,延时1秒后继续MUSIC6:MOV R3,#00HLCALL DELDJNZ R2,MUSIC6LJMP MUSIC0DEL:NOPDEL3:MOV R4,#02HDEL4:NOPDJNZ R4,DEL4NOPDJNZ R3,DEL3RETNOPDAT:db26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h db30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h db20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h db30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h db30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h db2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h db20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h db20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h db20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h db20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h db18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h db30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h db39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h db20h,10h,2bh,10h,26h,30h,30h,80h,00HEND音乐程序汇编代码代码2-------------Voice1.asm--------------------------;标题'八月桂花香'发声程序;摘要详见'无线电'92年3期;作者周振安ORG0000HLJMP STARTORG000BHINC20H;中断服务,中断计数器加1MOV TH0,#0D8HMOV TL0,#0EFH;12M晶振,形成10毫秒中断RETISTART:MOV SP,#50HMOV TH0,#0D8HMOV TL0,#0EFHMOV TMOD,#01HMOV IE,#82HMUSIC0:NOPMOV DPTR,#DAT;表头地址送DPTRMOV20H,#00H;中断计数器清0MOV B,#00H;表序号清0MUSIC1:NOPCLR AMOVC A,@A+DPTR;查表取代码JZ END0;是00H,则结束CJNE A,#0FFH,MUSIC5LJMP MUSIC3MUSIC5:NOPMOV R6,AINC DPTRMOV A,BMOVC A,@A+DPTR;取节拍代码送R7MOV R7,ASETB TR0;启动计数MUSIC2:NOPCPL P1.0MOV A,R6MOV R3,ALCALL DELMOV A,R7CJNE A,20H,MUSIC2;中断计数器(20H)=R7否?;不等,则继续循环MOV20H,#00H;等于,则取下一代码INC DPTR;INC BLJMP MUSIC1MUSIC3:NOPCLR TR0;休止100毫秒MOV R2,#0DHMUSIC4:NOPMOV R3,#0FFHLCALL DELDJNZ R2,MUSIC4INC DPTRLJMP MUSIC1END0:NOPMOV R2,#64H;歌曲结束,延时1秒后继续MUSIC6:MOV R3,#00HLCALL DELDJNZ R2,MUSIC6LJMP MUSIC0DEL:NOPDEL3:MOV R4,#02HDEL4:NOPDJNZ R4,DEL4NOPDJNZ R3,DEL3RETNOPDAT:DB18H,30H,1CH,10HDB20H,40H,1CH,10HDB18H,10H,20H,10HDB1CH,10H,18H,40HDB1CH,20H,20H,20HDB1CH,20H,18H,20HDB20H,80H,0FFH,20HDB30H,1CH,10H,18HDB20H,20H,20H,26H DB40H,20H,20H,2BH DB20H,26H,20H,20H DB20H,30H,80H,0FFH DB20H,20H,1CH,10H DB18H,10H,20H,20H DB26H,20H,2BH,20H DB30H,20H,2BH,40H DB20H,20H,1CH,10H DB18H,10H,20H,20H DB26H,20H,2BH,20H DB30H,20H,2BH,40H DB20H,30H,1CH,10H DB18H,20H,15H,20H DB1CH,20H,20H,20H DB26H,40H,20H,20H DB2BH,20H,26H,20H DB20H,20H,30H,80H DB20H,30H,1CH,10H DB20H,10H,1CH,10H DB20H,20H,26H,20H DB2BH,20H,30H,20H DB2BH,40H,20H,15H DB1FH,05H,20H,10H DB1CH,10H,20H,20H DB26H,20H,2BH,20H DB30H,20H,2BH,40H DB20H,30H,1CH,10H DB18H,20H,15H,20HDB26H,40H,20H,20HDB2BH,20H,26H,20HDB20H,20H,30H,30HDB20H,30H,1CH,10HDB18H,40H,1CH,20HDB20H,20H,26H,40HDB13H,60H,18H,20HDB15H,40H,13H,40HDB18H,80H,00Hend51实验板推荐(点击下面的图片可以进入下载资料链接)HJ-1G HJ-3G。
51单片机汇编程序设计PPT课件
5、赋值伪指令
格式汇编指令
格式: END END指示源程序到结束,常将其放在汇编语言源 程序的末尾。
3.3.3 汇编语言程序设计过程
1、分析任务,确定算法或解题思路 2、根据算法和解决思路画出程序流程图 流程图是由一些框图和流程线组合而成:
【例3-10】 求单字节有符号二进制数的补码。
编程如下:
CMPT:
MOV A , 30H
JNB ACC.7 , NCH
;(A)≥0,不需要转换
MOV C , ACC.7 ;保存符号
MOV 10H , C
CPL A
ADD A , #1
MOV C , 10H
MOV ACC.7 , C ;恢复符号
NCH: END
3.3.2 伪指令
1、定位伪指令 格式:ORG n 2、定义字节伪指令 格式:标号:DB X1, X2, ……Xn 此伪指令的功能是把Xi存入从标号开始连续的单元中。 3、定义双字节伪指令 格式:标号:DW X1,X2,……Xn 此伪指令的功能是把Xi存入从标号开始的连续单元中。
4、预留存贮区伪指令
解:编程说明: 内部数据区首址: R0←30H 外部数据区首址: DPTR←2000H 循环次数: R2←32H 程序流程如图3-9所示。
参考程序如下: START: MOV R0 , #30H MOV DPTR , #2000H MOV R2 , #32H
LOOP: MOV A , @R0 MOVX @DPTR , A INC R0 INC DPTR DJNZ R2 , LOOP END
MOV R2 , #10H MOV R4 , #00H MOV R5 , #00H
51单片机:音乐盒设计控制程序(音乐汇编) - 日月环的日志 - 网易博客
db 08h,04h,05h,04h,08h,04h,08h,04h
end
;------------------------------------------------------------------------------------------------------
yfh equ 30h ;音符高位
yfl equ 31h ;音符低位
;低1DO 262 1908 f88c 中1DO 523 0956 fc44 高1DO 1046 0478 fe22
;#1DO# 277 1805 #1DO# 554 0903 #DO# 1109 0451
db 08h,04h,09h,04h,0ah,04h,0bh,04h,0ch,04h,0dh,04h,0eh,04h
db 0fh,04h,10h,04h,11h,04h,12h,04h,13h,04h,14h,04h,15h,06h
db 00h*/
/*乐曲---心太软
db 0ch,02h,0ch,02h,0ah,02h,0dh,04h,0ch,02h,0ah,06h,0ah,04h,09h,02h,08h,02h,08h,04h,08h,02h
db 0fh,02h,0fh,02h,0fh,02h,0fh,02h,0dh,02h,0ch,04h,0ah,02h,0dh,02h,0ch,06h*/
mov yyd,a
lcall delay
nop
ljmp music
delay:
汇编语言课程设计 音乐点播程序
一.背景分析及意义随着计算机的不断更新发展,计算机在各个领域的应用越来越多,更多的软件开发人员和相关技术人员在程序设计的过程中应用汇编程序或编制汇编语言。
而汇编语言做为计算机专业大学生必修之课,每个做为本专业的学生对汇编的理解和学习就显的尤为重要。
汇编语言是计算机能够提供给用户使用的最快而又最好最有效的语言,也是能够利用计算机所有硬件特性并能直接控制硬件的唯一语言。
因而,对程序的空间和时间要求很高的场合,汇编语言的应用就显的必不可少了,一些直接控制硬件的应用场合,则更是非用汇编语言不可了。
这次课程设计是在学习汇编语言与实践相结合的一次综合应用。
通过具体的问题分析、设计、调试、运行程序。
在实际问题中锻炼提高自己,增加了对本门课程内容的理解,锻炼了动手能力。
就这个程序具体而言:知道了音调与频率和时间的关系,就可以按照乐曲的曲谱将每个音符的频率和持续时间定义成两个数据表;然后编写程序依次取出表中的频率值和时间值,调用GENSOUNDF程序发出各种声音。
这个程序最终通过菜单所提示的信息选取所要欣赏的音乐,是执行此程序后,会很有速且有效的使扬声器接通并发出音频为896 Hz的声音。
二.总体设计思想ROM BIOS 中的BEEP子程序能根据BL中给出的时间计数植控制8254定时器,产生持续时间计数值控制8254定时器,产生持续时间为1个或几个0.5 秒,频率为896Hz的声音。
通过对BEEP的修改,可产生任一频率的声音。
用汇编语言写的GENSOUNG,能使Pc 机发出指定频率和指定延时的声音。
它是一个很好的通用发声程序。
组成乐曲的每个音符的频率值和持续时间定义成两个数据表,然后编程依次取出表中的频率值和时间值,调用GENSOUND程序发出各种声音。
本程序就是通过GENSOUNG程序演奏乐曲的例子。
该乐曲点播程序由一个乐曲点播主程序和五个子程序组成。
(1)歌曲设置程序;(2)打开另一个显示窗口程序;(3)接收键盘输入程序;(4)返回程序;(5)发声程序。
51单片机汇编语言音乐程序
01 两只老虎NEXT BIT 10H ;定义标志位ORG 0000HJMP MAINORG 000BHJMP TONEORG 001BHJMP BEATORG 0100HMAIN: MOV TMOD,#11HMOV TH0,R2MOV TL0,R3MOV TH1,#3CHMOV TL1,#0B0HMOV R4,#00HMOV DPTR,#TABYD: MOV A,R4 ;取音调数据MOVC A,@A+DPTRMOV R2,AXRL A,#00HJNZ JP ;直接取节拍INC R4CALL PD ;判断指针是否溢出MOV A,R4MOVC A,@A+DPTRMOV R3,AXRL A,#0FFHJZ JPMOV A,R2XRL A,#0FFHJNZ MAINJP: INC R4 ;取节拍数据CALL PDMOV A,R4MOVC A,@A+DPTRMOV R5,ASETB EASETB ET0SETB ET1SETB TR0SETB TR1SETB NEXTJBNEXT,$ INCR4 CALLPDJMP YDPD: MOV A,R4CJNE A,#00H,L1INC DPHL1: RET;音调产生子程序TONE: CPL P2.0MOV TH0,R2MOV TL0,R3RETI;节拍产生子程序BEAT: DJNZ R5,L2MOV TH1,#3CHMOV TL1,#0B0HL3: RETIL2: CLR TR0CLR TR1CLR NEXTJMP L3;两只老虎音符表TAB: DB0FBH,0F9H,08H,0FCH,066H,08H,0FCH,0C7H,08H,0FBH,0F9H,08H DB0FBH,0F9H,08H,0FCH,066H,08H,0FCH,0C7H,08H,0FBH,0F9H,08HDB0FCH,0C7H,08H,0FCH,0F3H,08H,0FDH,4AH,10H,0FCH,0C7H,08H DB0FCH,0F3H,08H,0FDH,4AH,08H,0FDH,4AH,04H,0FDH,95H,04H DB0FDH,4AH,04H,0FCH,0F3H,04H,0FCH,0C7H,08H,0FBH,0F9H,08H DB0FDH,4AH,04H,0FDH,95H,04H,0FDH,4AH,04H,0FCH,0F3H,04H DB0FCH,0C7H,08H,0FBH,0F9H,08H,0FCH,66H,08H,0FAH,93H,08H DB 0FBH,0F9H,08H,00H,08H,0FCH,66H,04H,0FAH,93H,08HDB 0FBH,0F9H,08H,00H,10H,0FFH,0FFHEND02 祝你平安ORG 0000HLJMP STARTORG 000BHINC 20H ;中断服务,中断计数器加 1MOV TH0,#0D8HTL0,#0EFH ;12M 晶振,形成10 毫秒中断MOVRETISTART:MOV SP,#50HMOV TH0,#0D8HMOV TL0,#0EFHMOV TMOD,#01HMOV IE,#82HMUSIC0:NOPMOV DPTR,#DAT ;表头地址送DPTRMOV 20H,#00H ;中断计数器清0MOV B,#00H ;表序号清0MUSIC1:NOPCLR AMOVC A,@A+DPTR ; 查表取代码JZ END0 ;是00H,则结束CJNE A,#0FFH,MUSIC5LJMP MUSIC3MUSIC5:NOPMOV R6,AINC DPTRMOV A,BMOVC A,@A+DPTR ; 取节拍代码送R7MOV R7,ASETB TR0 ;启动计数MUSIC2:NOPCPL P3.3MOV A,R6MOV R3,ALCALL DELMOV A,R7CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7 否?;不等,则继续循环MOV 20H,#00H ;等于,则取下一代码INC DPTR; INC BLJMP MUSIC1MUSIC3:NOPCLR TR0 ; 休止100 毫秒MOV R2,#0DHMUSIC4:NOPMOV R3,#0FFHLCALL DELDJNZ R2,MUSIC4INC DPTRLJMP MUSIC1END0:NOPMOV R2,#64H ;歌曲结束,延时1 秒后继续MUSIC6:MOV R3,#00HLCALL DELDJNZ R2,MUSIC6LJMP MUSIC0DEL:NOPDEL3:MOV R4,#02HDEL4:NOPDJNZ R4,DEL4NOPDJNZ R3,DEL3RETNOPDAT:db26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h db30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h db20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h db30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h db30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h db2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h db20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h db20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20hdb20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h db20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h db18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h db30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h db39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h db 20h,10h,2bh,10h,26h,30h,30h,80h,00HEND03 生日歌ORG 0000HJMP STARTORG 000BHJMP TIM0ORG 0030HSTART:MOV TMOD,#01HMOV IE,#82HSTART0:MOV 30H,#00HNEXT: MOV A,30HMOV DPTR,#TABLEMOVC A,@A+DPTRMOV R2,AJZ END0ANL A,#0FHMOV R5,AMOV A,R2SWAP AANL A,#0FHJNZ SINGCLR TR0JMP D1SING: DEC AMOV 22H,ARL AMOV DPTR,#TABLE1MOVC A,@A+DPTRMOV TH0,AMOV 21H,AMOV A,22HRL AINC AMOVC A,@A+DPTRMOV TL0,AMOV 20H,ASETB TR0D1: CALL DELAYINC 30HJMP N EXTEND0: CLR TR0JMP START0 TIM0: PUSH ACCPUSH PSWMOV TH0,21HMOV TL0,20HCPL P3.7POP PSWPOP ACCRETIDELAY: MOV R7,#02D2: MOV R4,#187D3: MOV R3,#248DJNZR3,$ DJNZR4,D3 DJNZR7,D2 DJNZR5,DELAY RETTABLE1:DW 64260,64400,64524,64580DW 64684,64777,64820,64898DW 64968,65030,65058,65110DW 65157,65178,65217TABLE:DB 82H,01H,81H,94H,84HDB 0B4H,0A4H,04HDB 82H,01H,81H,94H,84HDB 0C4H,0B4H,04HDB 82H,01H,81H,0F4H,0D4HDB 0B4H,0A4H,94HDB 0E2H,01H,0E1H,0D4H,0B4HDB 0C4H,0B4H,04HDB 82H,01H,81H,94H,84HDB 0B4H,0A4H,04HDB 82H,01H,81H,94H,84HDB 0C4H,0B4H,04HDB 82H,01H,81H,0F4H,0D4HDB 0B4H,0A4H,94HDB 0E2H,01H,0E1H,0D4H,0B4HDB 0C4H,0B4H,04HDB 00HEND04 八月桂花香ORG 0000HLJMP STARTORG 000BHINC 20H ;中断服务,中断计数器加 1MOV TH0,#0D8HMOV TL0,#0EFH ;12M 晶振,形成10 毫秒中断RETISTART:MOV SP,#50HMOV TH0,#0D8HMOV TL0,#0EFHMOV TMOD,#01HMOV IE,#82HMUSIC0:MOV DPTR,#DAT ;表头地址送DPTRMOV 20H,#00H ;中断计数器清0MUSIC1:NOPCLR A ;A 清零MOVC A,@A+DPTR ; 查表取代码JZ END0 ;是00H,则结束CJNE A,#0FFH,MUSIC5 ;如果是休止符,往下执行LJMP MUSIC3MUSIC5:NOPMOV R6,A ;R6=18H 音符的频率INC DPTR ;DPTR 加一MOV A,#0MOVC A,@A+DPTR ; 取节拍代码送R7MOV R7,A ;R7=30H 音符发音的时间SETB TR0 ;启动计数MUSIC2:NOPCPL P2.3 ;P2.3 是音乐输出引脚MOV A,R6MOV R3,A ; 籖3=R6=18HLCALL DELMOV A,R7CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7 否? ;不等,则继续循环MOV 20H,#00H ;等于,则取下一代码INC DPTRLJMP MUSIC1MUSIC3:NOP ;休止100 毫秒CLR TR0MOV R2,#0DH ;R2=13MUSIC4:MOV R3,#0FFH ;R3=255LCALL DELDJNZ R2,MUSIC4INC DPTRLJMP MUSIC1END0:NOPMOV R2,#0FFH ;歌曲结束,延时1 秒后继续MUSIC6:MOV R3,#00HLCALL DELDJNZ R2,MUSIC6LJMP MUSIC0DEL:NOPDEL3:MOV R4,#02HDEL4:NOPDJNZ R4,DEL4NOPDJNZ R3,DEL3RETNOPDAT:DB 18H, 30H, 1CH, 10HDB 20H, 40H, 1CH, 10HDB 18H, 10H, 20H, 10HDB 1CH, 10H, 18H, 40HDB 1CH, 20H, 20H, 20HDB 1CH, 20H, 18H, 20HDB 20H, 80H, 0FFH, 20HDB 30H, 1CH, 10H , 18HDB 20H, 15H, 20H , 1CHDB 20H, 20H, 20H , 26HDB 40H, 20H , 20H , 2BHDB 20H, 26H, 20H , 20H DB 20H, 30H , 80H , 0FFH DB 20H, 20H, 1CH , 10H DB 18H, 10H, 20H , 20H DB 26H, 20H , 2BH , 20H DB 30H, 20H , 2BH , 40H DB 20H, 20H , 1CH , 10H DB 18H, 10H, 20H, 20H DB 26H, 20H , 2BH, 20H DB 30H, 20H, 2BH , 40H DB 20H, 30H, 1CH , 10H DB 18H, 20H , 15H , 20H DB 1CH, 20H , 20H , 20H DB 26H, 40H, 20H , 20H DB 2BH, 20H, 26H , 20H DB 20H, 20H, 30H , 80H DB 20H, 30H, 1CH , 10H DB 20H, 10H, 1CH , 10H DB 20H, 20H, 26H , 20H DB 2BH, 20H, 30H , 20H DB 2BH, 40H, 20H , 15H DB 1FH, 05H, 20H , 10H DB 1CH, 10H, 20H , 20H DB 26H, 20H, 2BH , 20H DB 30H, 20H, 2BH , 40H DB 20H, 30H, 1CH , 10H DB 18H, 20H , 15H , 20H DB 1CH, 20H , 20H , 20H DB 26H, 40H, 20H , 20H DB 2BH, 20H, 26H , 20H DB 20H, 20H, 30H, 30H DB 20H, 30H, 1CH, 10H DB 18H, 40H, 1CH, 20H DB 20H, 20H, 26H, 40H DB 13H, 60H, 18H , 20H DB 15H, 40H, 13H , 40H DB 18H, 80H, 00Hend05 兰花草SPK EQU P3.3 ; 蜂鸣器所在端口ORG 0000HJMP STARTSTART:MOVR3,#00HNEXT:MOVA,R3MOVDPTR,#TABLEMOVC A,@A+DPTRJZ STARTMOVR7,AINC R3MOVA,R3MOVC A,@A+DPTRMOVR2,AACALL SONGINC R3SJMPNEXT;================================================== =============================;=== 歌曲播放子程序===SONG:MOVA,R2 ; 取出节拍RL AJNZ KEEPMOVA,#01HKEEP:MOVR2,AREPEAT:ACALL EIGHTHDJNZ R2,REPEATRET;===============================================================================;=== 产生1/8 拍延时子程序===EIGHTH:MOVA,R7 ; 查表取出廷时参数,保存到R4MOVDPTR,#DELAY_TMOVC A,@A+DPTRMOVR4,AMOVA,R7 ; 查表取出1/8 拍周期数,保存到R5MOVDPTR,#S_PARAMOVC A,@A+DPTRMOVR5,ANEXTCYC:ACALL SOUNDDJNZ R5,NEXTCYCRET;===============================================================================;=== 发声子程序===SOUND:SETB SPKACALL SDELAYCLR SPKACALL SDELAYRET;===============================================================================;=== 延时子程序===SDELAY:XL2: DL1: MOVA,R4 ; 廷时值在R4 内MOVR0,AMOVR1,#03HNOPDJNZ R1,DL1DJNZ R0,XL2RET;================================================== =============================;=== 1/8 拍周期表===S_PARA:DS 1DHDB 15H,16H,00DB 19H,00H,1CH,00H,1FH,21H,00H,25HDB 00H,29H,2CH,00H,31H,34H,37H,00HDB 3EH,41H,00H,49H,00H,52H,57H,00HDB 62H;================================================== =============================;=== 延时参数表===DELAY_T:DS 1DHDB 7EH,77H,00HDB 6AH,00H,5EH,00H,54H,4FH,00H,46HDB 00H,3FH,3BH,00H,35H,32H,2FH,00HDB 2AH,27H,00H,23H,00H,1FH,1DH,0C0HDB 1AH;================================================== =============================;=== 歌曲表===TABLE:DW 2202H,2902H,2902H,2902H,2906H,2702H ;我从山中来DW 2502H,2702H,2502H,2402H,2208H ;带着兰花草DW 2E02H,2E02H,2E02H,2E02H,2E06H,2C02H ;种在小园中DW 2902H,2C02H,2D02H,2A02H,2908H ;祈祷花开早DW 2902H,2E02H,2E02H,2C02H,2906H,2702H ;一日看三回DW 2502H,2702H,2502H,2402H,2206H,1D02H ;看得花时过DW 1D02H,2502H,2502H,2402H,2206H,2902H ;兰花却依然DW 2702H,2502H,2402H,2002H,2208H ;苞也无一个DW 0000H ;END。
51单片机音乐编辑程序详解
#include<reg51.h>#include<intrins.h>#define uc unsigned char#define ui unsigned intuc a;sbit speaker=P1^2;ui code yinpin[]={ //音频的赫兹0,0,0,0,0,0,0, //高两位单调个位表示节拍63628,63835,64021,64103,64260,64400,64524,//低音64680,64684,64777,64820,64898,64968,65030,//中音65085,65110,65157,65178,65217,65252,65282,//高音};uc code yuema[]={//音乐的编码001,001,001,001,134,134,154,132,152,168,184,001,001,001,001,164,164,182,162,162,182,199,197,154,164,182,162,164,132,124,134,122,132,154,164,184,192,162,169,167,001,001,001,204,202,192,198,204,192,202,184,164,204,202,192,194,198,122,132, 114,112,162,164,164,001,001,001,156,152,132,152,162,186,156,152,132,152,182,166,156,152,132,152,162,186,156,152,132,152,182,166,001,001,001,};void delay(ui m){ui i,j;for(i=0;i<121;i++)for(j=0;j<m;j++);}void init_t0(void){TMOD=0X01;//工作在定时器0的模式下ET0=1;//定时器中断允许EA=1;//开总中断TR0=1;//启动定时器}void sec_t0(void) interrupt 1//定时器服务子程序{TH0=yinpin[yuema[a]/10]/256;//复初值TL0=yinpin[yuema[a]/10]%256;//复初值speaker=!speaker;}void jiema(void)//音频的解码{if(yuema[a]/10)TR0=1;else TR0=0;//如果乐码的高两位为1则启动定时器,否则关闭定时器delay(yuema[a]%10*100);//节拍的延时,100表示把节拍的时间扩大100倍,不然时间会很快TR0=0;speaker=1;//关闭定时器和蜂鸣器为下次发生做准备a++;//乐码自加if(yuema[a]==0)a=0;//如果乐码遇到000的时候则表示音乐播放完毕。
汇编语言音乐课程设计
汇编语言音乐课程设计一、课程目标知识目标:1. 学生理解汇编语言的基本概念,掌握音乐编程的基础知识;2. 学生学会使用汇编语言编写简单的音乐程序,了解音乐与计算机编程的结合;3. 学生了解音乐在计算机领域的应用,拓宽知识视野。
技能目标:1. 学生能够运用汇编语言进行音乐编程,创作独特的音乐作品;2. 学生通过动手实践,提高逻辑思维能力和问题解决能力;3. 学生学会合作与沟通,提高团队协作能力。
情感态度价值观目标:1. 学生培养对计算机编程和音乐的兴趣,激发创造力和创新精神;2. 学生在学习过程中,体验编程与音乐的乐趣,培养积极的学习态度;3. 学生通过课程学习,认识到科技进步对音乐创作的影响,增强社会责任感。
课程性质:本课程为选修课,结合汇编语言和音乐,培养学生编程技能和音乐素养。
学生特点:学生具备一定的计算机基础知识,对音乐有兴趣,具有较强的学习意愿和动手能力。
教学要求:教师需引导学生掌握汇编语言音乐编程的基本方法,注重实践与理论相结合,关注学生的个体差异,提供有针对性的指导。
通过课程学习,使学生在知识、技能和情感态度价值观方面取得具体的学习成果。
二、教学内容1. 汇编语言基础知识:介绍汇编语言的基本概念、语法和指令,包括寄存器、内存访问、程序流程控制等,关联教材第1章内容。
2. 音乐编程基础:讲解音乐编程的基本原理,如音调、节奏、音色等,引入MIDI音乐制作相关知识,关联教材第2章内容。
3. 汇编语言音乐编程实践:a. 使用汇编语言编写简单的MIDI音乐程序,如演奏一首简单的歌曲,关联教材第3章内容;b. 学习如何调整音量、音色和节奏等参数,创作个性化的音乐作品,关联教材第4章内容;c. 探索音乐与汇编语言的深度融合,如编写互动式音乐程序,关联教材第5章内容。
4. 教学进度安排:a. 第1-2周:汇编语言基础知识学习;b. 第3-4周:音乐编程基础学习;c. 第5-6周:汇编语言音乐编程实践;d. 第7-8周:作品创作、展示与评价。
51单片机唱歌 C51音乐程序
51单片机唱歌 C51音乐程序#i nclude <reg52.h>#i nclude <intrins.h>//本例采用89C52, 晶振为11.0592MHZ//关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.//频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;//所以拿出谱子, 试探编吧!unsigned char n=0; //n为节拍常数变量unsigned char code music_tab[] ={0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数, 0x20, 0x40, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x10,0x1C, 0x10, 0x18 , 0x40,0x1C, 0x20, 0x20 , 0x20,0x1C, 0x20, 0x18 , 0x20,0x20, 0x80, 0xFF , 0x20,0x30, 0x1C, 0x10 , 0x18,0x20, 0x15, 0x20 , 0x1C,0x20, 0x20, 0x20 , 0x26,0x40, 0x20, 0x20 , 0x2B,0x20, 0x26, 0x20 , 0x20,0x20, 0x30, 0x80 , 0xFF,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x80,0x20, 0x30, 0x1C , 0x10,0x20, 0x10, 0x1C , 0x10,0x20, 0x20, 0x26 , 0x20,0x2B, 0x20, 0x30 , 0x20,0x2B, 0x40, 0x20 , 0x15,0x1F, 0x05, 0x20 , 0x10,0x1C, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x30,0x20, 0x30, 0x1C , 0x10,0x18, 0x40, 0x1C , 0x20,0x20, 0x20, 0x26 , 0x40,0x13, 0x60, 0x18 , 0x20,0x15, 0x40, 0x13 , 0x40,0x18, 0x80, 0x00};void int0() interrupt 1 //采用中断0 控制节拍{ TH0=0xd8;TL0=0xef;n--;}void delay (unsigned char m) //控制频率延时{unsigned i=3*m;while(--i);}void delayms(unsigned char a) //豪秒延时子程序{while(--a); //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!}void main(){ unsigned char p,m; //m为频率常数变量unsigned char i=0;TMOD&=0x0f;TMOD =0x01;TH0=0xd8;TL0=0xef;IE=0x82;play:while(1){a: p=music_tab[i];if(p==0x00) { i=0, delayms(1000); goto play;} //如果碰到结束符,延时1秒,回到开始再来一遍else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延时100ms,继续取下一音符else {m=music_tab[i++], n=music_tab[i++];} //取频率常数和节拍常数TR0=1; //开定时器1while(n!=0) P1=~P1,delay(m); //等待节拍完成, 通过P1口输出音频(可多声道哦!)TR0=0; //关定时器1 }}。
汇编音乐程序课程设计
汇编音乐程序课程设计一、课程目标知识目标:1. 学生能理解汇编语言的基本概念,掌握音乐程序设计的相关知识。
2. 学生能运用汇编语言编写简单的音乐程序,如播放单个音符、简单旋律等。
3. 学生了解音乐编程中的循环、条件判断等基本结构,并能运用到实际编程中。
技能目标:1. 学生掌握汇编语言编程环境的使用,如编辑器、编译器等。
2. 学生能运用汇编语言编写音乐程序,具备调试和优化程序的能力。
3. 学生具备团队协作能力,能够与同学共同完成音乐程序的编写和调试。
情感态度价值观目标:1. 学生培养对计算机音乐编程的兴趣,激发创新意识和探索精神。
2. 学生在学习过程中,培养耐心、细心和责任心,养成良好的编程习惯。
3. 学生通过音乐编程,体验艺术与技术的结合,提升审美情趣。
本课程针对高年级学生,课程性质为理论与实践相结合。
在分析学生特点和教学要求的基础上,明确课程目标,将目标分解为具体的学习成果,以便后续的教学设计和评估。
通过本课程的学习,学生将能够掌握汇编音乐编程的基本知识,具备实际编程能力,并在学习过程中培养良好的情感态度价值观。
二、教学内容1. 汇编语言基础知识:介绍汇编语言的基本概念、语法规则,以及与音乐编程相关的基础知识,如音符、节拍等。
教材章节:第1章 汇编语言概述,第2章 汇编语言基础知识2. 汇编音乐编程环境搭建:讲解汇编音乐编程环境的配置方法,包括编辑器、编译器和播放器的使用。
教材章节:第3章 汇编音乐编程环境搭建3. 基本音乐程序编写:教授如何使用汇编语言编写单个音符、简单旋律等音乐程序。
教材章节:第4章 基本音乐程序编写4. 循环与条件判断:介绍在音乐编程中循环、条件判断等基本结构的应用。
教材章节:第5章 循环与条件判断5. 复杂音乐程序设计:讲解如何运用所学知识编写较复杂的音乐程序,如多声部音乐、动态音量调整等。
教材章节:第6章 复杂音乐程序设计6. 调试与优化:教授音乐程序的调试技巧和优化方法,提高程序执行效率。
单片机音乐播程序设计流程
单片机音乐播程序设计流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 确定音乐格式:首先需要确定要播放的音乐文件格式,常见的音乐格式如 MP3、WAV 等。
基于-51单片机的音乐程序
基于51单片机的按键切换播放音乐原理图:引脚说明:共5个按键,分别接51单片机的P0~P4引脚,前4个按键控制播放设置好的四首音乐,第5个按键用来关闭音乐。
按键采用中断方式,任意时刻按下任意按键那么立即进入所按按键的功能;蜂鸣器接单片机的P3.6口。
仿真说明:使用proteus仿真,晶振:12MHZ。
程序代码如下:/*12Mhz晶振工作*/#include <reg52.h>#define uint unsigned int#define uchar unsigned charsbit voice=P3^6;uchar code sound1[]={0xff,0x40,0x80,0x30,0x40,0x2b,0x40,0x26,0x80,0x24,0x10,0x26,0x40,0x30,0x40,0x2b,0x80,0x30,0x40,0x39,0x40,0x30,0xc0,0x40,0x80,0x30,0x40,0x2b,0x40, 0x26,0x40,0x26,0x20,0x24,0x20,0x20,0x40,0x30,0x40,0x24,0x80,0x26,0x10, 0x20,0x40,0x2b,0x20,0x26,0x20,0x26,0x20,0x2b,0x20,0x2b,0xc0,0x26,0x80, 0x20,0x40,0x19,0x40,0x19,0x80,0x1c,0x10,0x1c,0x80,0x20,0x40,0x20,0x20, 0x1c,0x20,0x19,0x40,0x1c,0x20,0x20,0x20,0x26,0xc0,0x24,0x80,0x24,0x10, 0x20,0x40,0x1c,0x40,0x20,0x40,0x24,0x20,0x26,0x20,0x2b,0x80,0x33,0x40, 0x33,0x20,0x39,0x20,0x40,0x40,0x39,0x40,0x30,0xc0,0x18,0x80,0x1c,0x80, 0x24,0x80,0x20,0x10,0x1c,0x80,0x19,0x40,0x19,0x20,0x19,0x20,0x19,0x40, 0x1c,0x20,0x20,0x20,0x26,0xc0,0x18,0x80,0x1c,0x80,0x24,0x80,0x20,0x10, 0x1c,0x80,0x1c,0x40,0x1c,0x20,0x1c,0x20,0x1c,0x40,0x24,0x20,0x26,0x20, 0xff,0x20,0x00};//同一首歌*/uchar code sound2[]={0xff,0x18,0x40,0x1c,0x20,0x18,0x20,0x13,0x40,0x13,0x20,0x15,0x20,0x13,0x20, 0x15,0x20,0x13,0x20,0x15,0x20,0x18,0x20,0x19,0x20,0x1c,0x20,0x20,0x20, 0x1c,0x40,0x19,0x20,0x18,0x20,0x15,0x40,0x10,0x80,0x13,0x10,0x10,0x40,0x15,0x10,0x13,0x10,0x18,0x10,0x1c,0x10,0x26,0x10, 0x13,0x10,0x18,0x10,0x1c,0x10,0x26,0x10,0x13,0x10,0x18,0x10,0x1c,0x10, 0x26,0x10,0x13,0x10,0x18,0x10,0x1c,0x10,0x26,0x10,0x15,0x10,0x19,0x10, 0x20,0x10,0x2b,0x10,0x15,0x10,0x19,0x10,0x20,0x10,0x2b,0x10,0x15,0x10, 0x19,0x10,0x20,0x10,0x2b,0x10,0x15,0x10,0x19,0x10,0x20,0x10,0x2b,0x10, 0x18,0x10,0x1c,0x10,0x24,0x10,0x30,0x10,0x18,0x10,0x1c,0x10,0x24,0x10, 0x30,0x10,0x19,0x10,0x20,0x10,0x2b,0x10,0x19,0x10,0x19,0x10,0x20,0x10, 0x2b,0x10,0x19,0x10,0x18,0xc0,0xff,0x40,0x40,0x10,0x39,0x20,0x30,0x20, 0x2b,0x20,0x30,0x20,0x2b,0x20,0x26,0x20,0x26,0x20,0x26,0x20,0x26,0x20,0x26,0x20,0x26,0x20,0x2b,0x20,0x30,0x20,0x2b,0x40,0x30,0x10,0x30,0x20, 0x39,0x20,0x30,0x40,0x2b,0x10,0x2b,0x20,0x26,0x20,0x26,0x80,0x40,0x10, 0x39,0x20,0x30,0x20,0x2b,0x20,0x30,0x20,0x2b,0x20,0x30,0x20,0x30,0x20, 0x20,0x20,0x20,0x20,0x26,0x20,0x2b,0x20,0x26,0x20,0x2b,0x20,0x30,0x20, 0x30,0x20,0x26,0x20,0x26,0x20,0x26,0x20,0x2b,0x20,0x30,0x20,0x2b,0x40, 0x2b,0x10,0x2b,0x20,0x2b,0x20,0x2b,0x40,0x30,0x10,0x30,0x20,0x39,0x20, 0x2b,0x80,0x40,0x10,0x39,0x20,0x30,0x20,0x2b,0x20,0x30,0x20,0x2b,0x20, 0x26,0x20,0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x20,0x2b,0x20,0x30,0x20, 0x2b,0x20,0x26,0x20,0x26,0x20,0x1c,0x20,0x1c,0x20,0x26,0x20,0x2b,0x20, 0x30,0x20,0x2b,0x40,0x30,0x10,0x30,0x20,0x39,0x20,0x30,0x40,0x2b,0x10, 0x2b,0x20,0x26,0x20,0x20,0x80,0x40,0x10,0x39,0x20,0x30,0x20,0x2b,0x20, 0x30,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x1c,0x20,0x20,0x20, 0x26,0x20,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x26,0x20,0x26,0x20, 0x26,0x20,0x2b,0x20,0x30,0x20,0x2b,0x40,0x2b,0x10,0x2b,0x20,0x2b,0x20, 0x2b,0x40,0x30,0x10,0x30,0x20,0x39,0x20,0x30,0x80,0x30,0x10,0x18,0x20, 0x19,0x20,0x18,0x20,0x1c,0x20,0x18,0x40,0x1c,0x10,0x1c,0x20,0x20,0x20, 0x1c,0x20,0x20,0x20,0x26,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x1c,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,0x20,0x20,0x1c,0x40,0x1c,0x10, 0x1c,0x20,0x1c,0x20,0x1c,0x40,0x20,0x10,0x20,0x20,0x1c,0x20,0x20,0x20, 0x26,0x20,0x26,0x40,0xff,0x20,0x30,0x20,0x2b,0x20,0x26,0x20,0x20,0x20, 0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x30,0x20,0x2b,0x20,0x26,0x20, 0x1c,0x20,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x30,0x20,0x30,0x20, 0x30,0x20,0x18,0x40,0x18,0x10,0x18,0x20,0x18,0x20,0x18,0x40,0x1c,0x10,0x19,0x20,0x18,0x20,0x19,0x20,0x1c,0x20,0x20,0x20,0x1c,0x20,0x20,0x20, 0x26,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x1c,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x1c,0x20,0x20,0x20,0x1c,0x40,0x1c,0x10,0x1c,0x20,0x1c,0x20, 0x1c,0x40,0x20,0x10,0x20,0x20,0x1c,0x20,0x20,0x20,0x26,0x20,0x26,0x40, 0xff,0x20,0x30,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x26,0x20,0x2b,0x20, 0x30,0x20,0x30,0x20,0x30,0x20,0x2b,0x20,0x26,0x20,0x1c,0x20,0x26,0x20, 0x2b,0x20,0x30,0x20,0x18,0x80,0xff,0x40,0xff,0x40,0xff,0x20,0x18,0x20,0x1c,0x20,0x18,0x20,0x1c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x1c,0x20, 0x20,0x20,0x26,0x20,0x2b,0x20,0x26,0x20,0x2b,0x20,0x2b,0x20,0x30,0x20, 0x39,0x20,0x30,0x20,0x30,0x20,0x2b,0x20,0x30,0xc0,0x30,0x80,0x30,0x20, 0x18,0x20,0x1c,0x20,0x18,0x20,0x15,0x20,0x18,0x20,0x18,0x20,0x18,0x20, 0x15,0x20,0x18,0x20,0x18,0x20,0x18,0x20,0x15,0x20,0x18,0x20,0x1c,0x20, 0x18,0x20,0x13,0x20,0x15,0x20,0x15,0x20,0x18,0x20,0x1c,0x20,0x18,0x20, 0x15,0x40,0x30,0xc0,0xff,0x40,0x00}; //爱情转移*/uchar code sound3[]={0xff,0x40,0x10,0x39,0x10,0x30,0x10,0x2b,0x10,0x26,0x20,0x20,0x10,0x20,0x10, 0x20,0x30,0x18,0x10,0x19,0x20,0x1c,0x20,0x20,0x20,0x20,0x40,0x1c,0x20, 0x30,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,0x24,0x10,0x26,0x10, 0x26,0x10,0x2b,0x20,0x30,0x10,0x39,0x20,0x30,0x10,0x30,0x10,0x30,0x20, 0x20,0x20,0x24,0x10,0x26,0x10,0x2b,0x10,0x30,0x10,0x33,0x10,0x40,0x10, 0x39,0x20,0x39,0xc0,0xff,0x20,0x26,0x10,0x20,0x10,0x1c,0x10,0x20,0x10, 0x1c,0x10,0x20,0x10,0x1c,0x10,0x18,0x30,0x19,0x10,0x1c,0x10,0x1c,0x10, 0x20,0x10,0x1c,0x20,0x20,0x20,0x1c,0x20,0x1c,0x10,0x18,0x10,0x19,0x20,0x1c,0x10,0x20,0x10,0x1c,0x10,0x18,0x30,0x15,0x10,0x18,0x10,0x15,0x10, 0x18,0x10,0x18,0x10,0x15,0x30,0x13,0x20,0x13,0x10,0x15,0x10,0x18,0x10, 0x15,0x20,0x13,0x10,0x13,0x60,0x15,0x20,0x13,0x20,0x15,0x10,0x18,0x10, 0x15,0x10,0x18,0x10,0x15,0x20,0x18,0x10,0x15,0x10,0x15,0x60,0x15,0x20, 0x13,0x20,0x15,0x10,0x18,0x10,0x18,0x10,0x18,0x10,0x18,0x20,0x19,0x10, 0x1c,0x10,0x1c,0x60,0xff,0x20,0x13,0x20,0x15,0x10,0x18,0x10,0x15,0x10, 0x18,0x10,0x15,0x20,0x18,0x10,0x15,0x10,0x15,0x20,0x18,0x20,0x18,0x10, 0x10,0x30,0x10,0xc0,0x18,0x20,0x15,0x20,0x13,0x10,0x15,0x10,0x13,0x10, 0x15,0x10,0x13,0x10,0x15,0x10,0x13,0x10,0x15,0x10,0x15,0x10,0x10,0x30, 0x10,0x20,0x13,0x10,0x10,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x10, 0x10,0x20,0x13,0x10,0x15,0x10,0x13,0x60,0x15,0x20,0x13,0x20,0x15,0x20, 0x18,0x10,0x1c,0x10,0x1c,0x40,0x18,0x20,0x19,0x10,0x1c,0x10,0x1c,0x40, 0xff,0x20,0x0e,0x20,0x10,0x20,0x13,0x20,0x15,0x40,0x18,0x20,0x15,0x20, 0xff,0x20,0x26,0x20,0x20,0x20,0x26,0x20,0x15,0x20,0x13,0x40,0x15,0x20, 0x18,0x20,0x1c,0xc0,0x30,0x40,0x2b,0x30,0x26,0x10,0x39,0x40,0xff,0x20, 0x30,0x10,0x39,0x10,0x33,0x10,0x30,0x10,0x2b,0x20,0x2b,0x20,0x30,0x10, 0x2b,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x1c,0x10,0x20,0x10,0x2b,0x10, 0x26,0x10,0x26,0x80,0x18,0x10,0x19,0x10,0x1c,0x10,0x1c,0x10,0x19,0x20, 0x26,0x20,0xff,0x20,0x26,0x20,0x20,0x20,0x26,0x20,0x15,0x20,0x13,0x40, 0x15,0x20,0x18,0x20,0x1c,0xc0,0xff,0x20,0x26,0x20,0x20,0x20,0x26,0x20, 0x15,0x20,0x13,0x40,0x15,0x20,0x18,0x20,0x1c,0x40,0x1c,0xc0,0x00};//最后一次的温柔*/uchar code sound4[]={0xff,0x40,0x30,0x30,0x80,0x30,0x30,0x30,0x80,0x26,0x40,0x2b,0x80,0x30,0x30, 0x2b,0x80,0x26,0x30,0x30,0x80,0x30,0x30,0x26,0x80,0x20,0x30,0x1c,0xc0, 0x1c,0x80,0x1c,0x30,0x20,0x80,0x26,0x30,0x26,0x80,0x30,0x30,0x2b,0x80, 0x30,0x30,0x2b,0x80,0x26,0x30,0x30,0x80,0x39,0x30,0x39,0x80,0x40,0x30, 0x30,0xc0,0x30,0x80,0x1c,0x30,0x20,0x80,0x26,0x30,0x26,0x80,0x30,0x30, 0x2b,0x80,0x30,0x30,0x2b,0x80,0x1c,0x30,0x20,0x80,0x26,0x30,0x26,0x80, 0x20,0x30,0x1c,0xc0,0x1c,0x80,0x18,0x30,0x20,0x80,0x26,0x30,0x26,0x80, 0x30,0x30,0x2b,0x80,0x30,0x30,0x2b,0x80,0x26,0x30,0x30,0x80,0x39,0x30, 0x39,0x80,0x40,0x30,0x30,0xc0,0x30,0xc0,0x00};//友谊地久天长*//*uchar code sound[]={0xff,0x20,0x60,0x26,0x20,0x20,0x40,0x20,0x20,0x1c,0x20,0x18,0x40,0x18,0x20, 0x1c,0x20,0x20,0x80,0x20,0x60,0x1c,0x20,0x20,0x20,0x1c,0x10,0x20,0x10, 0x26,0x20,0x2b,0x20,0x20,0x30,0x1c,0x10,0x20,0x20,0x26,0x20,0x2b,0x80, 0xff,0x20,0x20,0x20,0xff,0x20,0x20,0x20,0x1c,0x40,0x20,0x40,0x18,0x30, 0x1c,0x10,0x20,0x20,0x26,0x20,0x2b,0x80,0xff,0x20,0x20,0x20,0xff,0x20, 0x20,0x20,0x26,0x40,0x2b,0x20,0x30,0x20,0x30,0xc0,0xff,0x40,0x00};//中华民谣*/uchar zdjs=0,jp,p,a;uint dpjs;void del(uchar yj){uchar yj2=2;while(yj!=0){while(yj2!=0) {yj2--;}yj2=2;yj--;}}void delay0() {uchar u=20; while(u--);}void play() {uchar yj;dpjs=0;while(a){zdjs=0;dpjs++;if(p==1){yj=sound1[dpjs];dpjs++;jp=sound1[dpjs];}if(p==2){yj=sound2[dpjs]; dpjs++;jp=sound2[dpjs];}if(p==3){yj=sound3[dpjs];dpjs++;jp=sound3[dpjs];}if(p==4){yj=sound4[dpjs]; dpjs++;jp=sound4[dpjs];}while(zdjs!=jp){if(yj!=0xff){if(yj!=0){voice=!voice; del(yj);}else{dpjs=0;break;}}else{voice=0;del(jp);}}}}void init(){TMOD=0x01;IE=0x82;TH0=0xd8;TL0=0xef;TR0=1;EX0=1;IT0=1;EA=1;}void main(void){init();a=1;p=1;while(1){play();}}void init_0(void) interrupt 0 {uchar q;q=P1;if(q!=0xff){delay0();q=P1;if(q!=0xff){zdjs=0;dpjs=0;jp=0;switch(q){case 0xfe: a=1;p=1;break;case 0xfd: a=1;p=2;break;case 0xfb: a=1;p=3;break;case 0xf7: a=1;p=4;break;case 0xef: a=0;break;}}}}void time0(void) interrupt 1{TH0=0xd8;TL0=0xef;zdjs++;}声明:欢送学习与制作;请注明出处!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机汇编语言教程:第28课-音乐程序设计(基于HL-1、HJ-C52、HJ-3G实验板)(图片HL-1开发板)利用单片机(或单板机)奏乐大概是无线电爱好者感兴趣的问题之一。
本文从单片机的基本发间实验出发,谈谈音乐程序的设计原理,并给出具体实例,以供参考。
单片机的基本发音实验我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调。
例如,要产生200HZ的音频信号,按图1接入喇叭(若属临时实验,也可将喇叭直接接在P1口线上),实验程序为:其中子程序DEL为延时子程序,当R3为1时,延时时间约为20us,R3中存放延时常数,对200HZ 音频,其周期为1/200秒,即5ms。
这样,当P1.4的高电平或低电平的持续时间为2.5ms,即R3的时间常数取2500/20=125(7DH)时,就能发出200HZ的音调。
将上述程序键入学习机,并持续修改R3的常数能感到音调的变化。
乐曲中,每一音符对应着确定的频率,表1给出C调时各音符频率及其对应的时间常数。
读者能根据表1所供给的常数,将其16进制代码送入R3,反复练习体会。
根据表1能奏出音符。
仅这还不够,要准确奏出一首曲子,必须准确地控制乐曲节奏,即一音符的持续时间。
音符的节拍我们能用定时器T0来控制,送入不一样的初值,就能产生不一样的定时时间。
便如某歌曲的节奏为每分钟94拍,即一拍为0.64秒。
其它节拍与时间的对应关系见表2。
但时,由于T0的最大定时时间只能为131毫秒,因此不可能直接用改变T0的时间初值来实现不一样节拍。
我们能用T0来产生10毫秒的时间基准,然后设置一个中断计数器,通过判别中断计数器的值来控制节拍时间的长短。
表2中也给出了各种节拍所对应的时间常数。
例如对1/4拍音符,定时时间为0.16秒,对应的时间常数为16(即10H);对3拍音符,定时时间为1.92秒,对应时间长数为192(即C0H)。
我们将每一音符的时间常数和其对应的节拍常数作为一组,按次序将乐曲中的所有常数排列成一个表,然后由查表程序依次取出,产生音符并控制节奏,就能实现演奏效果。
此外,结束符和体止符能分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生对应的停顿效果。
为了产生手弹的节奏感,在某些音符(例如两个相同音符)音插入一个时间单位的频率略有不一样的音符。
下面给出程序序清单,可直接在TD-III型学习机上演奏,对其它不一样型号的学习机,只需对应地改变一下地址即可。
本程序演奏的是民歌“八月桂花遍地开”,C调,节奏为94拍/分。
读者也能自行找出一首歌,按表1和表2给定的常数,将乐曲翻译成码表输入机器,而程序不变。
本实验办法简便,即使不懂音乐的人,将一首陌生的曲子翻译成代码也是易事,和着机器的演奏学唱一首歌曲,其趣味无穷。
程序清单(略,请参看源程序的说明)。
程序框图如图2所示。
<单片机音乐程序的设计图>本课由单片机教程网提供,有问题指出.硬件连接说明:随便找一个仿真机或者什么单片机实验板,只要能工作的就行,将程序输入,运行,然后找个音箱(你计算机旁边应当就有一对吧)拨出插头,插头的前端接在P1。
0上,后面部分找根线接单片机的地,就应当有声了,然后怎么改进硬件连接就是你的事了。
音乐程序汇编代码代码1-------------Voice.asm--------------------------ORG0000HLJMP STARTORG000BHINC20H;中断服务,中断计数器加1MOV TH0,#0D8HMOV TL0,#0EFH;12M晶振,形成10毫秒中断RETISTART:MOV SP,#50HMOV TH0,#0D8HMOV TL0,#0EFHMOV TMOD,#01HMOV IE,#82HMUSIC0:NOPMOV DPTR,#DAT;表头地址送DPTRMOV20H,#00H;中断计数器清0MOV B,#00H;表序号清0 MUSIC1:NOPCLR AMOVC A,@A+DPTR;查表取代码JZ END0;是00H,则结束CJNE A,#0FFH,MUSIC5LJMP MUSIC3MUSIC5:NOPMOV R6,AINC DPTRMOV A,BMOVC A,@A+DPTR;取节拍代码送R7MOV R7,ASETB TR0;启动计数MUSIC2:NOPCPL P1.0MOV A,R6MOV R3,ALCALL DELMOV A,R7CJNE A,20H,MUSIC2;中断计数器(20H)=R7否?;不等,则继续循环MOV20H,#00H;等于,则取下一代码INC DPTR;INC BLJMP MUSIC1MUSIC3:NOPCLR TR0;休止100毫秒MOV R2,#0DHMUSIC4:NOPMOV R3,#0FFHLCALL DELDJNZ R2,MUSIC4INC DPTRLJMP MUSIC1END0:NOPMOV R2,#64H;歌曲结束,延时1秒后继续MUSIC6:MOV R3,#00HLCALL DELDJNZ R2,MUSIC6LJMP MUSIC0DEL:NOPDEL3:MOV R4,#02HDEL4:NOPDJNZ R4,DEL4NOPDJNZ R3,DEL3RETNOPDAT:db26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20hdb30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20hdb20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20hdb30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20hdb30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10hdb2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20hdb20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20hdb20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20hdb20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10hdb20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80hdb18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20hdb30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20hdb39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10hdb20h,10h,2bh,10h,26h,30h,30h,80h,00HEND音乐程序汇编代码代码2-------------Voice1.asm--------------------------;标题'八月桂花香'发声程序;摘要详见'无线电'92年3期;作者周振安ORG0000HLJMP STARTORG000BHINC20H;中断服务,中断计数器加1MOV TH0,#0D8HMOV TL0,#0EFH;12M晶振,形成10毫秒中断RETISTART:MOV SP,#50HMOV TH0,#0D8HMOV TL0,#0EFHMOV TMOD,#01HMOV IE,#82HMUSIC0:NOPMOV DPTR,#DAT;表头地址送DPTRMOV20H,#00H;中断计数器清0MOV B,#00H;表序号清0MUSIC1:NOPCLR AMOVC A,@A+DPTR;查表取代码JZ END0;是00H,则结束CJNE A,#0FFH,MUSIC5LJMP MUSIC3MUSIC5:NOPMOV R6,AINC DPTRMOV A,BMOVC A,@A+DPTR;取节拍代码送R7MOV R7,ASETB TR0;启动计数MUSIC2:NOPCPL P1.0MOV A,R6MOV R3,ALCALL DELMOV A,R7CJNE A,20H,MUSIC2;中断计数器(20H)=R7否?;不等,则继续循环MOV20H,#00H;等于,则取下一代码INC DPTR;INC BLJMP MUSIC1MUSIC3:NOPCLR TR0;休止100毫秒MOV R2,#0DHMUSIC4:NOPMOV R3,#0FFHLCALL DELDJNZ R2,MUSIC4INC DPTRLJMP MUSIC1END0:NOPMOV R2,#64H;歌曲结束,延时1秒后继续MUSIC6:MOV R3,#00HLCALL DELDJNZ R2,MUSIC6LJMP MUSIC0DEL:NOPDEL3:MOV R4,#02HDEL4:NOPDJNZ R4,DEL4NOPDJNZ R3,DEL3RETNOPDAT:DB18H,30H,1CH,10HDB20H,40H,1CH,10HDB18H,10H,20H,10HDB1CH,10H,18H,40HDB1CH,20H,20H,20HDB1CH,20H,18H,20HDB20H,80H,0FFH,20HDB30H,1CH,10H,18HDB20H,15H,20H,1CHDB20H,20H,20H,26HDB40H,20H,20H,2BHDB20H,26H,20H,20HDB20H,30H,80H,0FFHDB20H,20H,1CH,10HDB18H,10H,20H,20HDB26H,20H,2BH,20H DB30H,20H,2BH,40H DB20H,20H,1CH,10H DB18H,10H,20H,20H DB26H,20H,2BH,20H DB30H,20H,2BH,40H DB20H,30H,1CH,10H DB18H,20H,15H,20H DB1CH,20H,20H,20H DB26H,40H,20H,20H DB2BH,20H,26H,20H DB20H,20H,30H,80H DB20H,30H,1CH,10H DB20H,10H,1CH,10H DB20H,20H,26H,20H DB2BH,20H,30H,20H DB2BH,40H,20H,15H DB1FH,05H,20H,10H DB1CH,10H,20H,20H DB26H,20H,2BH,20H DB30H,20H,2BH,40H DB20H,30H,1CH,10H DB18H,20H,15H,20H DB1CH,20H,20H,20H DB26H,40H,20H,20H DB2BH,20H,26H,20H DB20H,20H,30H,30H DB20H,30H,1CH,10H DB18H,40H,1CH,20H DB20H,20H,26H,40HDB13H,60H,18H,20HDB15H,40H,13H,40HDB18H,80H,00Hend重要说明需要51学习板的朋友请QQ:3981150881、本教程是《慧净电子》网上收整理,版权归互联网,全部免费共享,为了支持慧净免费助学加上了慧净51实验板的链接。