资讯详情

【绝对精度】利用单片机、蜂鸣器播放孤勇者等音乐(延时、定时器PWM两种方式,任意单片机皆可,适用于51、...

【绝对精度】用单片机和蜂鸣器播放孤勇者等音乐(延迟和定时器)PWM任何单片机都可以用两种方法,适用于51。STM32、ADuCM4050等)

一是蜂鸣器原理 对其驱动时 不断切换电平状态即可播放声音 若想播放440HzA4音 则需要在1s880次内对蜂鸣器电平切换(求反)(两次电平切换为一个周期)

延迟播放声音 延迟可以用最精确的延迟来延迟 延时1s切换电平的频率为两倍 但是延迟法有缺陷 很难控制播放时间 播放计数需要使用其他函数 同时 不同的音高意味着不同的延迟周期 延迟函数赋值需要时间 高频播放 时间误差会更大 节奏控制不好

使用定时器PWM来实现 只需要定义PWM后 不进行分频 采用1s除以获得频率 不需要两倍频率 这是因为PWM事实上,在定时器中断过程中,电平切换已经完成 而且采用PWM功能还可以控制空比 然后控制音量

总体而言 定时器PWM法易于编程 且精确度高 只需按节奏延迟 来控制PWM定时器的计数值很好 与延迟法相比 PWM定时器相当于一个独立的进程 延迟误差效果不会造成误差

以下是32位无符号整形最高精度下的频率表和音符长度宏定义:

#ifndef __MUSIC_NOTE_H__ #define __MUSIC_NOTE_H__  unsigned int MUSIC_BPM=120; #define NOTE_4 (60.0/MUSIC_BPM) #define NOTE_8 (30.0/MUSIC_BPM) #define NOTE_16 (15.0/MUSIC_BPM) #define NOTE_32 (7.5/MUSIC_BPM) #define NOTE_64 (3.75/MUSIC_BPM) #define NOTE_2 (120.0/MUSIC_BPM) #define NOTE_1 (240.0/MUSIC_BPM)  #endif   
#ifndef __PITCH_H__ #define __PITCH_H__  #define C0 (1635159) #define Db0 (1732391) #define D0 (1835404) #define Eb0 (1944543) #define E0 (2060172) #define F0 (2182676) #define Gb0 (2312465) #define G0 (2449971) #define Ab0 (2595654) #define A0 (2750000) #define Bb0 (2913523) #define B0 (3086770) #define C1 (3270319) #define Db1 (3464782) #define D1 (3670809) #define Eb1 (3889087) #define E1 (4120344) #define F1 (4365352) #define Gb1 (4624930) #define G1 (4899942) #define Ab1 (5191308) #define A1 (5500000) #define Bb1 (5827047) #define B1 (6173541) #define C2 (6540639) #define Db2 (6929565) #define D2 (7341619) #define Eb2 (7778174) #define E2 (8240688) #define F2 (8730705) #define Gb2 (9249860) #define G2 (9799885) #define Ab2 (10382617) #define A2 (11000000) #define Bb2 (11654094) #define B2 (12347082) #define C3 (13081278) #define Db3 (13859131) #define D3 (14683238) #define Eb3 (15556349) #define E3 (16481377) #define F3 (17461411) #define Gb3 (18499721) #define G3 (19599771) #define Ab3 (20765234) #define A3 (22000000) #define Bb3 (23308188) #define B3 (24694165) #define C4 (26162556) #define Db4 (27718263) #define D4 (29366476) #define Eb4 (31112698) #define E4 (32962755) #define F4 (34922823) #define Gb4 (36999442) #define G4 (39199543) #define Ab4 (41530469) #define A4 (44000000) #define Bb4 (46616376) #define B4 (49388330) #define C5 (52325113) #define Db5 (55436526) #define D5 (58732953) #define Eb5 (62225396) #define E5 (65925511) #define F5 (69845646) #define Gb5 (73998884) #define G5 (78399087) #define Ab5 (83060939) #define A5 (88000000) #define Bb5 (93232752) #define B5 (98776660) #define C6 (104650226) #define Db6 (110873052) #define D6 (117465907) #define Eb6 (124450793) #define E6 (131851022) #define F6 (139691292) #define Gb6 (147997769) #define G6 (156798174) #define Ab6 (166121879) #define A6 (176000000) #define Bb6 (186465504) #define B6 (197553320) #define C7 (209300452) #define Db7 (221746104) #define D7 (234931814) #define Eb7 (248901586) #define E7 (263702045) #define F7 (279382585) #define Gb7 (295995538) #define G7 (313596348) #define Ab7 (332243758) #define A7 (352000000) #define Bb7 (372931009) #define B7 (395106641) #define C8 (418600904) #define Db8 (443492209) #define D8 (469863628) #define Eb8 (497803173) #define E8 (527404091) #define F8 (558765170) #define Gb8 (591991076) #define G8 (627192697) #define Ab8 (664487516) #define A8 (704000000) #define Bb8 (745862018) #define B8 (790213282) #define C9 (837201808) #define Db9 (886984419) #define D9 (939727257) #define Eb9 (995606347) #define E9 (1054808182) #define F9 (1117530340) #define Gb9 (1183982152) #define G9 (1254385395) #define Ab9 (1328975032) #define A9 (1408000000) #define Bb9 (1491724036) #define B9 (1580426564) #endif 

频率表采用A4=440.00000hz来进行计算 每个半音之间是2的12次方根关系 可以用Python来生成频率表(这里是440.01000hz)

f = open('./PITCH.h', 'w')
C=44001000/((2**(1/12))**9)
Db=44001000/((2**(1/12))**8)
D=44001000/((2**(1/12))**7)
Eb=44001000/((2**(1/12))**6)
E=44001000/((2**(1/12))**5)
F=44001000/((2**(1/12))**4)
Gb=44001000/((2**(1/12))**3)
G=44001000/((2**(1/12))**2)
Ab=44001000/(2**(1/12))
A=44001000
Bb=44001000*(2**(1/12))
B=44001000*((2**(1/12))**2)
f.write('#ifndef __PITCH_H__\n')
f.write('#define __PITCH_H__\n')
f.write('\n')
for i in range(0,10):
    f.write('#define C'+str(i)+' '+str(int(C/(2**(4-i))))+'\n')
    f.write('#define Db'+str(i)+' '+str(int(Db/2**(4-i)))+'\n')
    f.write('#define D'+str(i)+' '+str(int(D/2**(4-i)))+'\n')
    f.write('#define Eb'+str(i)+' '+str(int(Eb/2**(4-i)))+'\n')
    f.write('#define E'+str(i)+' '+str(int(E/2**(4-i)))+'\n')
    f.write('#define F'+str(i)+' '+str(int(F/2**(4-i)))+'\n')
    f.write('#define Gb'+str(i)+' '+str(int(Gb/2**(4-i)))+'\n')
    f.write('#define G'+str(i)+' '+str(int(G/2**(4-i)))+'\n')
    f.write('#define Ab'+str(i)+' '+str(int(Ab/2**(4-i)))+'\n')
    f.write('#define A'+str(i)+' '+str(int(A/2**(4-i)))+'\n')
    f.write('#define Bb'+str(i)+' '+str(int(Bb/2**(4-

标签: d5d电阻电阻b3a

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台