1、前面我们已经学习了如何让单片机控制蜂鸣器发出不同的声音。现在我们更进一步,让单片机控制蜂鸣器发出再复杂一些的声音:模拟乐音输出
2、关于音乐的乐谱和节拍这些知识,我们将在下一节进一步说明
3、在keil c51中新建工程ex76,编写如下程序代码,编译并生成ex76.hex文件
//简单乐曲播放演示实例
#include <reg51.h>
//蜂鸣器管脚定义
sbit sound = P2^0;
//定时常数
unsigned int number;
//低音音频定义
#define l_dao 262
#definel_re 286
#definel_mi 311
#definel_fa 349
#definel_sao 392
#definel_la 440
#definel_xi 494
//中音音频定义
#define dao 523
#definere 587
#definemi 659
#definefa 698
#definesao 784
#definela 880
#definexi 987
//高音音频定义
#define h_dao 1046
#defineh_re 1174
#defineh_mi 1318
#defineh_fa 1396
#defineh_sao 1567
#defineh_la 1760
#defineh_xi 1975
//延时200ms
void delay(void)
{
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 music[]={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 musicJP[ ]={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(music[i] != 0xff) //只要没有读到结束标志就继续播放
{
number = 460830 / music[i];
TH0 = (8192-number) / 32; //定时器赋初值
TL0 = (8192-number) % 32;
TR0 = 1; //启动定时器T0
for(j = 0;j < musicJP[i];j++) //控制节拍数
delay(); //延时1个节拍单位
TR0 = 0; //关闭定时器T0
i++; //播放下一个音符
}
}
}
/***********************************************************
函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频的方波
************************************************************/
void Time0(void ) interrupt 1 using 1
{
sound=!sound; //P3.7引脚输出电平取反
TH0=(8192-number)/32; //定时器赋初值
TL0=(8192-number)%32;
}
4、在proteus中新建仿真文件ex76.dsn,电路原理图如下所示
5、将ex76.hex文件载入at89c51中,启动仿真,观察运行结果。如下图,在电脑上接上音箱,就能听到乐曲的演奏