ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-04-17 09:05:54  阅读:342  来源: 互联网

标签:蜂鸣器 int 0.25 音乐盒 0.5 unsigned 单片机 MR 659


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

所用的工具

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

实验效果图片

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

标签:蜂鸣器,int,0.25,音乐盒,0.5,unsigned,单片机,MR,659
来源: https://blog.csdn.net/weixin_44459986/article/details/115785013

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有