找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机音乐盒proteus仿真和源码 内附三首小音乐

[复制链接]
跳转到指定楼层
楼主
内附三首小音乐。


全部源码和仿真下载:
音乐会.zip (61.05 KB, 下载次数: 140)


单片机源程序:
  1. #include<reg51.h>
  2. sbit fx_buzzer=P3^7; //蜂鸣器音乐输出,可根据需要自行修改

  3. sbit music_1 = P2^0;        //第一首音乐
  4. sbit music_2 = P2^1;        //第二首音乐
  5. sbit music_3 = P2^2;        //第二首音乐



  6. unsigned int tone; //简谱音调计数

  7. unsigned char fx_timeh,fx_timel,music,speed; //fx_timeh:TH0初值,fx_timel:TL0初值; music =1播放,=0停止

  8. unsigned char code fx_tone0[]={ //音调对应定时器初值
  9. 0xFC,0x8E, 0xFC,0xED, 0xFD,0x43, //中音
  10. 0xFD,0x6A, 0xFD,0xB3, 0xFD,0xF3, 0xFE,0x2D,
  11. 0xFE,0x47, 0xFE,0x76, 0xFE,0xA1, //高音
  12. 0xFE,0xC7, 0xFE,0xD9, 0xFE,0xF9, 0xFF,0x16
  13. };

  14. unsigned char code songbie[]={//送别
  15. 0x54,0x32,0x52,0x88,0x64,0x84,0x58,0x54,0x12,0x22,0x34,0x22,0x12,0x2c,0x04,
  16. 0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0x72,0x1c,
  17. 0x64,0x8c,0x74,0x62,0x72,0x88,0x62,0x72,0x82,0x62,0x52,0x32,0x12,0x2f,
  18. 0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0x72,0x1c,
  19. 0x64,0x8c,0x74,0x62,0x72,0x88,0x62,0x72,0x82,0x62,0x52,0x32,0x12,0x2f,
  20. 0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0x72,0x1c,
  21. 0xff};

  22. unsigned char code qnzl[]={ //千年之恋
  23. 0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,
  24. 0x42,0x34,0x84,0x72,0x82,0x94,0xA8,0x08,0x32,0x31,
  25. 0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,0x32,0x31,
  26. 0x21,0x32,0x82,0x71,0x81,0x71,0x51,0x32,0x22,0x32,
  27. 0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,0x32,
  28. 0x31,0x21,0x32,0x83,0x82,0x71,0x72,0x02,0x63,0xA1,
  29. 0xA2,0x62,0x92,0x82,0x52,0x31,0x51,0x63,0x51,0x63,
  30. 0x51,0x63,0x51,0x62,0x82,0x7C,0x02,0x61,0x71,0x82,
  31. 0x71,0x62,0xA2,0x71,0x76,0x61,0x71,0x82,0x71,0x62,
  32. 0x52,0x31,0x36,0x61,0x71,0x82,0x71,0x62,0xA3,0x73,
  33. 0x62,0x53,0x42,0x63,0x83,0x83,0x91,0x91,0x61,0x71,
  34. 0x82,0x71,0x62,0x0A2,0x71,0x76,0x61,0x71,0x82,0x71,
  35. 0x62,0x52,0x31,0x36,0x61,0x71,0x82,0x71,0x62,0xA3,
  36. 0x73,0x62,0x53,0x42,0x82,0x88,0x02,0x74,0x93,0x89,
  37. 0xff};

  38. unsigned char code laohu[]={                  //两只老虎
  39. 0x14,0x14,0x24,0x34,0x14,0x14,0x24,0x34,0x14,
  40. 0x34,0x44,0x58,0x34,0x44,0x58,
  41. 0x53,0x61,0x53,0x41,0x34,0x14,
  42. 0x53,0x61,0x53,0x41,0x34,0x14,
  43. 0x14,0x54,0x18,
  44. 0x14,0x54,0x18,
  45. 0xFF};

  46. unsigned char keyValue;           //存储按下的键值

  47. void init() //初始化函数
  48. {
  49.         EA=1;//开总中断
  50.         TMOD=0x10;//定时器0工作在方式1
  51.         TH1=0;
  52.         TL1=0;
  53.         ET1=1;
  54.         music=1; //默认播放
  55.         tone=0;
  56.         speed=20;         //播放速度
  57. }


  58. void fx_delay(unsigned char i) //音长延时函数
  59. {
  60.         unsigned int j,k;
  61.         for(i;i>0;i--)
  62.                 for(k=speed;k>0;k--)
  63.                         for(j=625;j>0;j--);
  64. }


  65. void play(unsigned char *temp) //音阶播放函数
  66. {
  67.         if(speed<1) speed=1; //速度范围设定
  68.         if(speed>60) speed=60;
  69.         while(1)
  70.         {
  71.                 if(!music) break;
  72.         
  73.                 if(music==2) {tone=0;music=1;break;} //配合按钮换歌
  74.                 if(temp[tone]==0xff){tone=0;break;};
  75.                 if(temp[tone]/16!=0) //取高4位的音阶判断
  76.                 {
  77.                         fx_timeh=fx_tone0[temp[tone]/16*2-2];
  78.                         fx_timel=fx_tone0[temp[tone]/16*2-1];
  79.                         TR1=1;
  80.                 }
  81.                 fx_delay(temp[tone]%16); //取数的低4位
  82.                 TR1=0;
  83.                 tone++;
  84.         }
  85.         TR1=0;
  86. }


  87. void fx_tone() interrupt 3 //用于产生各种音调
  88. {
  89.         TH1=fx_timeh;
  90.         TL1=fx_timel;
  91.         fx_buzzer=~fx_buzzer;
  92. }

  93. void Delay10ms(unsigned int n)  //延时函数,延时10ms
  94. {  
  95.     unsigned char a, b;  
  96.     for (; n>0; n--)  
  97.     {  
  98.         for (b=38; b>0; b--)  
  99.         {  
  100.             for (a=130; a>0; a--);  
  101.         }  
  102.     }      
  103. }  


  104. void EX0_INT(void) interrupt 0   //外部INT0
  105. {
  106.         if(tone !=0 ) music = 2;


  107.         if(music_1 == 0)
  108.                 {
  109.                         Delay10ms(1);
  110.                         if(music_1 == 0)
  111.                         {
  112.                                 while(music_1 == 0);        //等待松开按钮
  113.                                 keyValue = 1; //播放第一首音乐-送别
  114.                         }
  115.                 }
  116.                
  117.                 if(music_2 == 0)
  118.                 {
  119.                         Delay10ms(1);
  120.                         if(music_2 == 0)
  121.                         {
  122.                                 while(music_2 == 0);        //等待松开按钮
  123.                                 keyValue = 2; //播放第二首音乐
  124.                         }
  125.                 }
  126.                
  127.                 if(music_3 == 0)
  128.                 {
  129.                         Delay10ms(1);
  130.                         if(music_3 == 0)
  131.                         {
  132.                                 while(music_3 == 0);        //等待松开按钮
  133.                                 keyValue = 3; //播放第三首音乐
  134.                         }
  135.                         
  136.                 }

  137. }

  138. //主函数
  139. void main()
  140. {
  141.         init(); //初始化函数
  142.         //play(song1); //音阶播放函数

  143.         IT0=1;          //外部中断INT0位下降沿触发
  144.         EX0=1;          //开INT0中断允许
  145.         


  146. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

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

使用道具 举报

沙发
ID:858740 发表于 2020-12-11 15:55 | 只看该作者
没有proteus仿真电路图?
回复

使用道具 举报

板凳
ID:328014 发表于 2020-12-11 16:18 | 只看该作者
lixinxian 发表于 2020-12-11 15:55
没有proteus仿真电路图?

那个dsn文件就是Proteus仿真图,需要先下载安装Proteus7.8版本才能打开,其他版本都不行
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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