利用单片机的蜂鸣器做个简易的音乐盒

利用单片机做个简易音乐盒

所用的工具

keil5, LPC11C114,cortex-m0。
单片机引脚图
利用单片机的蜂鸣器做个简易的音乐盒
蜂鸣器电路图
利用单片机的蜂鸣器做个简易的音乐盒
蜂鸣器PIO1_1寄存器
利用单片机的蜂鸣器做个简易的音乐盒

思路要点

首先,要整明白蜂鸣器的的工作方式,以及发音的频率和拍数。
C调音符与频率对照表如下:
利用单片机的蜂鸣器做个简易的音乐盒

代码

下面展示一些 内联代码片

#include<stdio.h>
#include<string.h>
typedef unsigned int uint32_t;
void farsight_delay(int n);
struct Note{
	int mr;//音的匹配值
	float delay;//唱几拍
};
int main(void)
{	  	
	volatile unsigned	int* PIO1_1=(volatile unsigned int *)0x4004407C;
	volatile unsigned	int*AHB =(volatile unsigned int *)0x40048080;
	volatile unsigned	int* PR=(volatile unsigned int *)0x4001800C;
	volatile unsigned	int* MR=(volatile unsigned int *)0x40018018;
	volatile unsigned	int* PWMC=(volatile unsigned int *)0x40018074;
	volatile unsigned	int* MCR=(volatile unsigned int *)0x40018014;
	volatile unsigned	int* TCR=(volatile unsigned int *)0x40018004;
	volatile unsigned	int* TC=(volatile unsigned int *)0x40018008;
	struct Note music[] = {{TO_MR(659), 0.5},{TO_MR(659), 0.5},{TO_MR(659), 0.5},{TO_MR(523), 0.25},{TO_MR(659), 0.25},{TO_MR(784), 0.5},
	{TO_MR(392), 0.5},{TO_MR(1), 0.5},{TO_MR(523), 0.5},{TO_MR(1), 0.5},{TO_MR(392), 0.25},{TO_MR(1), 0.5},{TO_MR(330), 0.5},
	{TO_MR(1), 0.5},{TO_MR(440), 0.5},{TO_MR(494), 0.5},{TO_MR(475), 0.25},{TO_MR(440), 0.5},{TO_MR(392), 0.5},{TO_MR(659), 0.5},
	{TO_MR(784), 0.25},{TO_MR(880), 0.25},{TO_MR(1), 0.5},{TO_MR(698), 0.25},{TO_MR(784), 0.25},{TO_MR(1), 0.5},{TO_MR(698), 0.25},
	{TO_MR(1), 0.5},{TO_MR(523), 0.25},{TO_MR(587), 0.25},{TO_MR(494), 0.5},{TO_MR(1), 0.5},{TO_MR(523), 0.5},{TO_MR(1), 0.5},
	{TO_MR(392), 0.25},{TO_MR(1), 0.5},{TO_MR(1), 0.5},{TO_MR(330), 0.25},{TO_MR(1), 0.5},{TO_MR(440), 0.5},{TO_MR(494), 0.25},
	{TO_MR(1), 0.5},{TO_MR(475), 0.25},{TO_MR(440), 0.5},{TO_MR(1), 0.5},{TO_MR(392), 0.25},{TO_MR(659), 0.5},{TO_MR(784), 0.5},
	{TO_MR(880), 0.5},{TO_MR(698), 0.5},{TO_MR(784), 0.5},{TO_MR(1), 0.5},{TO_MR(659), 0.5},{TO_MR(587), 0.25},{TO_MR(523), 0.25},{TO_MR(494), 1},{TO_MR(1), 0.5},{TO_MR(784), 0.5},{TO_MR(698), 0.25},{TO_MR(698), 0.25},{TO_MR(659), 0.5},{TO_MR(659), 0.5},
	{TO_MR(392), 0.25},{TO_MR(440), 0.5},{TO_MR(523), 0.5},{TO_MR(1), 0.5},{TO_MR(440), 0.25},{TO_MR(523), 0.25},{TO_MR(587), 0.5},
	{TO_MR(1), 0.5},{TO_MR(784), 0.25},{TO_MR(698), 0.25},{TO_MR(695), 0.5},{TO_MR(659), 0.5},{TO_MR(1), 0.5},{TO_MR(659), 0.5},
	{TO_MR(1046), 0.5},{TO_MR(1046), 0.5},{TO_MR(1046), 0.5},{TO_MR(1), 1},{TO_MR(784), 0.25},{TO_MR(698), 0.5},{TO_MR(659), 0.5},
	{TO_MR(659), 0.25},{TO_MR(1), 0.5},{TO_MR(392), 0.25},{TO_MR(1), 0.5},{TO_MR(440), 0.25},{TO_MR(523), 0.5},{TO_MR(440), 0.25},{TO_MR(523), 0.25},{TO_MR(1), 0.5},{TO_MR(587), 0.25},
	{TO_MR(1), 0.5},{TO_MR(659), 0.5},{TO_MR(1), 0.5},{TO_MR(587), 0.5},{TO_MR(1), 0.5},{TO_MR(523), 0.5},{TO_MR(1), 1.5},
	{TO_MR(784), 0.5},{TO_MR(1), 0.5},{TO_MR(698), 0.25},{TO_MR(698), 0.25},{TO_MR(659), 0.25},{TO_MR(1), 0.5},{TO_MR(659), 0.25},
	{TO_MR(392), 0.25},{TO_MR(440), 0.25},{TO_MR(523), 0.5},{TO_MR(1), 0.5},{TO_MR(440), 0.25},{TO_MR(523), 0.25},
	{TO_MR(587), 0.25},{TO_MR(1), 0.5},{TO_MR(784), 0.25},{TO_MR(698), 0.25},{TO_MR(698), 0.25},{TO_MR(659), 0.5},{TO_MR(1), 0.5},{TO_MR(659), 0.5},
	{TO_MR(1), 0.5},{TO_MR(523), 0.5},{TO_MR(1), 0.5},{TO_MR(523), 0.5},{TO_MR(523), 0.5},{TO_MR(1), 1},{TO_MR(784), 0.25},{TO_MR(698), 0.25},{TO_MR(698), 0.25},{TO_MR(659), 0.25},{TO_MR(1), 0.5},
	{TO_MR(659), 0.5},{TO_MR(392), 0.25},{TO_MR(440), 0.25},{TO_MR(1), 0.5},{TO_MR(523), 0.5},{TO_MR(1), 0.5},{TO_MR(440), 0.25},{TO_MR(523), 0.25}};//超级玛丽音符部分
	int i;
	SystemInit();
	
	*AHB |=1<<10;//开启CT32_B1定时器
	*PIO1_1 |=(1<<0)|(1<<1);//设置PIO1_1管脚是CT32B1_MAT0功能
	*PR=1000;//设置预分频值,目的是为了降低计数器的计数频率 48000000/1000 此时计数器的频率是48000
	*MR= 100;//匹配寄存器,计数器计数到匹配值就做事
	//*TC=0;
	*PWMC |=1<<0;//设置当计数器达到匹配值后输出一个方波
	*MCR |=1<<1;//设置计数器达到匹配值后重新计数
	*TCR |=1<<0;//让计数器开始工作
	for(i = 0;i < 1000;i++)
	{
		*MR = music[i].mr;
		*TC=0;
		farsight_delay(500*music[i].delay);
	}
	*TCR = *TCR & ~(1<<0);
	return 0;
}
void farsight_delay(int n)//延时函数
{
	uint32_t i,j,k;
	for(i = 0;i < n;i++)
		for(j = 0;j <300;j++)
			for(k = 0;k < 30;k++);
}

实验效果图片

利用单片机的蜂鸣器做个简易的音乐盒
有点尴尬,只有图,没有声音,听不到响动。但代码是没毛病的。

上一篇:【海通国际】Joe Lowry(Mr. Lithium)谈全球电池原材料供应危机


下一篇:数据如何从HBase读到MR