标题:
单片机中断+Proteus仿真音乐实现《天空之城》
[打印本页]
作者:
青时°
时间:
2020-6-2 18:02
标题:
单片机中断+Proteus仿真音乐实现《天空之城》
随手做的天空之城音乐播放
附带流水灯实现的灯谱效果
代码与proteus仿真都为原创
请大家多多指教
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei截图20200602174947.png
(40.68 KB, 下载次数: 43)
下载附件
2020-6-2 18:01 上传
单片机源程序如下:
#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)
2020-6-2 18:02 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1