生产实习报告
——基于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的播放器设计