基于STM32开发板的播放器设计_第1页
基于STM32开发板的播放器设计_第2页
基于STM32开发板的播放器设计_第3页
基于STM32开发板的播放器设计_第4页
基于STM32开发板的播放器设计_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

生产实习报告 基于STM32的播放器设计1 概述(1)使用STM32编写代码送至蜂鸣器中,实现简易的播放器功能 (2)通过使用时钟芯片,可以显示出当前的时间日期(3)可以通过重力感应完成上下一曲。(4)开机时有开机动画。(5)完成完整的电路设计原理图及软件源代码。二总体设计框图蜂鸣器液晶显示MCU小组分工:总体设计:由组长郑健师完成。时间模块:张春蕾、张宁、张道永。重力感应模块:宗瑞、张正阳、金以俊、司良振。开机动画模块:王丹阳、张金凤、宋加伟。3、 关键模块设计1、重力模块设计:在播放音乐时,可以通过改变ARM板的重心来进行歌曲的前一首和后一首的切换.实现方法:在每次播放音符的时候检测是否有重力偏转的大幅度改变,如果有,则停止播放当前歌曲,进去上下曲的播放。此外软件还设有重力感应锁定模块,只需要将开关1打上就可以实现2、时间显示:这个模块主要是通过例程实验代码实现的。具体的就是读取时钟芯片的数据,然后显示在OLED上面。3、开机显示:读取汉字“欢迎光临“程序没执行一次,改变显示的位置,从而实现了文字在动的效果4 测试结果通过我们这两个星期的努力,我们的任务基本实现了,我们通过蜂鸣器来实现播放,通过重力感应来完成下一曲上一曲的播放和功能选择,还有就是开机动画也完成了预期的效果。5 总结我们经过了两个星期的共同合作,我们从一点也不懂,到对基板有了比较理性的认识,再到完成了基本的设计,实现了基本的功能,团队协作精神也得到了提高。我们从中收获了很多。6 关健程序代码 主程序的菜单显示模块:重力感应实现上下曲的代码:时间显示模块的部分代码:七 相关问题: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 arcsinV( 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.hacc_3d mems;extern u8 DisplayBuff20;int LI35_out(void);extern void beep(void);extern void time_test(void);unsigned char hanzi32=/*- 文字: 欢 -*/*- 宋体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,0x00,/*- 文字: 迎 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=16x16 -*/0x40,0x40,0x42,0xCC,0x00,0x00,0xFC,0x04,0x02,0x00,0xFC,0x04,0x04,0xFC,0x00,0x00,0x00,0x40,0x20,0x1F,0x20,0x40,0x4F,0x44,0x42,0x40,0x7F,0x42,0x44,0x43,0x40,0x00,/*- 文字: 光 -*/*- 宋体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,0x00,/*- 文字: 临 -*/*- 宋体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,0x00,;unsigned char My_music32= /*- 文字: 我 -*/*- 宋体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,0x00,/*- 文字: 的 -*/*- 宋体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,0x00,/*- 文字: 音 -*/*- 宋体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,0x00,/*- 文字: 乐 -*/*- 宋体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,0x00,;unsigned char tool32=/*- 文字: 系 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=16x16 -*/0x00,0x00,0x22,0x32,0x2A,0xA6,0xA2,0x62,0x21,0x11,0x09,0x81,0x01,0x00,0x00,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,0x88,0x00,0x22,0x67,0x22,0x12,0x12,0x80,0x40,0x30,0x0F,0x00,0x00,0x3F,0x40,0x40,0x71,0x00,/*- 文字: 设 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=16x16 -*/0x40,0x40,0x42,0xCC,0x00,0x40,0xA0,0x9E,0x82,0x82,0x82,0x9E,0xA0,0x20,0x20,0x00,0x00,0x00,0x00,0x3F,0x90,0x88,0x40,0x43,0x2C,0x10,0x28,0x46,0x41,0x80,0x80,0x00,/*- 文字: 置 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=16x16 -*/0x00,0x17,0x15,0xD5,0x55,0x57,0x55,0x7D,0x55,0x57,0x55,0xD5,0x15,0x17,0x00,0x00,0x40,0x40,0x40,0x7F,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0x40,0x40,0x40,0x00,;unsigned char shijian32=/*- 文字: 时 -*/*- 宋体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,0x00,/*- 文字: 间 -*/*- 宋体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,0x00,/*- 文字: 显 -*/*- 宋体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,0x00,/*- 文字: 示 -*/*- 宋体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,0x00,;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:com63com0 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 onvoid 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;i220&mems.x10&mems.x5&mems.y210&mems.y245) return 2;/代表向左偏转 else return 0;/无偏转或者偏转过大 扬声器的模块:#include include.h#include OLED.hextern 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 /低音17const unsigned int MusicDataD7 = 61069,54422,48485,45845,40816,36364,32389;/中音17const unsigned int MusicData7 = 30592,27257,24297,22922,20408,18182,16194;/高音17const unsigned int MusicDataG7 = 15282,13617,12130,11453,10204,9091,8097;/音乐数据格式:/0x110x17 表示低音17/0x210x27 表示中音17/0x310x37 表示高音17/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,0x21,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,0x21,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,0x23,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,0x22,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,0x25,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,0x00,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;iDataNumber;i+) if(LI35_out()=2|LI35_out()=4|LI35_out()=1) break; else switch (*p) case 0x11: PlayWord = MusicDataD0; break; case 0x12: PlayWord = MusicDataD1; break; case 0x13: PlayWord = MusicDataD2; break; case 0x14: PlayWord = MusicDataD3; break; case 0x15: PlayWord = MusicDataD4; break; case 0x16: PlayWord = MusicDataD5; break; case 0x17: PlayWord = MusicDataD6; break; case 0x21: PlayWord = MusicData0; break; case 0x22: PlayWord = MusicData1; break; case 0x23: PlayWord = MusicData2; break; case 0x24: PlayWord =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论