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

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

所用的工具

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++);
}

实验效果图片

在这里插入图片描述
有点尴尬,只有图,没有声音,听不到响动。但代码是没毛病的。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值