1、本例利用蜂鸣器模拟输出"DO,RE,MI..."的音阶声音。蜂鸣器发声过程仍由按键启动,定时器控制鸣叫频率。
2、根据不同音阶的频率,计算出定时器的定时初值和定时周期,
3、在keil c51中新建工程ex75,编写如下程序代码,编译并生成ex75.hex文件
//简易音阶声音演示实例
#include //寄存器头文件包含
//引脚定义,分别定义按键和蜂鸣器的引脚
sbit KEY = P1^7;
sbit SOUNDER = P3^0;
//全局变量,音符索引数
unsigned char musicNum;
//音符播放时定时寄存器处值TH0
unsigned char code high_buff[] = {0,226,229,232,233,236,238,240,
241,242,244,245,246,247,248};
//音符播放时定时寄存器处值TL0
unsigned char code low_buff[] = {0,4,13,10,20,3,8,6,2,23,5,26,4,4,3};
//延时函数
void delayms(unsigned int x)
{
unsigned char i;
while(x--)
{
for(i = 0;i < 120;i++);
}
}
//主函数
void main(void)
{
//IE = 0x82;
TMOD = 0x00; //定时器0工作在模式0
TH0 = (8192 - 700) / 32; //定时器赋初值
TL0 = (8192 - 700) % 32;
EA = 1; //开总中断
ET0 = 1; //开定时器0定时溢出中断
SOUNDER = 0;
while(1)
{
while(KEY == 1);
while(KEY == 0);
for(musicNum = 1;musicNum < 15;musicNum++)
{
TR0 = 1;
delayms(500);
TR0 = 0;
delayms(50);
}
}
}
//定时器0的定时中断函数
void Timer0(void) interrupt 1
{
SOUNDER = ~SOUNDER;//蜂鸣器输出电平取反
TH0 = high_buff[musicNum];
TL0 = low_buff[musicNum];
}
4、在proteus中新建仿真文件ex75.dsn,电路原理图如下所示
5、将ex75.hex文件载入at89c51中,启动仿真,观察运行结果。如下图,按动按键,蜂鸣器即可发出声音,在电脑上接上音箱,,就能听到声音。我们可以改变定时器的定时处置和中断次数来改变蜂鸣器的声音。