STC89Cxx的蜂鸣器解读

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 / 256N % 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 / 25665035 / 256 = 254(十六进制 FE),这正是高8位。

  • TL0 = N % 25665035 % 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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值