基于STC12单片机的WAV播放器_第1页
基于STC12单片机的WAV播放器_第2页
基于STC12单片机的WAV播放器_第3页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、STC12 播放器物电学院电信二班小组成员:张景宝、李镇宇、周方嫒一、 设计特点1、采用PWM 调制方式,使硬件简单,实现容易。2、由于没有专用解码芯片,所以只能播放 音轨。3、通过软件自动适应音乐采样率。4、设计电池接口,可便携。5、声音大小可通过硬件调整。二、 基本原理PCM 文件结合采样率调制到PWM原音乐文件。三、 硬件设计1、电源部分2、SD 卡部分3、音频接口部分4、CPU 部分四、 软件设计1、编译平台:KEIL V9.09 级优化2、使用资源情况3、 SD 卡低层驱动/*功能描述:向 SD卡写命令隶属模块:SD卡模块函数属性:内部参数说明:SD6个字节,pcmd是指向命令字节序

2、列的指针返 回 说 明 : 命 令 写 入 后 , SD 卡 的 回 应 值 , 调 用 不 成 功 , 将 返 回0 xff*/u8 SD_SendCommand(u8 cmd, u32 arg, u8 crc)unsigned char r1; unsignedcharRetry=0;/ SPI_ReadWriteByte(0 xff);/片选端置低,选中 SD 卡SD_CS=0; /打开片选/发送SPI_ReadWriteByte(cmd|0 x40)/分别写入命令SPI_ReadWriteByte(arg24);SPI_ReadWriteByte(arg 16);SPI_ReadWri

3、teByte(arg 8); SPI_ReadWriteByte(arg); SPI_ReadWriteByte(crc);/等待响应,或超时退出while(r1 = SPI_ReadWriteByte(0 xFF)=0 xFF)Retry+; if(Retry 200)break;/关闭片选/在总线上额外增加 8 个时钟,让 SD 卡完成剩下的工作SPI_ReadWriteByte(0 xFF); SD_CS=1; /打开片选/返回状态值return r1;/*功能描述:初始化 SDCMD1隶属模块:SD卡模块函数属性:内部参数说明:无返回说明:调用成功,返回 0 x00,否则返回 INIT

4、_CMD1_ERROR (sd.h 中有定义)u8SD_Init()unsigned char time,temp,i;SPI_Init(); SPI_SetSpeed(3);/设置到低速模式SD_CS=1; /打开片选)/4!SPI_ReadWriteByte(0 xff); /120 个时钟SD_CS=0; /打开片选time=0;dotemp=SD_SendCommand(CMD0,0,0 x95);/写入CMD0复位SD卡time+; if(time=200)SD_CS=1; /打开片选while(temp!=0 x01); time=0;dotemp=SD_SendCommand(C

5、MD1, 0 , 0 xff); /写入 CMD1 激活 SD 卡time+; if(time=200)SD_CS=1; /打开片选while(temp!=0);SPI_SetSpeed(0);temp = SD_SendCommand(CMD59, 0, 0 x01); if(temp != 0 x00)return temp; /命令错误,返回 r1temp=SD_SendCommand(CMD16,512,0 xff); if(temp!=0 x00)return temp ;/命令错误,返回 r1SD_CS=1; /打开片选SPI_ReadWriteByte(0 xff); /按照 S

6、D 卡的操作时序在这里补 8 个时钟return 0;/*-*/* InitializeDiskDrive*/*-*/DSTATUS disk_initialize (void)DSTATUSstat;stat =SD_Init();return stat;/*-*/*ReadPartialSector*/*-*/DRESULT disk_readp (BYTE* buff,/*Pointertothedestinationobject*/DWORD sector, WORD offset, WORD count)/* Sector number (LBA) */* Offset in the

7、 sector */* Byte count (bit15:destination) */DRESULT res;uchar response=0 xff; uint byteLeft,retry=0;byteLeft=512-offset-count;/接收数据后,跳过的字节数if(offset+count)512)出扇区returnRES_PARERR;/读取字节超if(SD_SendCommand(CMD17, sector0 xfffe)/超时错误SD_CS_DEASSERT;return RES_ERROR;while(response != 0 xfe); /等待回应if/跳过 o

8、ffset(偏移字节数)个数据doSPI_ReadWriteByte(0 xff);while (-offset);if(buff)do/接收到的数据块数据存入缓冲区*buff+=SPI_ReadWriteByte(0 xff);while (-count);else/dummyif(byteLeft)/byteLeft个数据dodoSPI_ReadWriteByte(0 xff);while (-byteLeft);SPI_ReadWriteByte(0 xff);SPI_ReadWriteByte(0 xff);/忽略 CRC 校验(两个字节)res= RES_OK;SD_CS_DEASS

9、ERT;SPI_ReadWriteByte(0 xff);/等待 8 个 clkreturnres;BYTE xdata Cache0SIZE; BYTExdataBYTE xdata Cache0SIZE; BYTExdataCache1SIZE; LPBYTE dataCache;LPBYTEdataAudioCache=Cache0;if(Cache = Cache0) Cache=Cache1;else Cache =Cache0;staticDWORDload_header(void)staticDWORDload_header(void)/*0:Invalidformat,1:I/

10、Oerror,=1024:Numberofsamples*/DWORD sz, f; BYTE b, al = 0;voidTimer0(void)interrupt1CCAP0L=CCAP0H=AudioCacheAudioPos; AudioPos+;if(AudioPos=SIZE)play_f=1; AudioPos=if(AudioCache=Cache0)AudioCache=Cache1; else AudioCache =Cache0;if (pf_read(Cache, 12, &rb) return 1;/* Load file header (12 bytes) */if

11、 (rb != 12 | LD_DWORD(Cache+8) != FCC(W,A,V,E) return 0;for (;) pf_read(Cache, 8,&rb);if (rb != 8) return 0;/* Get Chunk ID and size */sz = LD_DWORD(&Cache4);/* Chunk size */switch (LD_DWORD(&Cache0) /* FCC */case FCC(f,m,t, ) :if (sz & 1) sz+;/* fmt chunk */* Align chunk size */if (sz 100 | sz 16)

12、return 0; /* Check chunk size */pf_read(Cache, sz, &rb); if (rb != sz) return 0;/* Get content */if (Cache0 != 1) return 0;/* Check coding type (LPCM) */ b = Cache2;if(b!=1&b!=2)return0; b = Cache14;if (b != 8 & b != 16) return 0;/* Check channels (1/2) */* Check resolution (8/16 bit) */if (b & 16)

13、al = 1;f = LD_DWORD(&Cache4);/* Check sampling freqency (8k-48k) */ if (f 8000) return 4;TH0 = -(FOSC / 12 / f);break;case FCC(d,a,t,a) :/* data chunk */if (!al) return 0; /* Check if format valid */if (sz 1024 | (sz & (al - 1) return 0;/* Check size */if (Fs.fptr & (al - 1) return 0; return sz;/* C

14、heck offset */* Start to play */case FCC(D,I,S,P) :/* DISP chunk */SendString(dispn);case FCC(L,I,S,T) :case FCC(f,a,c,t) : if (sz & 1) sz+;/* LIST chunk */* fact chunk */* Align chunk size */pf_lseek(Fs.fptr + sz); break;/* Skip this chunk */default :default :return 0;/* Unknown chunk */return 0;五、

15、 附录文件头1、WAV 文件头偏移地址字节数数据类型内容00H4char“RIFF”;RIFF标志04H4long int0 x0001060A(注意数据存储顺序);文件长度08H4char“WAVE”;WAVE标志0CH4char“fmtfmt标志,最后一位为空10H4long int0 x12;sizeof(PCMWAVEFORMAT)14H2int1(WAVE_FORMAT_PCM)格式类别,1 PCM 形式的声音数据16H2int2; 通道数,单声道为 1,双声道为 218H2int44100; 采样频率(每秒样本数)1CH4long int0 x10B10000;每秒数据位数每样本的

16、数据位数8。播放软件利用此值可以估计缓冲区的大小。20H2int数据块的调整数(按字节算的),每样本的数据位值8。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。22H2果有多个声道,对每个声道而言,样本大小都一样。50H4char“data”;数据标记符54H4long int0 x00 0105D8;语音数据大小2、FatFSFatFSFatFS FatFs FAT FatFsANSI 8051, PIC, AVR,SH, Z80, H8, ARM 等等,不需要做任何修改。特点:FAT12, FAT16 FAT32.多个卷(物理驱动器与分区).FDISK Super

17、-floppy.多种配置选项:为双位元组字元系统 Byte Char Systems )API,缓冲区配置等等应用程序接口FatFs 提供下面的函数:f_mount - 注册/注销一个工作区域(Work Area) f_open - 打开/创建一个文件 f_close - 关闭一个文件f_read - 读文件 f_write - 写文件f_lseek - 移动文件读/写指针f_truncate - 截断文件f_syncFlush Cached f_opendir - 打开一个目录f_readdir - 读取目录条目f_getfree - 获取空闲簇 Get Free Clusters f_st

18、at - 获取文件状态f_mkdir - 创建一个目录f_unlink - 删除一个文件或目录f_chmod - 改变属性(Attribute) f_utime - 改变时间戳(Timestamp)f_rename - 重命名/移动一个文件或文件夹f_mkfs - 在驱动器上创建一个文件系统f_forwardForwardfiledatatothestreamdirectly f_gets - 读一个字符串f_putc - 写一个字符f_puts - 写一个字符传f_printf - 写一个格式化的字符磁盘 I/O接口Since the FatFs module is completely separated from disk I/O layer, it requires following functionstolowerlayertoread/writephysicaldiskandtogetcurrenttime.ThelowleveldiskI/O moduleisnotapartofFatFsmoduleanditmustbeprovidedbyuser.Thesampledriversarealso available in theresources.因为 FatFs 模块完全与磁盘 I

温馨提示

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

最新文档

评论

0/150

提交评论