《ARM微控制器与嵌入式系统》慕课

阅读: 评论:0

《ARM微控制器与嵌入式系统》慕课

《ARM微控制器与嵌入式系统》慕课

任务:使用PWM驱动蜂鸣器来播放简单音乐

分析:声音的特性可由三个要素来描述,即响度、音调和音色。音调主要与声波的频率有关

 音调频率
L1261.6
L2293.7
L3329.6
L4349.2
L5392
L6440
L7493.9
M1523.3
M2587.3
M3659.3
M4698.5
M5784
M6880
M7987.8
H11045.5
H21174.7
H31318.5
H41396.9
H51568
H61760
H71975.5

两只老虎简谱:

如果数字下方有点,代表低音,如果数字上方有点,代表高音,否则默认中音。

音长:一般一节为4拍,如果相邻数字下面有连线,说明两个一起是一拍

实现代码片段如下:

#define PWM0_CLK_FREQ 164*1000 //20.97M / 128#define L1 M1*2
#define L2 M2*2
#define L3 M3*2
#define L4 M4*2
#define L5 M5*2
#define L6 M6*2
#define L7 M7*2#define M1 (PWM0_CLK_FREQ/523)
#define M2 (PWM0_CLK_FREQ/587)
#define M3 (PWM0_CLK_FREQ/659)
#define M4 (PWM0_CLK_FREQ/698)
#define M5 (PWM0_CLK_FREQ/784)
#define M6 (PWM0_CLK_FREQ/880)
#define M7 (PWM0_CLK_FREQ/988)#define H1 M1/2
#define H2 M2/2
#define H3 M3/2
#define H4 M4/2
#define H5 M5/2
#define H6 M6/2
#define H7 M7/2#define NN 0static unsigned int During;
static unsigned int num;struct Music_data {unsigned int freq;unsigned int During_time;
};//两只老虎乐谱
static struct Music_data md[] = {{M1, 0x2},{M2, 0x2},{M3, 0x2},{M1, 0x2},{M1, 0x2},{M2, 0x2},{M3, 0x2},{M1, 0x2},{M3, 0x2},{M4, 0x2},{M5, 0x4},{M3, 0x2},{M4, 0x2},{M5, 0x4},{M5, 0x1},{M6, 0x1},{M5, 0x1},{M4, 0x1},{M3, 0x2},{M1, 0x2},{M5, 0x1},{M6, 0x1},{M5, 0x1},{M4, 0x1},{M3, 0x2},{M1, 0x2},{M1, 0x2},{L5, 0x2},{M1, 0x4},{M1, 0x2},{L5, 0x2},{M1, 0x4},{0xff, 0x0},
};void TPM0_init(void)
{SIM_SOPT2 |= (1 << 24); //select TPM Clock sourceSIM_SCGC5 |= (1 << 11); //enable portC ClockSIM_SCGC6 |= (1 << 24); //enable TPM0 ClockPORTC_PCR8 |= (3 << 8); //conifg portc_8 as TPM0_ch4TPM0_SC |= (1 << 3) | 0x7; //CPWMS and CMOD and PSTPM0_CNT = 0;TPM0_MOD = 0; // period =  (MOD + 0x0001)TPM0_C4SC |= (1 << 5) | (1 << 3); //MSnB:MSnA ELSnB:ELSnA EPWMTPM0_C4V = 0; //duty cycle
}void TPM0_set(int period)
{TPM0_MOD = period;TPM0_C4V = period / 2;
}void systick_init(void)
{SYST_RVR = 2621250; //1/8sSYST_CVR = 0;SYST_CSR |= 0x7; 
}void __enable_irq(void)
{asm("CPSIE i");
}void SysTick_Handler(void)
{int i;if(During == 0){if(md[num].freq == 0xff){num = 0;}TPM0_set(md[num].freq);During = md[num].During_time;num++;}During--;i = SYST_CSR;
}int main(void)
{int counter = 0;TPM0_init();systick_init();__enable_irq();for(;;) {	   counter++;}return 0;
}

至此,该实验就玩完啦,别忘记点赞哦,欢迎大家留言讨论,谢谢!

本文发布于:2024-02-03 03:05:09,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170690070948232.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23