评论区别江科协江科协地喊了,这是我自己看他的视频做的学习笔记,记录在这个平台上而已,我又没盈利单纯为了方便我自己复习用的,勿扰好吗。


由原理图可知,蜂鸣器BEEP与P1_5 相关,但其实这个原理图有错,实测接的是P2_5
下面这个代码就是以500HZ的频率响500ms的例子
sbit Buzzer = P2^5;
unsigned char KeyNum;
unsigned int i;
void main()
{
while(1)
{
KeyNum = Key();
if(KeyNum)
{
for(i = 0; i < 500; i ++) {
Buzzer = !Buzzer;
Delay(1);// 1ms翻转一次,周期就是2ms,频率就是500HZ
} //一共会响500ms
}
}
}
接下来先把这个发出声响的代码封装成Buzzer模块,接下来的目标是实现发出不同音调的声响

先来看用定时器实现的蜂鸣器发生,每次中断就翻转一次Buzzer,中断每1ms执行一次,所以翻转周期是2ms,音调一样
#include <REGX52.H>
#include "Timer0.h"
#include "Delay.h"
sbit Buzzer = P2^5;
void main()
{
Timer0_Init();
while(1)
{
}
}
void Timer0_Routine() interrupt 1
{
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
Buzzer = !Buzzer;
}
只要更改中断函数中的定时初值,翻转需要的的时长就会变化,从而改变声音的周期进而改变音调

比如中央C的重装载值是64580,这个声调对应的初值如下
void Timer0_Routine() interrupt 1
{
TL0 = 64580 % 256; //设置定时初值
TH0 = 64580 / 256; //设置定时初值
Buzzer = !Buzzer;
}
接下来只要稍微费点力气,把所有重装载值整理到一个数组里,使数组的每个序号对应一个音调,需要的时候调用序号就行
unsigned int FreqTable[] = {
//中央C以及高八度低八度的音调由低到高
63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,

文章讲述了如何通过编程利用定时器和数组来控制蜂鸣器发出不同音调的声音,包括基本的500Hz响铃,再到使用定时初值调整音调,以及处理休止符和存储复杂音乐数据的问题。
2万+

被折叠的 条评论
为什么被折叠?



