您的位置 首页 传感器

单片机 音乐编写 《巴望》

用定时器T0的中断实现渴望主题曲的播放#includereg51.h>//包含51单片机寄存器定义的头文件sbitsound=P3^7;//将sound位定义为P3.7u…

用守时器T0的中止完成”巴望”主题曲的播映
#include //包括51单片机寄存器界说的头文件
sbit sound=P3^7; //将sound位界说为P3.7
unsigned int C; //贮存守时器的守时常数
//以下是C调低声的音频宏界说
#define l_dao 262 //将“l_dao”宏界说为低声“1”的频率262Hz
#define l_re 286 //将“l_re”宏界说为低声“2”的频率286Hz
#define l_mi 311 //将“l_mi”宏界说为低声“3”的频率311Hz
#define l_fa 349 //将“l_fa”宏界说为低声“4”的频率349Hz
#define l_sao 392 //将“l_sao”宏界说为低声“5”的频率392Hz
#define l_la 440 //将“l_a”宏界说为低声“6”的频率440Hz
#define l_xi 494 //将“l_xi”宏界说为低声“7”的频率494Hz
//以下是C调中音的音频宏界说
#define dao 523 //将“dao”宏界说为中音“1”的频率523Hz
#define re 587 //将“re”宏界说为中音“2”的频率587Hz
#define mi 659 //将“mi”宏界说为中音“3”的频率659Hz
#define fa 698 //将“fa”宏界说为中音“4”的频率698Hz
#define sao 784 //将“sao”宏界说为中音“5”的频率784Hz
#define la 880 //将“la”宏界说为中音“6”的频率880Hz
#define xi 987 //将“xi”宏界说为中音“7”的频率523H
//以下是C调高音的音频宏界说
#define h_dao 1046 //将“h_dao”宏界说为高音“1”的频率1046Hz
#define h_re 1174 //将“h_re”宏界说为高音“2”的频率1174Hz
#define h_mi 1318 //将“h_mi”宏界说为高音“3”的频率1318Hz
#define h_fa 1396 //将“h_fa”宏界说为高音“4”的频率1396Hz
#define h_sao 1567 //将“h_sao”宏界说为高音“5”的频率1567Hz
#define h_la 1760 //将“h_la”宏界说为高音“6”的频率1760Hz
#define h_xi 1975 //将“h_xi”宏界说为高音“7”的频率1975Hz
/*******************************************
函数功用:1个延时单位,延时200ms
******************************************/
void delay()
{
unsigned char i,j;
for(i=0;i<250;i++)
for(j=0;j<250;j++)
;
}
/*******************************************
函数功用:主函数
******************************************/
void main(void)
{
unsigned char i,j;
//以下是《巴望》片头曲的一段简谱
unsigned int code f[]={re,mi,re,dao,l_la,dao,l_la, //每行对应一末节音符
l_sao,l_mi,l_sao,l_la,dao,
l_la,dao,sao,la,mi,sao,
re,
mi,re,mi,sao,mi,
l_sao,l_mi,l_sao,l_la,dao,
l_la,l_la,dao,l_la,l_sao,l_re,l_mi,
l_sao,
re,re,sao,la,sao,
fa,mi,sao,mi,
la,sao,mi,re,mi,l_la,dao,
re,
mi,re,mi,sao,mi,
l_sao,l_mi,l_sao,l_la,dao,
l_la,dao,re,l_la,dao,re,mi,
re,
l_la,dao,re,l_la,dao,re,mi,
re,
0xff}; //以0xff作为音符的完毕标志
//以下是简谱中每个音符的节拍
//”4″对应4个延时单位,”2″对应2个延时单位,”1″对应1个延时单位
unsigned char code JP[ ]={4,1,1,4,1,1,2,
2,2,2,2,8,
4,2,3,1,2,2,
10,
4,2,2,4,4,
2,2,2,2,4,
2,2,2,2,2,2,2,
10,
4,4,4,2,2,
4,2,4,4,
4,2,2,2,2,2,2,
10,
4,2,2,4,4,
2,2,2,2,6,
4,2,2,4,1,1,4,
10,
4,2,2,4,1,1,4,
10
};
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位的赋初值办法
TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值办法
TR0=1; //发动守时器T0
for(j=0;j delay(); //延时1个节拍单位
TR0=0; //封闭守时器T0
i++; //播映下一个音符
}
}
}
/***********************************************************
函数功用:守时器T0的中止服务子程序,使P3.7引脚输出音频的方波
************************************************************/
void Time0(void ) interrupt 1 using 1
{
sound=!sound; //将P3.7引脚输出电平取反,构成方波
TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值办法
TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值办法
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/268206.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部