随手做的天空之城音乐播放
附带流水灯实现的灯谱效果
代码与proteus仿真都为原创
请大家多多指教
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg51.h>
- #include "yinfu.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit k1=P0^0;
- sbit BEEP = P2^7;
- unsigned char tab[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- //天空之城
- uchar code SONG_TONE[] = {
- z6,z7, g1,z7,g1,g3, z7,z3,z3, z6,z5,z6,g1, z5,0,z3,z3, z4,z3,z4,g1,
- 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,
- 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,
- 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,
- g3, g3,0,g3, g6,g5,g5, g3,g2,g1,0,g1, g2,g1,g2,g2,g5, g3,0,g3,
- g6,g5, g3,g3,g1,0,g1, g2,g1,g2,g2,z7, z6,0,z6,z7, z6,0
- };
- uchar code SONG_LONG[] = {
- 6,6, 12,6,12,12, 36,6,6, 12,6,12,12, 24,12,6,6, 12,6,6,12,
- 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,
- 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,
- 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,
- 48, 24,12,12, 24,12,12, 6,6,12,6,6,12,6,6,6,12, 24,12,12,
- 24,24, 6,6,24,6,6, 12,6,6,6,12, 24,12,6,6, 48,0
- };
- void delay12u(uint j) //延时12us
- {
- uint i;
- for(i=0;i<j;i++)
- {;}
- }
- void dengpu(uint a) // 等谱实现
- {
- switch(a)
- {
- case d7:
- P1 = 0x7f;
- break;
- case d6:
- P1 = 0xbf;
- break;
- case d5:
- P1 = 0xdf;
- break;
- case d4:
- P1 = 0xef;
- break;
- case d3:
- P1 = 0xf7;
- break;
- case d2:
- P1 = 0xfb;
- break;
- case d1:
- P1 = 0xfd;
- break;
- case z7:
- P1 = 0x7f;
- break;
- case z6:
- P1 = 0xbf;
- break;
- case z5:
- P1 = 0xdf;
- break;
- case z4:
- P1 = 0xef;
- break;
- case z3:
- P1 = 0xf7;
- break;
- case z2:
- P1 = 0xfb;
- break;
- case z1:
- P1 = 0xfd;
- break;
- case g7:
- P1 = 0x7f;
- break;
- case g6:
- P1 = 0xbf;
- break;
- case g5:
- P1 = 0xdf;
- break;
- case g4:
- P1 = 0xef;
- break;
- case g3:
- P1 = 0xf7;
- break;
- case g2:
- P1 = 0xfb;
- break;
- case g1:
- P1 = 0xfd;
- break;
- default:
- P1 = 0xff;
- }
- }
- void PlayMusic()
- {
- uint i=0,j;
- while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)
- {
- dengpu(SONG_TONE[i]);
- for(j=0;j<SONG_LONG[i]*50;j++)
- {
- BEEP = ~BEEP;
- delay12u(SONG_TONE[i]);
- }
- i++;
- }
- }
- void main()
- {
- k1=1;
- while(1)
- {
- if(k1==0)
- {
- delay12u(900);
- if(k1==0)
- {
- PlayMusic();
- delay12u(5000);
- }
- }
- }
- }
复制代码
yinfu.h代码- #ifndef __YINFU_H__
- #define __YINFU_H__
- #define d1 159
- #define d2 142
- #define d3 126
- #define d4 119
- #define d5 106
- #define d6 95
- #define d7 84
- #define z1 80
- #define z2 71
- #define z3 63
- #define z4 60
- #define z5 53
- #define z6 47
- #define z7 42
- #define g1 40
- #define g2 35
- #define g3 32
- #define g4 30
- #define g5 27
- #define g6 24
- #define g7 21
- #endif
复制代码 proteus元件连接图与程序:
51单片机天空之城音乐实现.zip
(65.75 KB, 下载次数: 27)
|