完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近想在单片机上播单音的音乐,想自己选歌来播,现成的音乐代码都是比较耳熟能详的歌,稍微偏门一点的歌就没用51的代码可以直接烧录。我是最近才开始学单片机的,之前在网上下了一个叫51Music单片机音乐代码生成器的软件,试着用了一下,发现就里面的案例用比较常用的11.0592MHz的晶振播放感觉好像是快了几倍,用差不多4MHz的晶振才能正常速度播放。我试着改了一下里面的代码,就是没办法调节速度,这个我忍了。试着打了一首歌,上面的音符节拍按下之后就会显示代码在右边,但是这不方便对照检查,打错了也不知道,想更改其中一个位置的数据又不方便。打完之后编译烧录试了一下,和原版相差太多了,就好像不是那首曲子一样,还有写地方都不知道是我打错了还是程序的问题。最后面我实在是忍无可忍了。 自己就花了半个月多的时间写了一款代码生成器。这个代码生成器真的是非常好用啊,可以对照简谱,可以设置每个音的停顿时间设定使用的晶振频率、时钟周期、歌曲的拍数。编写音乐的效率大大提高,终于不用自己一个一个去算定时器的赋值了,除了代码可能不是写的很规范。如果大家有需要的话就用吧,刚开始的时候是为了自己用的,把功能设置的很简单。但是本着你好我好大家好的共享精神,就把界面,功能,用户体验,做的比较用心了。如果有什么错误疏漏不规范的地方请大家指正。最后的话,欢迎大家转载哦! |
|
相关推荐
5 个讨论
|
|
我比较喜欢动漫歌曲,最近用它打了《东京泰迪熊》到单片机里面,用P0.0做蜂鸣器输出口,挺好听的,分享一下源代码应该没什么问题吧?
/*----------------------------------------------- ---------8051单片机音乐代码生成器--------- 本软件作者:CLY 作者QQ:2315959474 本音乐编写日期:2016年4月10日 19:46 曲名:东京泰迪熊 使用的晶振频率:11.059200MHz 时钟周期:12个 曲调:G 速度:240 感谢您对本音乐代码生成器作者的支持! ------------------------------------------------*/ #include ***it fmq = P0^0;//定义蜂鸣器端口 static unsigned int bf;//定义全局变量播放位置变量 static unsigned char jp0;//定义全局变量播放时间单位化到0.015s static unsigned char jp1;//定义全局变量控制播放时间即节拍 unsigned char code th[] = {//定时器0高八位频率设定 0x93,0xF6,0xF6,0xF7,0xF7,0xF8,0xF8,0xF9,0xF9,0xF9,0xFA,0xFA,0xFA,0xFB, //低八度0,b1,1,#1,2,#2,3,4,#4,5,#5,6,#6,7 0xFB,0xFB,0xFB,0xFC,0xFC,0xFC,0xFC,0xFC,0xFD,0xFD,0xFD,0xFD, //中音1,#1,2,#2,3,4,#4,5,#5,6,#6,7 0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE //高八度1,#1,2,#2,3,4,#4,5,#5,6,#6,7,#7 }; unsigned char code tl[] = {//定时器0低八位频率设定 0xFF,0x44,0xD6,0x5D,0xD5,0x4A,0xB5,0x1D,0x85,0xDD,0x38,0x89,0xDA,0x22, //低八度0,b1,1,#1,2,#2,3,4,#4,5,#5,6,#6,7 0x67,0xAB,0xE8,0x23,0x59,0x8E,0xC1,0xEF,0x1C,0x44,0x6C,0x90, //中音1,#1,2,#2,3,4,#4,5,#5,6,#6,7 0xB4,0xD5,0xF4,0x12,0x2D,0x47,0x60,0x77,0x8D,0xA2,0xB5,0xC6,0xD8 //高八度1,#1,2,#2,3,4,#4,5,#5,6,#6,7,#7 }; unsigned char code ysjs[] = {//延时计算一个单位时间为0.015s 1,7,7,8,8,8,9,9,10,11,11,12,13,13, //低八度0,b1,1,#1,2,#2,3,4,#4,5,#5,6,#6,7 14,15,16,17,18,19,20,21,22,24,25,27, //中音1,#1,2,#2,3,4,#4,5,#5,6,#6,7 28,30,32,34,36,38,40,42,45,47,50,53,56 //高八度1,#1,2,#2,3,4,#4,5,#5,6,#6,7,#7 }; unsigned char code jpsz[] = {2,4,5,7,11,13,15,24,28,32,49,66};//对应节拍数组 unsigned int code yb1[][2] = {//歌曲音符节拍调用数组 {0,6},{18,6},{26,6},{26,3},{25,6},{23,3},{22,6},{0,6},{21,6},{23,6},{23,3},{21,6},{16,3}, {19,3},{18,11},{0,6},{16,6},{19,6},{19,3},{18,6},{23,3},{23,6},{0,6},{23,6},{23,6},{23,3}, {25,6},{23,3},{23,3},{22,11},{0,6},{18,6},{26,6},{26,3},{25,6},{23,3},{22,6},{0,6},{21,6}, {23,6},{23,3},{21,6},{16,3},{19,3},{18,11},{0,6},{16,6},{19,6},{19,3},{18,6},{23,3},{23,6}, {0,6},{23,6},{23,6},{23,3},{25,6},{23,3},{23,3},{22,11},{0,6},{18,6},{26,6},{26,3},{25,6},{23,3},{22,6},{0,6},{21,6},{23,6},{23,3},{21,6},{16,3}, {19,3},{18,11},{0,6},{16,3},{16,3},{19,6},{19,3},{18,6},{23,3},{23,6},{0,6},{23,6},{23,6}, {26,3},{25,6},{22,3},{22,3},{23,3},{0,3},{11,3},{11,3},{11,3},{11,3},{0,3},{0,6},{23,6}, {18,6},{18,3},{23,6},{22,7},{18,6},{18,6},{22,6},{23,6},{23,6},{21,3},{19,6},{18,6},{18,3}, {18,3},{18,3},{18,3},{18,3},{18,3},{18,3},{19,6},{19,6},{19,3},{18,3},{16,3},{18,10}, {23,6},{26,6},{25,9},{23,7},{22,11},{0,6},{18,6},{26,6},{26,3},{25,6},{23,3},{22,6},{0,6},{21,6},{23,6}, {23,3},{21,6},{16,3},{19,3},{18,11},{0,6},{16,3},{16,3},{19,6},{19,3},{18,6},{23,3},{23,6}, {0,6},{23,6},{23,6},{26,3},{25,6},{22,3},{22,3},{23,10},{23,3},{30,10},{30,3},{28,7}, {26,6},{25,6},{21,3},{21,10},{28,3},{28,6},{26,7},{23,6},{25,3},{26,6},{25,3},{26,9}, {26,3},{28,6},{26,3},{28,9},{26,3},{28,7},{28,3},{28,3},{30,3},{26,3},{26,3},{25,3},{0,6},{21,6},{26,3},{24,6},{26,7},{33,6},{26,3},{24,6},{26,7},{33,6},{26,3},{24,6},{28,7}, {29,6},{28,3},{24,6},{21,7},{21,6},{26,3},{24,6},{26,7},{33,6},{26,3},{24,6},{26,7},{33,6}, {26,3},{24,6},{0,3},{24,9},{28,7},{29,3},{0,6},{21,6},{26,3},{24,6},{26,7},{33,6},{26,3}, {24,6},{26,7},{33,6},{26,3},{24,6},{28,7},{29,6},{28,3},{24,6},{21,3},{0,6},{21,6},{26,3}, {28,3},{0,3},{29,7},{21,6},{21,3},{29,3},{0,3},{28,7},{19,6},{19,3},{28,3},{0,3},{28,6},{26,3},{26,10},{0,6},{0,6},{0,6},{0,6},{0,6},{18,6},{26,6},{26,3},{25,6},{23,3},{22,6}, {0,6},{21,6},{23,6},{23,3},{21,6},{16,3},{19,3},{18,11},{0,6},{16,6},{19,6},{19,3},{18,6}, {23,3},{23,6},{0,6},{23,6},{23,6},{23,3},{25,6},{23,3},{23,3},{22,10},{0,3},{18,7},{26,3}, {26,3},{25,6},{23,3},{22,3},{0,3},{22,3},{20,3},{22,3},{23,6},{0,3},{18,7},{26,3},{26,3}, {25,6},{23,3},{22,3},{0,3},{22,3},{20,3},{22,3},{23,6},{0,3},{18,7},{26,3},{26,3},{25,6}, {23,3},{22,3},{0,3},{22,3},{20,3},{22,3},{23,6},{0,3},{18,7},{26,3},{26,3},{25,6},{23,3},{22,3},{0,3}, {22,3},{20,3},{22,3},{23,6},{0,3},{28,10},{30,3},{28,7},{26,6},{25,6},{21,3},{21,10}, {28,3},{28,6},{26,7},{23,6},{25,3},{26,6},{25,3},{26,9},{26,3},{28,6},{26,3},{28,9},{26,3}, {28,7},{28,3},{28,3},{30,3},{26,3},{25,3},{0,6},{21,6},{26,3},{24,6},{26,7},{33,6},{26,3},{24,6},{26,7},{33,6},{26,3},{24,6},{28,7}, {29,6},{28,3},{24,6},{21,7},{21,6},{26,3},{24,6},{26,7},{33,6},{26,3},{24,6},{26,7},{33,6}, {26,3},{24,6},{0,3},{24,9},{28,7},{29,3},{0,6},{33,3},{33,3},{36,3},{36,3},{0,3},{26,7}, {33,3},{33,3},{36,3},{36,3},{0,3},{26,7},{33,3},{33,3},{36,3},{36,3},{0,3},{31,7},{29,3},{29,3},{28,3},{24,3},{24,3},{26,7},{21,6},{26,3},{28,6},{29,7},{21,6},{21,3},{29,6}, {28,7},{19,6},{19,3},{28,3},{0,3},{28,6},{26,11},{23,6},{18,6},{18,3},{23,6},{22,7},{18,6}, {18,6},{22,6},{23,6},{23,6},{21,3},{19,6},{18,6},{23,3},{26,3},{30,3},{35,3},{30,3},{26,3}, {30,2},{31,6},{31,6},{31,3},{30,3},{28,3},{30,10},{35,6},{38,6},{37,9},{35,7},{34,6}, {35,3},{34,3},{30,3},{25,3},{23,3},{22,3},{18,3},{23,10},{22,3},{23,3},{25,3},{23,3}, {22,3},{18,10},{23,9},{22,3},{23,6},{30,11},{31,3},{35,3},{31,3},{28,3},{23,3},{19,3},{16,3},{19,3}, {23,3},{28,3},{31,3},{35,3},{30,3},{34,3},{30,3},{25,3},{22,3},{18,3},{14,3},{18,3},{22,3}, {25,3},{30,3},{34,3},{38,9},{37,7},{33,11} }; void ds1() {//定时器使用函数 TMOD |= 0x01;//打开定时器0,工作模式为1 TR0=1;//定时器0开关打开 EA=1;//总中断打开 ET0=1;//定时器0中断打开 } main() {//主循环 bf=0;//全局变量播放位置变量初始 jp0=0;//全局变量播放时间单位化初始 jp1=0;//全局变量控制播放时间即节拍初始 ds1();//调用定时器使用函数开始播放 while(1);//这里可以添加要同时执行的其他命令 } void ds1_dl()interrupt 1//当定时器0溢出中断 { TH0 = th[yb1[bf][0]];//定时器0高8位给定时值 TL0 = tl[yb1[bf][0]];//定时器0低8位给定时值 if (th[yb1[bf][0]] != 0x93 && tl[yb1[bf][0]] != 0xFF && jp1 fmq = ~fmq;//蜂鸣器振动发声 } jp0++;//计数器加一计数 if (jp0 == ysjs[yb1[bf][0]]) {//如果当前音符播放了0.03s jp1++;//节拍,播放个数加1 jp0 = 0;//计数器归零 } if (jp1 == jpsz[yb1[bf][1]]) {//如果当前音符播放完成一个指定的节拍 bf++;//播放位置跳到下一个音符节拍 jp1 = 0;//计数器归零 if(bf == 511) {//如果播放到最后一位,即播放完成 bf = 0;//从头播放 } } } |
|
|
|
|
|
不错的文件,值得收藏
|
|
|
|
|
|
《DNK210使用指南 -CanMV版 V1.0》第四十章 YOLO2人手检测实验
366 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-网络编程示例之开发板测试
348 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-网络编程示例之网络socket程序编程
780 浏览 0 评论
飞凌嵌入式-ELFBOARD-RGB LCD屏接口的PCB设计要点
848 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-spi编程示例之spi编写程序
900 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11724 浏览 31 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-15 20:06 , Processed in 0.506344 second(s), Total 44, Slave 35 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号