1.蜂鸣器的原理
蜂鸣器分为:压电式蜂鸣器和电磁式蜂鸣器
压电蜂鸣器通过逆电效应,使压电陶瓷片在交流电作用下反复形变振动,从而推动空气发出声音。
电磁蜂鸣器的工作原理是通电线圈产生交变磁场,与磁铁相互作用后吸合振动片,使其快速振动而发声。
总得来说,蜂鸣器的工作原理都是两个铁皮因为电流的变化导致铁片相互碰撞又相互分开而发出声音。
2.蜂鸣器的控制信号
所以想让蜂鸣器发出声音需要快速有电没电(有电碰撞,没电分开),控制信号:高低电平相间的方波(正弦波之类的也行)
3.蜂鸣器的电路图

因为单片机的IO端口电流太小无法驱动蜂鸣器,所以IO端口通过控制三极管的开关,控制VCC的导通和不导通来控制蜂鸣器。
4.音调如何控制
音调是人耳对声音高低的主观感受,其物理本质是声波振动的频率,频率越高,音调就越高。
音调受震动频率控制,就等于控制信号的频率。频率越高音调越高,听起来越刺耳。
(例如:1个高电平5微秒,1个低电平5微秒,1个周期T:10微秒,频率:1/T = 1/10微妙 = 100KHz)
5.声音大小如何控制
由硬件决定的,没法写代码去控制声音大小。
6.有源蜂鸣器和无源蜂鸣器
有源蜂鸣器内部自带振荡电路,接通直流电即可持续发声,音调固定;无源蜂鸣器内部无振荡源,需要外部提供交变脉冲信号驱动才能发声,音调由信号频率决定。
7.让蜂鸣器响起来
引脚连接:J7接P00(普中A7)
最简单:使用delay让蜂鸣器响起来,调节delay时间感受音调变化

8.用定时器控制蜂鸣器音调
用delay函数的劣势:不容易精准控制时间,CPU控制蜂鸣器中不能做其他事

STC89CXX单片机的16位定时器(T0/T1,模式1)本质上是一个从设定初始值开始,不断加1,直到超过65535(0xFFFF)就会溢出并触发中断的计数器。
-
计数范围:16位二进制数的最大值是
2^16 - 1 = 65535。计数器从某个数(初始值)开始,每过一个机器周期就加1,当它加到65535后,下一个计数就会变成65536(0x10000)。由于寄存器只有16位,最高位的“1”会丢失,实际值变回0,并同时置位溢出标志,触发中断。 -
关键公式:因此,要定时 N 个机器周期,我们需要让计数器从
(65536 - N)开始计数。这样,它再计数 N 次后,就会达到65536并溢出。-
初始化计算:
TH0 = (65536 - N) / 256;TL0 = (65536 - N) % 256
-
256 这个数字和 N / 256、N % 256 这种操作,其本质是将一个16位的整数拆分成高8位和低8位,分别存入两个8位的寄存器。
1. 核心原因:硬件寄存器的宽度
51单片机的定时器(Timer 0)是一个16位的计数器。但与之对应的特殊功能寄存器 TH0(高字节)和 TL0(低字节)每个都是8位宽的。
-
一个8位寄存器能存储的最大值是
2^8 - 1 = 255(二进制11111111)。 -
因此,任何要放入这个16位定时器的值(比如我们计算出的初始值
N),都必须拆成两半,分别放入TH0和TL0。
2. 为什么是256?—— 数学原理
256 是 2^8。在二进制和计算机中,除以256(2^8)的操作相当于将整个16位二进制数向右移动8位。
-
N / 256:得到的是N的高8位。在整数除法中,这等同于丢弃低8位,保留高8位的值。 -
N % 256:得到的是N除以256后的余数,也就是N的低8位。因为任何数对256取余,结果范围都在 0~255 之间,正好填满一个8位寄存器。
一个直观的比喻:
想象一个4位的十进制数,比如 1234。我们要把它拆成前两位和後兩位,分别放入两个只能存两位数的盒子。
-
高两位盒子 =
1234 / 100=12(这里100是10^2,因为十进制每位有10种状态) -
低两位盒子 =
1234 % 100=34
对于16位二进制数,256扮演的角色就是十进制例子里的100。它是 “进位基数” (2^8),是分割高、低字节的标尺。
3. 在您的代码中的具体应用
您的代码中 N = 65535 - US。假设 US = 500,则 N = 65035。
-
65035的十六进制是FE0B。 -
TH0 = N / 256:65035 / 256 = 254(十六进制FE),这正是高8位。 -
TL0 = N % 256:65035 % 256 = 11(十六进制0B),这正是低8位。
这样,16位的初始值0xFE0B就被正确地装载到了TH0(0xFE)和TL0(0x0B)中。
4.关于 US = (500 / XKHZ)
这个公式决定了你想要的音调频率。
-
逻辑:在中断服务程序
timer0_isr中,你执行了BUZZER = !BUZZER;,这意味着每次中断翻转一次引脚电平。 -
完整周期:要产生一个完整的方波(高-低-高),需要两次引脚翻转。因此,两次中断的时间才对应一个完整的声波周期。
-
计算:假设你的单片机晶振是12MHz(标准51机),那么机器周期为1μs。如果你的
XKHZ是1,那么:-
US = 500 / 1 = 500(这代表半周期的微秒数) -
因此,一个完整的中断周期是
US微秒。 -
最终的蜂鸣器发声频率 =
1 / (2 * US * 10^-6)=1 / (2 * 500 * 10^-6)= 1000Hz = 1KHz。
-



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



