微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机-播放天空之城

51单片机-播放天空之城

时间:11-27 来源:互联网 点击:
#include //包含51单片机寄存器定义的头文件

sbit sound=P3^7; //将sound位定义为P3.7

unsigned int C; //储存定时器的定时常数

//以下是C调低音的音频宏定义

#define L1 262 //将"L1"宏定义为低音"1"的频率262Hz 时间是1/262=3826/2 us 取半周期

#define L2 286 //将"L2"宏定义为低音"2"的频率286Hz

#define L3 311 //将"L3"宏定义为低音"3"的频率311Hz

#define L4 349 //将"L4"宏定义为低音"4"的频率349Hz

#define L5 392 //将"L5"宏定义为低音"5"的频率392Hz

#define L6 440 //将"l_a"宏定义为低音"6"的频率440Hz

#define L7 494 //将"L7"宏定义为低音"7"的频率494Hz

//以下是C调中音的音频宏定义

#define Z1 523 //将"Z1"宏定义为中音"1"的频率523Hz

#define Z2 587 //将"Z2"宏定义为中音"2"的频率587Hz

#define Z3 659 //将"Z3"宏定义为中音"3"的频率659Hz

#define Z4 698 //将"Z4"宏定义为中音"4"的频率698Hz

#define Z5 784 //将"Z5"宏定义为中音"5"的频率784Hz

#define Z6 880 //将"Z6"宏定义为中音"6"的频率880Hz

#define Z7 987 //将"Z7"宏定义为中音"7"的频率523H

//以下是C调高音的音频宏定义

#define H1 1046 //将"H1"宏定义为高音"1"的频率1046Hz

#define H2 1174 //将"H2"宏定义为高音"2"的频率1174Hz

#define H3 1318 //将"H3"宏定义为高音"3"的频率1318Hz

#define H4 1396 //将"H4"宏定义为高音"4"的频率1396Hz

#define H5 1567 //将"H5"宏定义为高音"5"的频率1567Hz

#define H6 1760 //将"H6"宏定义为高音"6"的频率1760Hz

#define H7 1975 //将"H7"宏定义为高音"7"的频率1975Hz

void delay()

{

unsigned char i,j;

for(i=0;i<100;i++)

for(j=0;j<250;j++)

;

}

void main(void)

{

unsigned char i,j;

//以下是《天空之城》简谱 //每行对应一小节音符

unsigned int code f[]={ Z6,Z7,H1,Z7,H1,H3,Z7,Z3,Z3, Z6,Z5,Z6,H1,Z5,Z3,Z3, Z4,Z3,Z4,H1,

Z3,H1,H1,H1,Z7,Z4,Z4,Z7,Z7,Z6,Z7, H1,Z7,H1,H3,Z7,Z3,Z3, Z6,Z5,Z6,H1,

Z5, Z3,Z4,H1,Z7,H1,H2,H2,H2,H1,H1,Z6,Z7,Z5,Z6,H1,H2, H3,H2,H3,H5,

H2,Z5,Z5, H1,Z7,H1,H3,H3, Z6,H1,Z7,H2,H1,Z5,Z5, H4,H3,H2,H1,

H3, Z3,H3, H6,H5,H5, H3,H2,H1,H1,H2,H1,H2,H5,H3,H3,

H6,H5, H3,H2,H1,H1,H2,H1,H2,Z7,Z6,Z6,Z7, Z6,

0xff}; //以0xff作为音符的结束标志

//以下是简谱中每个音符的节拍

//"4"对应4个延时单位,"2"对应2个延时单位,"1"对应1个延时单位

unsigned char code JP[ ]={ 4,4, 12,4,8,8, 20,4,4, 12,4,8,8, 20,4,4, 12,4,4,12,

20,4,4,4, 12,4,8,8, 20,4,4, 12,4,8,8, 20,4,4, 12,4,8,8,

32, 4, 8,4,6,8, 4,4,4,16, 8,4,6,8, 24,4,4, 12,4,8,8,

24,4,4, 4,4,8,8, 32, 4,8,8,6, 12,4,16, 8,8,8,8,

30, 20,8, 16,8,8, 4,4,16,8, 8,4,4,8, 20,8,

16,16, 4,20,8, 8,4,4,8, 20,4,4, 32,

};

EA=1; //开总中断

ET0=1; //定时器T0中断允许

TMOD=0x00; // 使用定时器T0的模式1(13位计数器)

while(1) //无限循环

{

i=0; //从第1个音符f[0]开始播放

while(f[i]!=0xff) //只要没有读到结束标志就继续播放

{

C=460830/f[i]; //

TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法 5

TL0=(8192-C)2; //可证明这是13位计数器TL0低5位的赋初值方法

TR0=1; //启动定时器T0

for(j=0;j

delay(); //延时1个节拍单位

TR0=0; //关闭定时器T0

i++; //播放下一个音符

}

sound=0;

}

}

void Time0(void ) interrupt 1 using 1

{

sound=!sound; //将P3.7引脚输出电平取反,形成方波

TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法

TL0=(8192-C)2; //可证明这是13位计数器TL0低5位的赋初值方法

}

上一篇:单片机的罢工
下一篇:外部按键中断

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top