搜档网
当前位置:搜档网 › (完整版)基于STM32开发板的播放器设计

(完整版)基于STM32开发板的播放器设计

(完整版)基于STM32开发板的播放器设计
(完整版)基于STM32开发板的播放器设计

生产实习报告

——基于STM32的播放器设计一.概述

(1)使用STM32编写代码送至蜂鸣器中,实现简易的播放器功能

(2)通过使用时钟芯片,可以显示出当前的时间日期

(3)可以通过重力感应完成上下一曲。

(4)开机时有开机动画。

(5)完成完整的电路设计原理图及软件源代码。

二.总体设计框图

小组分工:

总体设计:由组长郑健师完成。

时间模块:张春蕾、张宁、张道永。

重力感应模块:宗瑞、张正阳、金以俊、司良振。

开机动画模块:王丹阳、张金凤、宋加伟。

三、关键模块设计

1、重力模块设计:

在播放音乐时,可以通过改变ARM板的重心来进行歌曲的前一首和后一首的切换.实现方法:

在每次播放音符的时候检测是否有重力偏转的大幅度改变,如果有,则停止播放当前歌曲,进去上下曲的播放。

此外软件还设有重力感应锁定模块,只需要将开关1打上就可以实现

2、时间显示:

这个模块主要是通过例程实验代码实现的。具体的就是读取时钟芯片的数据,然后显示在OLED上面。

3、开机显示:

读取汉字“欢迎光临“程序没执行一次,改变显示的位置,从而实现了文字在动的效果

四.测试结果

通过我们这两个星期的努力,我们的任务基本实现了,我们通过蜂鸣器来实

现播放,通过重力感应来完成下一曲上一曲的播放和功能选择,还有就是开机动画也完成了预期的效果。

五.总结

我们经过了两个星期的共同合作,我们从一点也不懂,到对基板有了比较理性的认识,再到完成了基本的设计,实现了基本的功能,团队协作精神也得到了提高。我们从中收获了很多。

六.关健程序代码

主程序的菜单显示模块:

重力感应实现上下曲的代码:

时间显示模块的部分代码:

七相关问题:

1 重力感应实现的基本原理:

重力传感器是将运动或重力转换为电信号的传感器,主要用于倾斜角、惯性力、冲击及

震动等参数的测量。在测量平台倾斜角时,将重力传感器垂直放置于在所测平台上,重力

传感器的敏感轴应与倾斜平台的轴向一致,在水平状态下应与水平面平行。其中α 为平台沿某一方向的倾斜角。重力传感器的质量块由于受到重力加速度g 在倾斜方向上的分量g : g = g sin 的作用产生偏移,使重力传感器的输出电压发生变化。若重力传感器在水平状态下的输出为0 V ,倾角为α 时的输出为α V ,且在1g 加速度作用下的输出为V ,则有:

0 V =V / g ×sinα ×1g +V α即:α = arcsin[(Vα ?V0 ) /V ]

利用上式可以方便求得平面某一方向上的倾斜角。如果将两个重力传感器正交放置在平台中心,则平台在x 方向上倾斜角x α 和平台在y 方向上倾斜角y α 为:

x arcsin[V( x V) /V] α = ?,arcsin[(V V ) /V ] y y α = ?

根据这两个方向上的倾斜角可以确定出平台的横向倾角和纵向倾角。

2 时间模块是如何实现:

实现原理图

八关健程序代码

主程序main:#include "include.h"

#include "uart.h"

#include "stm32f10x_spi.h"

#include "OLED.h"

#include "MEMS.h"

#include

#include "TWI.h"

acc_3d mems;

extern u8 DisplayBuff[20];

int LI35_out(void);

extern void beep(void);

extern void time_test(void);

unsigned char hanzi[][32]={

/*-- 文字: 欢--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

{0x04,0x24,0x44,0x84,0x64,0x9C,0x40,0x30,0x0F,0xC8,0x08,0x08,0x28,0x18,0x00, 0x00,

0x10,0x08,0x06,0x01,0x82,0x4C,0x20,0x18,0x06,0x01,0x06,0x18,0x20,0x40,0x80,0 x00},

/*-- 文字: 迎--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

{0x40,0x40,0x42,0xCC,0x00,0x00,0xFC,0x04,0x02,0x00,0xFC,0x04,0x04,0xFC,0x0 0,0x00,

0x00,0x40,0x20,0x1F,0x20,0x40,0x4F,0x44,0x42,0x40,0x7F,0x42,0x44,0x43,0x40,0 x00},

/*-- 文字: 光--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

{0x40,0x40,0x42,0x44,0x58,0xC0,0x40,0x7F,0x40,0xC0,0x50,0x48,0x46,0x40,0x40,

0x00,

0x80,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x78,0 x00},

/*-- 文字: 临--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

{0x00,0xF8,0x00,0x00,0xFF,0x40,0x20,0x18,0x0F,0x18,0x68,0x08,0x08,0x08,0x08, 0x00,

0x00,0x1F,0x00,0x00,0xFF,0x00,0x00,0x7F,0x21,0x21,0x3F,0x21,0x21,0x7F,0x00,0 x00},

};

unsigned char My_music[][32]={

/*-- 文字: 我--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

{0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,0x20,0xFF,0x20,0x22,0x2C,0xA0,0x20 ,0x00,

0x00,0x08,0x48,0x84,0x7F,0x02,0x41,0x40,0x20,0x13,0x0C,0x14,0x22,0x41,0xF8,0 x00},

/*-- 文字: 的--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

{0x00,0xF8,0x0C,0x0B,0x08,0x08,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0xF8,0x00 ,0x00,

0x00,0x7F,0x21,0x21,0x21,0x21,0x7F,0x00,0x00,0x00,0x43,0x80,0x40,0x3F,0x00,0 x00},

/*-- 文字: 音--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

{0x40,0x40,0x44,0x44,0x54,0x64,0x45,0x46,0x44,0x64,0x54,0x44,0x44,0x40,0x40, 0x00,

0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0 x00},

/*-- 文字: 乐--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

{0x00,0x00,0xE0,0x9C,0x84,0x84,0x84,0xF4,0x82,0x82,0x83,0x82,0x80,0x80,0x00, 0x00,

0x00,0x20,0x10,0x08,0x06,0x40,0x80,0x7F,0x00,0x00,0x02,0x04,0x08,0x30,0x00,0 x00},

};

unsigned char tool[][32]={

/*-- 文字: 系--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

{0x00,0x00,0x22,0x32,0x2A,0xA6,0xA2,0x62,0x21,0x11,0x09,0x81,0x01,0x00,0x0 0,0x00,

0x00,0x42,0x22,0x13,0x0B,0x42,0x82,0x7E,0x02,0x02,0x0A,0x12,0x23,0x46,0x00, 0x00},

/*-- 文字: 统--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

{0x20,0x30,0xAC,0x63,0x30,0x00,0x88,0xC8,0xA8,0x99,0x8E,0x88,0xA8,0xC8,0x 88,0x00,

0x22,0x67,0x22,0x12,0x12,0x80,0x40,0x30,0x0F,0x00,0x00,0x3F,0x40,0x40,0x71,0 x00},

/*-- 文字: 设--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

{0x40,0x40,0x42,0xCC,0x00,0x40,0xA0,0x9E,0x82,0x82,0x82,0x9E,0xA0,0x20,0x2 0,0x00,

0x00,0x00,0x00,0x3F,0x90,0x88,0x40,0x43,0x2C,0x10,0x28,0x46,0x41,0x80,0x80,0 x00},

/*-- 文字: 置--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

{0x00,0x17,0x15,0xD5,0x55,0x57,0x55,0x7D,0x55,0x57,0x55,0xD5,0x15,0x17,0x0 0,0x00,

0x40,0x40,0x40,0x7F,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0x40,0x40,0x40,0 x00},

};

unsigned char shijian[][32]={

/*-- 文字: 时--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

{0x00,0xFC,0x84,0x84,0x84,0xFC,0x00,0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10 ,0x00,

0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x01,0x06,0x40,0x80,0x7F,0x00,0x00,0 x00},

/*-- 文字: 间--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

{0x00,0xF8,0x01,0x06,0x00,0xF0,0x12,0x12,0x12,0xF2,0x02,0x02,0x02,0xFE,0x00, 0x00,

0x00,0xFF,0x00,0x00,0x00,0x1F,0x11,0x11,0x11,0x1F,0x00,0x40,0x80,0x7F,0x00,0x 00},

/*-- 文字: 显--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

{0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00, 0x00,

0x40,0x42,0x44,0x58,0x40,0x7F,0x40,0x40,0x40,0x7F,0x40,0x50,0x48,0x46,0x40,0 x00},

/*-- 文字: 示--*/

/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

{0x40,0x40,0x42,0x42,0x42,0x42,0x42,0xC2,0x42,0x42,0x42,0x42,0x42,0x40,0x40, 0x00,

0x20,0x10,0x08,0x06,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x02,0x04,0x08,0x30,0 x00},

};

void write_c(u8 cdata)

{

TWI_SendByte(0x80);

TWI_SendByte(cdata);

}

void write_d(u8 cdata)

{

TWI_SendByte(0x40);

TWI_SendByte(cdata);

}

void init_program()

{ write_c(0xAE); //display off

write_c(0xA1); //segment remap

write_c(0xDA); //common pads hardware: alternative

write_c(0x12);

write_c(0xC8); //common output scan direction:com63~com0 write_c(0xA8); //multiplex ration mode:63

write_c(0x3F);

write_c(0xD5); //display divide ratio/osc. freq. mode

write_c(0x70);

write_c(0x81); //contrast control

write_c(0x30);

write_c(0xD9); //set pre-charge period

write_c(0xF1);

write_c(0x20); //Set Memory Addressing Mode

write_c(0x02);

write_c(0xDb); //VCOM deselect level mode

write_c(0x3C);

write_c(0xAD); //master configuration

write_c(0x8E); //external VCC supply

write_c(0xA4); //out follows RAM content

write_c(0xA6); //set normal display

write_c(0xAF); //display on

}

void playmusic()

{ while(1)

{ WriteData(0,0,132,0,8,0); //清屏

MEMS_Get(&mems);

DelayMs(80);

sprintf( DisplayBuff,"Y:%04d \n",mems.y);

PrintStringLocate(DisplayBuff, 16,0x00,0x00);

printf( DisplayBuff,"Y:%04d \n",mems.y);

if(LI35_out()==2)

{

WriteData(0,0,132,0,8,0); //清屏

break;

}

}

}

int main (void)

{

// int index=0;

//int slect=0;

int i=0;

//__disable_interrupt();

SystemInit();//设置系统时钟

#ifndef EMb_FLASH

/* Set the Vector Ta0ble 0base location at 0x20000000 */

NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);

#else /* VECT_TA0b_FLASH */

/* Set the Vector Ta0ble 0base location at 0x08000000 */

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

#endif

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

//NVIC_Configuration(); //中断配置

FM_GPIOInit();

LED_GPIOInit();

I2C_GPIOInit();

OLED_init();

SW_GPIOInit();

KEY_GPIOInit();

MEMS_Init();

RS232Init(9600); //V1.1

// RS485Init(9600); //V1.0

// TWI_Initialize();

TWI_START();

TWI_SendByte(0x78);

init_program();

TWI_STOP();

WriteData(0,0,132,0,8,0); //清屏

for(i=0;i<40;i++)

{

WriteData(hanzi[0],i,16+i,3,5,1);

WriteData(hanzi[1],17+i,33+i,3,5,1);

WriteData(hanzi[2],114-i,130-i,3,5,1); //WriteData(hanzi[2],34+i,50+i,3,5,1);

WriteData(hanzi[3],131-i,147-i,3,5,1); //WriteData(hanzi[3],51+i,67+i,3,5,1);

}

DelayMs(10000);

WriteData(0,0,132,0,8,0); //清屏

while(1)

{

//显示“我的音乐菜单”

WriteData(My_music[0],6,16+6,1,3,1);

WriteData(My_music[1],17+6,33+6,1,3,1);

WriteData(My_music[2],34+6,50+6,1,3,1);

WriteData(My_music[3],51+6,67+6,1,3,1);

//显示时间菜单

WriteData(shijian[0],6,16+6,4,6,1);

WriteData(shijian[1],17+6,33+6,4,6,1);

WriteData(shijian[2],34+6,50+6,4,6,1);

WriteData(shijian[3],51+6,67+6,4,6,1);

//重力感应实现功能选择

switch(LI35_out())

{

case 1: beep();break;

case 2: break;

case 3: time_test(); break;

case 4: break;

default: break;

}

}

}

/*重力加速度输出函数*/

int LI35_out(void)

{ //acc_3d history_mems;

if(SW1Down()==0)

{return 0 ;

}

else

{

MEMS_Get(&mems);

DelayMs(80);

//sprintf( DisplayBuff,"X:%04d Y:%04d Z:%04d\n",mems.x,mems.y,mems.z );

if(mems.x>220&&mems.x<249)

{

return 1; //代表向上偏转

}

else if(mems.x>10&&mems.x<35)

{

return 3; //代表向下偏转

}

else if(mems.y>5&&mems.y<20)

{

return 4;//代表向右偏转

}

else if(mems.y>210&&mems.y<245)

{

return 2;//代表向左偏转

}

else return 0;//无偏转或者偏转过大

}

}

扬声器的模块:

#include "include.h"

#include "OLED.h"

extern int zhongli;

int index_mp3=0;

//音调表

//C 262

//D 294

//E 330

//F 349

//G 392

//A 440

//B 494

//C 523

//D 587

//E 659

//F 698

//G 784

//A 880

//B 988

//C 1047

//D 1175

//E 1319

//F 1397

//G 1568

//A 1760

//B 1976

//低音1~7

const unsigned int MusicDataD[7] = {61069,54422,48485,45845,40816,36364,32389};

//中音1~7

const unsigned int MusicData[7] = {30592,27257,24297,22922,20408,18182,16194}; //高音1~7

const unsigned int MusicDataG[7] = {15282,13617,12130,11453,10204,9091,8097};

//音乐数据格式:

//0x11~0x17 表示低音1~7

//0x21~0x27 表示中音1~7

//0x31~0x37 表示高音1~7

//0 表示静音

//每个音后面数据表示该音为多少个时间单位:1个16分音符定为1个时间单位static void DelayMs(u32 ms)

{u32 i = Music_MSCnt * ms;

while(i --);

}

const unsigned char TwoTiger[] = //两只老虎

{

0x21,4,0x22,4,0x23,4,0x21,4, 0x21,4,0x22,4,0x23,4,0x21,4,

0x23,4,0x24,4,0x25,4,0x25,4, 0x23,4,0x24,4,0x25,4,0x25,4

};

const unsigned char CoolestEnthic[] = //凤凰传奇最炫民族风

{

0x16,4,0x16,2,0x15,2, 0x16,4,0x21,4, 0x22,2,0x23,1,0x22,1,0x21,2, 0x23,8, 0x16,2,0x26,2,0x26,2,0x25,2, 0x22,2,0x23,1, 0x22,1,0x21,2,0x22,2,0x23,8,

0x21,2,0x16,2,0x16,2,0x21,2, 0x22,4,0x15,2, 0x15,2,0x23,2,0x25,2,0x23,2, 0x22,2, 0x21,8, 0x16,2,0x21,2,0x22,2,0x23,2,0x22,2,0x21,2,0x15,2,0x13,2,0x16,8 };

const unsigned char GuoGe[] = //义勇军进行曲国歌

{

0x21,3,0x23,1,0x25,2,0x25,2, 0x26,4,0x25,4, 0x23,3,0x21,1, 0x25,1,0x25,2,0x25,1, 0x23,4,0x21,4,

0x15,1,0x15,2,0x15,1,0x15,1,0x15,2,0x15,1,0x21,4,0x00,2,0x15,2,0x21,6,0x21,2,0x2 1,3,0x21,1,0x15,2,0x16,1,0x017,1,

0x21,4,0x21,4,0x00,2,0x23,2,0x21,2,0x22,1,0x23,1,0x25,4,0x25,4,0x23,3,0x23,1,0x2 1,3,0x23,1,0x25,3,0x23,1,0x22,4,

0x22,8,0x26,4,0x25,4,0x22,4,0x23,4,0x25,2,0x23,2,0x00,2,0x25,2,0x23,2,0x22,1,0x2 3,1,0x21,4,0x23,4,0x00,4,0x15,3,

0x16,1,0x21,2,0x21,2,0x23,3,0x23,1,0x25,2,0x25,2,0x22,2,0x21,1,0x22,1,0x16,4,0x2 2,6,0x15,2,0x21,5,0x21,2,0x23,6,

0x23,2,0x25,8,0x21,3,0x23,1,0x25,2,0x25,2,0x26,4,0x25,4,0x23,3,0x21,1,0x25,1,0x2 5,2,0x25,1,0x23,2,0x00,2,0x21,2,

0x00,2,0x15,4,0x21,4,0x23,3,0x21,1,0x25,1,0x25,2,0x25,1,0x23,2,0x00,2,0x21,2,0x0 0,2,0x15,4,0x21,4,0x15,4,0x11,4,

0x21,4,0x00,4

};

const unsigned char Bajie[] = //猪八戒背媳妇

{

0x16,4,0x23,3,0x25,1, 0x23,2,0x16,2,0x21,4, 0x16,1,0x21,1,0x16,1,0x21,1, 0x23,4, 0x23,1,0x22,1,0x23,1,0x21,1,0x16,4,

0x23,3,0x25,1,0x26,2, 0x26,2,0x26,2,0x23,2, 0x25,4,0x23,1,0x25,1,0x23,1, 0x25,1, 0x26,2,0x26,2,0x26,2,0x23,2,0x25,4,

0x25,2,0x16,2,0x25,2, 0x16,2,0x23,1,0x22,2, 0x23,2,0x21,4,0x22,4,0x22,4, 0x22,2, 0x21,1,0x22,2,0x23,2,0x25,2,

0x26,4,0x33,4,0x23,4, 0x33,4,0x23,2,0x33,2, 0x23,2,0x33,2,0x23,1,0x23,1, 0x22,2, 0x23,2,0x21,4,0x22,4,0x22,4,

0x22,2,0x21,1,0x22,1,0x23,2,0x25,2,0x26,8

};

void SetBellF(const unsigned int SetV)

{

TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

TIM_TimeBaseInitStructure.TIM_Period = SetV;

TIM_TimeBaseInitStructure.TIM_Prescaler = 0;

TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;

TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_Pulse = (SetV/2);

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

TIM_OC4Init(TIM4, &TIM_OCInitStructure);

// TIM_CtrlPWMOutputs(TIM4, ENABLE);

/* TIM1 enable counter */

// TIM_Cmd(TIM4, ENABLE);

}

void Timer4Init(void)

{ TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

TIM_DeInit(TIM4);

TIM_TimeBaseInitStructure.TIM_Period = 10000;

TIM_TimeBaseInitStructure.TIM_Prescaler = 0;

TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;

TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_Pulse = 5000;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

TIM_OC4Init(TIM4, &TIM_OCInitStructure);

TIM_CtrlPWMOutputs(TIM4, ENABLE);

/* TIM1 enable counter */

TIM_Cmd(TIM4, ENABLE);

}void Timer4OutEnable(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOD, &GPIO_InitStructure);

GPIO_PinRemapConfig(GPIO_Remap_TIM4,ENABLE);

}

void Timer4OutDisable(void)

{GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;

GPIO_Init(GPIOD, &GPIO_InitStructure);

}

void Timer4Start(void)

{TIM_Cmd(TIM4, ENABLE);

}

void Timer4Stop(void)

{

TIM_Cmd(TIM4, DISABLE);

}

//播放歌曲

void PlayMusicFile(unsigned int DataNumber,unsigned char* p,unsigned char UnitTime)

{unsigned int i = 0;

unsigned int PlayWord;

for(i=0;i

{

if(LI35_out()==2||LI35_out()==4||LI35_out()==1)

{

break;

}

else

{

switch (*p)

{ case 0x11:

PlayWord = MusicDataD[0];

break;

case 0x12:

PlayWord = MusicDataD[1];

break;

case 0x13:

PlayWord = MusicDataD[2];

break;

case 0x14:

PlayWord = MusicDataD[3];

break;

case 0x15:

PlayWord = MusicDataD[4];

break;

case 0x16:

PlayWord = MusicDataD[5];

break;

case 0x17:

PlayWord = MusicDataD[6];

break;

case 0x21:

PlayWord = MusicData[0];

break;

case 0x22:

PlayWord = MusicData[1];

break;

case 0x23:

PlayWord = MusicData[2];

break;

case 0x24:

PlayWord = MusicData[3];

break;

case 0x25:

PlayWord = MusicData[4];

break;

case 0x26:

PlayWord = MusicData[5];

break;

PlayWord = MusicData[6];

break;

case 0x31:

PlayWord = MusicDataG[0];

break;

case 0x32:

PlayWord = MusicDataG[1];

break;

case 0x33:

PlayWord = MusicDataG[2];

break;

case 0x34:

PlayWord = MusicDataG[3];

break;

case 0x35:

PlayWord = MusicDataG[4];

break;

case 0x36:

PlayWord = MusicDataG[5];

break;

case 0x37:

PlayWord = MusicDataG[6];

break;

default:

PlayWord = 0;//表示无声音

break;

}

if(*p <= 0x17)

Led0Pink();

else if(*p <= 0x27)

Led1Pink();

else if(*p <= 0x27)

Led2Pink();

else;

p++;

i++;

if(PlayWord != 0)

{

Timer4OutEnable();

SetBellF(PlayWord);

}

else

{ Timer4OutDisable();

}

DelayMs(UnitTime*(*p));

p++;

}

}

if(i == DataNumber)

{

index_mp3++;

if(index_mp3>3)

{

index_mp3=0;

}

}

}

void beep(void)

{ int i=0;

NVIC_Configuration(); //中断配置

Timer4Init();

LED_GPIOInit();

Timer4Start();

//DelayMs(500);

WriteData(0,0,132,0,8,0); //清屏

while(1)

{

switch(index_mp3)

{

case 0:

WriteData(0,0,132,0,8,0); //清屏

PrintStringLocate("Start....",Ascii8x16,0x04,0x00);

PrintStringLocate("TWO TIGER ->",Ascii8x16,0x04,0x00);

DelayMs(500);

PlayMusicFile(sizeof(TwoTiger),(unsigned char*) TwoTiger,100);

Timer4OutDisable();break;

case 1:

WriteData(0,0,132,0,8,0); //清屏

PrintStringLocate("Start....",Ascii8x16,0x04,0x00);

PrintStringLocate("CoolestEnthic ->",Ascii8x16,0x04,0x00);

DelayMs(500);

PlayMusicFile(sizeof(CoolestEnthic),(unsigned char*) CoolestEnthic,100);

Timer4OutDisable();break;

case 2:

WriteData(0,0,132,0,8,0); //清屏

PrintStringLocate("Start....",Ascii8x16,0x04,0x00);

PrintStringLocate("GuoGe ->",Ascii8x16,0x04,0x00);

DelayMs(500);

PlayMusicFile(sizeof(GuoGe),(unsigned char*) GuoGe,100);

Timer4OutDisable();break;

case 3:

PrintStringLocate("Music Start....",Ascii8x16,0x04,0x00);

WriteData(0,0,132,0,8,0); //清屏

PrintStringLocate("Bajie ->",Ascii8x16,0x04,0x00);

DelayMs(1000);

PlayMusicFile(sizeof(Bajie),(unsigned char*) Bajie,100);

Timer4OutDisable();break;

default :break;

}

if(LI35_out()==4) //下一曲

{

index_mp3++;

if(index_mp3>3)

{

index_mp3=0;

}

}

else if(LI35_out()==2) //上一曲

{

index_mp3--;

if(index_mp3<0)

{

index_mp3=3;

}

}

else if(LI35_out()==1) //跳出循环

{

Timer4OutDisable();

WriteData(0,0,132,0,8,0); //清屏

break;

}

else

{

}

}

Timer4OutDisable();

}

时间显示模块:

#include "include.h"

#include "realtime.h"

#include "OLED.h"

//u8 DisplayBuff[16];

void time_test(void)

{

time RealTime;

date RealDate;

u8 DisplayBuff[16];

bool rtflag = FALSE;

RealTime_Init();

/* PrintStringLocate("STM32 TEST 10",Ascii8x16,0x00,0x00);

PrintStringLocate("The TIME TEST",Ascii8x16,0x02,0x00);

PrintStringLocate("KEY1 to Next..", Ascii8x16,0x06,0x00);

DelayMs(1500); */

// Clear();

rtflag = RTV oltLower_Get();

if(rtflag)

{

RealTime.minute = 0;

RealTime.second = 0;

RealTime.hour = 0;

RealDate.year = 2012;

RealDate.month = September;

RealDate.day = 14U;

}

WriteData(0,0,132,0,8,0); //清屏

PrintStringLocate("Date:" , 16 , 0x00, 0x00);

PrintStringLocate("Week:" ,16 , 0x04, 0x00);

PrintStringLocate("Time:" , 16 , 0x06, 0x00);

for(;;)

{

GetTime(&RealTime);

GetDate(&RealDate);

sprintf((char *)DisplayBuff, "%4d %02d %02d",RealDate.year, (u8)RealDate.month, RealDate.day);

PrintStringLocate(DisplayBuff, 16,0x02,0x00);

sprintf((char *)DisplayBuff, "%6s", WeekDayStr[RealDate.weekday]);

PrintStringLocate(DisplayBuff, 16,0x04,0x06);

sprintf((char *)DisplayBuff, "%02d:%02d:%02d",RealTime.hour,RealTime.minute,RealTime.second);

PrintStringLocate(DisplayBuff, 16,0x06,0x06);

DelayMs(500);

if(LI35_out()==2)

{

WriteData(0,0,132,0,8,0); //清屏

break;

}

}

}

生产实习小组设计报告

设计题目:基于STM32的播放器设计

相关主题