历史上的今天
返回首页

历史上的今天

今天是:2025年03月17日(星期一)

正在发生

2020年03月17日 | 51单片机播放音乐(一):蜂鸣器

2020-03-17 来源:eefocus

蜂鸣器

蜂鸣器分为有(震动)源的和无源的,有源的无法控制频率,所以用无源的才能播放音乐。无源蜂鸣器需要自己控制输入变化的信号才能发声,最简单的就是输入方波信号了,通过单片机控制方波的频率就能发出不同音调的声音


这是发出50%占空比方波的代码:


int i;

while (1) {

for (i = 0; i < 10; ++i); // 改变循环次数可以改变方波频率

P1_0 = 1;

for (i = 0; i < 10; ++i);

P1_0 = 0;

}


乐谱转成循环次数

首先要有蜂鸣器乐谱,就是用频率和持续时间表示一个音符的乐谱,至于如何获取蜂鸣器乐谱可以看我上一篇文章。由于单片机的运行速度很慢,如果在单片机里计算循环次数会浪费很多时间,导致输出的音乐断断续续的,所以我尽量在电脑上完成计算,单片机直接读取循环次数就行了


已知单片机使用的晶振频率(我用的11059200Hz),机器主频是晶振频率的12分频,所以一个机器周期是 1/(晶振频率/12) 1 / (晶振频率 / 12)1/(晶振频率/12) 秒。还要知道for循环一次需要多少个机器周期,我是在keil仿真调试时开启定时器测出来的,是38个周期。一次循环时间就是 机器周期∗1000∗每次循环机器周期数 机器周期 * 1000 * 每次循环机器周期数机器周期∗1000∗每次循环机器周期数 毫秒,然后可以算出发出相应频率的方波需要几次循环


下面是把蜂鸣器乐谱转成循环次数的Python脚本:


import json


# 晶振频率(Hz)

CRYSTAL_FREQUENCY = 11059200

# 计数周期(机器周期)(s)

COUNT_PERIOD = 1 / (CRYSTAL_FREQUENCY / 12)

# 一次循环几个机器周期,通过定时器实验得到

COUNT_PER_LOOP = 38

# 一次循环时间(ms)

MS_PER_LOOP = COUNT_PERIOD * 1000 * COUNT_PER_LOOP



def tone_to_loop_count(notes, output_path):

    res = []

    for frequency, duration in notes:

        if frequency == 0:

            # 延时

            loop_count = 65535

            period_count = round(duration / MS_PER_LOOP)

        else:

            period = 1000 / frequency

            loop_count = round(period / 2 / MS_PER_LOOP)

            period_count = round(duration / period)

        # 最低频率0.185,loop_count = 65534

        assert 0 <= loop_count <= 65535, f'frequency = {frequency}, loop_count = {loop_count},不在unsigned int范围内'

        # 把一个时间过长的音符拆成多个音符

        while period_count > 65535:

            res.append((loop_count, 65535))

            period_count -= 65535

        res.append((loop_count, period_count))


    with open(output_path + '.h', 'w') as f:

        f.write(f"""#define DELAY_COUNT 65535

#define NOTES_LEN {len(res)}

extern const unsigned int code notes[][2];

""")


    with open(output_path + '.c', 'w') as f:

        f.write('const unsigned int code notes[][2] = {n')

        for i in range(0, len(res), 6):

            f.write('t')

            for loop_count, period_count in res[i: i + 6]:

                f.write(f'{{{loop_count}, {period_count}}}, ')

            f.write('n')

        f.write('};n')



def main():

    with open('beep.json') as f:

        notes = json.load(f)

    tone_to_loop_count(notes, '../beep/music_data')


if __name__ == '__main__':

    main()


单片机代码

单片机代码就很简单了,读取循环次数然后循环发出方波


#include


#include "music_data.h"


// 引脚定义

#define beepOut P1_0


int main() {

beepOut = 0;

while (1) {

unsigned int i, j, k;

for (i = 0; i < NOTES_LEN; ++i) {

if (notes[i][0] == DELAY_COUNT) // 延时

for (j = 0; j < notes[i][1]; ++j);

else {

for (j = 0; j < notes[i][1]; ++j) {

for (k = 0; k < notes[i][0]; ++k);

beepOut = 1;

for (k = 0; k < notes[i][0]; ++k);

beepOut = 0;

}

}

}

}

return 0;

}


仿真电路图

其实就是单片机最小系统把P1.0口接到蜂鸣器。顺带一提Proteus中buzzer是有源蜂鸣器,sounder是发声器,只接受数字信号,speaker是扬声器,接受模拟信号,这里用的是sounder。实际中可能单片机最大电流不够驱动蜂鸣器,这时要加个三极管来驱动

电路图

推荐阅读

史海拾趣

Helicomm公司的发展小趣事

在电子行业中,Helicomm公司凭借其深厚的技术积累和不断创新的精神,逐渐崭露头角并发展成为业界的佼佼者。以下是关于Helicomm公司发展起来的五个相关故事:

1. ZigBee技术的引领者

自2002年成立以来,Helicomm公司便致力于ZigBee及IEEE 802.15.4标准的研究与产品开发,成为全球ZigBee技术的引领者之一。公司不仅成功完成了IEEE 802.15.4和ZCP的双重资格认证,还推出了多款经过FCC认证的ZigBee模块,广泛应用于市政、安全、监测、物流、定位等领域。Helicomm的ZigBee模块为客户搭建了一条从芯片到应用的快速通道,极大地简化了无线产品的开发流程。(信息来源:百度百科)

2. 技术并购与子公司成立

2005年,Helicomm公司完成了对尉普(WirelessPlug)科技股份有限公司的并购,并成立了赫立讯科技(北京)有限公司,作为其在中国的全资子公司。这一举措不仅增强了Helicomm在全球无线通讯市场的竞争力,还为其在中国市场的拓展奠定了坚实的基础。赫立讯科技继承了尉普在无线传输终端产品方面的技术积累,进一步推动了ZigBee等无线通讯技术在中国的应用与发展。(信息来源:安阳市菲云网络科技有限公司网站)

3. 参与国际标准制定

作为ZigBee联盟的创始会员之一,Helicomm公司积极参与了ZigBee标准的制定与推广工作。通过与国际同行的紧密合作与交流,Helicomm不断提升自身在无线通讯领域的技术实力和影响力。其产品在符合国际标准的同时,也融入了公司的独特创新,满足了不同行业客户的多样化需求。(信息来源:综合多个来源)

4. 工业无线监控系统的创新

近年来,Helicomm公司联合柏元网控、研华科技等合作伙伴,共同推出了针对油田、水利等行业的工业无线监控系统方案。该系统方案充分利用了Helicomm在ZigBee、GSM/GPRS/CDMA等无线通讯技术方面的优势,结合合作伙伴在软件监控、硬件采集控制等方面的专长,为相关行业提供了高效、可靠的无线监控解决方案。这一创新不仅提升了行业的智能化水平,也进一步巩固了Helicomm在无线通讯领域的领先地位。(信息来源:重庆市智畅行物联科技有限公司网站)

5. 国际市场的拓展

Helicomm公司的产品不仅在中国市场取得了显著成绩,还成功打入国际市场,赢得了广泛的认可。公司凭借其先进的技术、稳定的产品性能和优质的本地化服务,在国际市场中建立了一席之地。特别是在水利、交通、环保、气象等领域,Helicomm的无线通讯产品得到了广泛应用,为全球客户提供了可靠的无线通讯解决方案。(信息来源:综合多个来源)

以上五个故事展示了Helicomm公司在电子行业中的发展历程和成就,体现了其在无线通讯领域的深厚技术实力和不断创新的精神。

峰岹(Fortior Tech )公司的发展小趣事

对于大型温室排气扇自动控制电路,网友们可能会提出一系列问题,这些问题涵盖了设计、功能、维护、能效以及安全性等多个方面。以下是一些常见问题及其回答示例:

1. 如何设计自动控制系统以确保温室内的温度和湿度保持在最佳范围?

回答
设计自动控制系统时,通常会集成温度传感器和湿度传感器,这些传感器实时监测温室内的环境参数,并将数据发送给控制器(如PLC或微控制器)。控制器根据预设的阈值(如温度上限、下限,湿度目标范围等)判断是否需要启动或调整排气扇的转速。此外,还可以加入光照强度、CO₂浓度等传感器,以更全面地控制温室环境。

2. 排气扇的自动启停是如何实现的?

回答
排气扇的自动启停通常通过继电器或固态继电器(SSR)控制。当控制器判断需要调整温室环境时,会发送信号给继电器,继电器闭合或断开电路,从而控制排气扇的电源通断。对于需要调节风速的排气扇,则可能采用变频驱动器(VFD)来控制电机的转速。

3. 如何保证自动控制系统在断电后能够恢复工作状态?

回答
为了确保系统在断电后能恢复工作状态,可以设计非易失性存储器(如EEPROM)来保存关键参数和设置。当系统重新上电时,控制器会读取这些参数并自动恢复到断电前的配置状态。此外,还可以加入备用电源(如UPS)来确保在短暂停电期间系统能够继续运行。

4. 如何提高自动控制系统的能效?

回答
提高能效的方法包括:

  • 使用高效节能的排气扇和电机。
  • 采用智能控制算法,如PID控制,精确调节排气扇的转速以匹配实际需求,避免过度或不足排气。
  • 引入自然通风策略,在适宜条件下减少机械通风的使用。
  • 定期检查和维护系统,确保传感器准确、设备无故障运行。

5. 自动控制系统在应对极端天气条件时有哪些安全措施?

回答
在应对极端天气条件时,自动控制系统应具备以下安全措施:

  • 增设防雷击保护装置,防止雷电对系统造成损害。
  • 设计防水防尘的传感器和控制器外壳,确保在恶劣天气下仍能正常工作。
  • 监控系统的运行状态,设置故障报警和自动停机功能,一旦检测到异常情况立即采取措施。
  • 备份关键数据和设置,以防数据丢失导致系统无法恢复。

这些问题和回答涵盖了大型温室排气扇自动控制电路的主要关注点,有助于理解和设计更加高效、安全、可靠的自动控制系统。

B&F Fastener Supply公司的发展小趣事

随着电子产品的日益小型化和复杂化,对紧固件的要求也越来越高。B&F Fastener Supply公司紧跟行业趋势,投入大量资源进行技术创新。公司成功研发出一系列适用于微型电子设备的紧固件产品,不仅满足了市场的迫切需求,还凭借出色的性能和稳定的品质赢得了客户的广泛认可。

BVLED公司的发展小趣事

随着公司规模的扩大和业务范围的拓展,BVLED公司开始注重产业链的整合和成本控制。公司通过与上游供应商建立长期稳定的合作关系,确保了原材料的稳定供应和质量保障;同时,公司还加强了对生产过程的监控和管理,通过优化生产流程和降低能耗等方式降低了生产成本。这些措施使得公司在激烈的市场竞争中保持了较强的竞争力。

Harvatek Corporation公司的发展小趣事

背景:在电子产品领域,品质是企业生存和发展的基石。Hantronix深知这一点,因此始终将品质保证放在首位。

发展:公司所有生产设施都通过了ISO 9001等国际质量管理体系认证,部分设施还通过了ISO/TS 16949等更高标准的认证。这些认证不仅证明了Hantronix在品质管理方面的卓越能力,也为其赢得了更多客户的信任和合作机会。

Gravitech公司的发展小趣事

背景:作为电子显示领域的佼佼者,Hantronix不仅关注自身的发展,还积极履行社会责任,为行业的进步和发展做出贡献。

发展:Hantronix通过技术创新和产品升级,推动了电子显示技术的进步和应用范围的扩大。同时,公司还积极参与行业标准的制定和推广工作,为行业的规范化、标准化发展贡献了自己的力量。此外,Hantronix还注重人才培养和团队建设,为行业培养了一大批高素质的专业人才。

以上五个故事虽然基于概括性描述,但均反映了Hantronix公司在电子行业中的发展历程、技术创新、市场拓展、品质保证以及行业影响等方面的实际情况。

问答坊 | AI 解惑

电磁兼容原理设计和预测技术

电磁兼容原理设计和预测技术 作    者: 蔡仁钢 I S B N: 7810126733 页    数: 240 开    本: 16开 封面形式: 简裝本 出 版 社: 北京航空航天大学出版社 出版日期: 1997-11-1 定    ...…

查看全部问答>

EVC中数据转换问题(TCHAR)

TCHAR *nTargetAddress m_SockAddrIn.sin_addr.S_un.S_addr=inet_addr(nTargetAddress); error C2664: \'inet_addr\' : cannot convert parameter 1 from \'unsigned short *\' to \'const char *\' 不知道这个怎么转?API里面是不是不能用CH ...…

查看全部问答>

关于STM32的IO口输出问题

                                 在板子上的STM32烧毁一次之后(3.3v和地短接),重新换了一个新芯片之后,发现IO的低电平输出拉高到3V左右,可以保 ...…

查看全部问答>

请教:ADC12 模块的问题,急!!!

A0results[index] = ADC12MEM0; // Move A0 results, IFG is cleared A1results[index] = ADC12MEM1; // Move A1 results, IFG is cleared A2results[index] = ADC12MEM2; // Move A2 results, IFG is cleared A3results[index] = ADC12MEM3; ...…

查看全部问答>

AT89C51单片机 6M晶振的时钟谁帮忙写下程序呗 最好C语言的 拜托了!

希望各位达人帮帮忙 帮忙解答AT89C51单片机 6M晶振的 时钟有电路图和相关说明 谁帮忙写下程序呗 最好C语言的 拜托了!还有就是那个 LED是怎么连接的啊 求解答要求和原理图在http://embed.chinaitlab.com/xfl/804366.html …

查看全部问答>

【ZZ】ARM与TSMC完成首件20纳米Cortex-A15多核设计定案

  ARM公司与TSMC日前共同宣布,已顺利完成首件采用20纳米工艺技术生产的ARM Cortex-A15 处理器设计定案(Tape Out)。藉由TSMC在开放创新平台上建构完成的20纳米设计生态环境,双方花费六个月的时间即完成从缓存器转换阶层(RTL)到产品设计定 ...…

查看全部问答>

TI的电源芯片LM2594

LM2594输入可高达60V,输出有3.3V,5V,12V等型号,电流可达500mA当输入电压越高时需要使用的二极管D1耐压就越大,此图为输入+24V,输出为5V,电流200mA左右,电感要用330uH,如果太小则输出电压不能保证,负载稍大则可能使输出电压被拉低,1N5819 ...…

查看全部问答>

求9B96开发板光盘资料

因光盘不小心遗失,求9B96开发板光盘资料。邮箱wzpstudy@126.com 片子是C3的,例程最好为6288版本的。。。谢谢了 …

查看全部问答>

牛人图解DIY 1pA超微电流测试器

本帖最后由 dontium 于 2015-1-23 11:23 编辑 目录 00、前言 01、电路图及说明 02、仿真 03、准备材料、元件 04、元件布局 05、制作输入隔离岛 06、输入岛岛芯的制作 07、元件安装和焊接 08、反馈电容制作 09、安装完成 10、初步测试 ...…

查看全部问答>