利用单片机做个简易音乐盒
所用的工具
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++);
}
实验效果图片
有点尴尬,只有图,没有声音,听不到响动。但代码是没毛病的。