找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5821|回复: 2
打印 上一主题 下一主题
收起左侧

在proteus软件中用51单片机实现音乐播放,音质完美

[复制链接]
跳转到指定楼层
楼主
ID:710460 发表于 2021-4-20 17:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
proteus 图纸需要用8.8版本以上,才能打开。

注意上图的speaker的驱动电压需要修改成1V,才能驱动。

单片机代码如下所示:
  1. #include <reg52.h>

  2. sbit beep = P1^5;
  3. unsigned char timer0H, timer0L, time;

  4. //单片机晶振采用11.0592MHz
  5. // 频率-半周期数据表 高八位     本软件共保存了四个八度的28个频率数据
  6. code unsigned char FREQH[] = {
  7.     0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8,    //低音1234567
  8.     0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i
  9.     0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE,            //高音 234567
  10.     0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF};   //超高音 1234567
  11. // 频率-半周期数据表 低八位
  12. code unsigned char FREQL[] = {
  13.     0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6,    //低音1234567
  14.     0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i
  15.     0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D,             //高音 234567
  16.     0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16};   //超高音 1234567
  17. //数据表           
  18. code unsigned char song[] = {
  19. 5, 2, 2, 6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 2, 1, 2, 6, 5, 1, 6, //我和我的祖国
  20. 1, 2, 2, 3, 2, 2, 1, 3, 2, 7, 2, 2, 6, 2, 3, 3, 2, 1, 5, 2, 12,                        //一刻也不能分割
  21. 6, 2, 2, 7, 2, 2, 6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 6, 6, 1, 6,        //无论我走到哪里
  22. 7, 1, 2, 6, 1, 2, 5, 1, 2, 5, 2, 2, 1, 2, 3, 2, 2, 1, 3, 2, 12,                        //都唱出一首赞歌
  23. 5, 2, 2, 6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 2, 1, 2, 6, 5, 1, 6,        //我歌唱每一座高山
  24. 1, 2, 2, 3, 2, 2, 1, 3, 2, 7, 2, 2, 2, 3, 3, 1, 3, 1, 6, 2, 12,                        //我歌唱每一条河
  25. 1, 3, 2, 7, 2, 2, 6, 2, 2, 5, 2, 6,                                                                                //袅袅炊烟
  26. 6, 2, 2, 5, 2, 2, 4, 2, 2, 3, 2, 6,                                                                                //小小村落
  27. 7, 1, 4, 6, 1, 2, 5, 1, 4, 2, 2, 2, 1, 2, 12,                                                        //路上一道辙
  28. 8, 2, 2, 2, 3, 2, 3, 3, 2, 2, 3, 2, 8, 2, 2, 6, 2, 2, 7, 2, 2, 6, 2, 3, 3, 2, 1, 5, 2, 12,//我最亲爱的祖国
  29. 8, 2, 2, 2, 3, 2, 3, 3, 2, 2, 3, 2, 8, 2, 2, 6, 2, 2, 7, 2, 2, 5, 2, 3, 3, 2, 1, 6, 2, 12,//我永远紧依着你的心窝
  30. 5, 2, 2, 4, 2, 2, 3, 2, 2, 2, 2, 6, 7, 1, 2, 6, 1, 2, 5, 1, 2, 3, 2, 6,4, 2, 6, 2, 2, 4, 1, 2, 2,1, 2, 10,//你用你那母亲的脉搏和我诉说
  31. 0x00,0x00,0x00
  32. };
  33. //一个音符有三个数字。前为第几个音、中为第几个八度、后为时长(以半拍为单位)。
  34. //6, 2, 3 分别代表:6, 中音, 3个半拍;
  35. //5, 2, 1 分别代表:5, 中音, 1个半拍;

  36. void t0int() interrupt 1         //T0中断程序,控制发音的音调
  37. {
  38.     TR0 = 0;                     //先关闭T0
  39.     beep = !beep;          //输出方波, 发音
  40.     TH0 = timer0H;               //下次的中断时间, 这个时间, 控制音调高低
  41.     TL0 = timer0L;
  42.     TR0 = 1;                     //启动T0
  43. }

  44. void delay(unsigned char t)     //延时程序,控制发音的时间长度
  45. {
  46.     unsigned char t1;
  47.     unsigned long t2;
  48.     for(t1 = 0; t1 < t; t1++)    //双重循环, 共延时t个半拍
  49.       for(t2 = 0; t2 < 4000; t2++); //延时期间, 可进入T0中断去发音
  50.     TR0 = 0;                        //关闭T0, 停止发音
  51. }

  52. void sing()                      //演奏一个音符
  53. {
  54.     TH0 = timer0H;               //控制音调
  55.     TL0 = timer0L;
  56.     TR0 = 1;                     //启动T0, 由T0输出方波去发音
  57.     delay(time);                 //控制时间长度
  58. }

  59. void main(void)
  60. {
  61.     unsigned int k, i;
  62.     TMOD = 1;                    //置T0定时工作方式1
  63.     ET0 = 1;                     //开T0中断
  64.     EA = 1;                      //开总中断
  65.    while(1)
  66.         {
  67.       i = 0;
  68.       time = 1;
  69.                            while(time)
  70.                                 {
  71.                                                 k = song[i] + 7 * song[i + 1] - 1;//第i个是音符, 第i+1个是第几个八度
  72.                                                 timer0H = FREQH[k];      //从数据表中读出频率数值
  73.                                                 timer0L = FREQL[k];      //实际上, 是定时的时间长度
  74.                                                 time = song[i + 2];   //读出时间长度数值
  75.                                                 i += 3;
  76.                                           if(time!=0x00)
  77.                                                         sing();                  //发出一个音符
  78.                                                 else break;
  79.                                 }  
  80.     }  
  81. }
复制代码
根据下图所示简谱,编写的程序



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:710460 发表于 2021-4-20 18:13 | 只看该作者
忘记上传附件了
-用蜂鸣器实现的音乐盒.7z (37.78 KB, 下载次数: 47)
回复

使用道具 举报

板凳
ID:1088316 发表于 2023-7-13 09:19 | 只看该作者
这个烧到51单片机里面不能用是为什么呀
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表