找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机中断+Proteus仿真音乐实现《天空之城》

[复制链接]
跳转到指定楼层
楼主
随手做的天空之城音乐播放
附带流水灯实现的灯谱效果
代码与proteus仿真都为原创
请大家多多指教

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg51.h>
  2. #include "yinfu.h"
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit k1=P0^0;
  6. sbit BEEP = P2^7;
  7. unsigned char tab[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  8. //天空之城
  9. uchar code SONG_TONE[] = {         
  10. z6,z7, g1,z7,g1,g3, z7,z3,z3, z6,z5,z6,g1, z5,0,z3,z3, z4,z3,z4,g1,
  11. z3,0,g1,g1,g1, z7,g4,g4,z7, z7,0,z6,z7, g1,z7,g1,g3, z7,0,z3,z3, z6,z5,z6,g1,
  12. z5,0,z3, z4,g1,z7,z7,g1, g2,g2,g3,g1,0, g1,z7,z6,z6,z7,z5, z6,0,g1,g2, g3,g2,g3,g5,
  13. g2,0,z5,z5, g1,z7,g1,g3, g3,0,0, z6,z7,g1,z7,g2,g2, z1,z5,z5,0, g4,g3,g2,g1,
  14. g3, g3,0,g3, g6,g5,g5, g3,g2,g1,0,g1, g2,g1,g2,g2,g5, g3,0,g3,
  15. g6,g5, g3,g3,g1,0,g1, g2,g1,g2,g2,z7, z6,0,z6,z7, z6,0
  16. };

  17. uchar code SONG_LONG[] = {
  18. 6,6, 12,6,12,12, 36,6,6, 12,6,12,12, 24,12,6,6, 12,6,6,12,
  19. 24,3,3,3,3, 12,6,12,12, 24,12,6,6, 12,6,12,12, 24,12,6,6, 12,6,12,12,
  20. 36,6,6, 12,6,6,12,12, 4,4,4,12,12, 12,6,6,6,12,12, 24,12,6,6, 12,6,12,12,
  21. 24,12,6,6, 6,6,12,12, 24,12,12, 6,6,12,12,6,6, 12,6,12,12, 12,12,12,12,
  22. 48, 24,12,12, 24,12,12, 6,6,12,6,6,12,6,6,6,12, 24,12,12,
  23. 24,24, 6,6,24,6,6, 12,6,6,6,12, 24,12,6,6, 48,0
  24. };


  25. void delay12u(uint j)         //延时12us
  26. {
  27.         uint i;
  28.         for(i=0;i<j;i++)
  29.         {;}
  30. }

  31. void dengpu(uint a)                        // 等谱实现
  32. {
  33.         switch(a)
  34.         {
  35.                 case d7:
  36.                         P1 = 0x7f;
  37.                 break;
  38.                 case d6:
  39.                         P1 = 0xbf;
  40.                 break;
  41.                 case d5:
  42.                         P1 = 0xdf;
  43.                 break;
  44.                 case d4:
  45.                         P1 = 0xef;
  46.                 break;
  47.                 case d3:
  48.                         P1 = 0xf7;
  49.                 break;
  50.                 case d2:
  51.                         P1 = 0xfb;
  52.                 break;
  53.                 case d1:
  54.                         P1 = 0xfd;
  55.                 break;

  56.                 case z7:
  57.                         P1 = 0x7f;
  58.                 break;
  59.                 case z6:
  60.                         P1 = 0xbf;
  61.                 break;
  62.                 case z5:
  63.                         P1 = 0xdf;
  64.                 break;
  65.                 case z4:
  66.                         P1 = 0xef;
  67.                 break;
  68.                 case z3:
  69.                         P1 = 0xf7;
  70.                 break;
  71.                 case z2:
  72.                         P1 = 0xfb;
  73.                 break;
  74.                 case z1:
  75.                         P1 = 0xfd;
  76.                 break;

  77.                 case g7:
  78.                         P1 = 0x7f;
  79.                 break;
  80.                 case g6:
  81.                         P1 = 0xbf;
  82.                 break;
  83.                 case g5:
  84.                         P1 = 0xdf;
  85.                 break;
  86.                 case g4:
  87.                         P1 = 0xef;
  88.                 break;
  89.                 case g3:
  90.                         P1 = 0xf7;
  91.                 break;
  92.                 case g2:
  93.                         P1 = 0xfb;
  94.                 break;
  95.                 case g1:
  96.                         P1 = 0xfd;
  97.                 break;
  98.                 default:
  99.                         P1 = 0xff;
  100.         }
  101. }

  102. void PlayMusic()
  103. {
  104.          uint i=0,j;
  105.         while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)
  106.         {
  107.                 dengpu(SONG_TONE[i]);
  108.                  for(j=0;j<SONG_LONG[i]*50;j++)
  109.                 {
  110.                          BEEP = ~BEEP;
  111.                         delay12u(SONG_TONE[i]);
  112.                 }
  113.                 i++;
  114.         }
  115. }

  116. void main()
  117. {
  118.         k1=1;
  119.          while(1)
  120.         {
  121.                  if(k1==0)
  122.                 {
  123.                         delay12u(900);
  124.                         if(k1==0)
  125.                         {
  126.                                 PlayMusic();
  127.                                 delay12u(5000);
  128.                         }
  129.                 }
  130.         }
  131. }
复制代码

yinfu.h代码
  1. #ifndef __YINFU_H__
  2. #define __YINFU_H__

  3. #define d1 159
  4. #define d2 142
  5. #define d3 126
  6. #define d4 119
  7. #define d5 106
  8. #define d6 95
  9. #define d7 84

  10. #define z1 80
  11. #define z2 71
  12. #define z3 63
  13. #define z4 60
  14. #define z5 53
  15. #define z6 47
  16. #define z7 42

  17. #define g1 40
  18. #define g2 35
  19. #define g3 32
  20. #define g4 30
  21. #define g5 27
  22. #define g6 24
  23. #define g7 21


  24. #endif
复制代码
proteus元件连接图与程序:
51单片机天空之城音乐实现.zip (65.75 KB, 下载次数: 27)

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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