51单片机-播放天空之城
2015-10-30 18:57
405 查看
#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位的赋初值方法
}
//包含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位的赋初值方法
}
相关文章推荐
- 基于STM32神舟系列开发板的读取绝…
- 基于STM32神舟系列开发板的串口通…
- STM32流水灯,小畅当初弄的小儿科…
- [转载]用Mathematica写动态…
- 01背包问题-动态规划源码
- LoadRunner测试50人同时登陆下单
- CSS布局之--各种居中
- Random类详解
- WebApi传参总动员(二)
- Python练习册,第 0005 题
- [NOIP 2013]花匠 DP
- HDU 4751 Divide Groups (判断二分图染色模板)
- [002] The Perks of Being a Wallflower - 读后记
- cobbler安装配置脚本
- android从相册中获取图片出错,图片无法裁剪的问题
- 【LEETCODE】ADD DIGITS
- Tsinsen 题目A1393. Palisection(回文树)
- 添加到购物车
- LeetCode Convert Sorted Array to Binary Search Tree(数据结构)
- 线程的sleep()和wait() 区别