打印
[资料分享与下载]

以YL-KL26Z开发板制作会讲故事的书

[复制链接]
568|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cowboy2014|  楼主 | 2015-11-24 19:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序代码
  经修改和调试,main.c的文件内容如下:
/*******************Copyright (c)*******************
**  Copyright ?2003~2009 Shenzhen uCdragon Technology Co.,Ltd. All Rights Reserved
**
**      http://www.ucdragon.com
**
**      深圳市优龙科技有限公司所提供的所有服务内容旨在协助客户加速产品的研发进度,在服务过程中所提供
**  的任何程序、文档、测试结果、方案、支持等资料和信息,都仅供参考,客户有权不使用或自行参考修改,本公司不
**  提供任何的完整性、可靠性等保证,若在客户使用过程中因任何原因造成的特别的、偶然的或间接的损失,本公司不承担任何责任。
**                     —深圳市优龙科技有限公司
**
**--------------File Info------------------------------
** File Name:               Main.c
** Last modified date:      
** Last version:            V1.0
** Description:             主函数文件
**
**-----------------------------------------------------
**      后经天津理工大学李静修改为多段语音文件键控播放,并在不断完善优**      化中,以期有更强的功能并更加易于使用。
**
********************************************************************/
#include "includes.h"
#include "fat.h"
void myDelay(INT16U uiTime);
extern uint16_t SectorsPerClust;
extern unsigned char audio[];
/************************* 全局变量与函数 **************************/
unsigned int FIFO_in;        //读取缓冲区指针
unsigned int FIFO_out;       //播放缓冲区指针
unsigned char Buffer[2048];  //2k缓冲区
int i;
INT32U         size1,size2=0;
#define AD_Sample_Num   65535
#define Volume_Num   20
unsigned int Volume=Volume_Num;
/********************************************************************
** Function name:           myDelay()
** Descriptions:            延时函数
** input parameters:        none
** output parameters:       none
** Returned value:          none
** Created by:            
** Created date:            
**-------------------------------------------------------------------** Modified by:            
** Modified date:           
********************************************************************/
void myDelay(INT16U uiTime)
{
    INT16U i,j;
    for(i = 0; i < uiTime; i++) {
      for(j = 0; j < 5000; j++);
    }
}
/********************************************************************
** Function name:           main
** Descriptions:
**                          SPI0 CS0  PTC4
**                          SPI0 SCK  PTC5
**                          SPI0 MOSI PTC6
**                          SPI0 MISO PTC7
** input parameters:        none
** output parameters:       none
** Returned value:          none
** Created by:            
** Created Date:            
**-------------------------------------------------------------------** Modified by:
** Modified date:
*******************************************************************/
int  main (void)
{
    INT8U flag,part;
         int i;
    int j=0;
          INT32U         cluster,size=0;
    struct        FileInfoStruct FileInfo;
    SystemCoreClockUpdate();                                            /* 时钟配置                     */
    uart0Init(9600,0,0,8,1);
        printf("SD_SPI Test Star...\n");
        gpioInit();                                                         /* 管脚初始化                   */
    Led5Set(1);        /* D5点亮 */
        dacInit();                                                          /* DAC  初始化                 */
        adcInit();
    pitInit();                                                          /* PIT  定时器初始化                 */
        spiInit(SPI0_BASE_PTR , Master);                                    /* SPI0 主机模式初始化           */
      
                flag=SD_Init();
                if(flag!=0)
                {
                        printf("SD_Init...Fall!");
                        while(1);
                }      
                FAT_Init();
                FAT_DisDir("\\");
                while(1)
                {
                //   增添以按键来选择语音段播放功能
                if(j==0)                cluster=FAT_OpenFile("\\1.wav",&FileInfo);
                if(j==1)                cluster=FAT_OpenFile("\\2.wav",&FileInfo);
                if(j==2)                cluster=FAT_OpenFile("\\3.wav",&FileInfo);
                if(j==3)                cluster=FAT_OpenFile("\\4.wav",&FileInfo);
                if(j==4)                cluster=FAT_OpenFile("\\5.wav",&FileInfo);
                if(j==5)                cluster=FAT_OpenFile("\\6.wav",&FileInfo);
                              
                if(cluster==0 || FileInfo.Size == 0)
          {
                printf("File open err!\n");
                return 0;
          }
               
    printf("File size is %d",FileInfo.Size);
         FIFO_out = 0;
    FIFO_in  = 0;
         NVIC_EnableIRQ(PIT_IRQn);                                          
    NVIC_SetPriority(PIT_IRQn,3);                                       
    __enable_irq();
        size1=FileInfo.Size;      
               
                while(size<FileInfo.Size)
                {
               
                        for(part=0;part<SectorsPerClust;part++)
                        {
                                FAT_LoadPartCluster(cluster,part,(uint8_t *)(Buffer+FIFO_in));        //读一个扇区
                                FIFO_in+=512;      
                                if(FIFO_in==2048) FIFO_in=0;
               
                do
      {                             //计算缓冲区出入口距离
          i = FIFO_in - FIFO_out;
                                        if(i<0) i+=2048;   //小于0要加上2048,再比较。   
                 
      } while(i>1024);           //如果缓冲区接近溢出,先暂停等待。
               
                  }   
                cluster=FAT_NextCluster(cluster);  //下一个扇区
                size=size+SectorsPerClust*512;
                }
                j++;
                if(j>=6) j=0;
                while((FGPIOD_PDIR & 1<<6) == 1<<6);
                myDelay(500);
                myDelay(500);
                size=0;
                size2=0;
          }
      
}


相关帖子

沙发
cowboy2014|  楼主 | 2015-11-24 19:50 | 只看该作者
/********************************************************************
** Function name:           PIT_IRQHandler
** Descriptions:            PIT  8KHz
** input parameters:        none
** output parameters:       none
** Returned value:          none
** Created by:              
** Created date
**-------------------------------------------------------------------
** Modified by:            
** Modified date:           
********************************************************************/
void PIT_IRQHandler(void)
{
        PIT_T标志寄存器0 |= PIT_T标志寄存器_TIF_MASK;                                    
        if(adcGetUint()<AD_Sample_Num/3)   
    // 根据ad采样大小 3个led灯显示音量大小程度
        {
                Led5Set(1);
                Led6Set(0);
                Led7Set(0);
               
        }
        else if(adcGetUint()<2*AD_Sample_Num/3)
        {
                Led5Set(1);
                Led6Set(1);
                Led7Set(0);
      
        }
        else
        {
                Led5Set(1);
                Led6Set(1);
                Led7Set(1);      
               
        }      
        Volume=Volume_Num*adcGetUint()>>16;
        if(size2 < size1)        dacTrigger(Buffer[FIFO_out]/(Volume_Num-Volume));        //语音输出
        FIFO_out++;            //输出buffer下标+1
        size2++;
        if(FIFO_out>2047)      //达到最大值,重置下标   
        {
                FIFO_out=0;
        }
}
/********************************************************************
  END FILE
********************************************************************/

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

821

帖子

5

粉丝