//用定时器T0的中断实现"老男孩"的播放
#include //包含52单片机寄存器定义的头文件
***it sound=P1^5; //将sound位定义为P1.5
unsigned int C; //储存定时器的定时常数,即定时器产生一次中断需要计数的个数
//以下是C调低音的音频宏定义
#define l_d 262 //将“l_dao”宏定义为低音“1”的频率262Hz
#define l_r 294 //将“l_re”宏定义为低音“2”的频率294Hz
#define l_m 330 //将“l_mi”宏定义为低音“3”的频率311Hz
#define l_f 349 //将“l_fa”宏定义为低音“4”的频率349Hz
#define l_s 392 //将“l_sao”宏定义为低音“5”的频率392Hz
#define l_l 440 //将“l_a”宏定义为低音“6”的频率440Hz
#define l_si 494 //将“l_xi”宏定义为低音“7”的频率494Hz
//以下是C调中音的音频宏定义
#define d 523 //将“dao”宏定义为中音“1”的频率523Hz
#define r 587 //将“re”宏定义为中音“2”的频率587Hz
#define m 659 //将“mi”宏定义为中音“3”的频率659Hz
#define f 698 //将“fa”宏定义为中音“4”的频率698Hz
#define s 784 //将“sao”宏定义为中音“5”的频率784Hz
#define l 880 //将“la”宏定义为中音“6”的频率880Hz
#define si 988 //将“xi”宏定义为中音“7”的频率987Hz
//以下是C调高音的音频宏定义
#define h_d 1047 //将“h_dao”宏定义为高音“1”的频率1046Hz
#define h_r 1175 //将“h_re”宏定义为高音“2”的频率1174Hz
#define h_m 1319 //将“h_mi”宏定义为高音“3”的频率1318Hz
#define h_f 1397 //将“h_fa”宏定义为高音“4”的频率1396Hz
#define h_s 1568 //将“h_sao”宏定义为高音“5”的频率1567Hz
#define h_l 1760 //将“h_la”宏定义为高音“6”的频率1760Hz
#define h_si 1967 //将“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 int p,q;
//以下是《老男孩》的一段简谱
unsigned int code f[]={s,s,s,s,s,s,l,s,s,f, //每行对应一小节音符
m,l,si,si,h_d,s,s,s,s,
l,d,d,d,r,m,s,s,
f,s,r,r,d,r,
s,s,s,s,s,s,l,s,s,f,
m,l,si,si,h_d,si,s,s,s,
l,d,d,d,r,m,s,s,
f,s,r,r,d,d,h_d,si,
l,si,h_d,h_d,h_r,h_m,si,s,s,
l,h_m,h_r,h_r,h_d,h_d,h_d,si,
l,si,h_d,h_d,h_r,h_m,si,s,s,
l,h_m,h_r,h_r,h_d,
h_d,
h_d,h_d,
h_s,h_s,h_s,h_s,h_s,h_s,si,si,si,si,si,
h_s,h_s,h_s,h_s,h_l,h_s,h_d,h_d,h_d,h_d,h_r
h_m,h_r,h_f,h_f,h_m,h_m,h_r,h_f,h_f,h_m,
h_m,h_r,h_f,h_f,h_m,h_s,h_d,h_d,
h_s,h_s,h_s,h_s,h_s,h_s,si,si,si,si,si,
h_s,h_s,h_s,h_s,h_l,h_s,h_d,h_d,h_d,h_d,h_r,
h_m,h_r,h_f,h_f,h_m,h_m,h_r,h_d,h_d,si,
h_d,
0xff}; //以0xff作为音符的结束标志
//以下是简谱中每个音符的节拍
//"4"对应4个延时单位,"2"对应2个延时单位,"1"对应1个延时单位
unsigned int code JP[ ]={ 2,1,1,2,2,2,1,1,2,2,
2,1,1,2,2,2,2,1,1,
2,1,1,2,2,2,2,1,
2,1,1,2,2,4,
2,1,1,2,2,2,1,1,2,2,
2,1,1,2,2,2,2,1,1,
2,1,1,2,2,2,2,1,
2,1,1,2,2,4,2,2,
2,1,1,2,2,2,2,1,1,
2,1,1,2,2,4,2,2,
2,1,1,2,2,2,2,1,1,
2,1,1,2,2,
8,
1,1,
2,1,1,2,2,2,1,1,2,1,1,
2,1,1,2,2,2,1,1,2,1,1,
2,1,1,2,2,2,1,1,2,2,
2,1,1,2,2,6,1,1,
2,1,1,2,2,2,1,1,2,1,1,
2,1,1,2,2,2,1,1,2,1,1,
2,1,1,2,2,2,1,1,2,2,
8
};
EA=1; //开总中断
ET0=1; //定时器T0中断允许
TMOD=0x00; // 使用定时器T0的模式1(13位计数器)
while(1) //无限循环
{
p=0; //从第1个音符f[0]开始播放
while(f[p]!=0xff) //只要没有读到结束标志就继续播放
{
//以下三个公式可用来计算任意音符频率对应的定时器的初值 ,晶振为12Mhz
C=500000/f[p];
TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法
TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值方法
TR0=1; //启动定时器T0
for(q=0;q
delay(); //延时1个节拍单位
TR0=0; //关闭定时器T0
p++; //播放下一个音符
}
}
}
/***********************************************************
函数功能:定时器T0的中断服务子程序,使P1.5引脚输出音频的方波
************************************************************/
void time0(void) interrupt 1 using 1
{
sound=!sound; //将P1.5引脚输出电平取反,形成方波
TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法
TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值方法
}
A.C(93): error C141: syntax error near '}'
A.C(107): error C202: 'JP': undefined identifier
Target not created
|