基于单片机的语音玩具的制作.doc
基于单片机的语音玩具的制作第一章 引言1第二章 单片机及相关器件介绍4图2410第三节 系统软件设计11第四章 系统硬件设计414.1 元器件清单414.3硬件实物成果图43第五章 系统测试与总结445.1 硬件电路调试441检查硬件焊接是不是有虚焊。445.1.2 硬件功能检查445.2 软件功能模块的调试445.3 综合调试44第七章 参考文献45摘要 现今,一些领先技术已广泛应用现在的玩具领域:如无线电、红外通讯、传感器、语音芯片,而嵌入了后两者的技术后使得玩具更具生命力。 基于此,我设计制作了一种基于单片机AT89S51控制、以ISD4002为核心的语音模块的语音玩具的电路样机。该电路能够实现实时按键放音和录音的功能,在玩具表面装有带有图案的按键,一个按键对应一个图案,当按键按下时,玩具会报出按键对应图案的名称。本文主要就电路样机的软件设计进行说明关键词: 单片机, ISD4002语音芯片, 语音玩具ABSTRACT Today, some of the leading technology has been widely applied now in the field of toys: such as radio, infrared communications, sensors, voice chip, embedded in the latter two of the technology makes toys more vitality. Based on this, I designed a control-based SCM AT89S51 to ISD4002 as the core of the voice module to the DS1302 clock as the core module of the voice dolls. The toy can touch real-time playback functions, to join in the design of the show can be achieved time and recording functions, This article mainly carries on showing on the electric circuit prototype's software designKeywords: SCM voive chipISD4002 Pronunciation toy第一章 引言1.1 选题意义音识别以语音为研究对象,它是语音信号处理的一个重要研究方向,是模式识别的一个分支,涉及到生理学、心理学、语言学、计算机科学,以及信号处理等诸多领域,其最终目的是实现人与机器进行自然语言通信,用语言操纵计算机。 语音识别系统的分类方式及依据是根据对说话人说话方式的要求,可以分为孤立字<词> 语音识别系统,连接字语音识别系统,以及连续语音识别系统。 进一步分为两个方向:一是根据对说话人的依赖程度可以分为特定人和非特定人语音识别系统;二是根据词汇量大小,可以分为小词汇量、中等词汇量、大词汇量,以及无限词汇量语音识别系统。 不同的语音识别系统,虽然具体实现细节有所不同,但所采用的基本技术相似,一个典型语音识别系统的实现过程如图1 所示。 图1目前,在智能语音玩具的研究中,语音这种人类最简单、最自然、最方便和最有效的交换信息的方式,在玩具上的应用还较少,显然,在玩具系统上增加语音接口,通过按键让玩具能听会说,不仅十分诱人,而且具有广泛的应用前景,同时,也是玩具智能化的重要标志之一.而语音识别技术是近年来十分活跃的研究领域,语音识别系统的实用化研究是语音识别研究的一个主要方向。本文是基于51单片机的语音玩具的制作的设计,系统以51单片机为核心,通过单片机来控制语音芯片输出语音信息。在玩具的表面装有带有图案的按键,一个按键对应一个图案,有按键按下时,玩具会报出按键对应的图案名称。1.2 当今应用领域智能语音玩具的发展趋势融合类个人电子终端发展到今天,我们已经看到PMP、手持游戏机、UMPC、PDA,以及智能手机的各显神通。但是在另一个领域玩具领域,智能玩具正在悄悄兴起,成为新一类的融合电子终端,代表着世界玩具业发展的趋势。在的玩具出口量中传统玩具包括洋娃娃的出口数字出现负增长,其占整体出口的比重,由20XX的约七成下跌至20XX的约五成,而非传统的智能玩具的比重,则由20XX的约27%上升至20XX的48%。说明互动性、高科技玩具已渐渐成为发展主流,电脑技术与玩具结合已成为创新的方向。去年,高科技玩具在美国玩具市场上的销售额已达到100亿美元,增长速度远远高于传统玩具。20XX世界智能玩具销售收入达到23.5亿美元。 In-Stat预计到20XX这个数字将增长到90亿美元。智能玩具市场相比其他融合终端绝对是新兴市场,因为智能玩具是基于现成的主流融合终端上的技术而产生的创新,相对成本较低,不仅可以给投资者提供较好的投资回报,而且还有很好的市场反应。同时,中国地玩具人均消费与欧美国家差距巨大,存在着很大的智能玩具市场空间。1.3 本课题主要研究容智能语音玩具是现代玩具发展的一个必然趋势 。 1.3.1 玩具设计要求 1、基本要求 1一个按键对应一个图案,有按键 2、语音点播:、猫叫声、鸡叫声、狗叫声 、羊叫声 、马叫声 3系统应具有启动和停止功能。第二章 单片机及相关器件介绍2.1 STC10L08XE 单片机介绍 2.1.1 STC11/10xx系列单片机简介STC11lOxx系列单片机是宏晶科技生产的单时钟机器周期<IT>的单片机,是高速低功耗超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。部集成高可靠复位电路,针对高速通信,智能控制,强干扰场合。11/lOxx系列单片机的定时器0/定时器1串行口与传统8051兼容,增加了独立波特率发牛器,省去了定时器2。传统8051的111条指令执行速度全面提速,最快的指令快24倍,最慢的指令快3倍。v 增强型8051 CPU,IT,单时钟机器周期,指令代码完全兼容传统8051。v 工作电压: STCIIFxx系列工作电压:5.5V - 4.1V3.7V <5V单片机>; STCIILxx系列工作电压:3.6V - 2.4V2.1V <3V单片机>; STCIOFxx系列工作电压:5.5V - 3.8V3.3V <5V单片机>; STCIOLxx系列工作电压:3.6V - 2.4V2.1V <3V单片机>。v 工作频率围:035MHz,相当于普通8051的0420MHz。v STCIIF/Lxx系列单斤机用户应用程序空间: 1/2/3/4/5/6/8/16/20/3 2/40/4 8/5 2/5 6/60/62K字节。 STCIOF/Lxx系列单片机用户应用程序空间:4K6K8K10K12K14K字节。v STCllxx系列单片机:片上集成1280字节或256字节RAM; STCllxx系列单片机:片上集成512字节或256字节RAM。v 通用I/O口36/40/12/14/16个每个1/0口驱动能力均可达到20mA,复位后为 1、准双向口弱上拉普通8051传统1/0口; 2、可设置成四种模式: 、准双向口弱上拉;、强推挽强上拉;、仅为输入高阻;、开漏 。v ISP在系统可编程IAP在应用可编程,无需专用编程器,无需专用仿真器。 可通过串口<RxD/P3.0,TxD/P3.1>直接下载用户程序,数秒即可完成一片。v 有EEPROM功能。v 看门狗。v 部集成MAX810专用复位电路晶体频率在24MHz以下时,要选择高的复位门 槛电压,如4.1V以下复位,晶体频率在12MHz以下时,可选择低的复位门槛电压, 如3.7V以下复位,复位脚接IK电阻到地。v 置一个对部Vcc迸行掉电检测的掉电检测电路,可设置为中断或复位。5v单片 机掉电检测门槛电压为4.IV/3. 7V附近,3.3V单片机掉电检测门槛电压为2.4V附近。v 时钟源:外部高精度晶体时钟,部R/C振荡器。用户在下载用户程序时,可选择是使用部R/C振荡器还是外部晶体时钟; 常温下部R/C振荡器频率为:4MHz8MHz;精度要求不高时,可选择使用部时钟,但因为有制造误差和温漂,以实际测试为准。v 共2个16位定时器与传统8051兼容的定时器计数器,16位定时器TO和T1, STCllxx/; STClOxx全系列都有1个独立波特率发牛器故小必用T2做为波特率发牛器,详 细使用方法请参考独立波特率发牛器做串口通讯的相关使用说明及示例程序。v 3个时钟输出口,可由TO的溢出在P3. 4/TO输出时钟,可由Tl的溢出在P3. 5/TI 输出时钟,独立波特率发生器可以在Pl.0口输出时钟部分型号无独立波特率发牛器,详情请参阅单片机选型一览表。v 外部中断I/O口5路,传统的下降沿中断或低电平触发中断, Power Down模式可 v 由外部中断唤醒,INTO/P3.2,INTl/P3.3,INT/TO/P3.4,INT/T1/P3.5, INTINT/RxD/P3.0 r或INT/RxD/P1.6>。v PowcT、Down掉电模式可由部掉电唤醒之用定时器唤醒<STCllxx系列有 此功能, STClOxx无此功能>,也口J由上而提到的外部中断口中断唤西星,由 于INT/RxD支持卜降沿中断,故也可支持远程通信唤醒。v 一个独立的通用全双工异步串行口<UART>,做主机时可以当2个串口便用 RxD/P3.0,TxD/P3.1可以切换到RxD/PI.6,TxD/PI.7,通过将串口在P3口和Pl口之间来回切换,将1个串口作为2个主串口分时复用,可低成本实现2个串口,当然有其局限性。v 工作温度围:-40 - +85工业级0- 75商业级。v 封装:SOP16/DIP16/DIP18/SOP20/DIP20/LSSOP20/PDIP-40/LQFP-44/PLCC-44<暂时尽量不要选PLCC44> 。SOP16/DIP16有12个1/0口,DIP18有14个1/0口,SOP20/PDIP20/LSSOP20有16个1/0口 ,LQFP44有40个1/0口,PDIP40/QFN40 <5mmx5mm>有36个1/0口。2.1.2 STC11/10xx系列单片机的部结构STC11lOxx系列单片机的部结构框图如图2-1所示。STC11lOxx单片机中包含中央处理器<CPU>、程序存储器<Flash>、数据存储器<SRAM>、定时计数器、UART串口、I/O接口、看门狗及片RjC振荡器和外部晶体振荡电路等模块。STC11lOxx系列单片机几乎包含了数据采集和控制中所需的所有单元模块,可称得上一个片上系统。2.2 主要器件介绍LD3320LD3320芯片图2-2是一款"语音识别"专用芯片,由ICRoute公司设计生产。该芯片集成了语音识别处理器和一些外部电路,包括AD、DA转换器、麦克风接口、声音输出接口等。本芯片在设计上注重节能与高效,不需要外接任何的辅助芯片如Flash、RAM等,直接集成在现有的产品中即可以实现语音识别声控人机对话功能。并且,识别的关键词语列表是可以任意动态编辑的。< 图2-2 > 2.2.1 功能介绍l 通过ICRoute公司特有的快速而稳定的优化算法,完成非特定人语音识别。不需要用户事先训练和录音,识别准确率95%。l 不需要外接任何辅助的Flash芯片,RAM芯片和AD芯片,就可以完成语音识别功能。真正提供了单芯片语音识别解决方案。l 每次识别最多可以设置50项候选识别句,每个识别句可以是单字,词组或短句,长度为不超过10个汉字或者79个字节的拼音串。另一方面,识别句容可以动态编辑修改,因此可由一个系统支持多种场景。l 芯片部已经准备了16位A/D转换器、16位D/A转换器和功放电路,麦克风、立体声耳机和单声道喇叭可以很方便地和芯片管脚连接。立体声耳机接口的输幽功率为20mW,而喇叭接口的输出功率为550mW,能产生清晰响亮的声音。l 支持并行和串行接口,串行方式可以简化与其他模块的连接。l 可设置为休眠状态,而且可以方便地激活。l 支持MP3播放功能,无需外围辅助器件,主控MCU将MP3数据依次送入LD3320芯片部就可以从芯片的相应PIN输出声音。产品设计可以选择从立体声的耳机或者单声道喇叭来获得声音输出。支持MPEGI<ISO/IEC11172-3>, MPEG2<ISO/IEC13818-3>和MPEG 2.5 layer 3等格式。l 工作供电为3. 3V,如果用于便携式系统,使用3节AA电池就可以满足供电需要。2.2.2 电路说明以下为部电路的简单逻辑图图23:图23详细说明如下:电压要求:VDD 数字电路用电源输入 3. 0 V - 3. 3 VVDDIO 数字1/0电路用电源输入 1. 65 V - VDDVDDA 模拟电路用电源输入 3. 0 V - 4. 0 V建议用户可以用统一的3. 3v电压输入以简化设计。数字电压和模拟电压进行隔离可以使得芯片有更好的效果。芯片管脚输入电压围:高电压逻辑"1":0. 7;lcVDDIO'VDDIO 低电压逻辑"0":0'0. 3VDDIO因此,开发者需要保证自己使用的主控MCU同样工作在3.3v,保证主控MCU向LD3320的管脚输出的高电压不超过3.3V。v 时钟<Clock>芯片必须连接外部时钟,可接受的频率围是4-48MHz;而芯片部还有PLL频率合成器,可产生特定的频率供部模块使用。v 复位对芯片的复位信号RSTB:1:必须在VDD/VDDA/VDDIO都稳定后进行。无论芯片正在进行何种运算,复位信号都可以使它恢复初始状态,并使各寄存器复位。如果没有后续的指令对寄存器的设置,复位后芯片将进入休眠状态。此后,一个CSB:1:信号就可以重新激活芯片进入工作状态。v 并行接口本芯片可通过并行方式和外部主CPU连接,此时使用8根数据线PO-P7,4个控制信号WRB#,RDB#,CS冰,AO,以及一个中断返回信号INTB#。v 串行接口串行接口通过SPI协议和外部主CPU连接,首先要将MD接高电平,而将SPIS:1:接地。此时只使用4个管脚:片选SCS冰、SPI时钟<SDCK>、SPI输入<SDI>和SPI输出<SDO>。v 寄存器对芯片的设置和命令,包括传送数据和接受数据,都是通过对寄存器的操作来完成的。例如进行语音识别时,设置识别的关键词语列表,设定芯片的识别模式,谀别完成后获得识别结果都是通过读写寄存器来完成。播放声音时,就是将MP3格式的数据循环放入FIFO对应的寄存器。识别结果是通过寄存器返回识别出的关键词语在关键词语列表中的排列序号Index数值,该Index数值是在设置关键词语列表时指定。v 喇叭音量的外部控制除了特定寄存器来控制音量以外,芯片外部的电路可以控制喇叭的音量增益。使用的是EPI、EP2、EP3对应的管脚。2.2.3 管脚分布图图24图24第3节 系统软件设计3.1 软件开发环境3.1.1 source insight 介绍source Insight是一个面向项目开发的程序编辑器和代码浏览器,它拥有置的对C/C+, C#和Java等程序的分析。Source Insight能分析你的原代码并在你工作的同时动态维护它自己的符号数据库,并自动为你显示有用的上下文信息。 Source Insight不仅仅是一个强大的程序编辑器,它还能显示reference trees,class inheritance diagrams和call trees。Source Insight提供了最快速的对源代码的导航和任何程序编辑器的源信息。 SourceInsight提供了快速和革新的访问源代码和源信息的能力。与众多其它编辑器产品不同,SourceInsight能在你编辑的同时分析你的源代码,为你提供实用的信息并立即进行分析。3.1.2 Source insight 技术特点Source Insight是如今最好用的语言编辑器,支持几乎所有的语言, 如C、C+、ASM、PAS、ASP、HTML等常见的,还支持自己定义关键字,如果您 是一个程序员或者网页制作人,这个软件对您都是有帮助的! Source Insight为您提供了可快速访问源代码和源信息的功能。Source Insight相较其它的编辑器产品来说,还可以帮您分析源代码,并在您编辑的同时立刻提供给您有用的信息和分析。 Source Insight自动创建并维护它自己高性能的符号数据库,包括函数、method、全局变量、结构、类和工程源文件里定义的其它类型的符号。Source Insight 可以迅速地更新您的文件信息,即使在您编辑代码的时候。而且符号数据库的符号可以自动创建到您的工程文件中。 而是InSight 4.0,关于InSight,网上对此软件的简介是: InSight 是一个小巧实用的多标签的文档编辑器,可替代系统自带的记事本软件。3.2 程序流程图图31程序流程图图313.3 软件功能代码#ifndef FlashDef_H #define FlashDef_Hsbit FLASH_CS= P1 7;sbit FLASH_CLK= P1 3;sbit FLASH_IO0= P1 2;sbit FLASH_IO1= P1 6;sbit FLASH_IO2= P1 5;sbit FLASH_IO3= P1 4;sbit FLASH_WP= P1 5;sbit FLASH_HOLD= P1 4;sbit FLASH_DO = P1 6;sbit FLASH_DIO = P1 2;#define W25P_FastReadData 0x0Bvoid IO_Send_Byte<uint8 dataout>#endifsbitP10=P10;sbitP11=P11;sbitP12=P12;sbitP13=P13;sbitP14=P14;sbitP15=P15;sbitP16=P16;sbitP17=P17;sbitP30=P30;sbitP31=P31;sbitP32=P32;sbitP33=P33;sbitP34=P34;sbitP35=P35;sbitP36=P36;sbitP37=P37;sbitP20=P20;sbitP21=P21;sbitP22=P22;sbitP23=P23;sbitP24=P24;sbitP25=P25;sbitP26=P26;sbitP27=P27;sbitP00=P00;sbitP01=P01;sbitP02=P02;sbitP03=P03;sbitP04=P04;sbitP05=P05;sbitP06=P06;sbitP07=P07;sbitP40=P40;sbitP41=P41;sbitP42=P42;sbitP43=P43;sbitP44=P44;sbitP45=P45;sbitP46=P46;sbitP47=P47;#include "STC10L08XE.H"#include "LDChip.h"#include "FlashDef.h"/#include "serial.h"sbit RSTB=P33;uint32 nMp3StartPos=0;uint32 nMp3Size=0;uint32 nMp3Pos=0;uint32 nCurMp3Pos=0;uint8 idata nLD_Mode = LD_MODE_IDLE;uint8 bMp3Play=0;uint8 idata ucRegVal;uint8 idata ucHighInt;uint8 idata ucLowInt;uint8 idata ucStatus;uint8 idata ucSPVol=15; / MAX=15 MIN=0extern uint8 idata nAsrStatus;extern uint8 idata nInt0Flag;void ProcessInt0<>void LD_Init_Common<>bMp3Play = 0;LD_ReadReg<0x06> /* soft reset. */LD_WriteReg<0x1F, 0x1>delay< 10 > LD_WriteReg<0x1F, 0x0> delay< 10 > LD_WriteReg<0x89, 0x03> LD_WriteReg<0xCF, 0x43> LD_WriteReg<0xCB, 0x02>/*PLL setting*/LD_WriteReg<0x11, LD_PLL_11> if <nLD_Mode = LD_MODE_MP3>LD_WriteReg<0x19, LD_PLL_19> LD_WriteReg<0x1B, LD_PLL_1B> LD_WriteReg<0x1D, LD_PLL_1D>LD_WriteReg<0x79, LD_LEDMTR_FREQ>elseLD_WriteReg<0x1E,0x00> LD_WriteReg<0x19,0x3f> LD_WriteReg<0x1D,0x1f>LD_WriteReg<0x1B,0x08>LD_WriteReg<0xCD, 0x04>LD_WriteReg<0x17, 0x4c> LD_WriteReg<0xB9, 0x00>LD_WriteReg<0xCF, 0x4f> void LD_Init_MP3<>nLD_Mode = LD_MODE_MP3;LD_Init_Common<>LD_WriteReg<0xBD,0x02>LD_WriteReg<0x17, 0x48>LD_WriteReg<0x85, 0x52> LD_WriteReg<0x8F ,0x00> LD_WriteReg<0x81,0x00>LD_WriteReg<0x83,0x00>LD_WriteReg<0x8E,0xff>LD_WriteReg<0x8D,0xff> delay<1>LD_WriteReg<0x87,0xff>LD_WriteReg<0x89,0xff>LD_WriteReg<0x22,0> LD_WriteReg<0x23,0>LD_WriteReg<0x20,<uint8>2031> LD_WriteReg<0x21,<uint8><<2031>>8>&0x07>>LD_WriteReg<0x24, <uint8>0x77> LD_WriteReg<0x25, <uint8>3> LD_WriteReg<0x26,<uint8>0xbb> LD_WriteReg<0x27,<uint8>1> void LD_Init_ASR<>nLD_Mode=LD_MODE_ASR_RUN;LD_Init_Common<>LD_WriteReg<0xBD, 0x00>LD_WriteReg<0x17, 0x48>delay< 10 >LD_WriteReg<0x3C, 0x80> LD_WriteReg<0x3E, 7>LD_WriteReg<0x38, 0xff> LD_WriteReg<0x3A, 7>LD_WriteReg<0x40, 8> LD_WriteReg<0x42, 0>LD_WriteReg<0x44, 8> LD_WriteReg<0x46, 0> LD_WriteReg<0x1b,0x48>delay< 1 >void LD_reset<>RSTB=1;delay<1>RSTB=0;delay<1>RSTB=1;void ProcessInt0<>uint8 nAsrResCount=0;EX0=0;ET0=0;nInt0Flag=0;ucRegVal = LD_ReadReg<0x2B>ucHighInt = LD_ReadReg<0x29> LD_WriteReg<0x29,0> ;ucLowInt=LD_ReadReg<0x02> LD_WriteReg<0x02,0> ;if<nLD_Mode = LD_MODE_ASR_RUN>if<<ucRegVal & 0x10> &&LD_ReadReg<0xb2>=0x21 && LD_ReadReg<0xbf>=0x35>nAsrResCount = LD_ReadReg<0xba>if<nAsrResCount>0 && nAsrResCount<4> nAsrStatus=LD_ASR_FOUNDOK;else nAsrStatus=LD_ASR_FOUNDZERO;elsenAsrStatus=LD_ASR_ERROR;/LD_ASR_FOUNDZERO;20101124LD_WriteReg<0x2b, 0> LD_WriteReg<0x1C,0>ET0=1;return; if<LD_ReadReg<0xBA>&CAUSE_MP3_SONG_END> LD_WriteReg<0x2B,LD_ReadReg<0x2B>&<MASK_INT_SYNC>> LD_WriteReg<0xBA, 0>LD_WriteReg<0xBC,0x0>bMp3Play=0;LD_WriteReg<0x08,1>delay<5> LD_WriteReg<0x08,0>LD_WriteReg<0x33, 0>ET0=1;return ; if<nMp3Pos>=nMp3Size>LD_WriteReg<0xBC,0x01>ucStatus = LD_ReadReg<0x02>ucStatus&=<MASK_AFIFO_INT>LD_WriteReg<0x02, ucStatus>ucStatus=LD_ReadReg<0x29>ucStatus&=<MASK_INT_FIFO> LD_WriteReg<0x29,ucStatus|MASK_INT_SYNC> ;/bMp3Play=0;EX0=1;ET0=1;return;LD_ReloadMp3Data<>LD_WriteReg<0x29,ucHighInt> LD_WriteReg<0x02,ucLowInt> ;delay<10>EX0=1;ET0=1;void LD_play<>nMp3Pos=0;bMp3Play=1;LD_WriteReg<0x1B, LD_ReadReg<0x1B>|0x08>if <nMp3Pos >= nMp3Size>return ; LD_ReloadMp3Data<> LD_WriteReg<0xBA, 0>LD_WriteReg<0x17,0x48>LD_WriteReg<0x33, 1>ucRegVal = LD_ReadReg<0x29>LD_WriteReg<0x29, ucRegVal|MASK_INT_FIFO>ucRegVal = LD_ReadReg<0x02>LD_WriteReg<0x02, ucRegVal|MASK_AFIFO_INT> ucRegVal=LD_ReadReg<0x89>LD_WriteReg<0x89, ucRegVal | 0x0c>ucRegVal = <2& 0x03><<2;/ucStatus=LD_ReadReg<0x85>&<0x0c>LD_WriteReg<0x85, ucStatus | ucRegVal>EX0=1;void LD_AdjustMIX2SPVolume<uint8 val>ucSPVol = val;val = <<15-val>&0x0f> << 2;ucRegVal = LD_ReadReg<0x8E>&0xc3; LD_WriteReg<0x8E, val | ucRegVal> LD_WriteReg<0x87, 0x78> void LD_WriteReg< uint8 ulAddr, uint8 ucVal >LD_INDEX_PORT = ulAddr; LD_DATA_PORT = ucVal; uint8 LD_ReadReg< uint8 ulAddr >LD_INDEX_PORT = ulAddr; return <uint8>LD_DATA_PORT; void LD_ReloadMp3Data<>uint32 nCurMp3Pos;uint8 val;uint8 k;nCurMp3Pos = nMp3StartPos + nMp3Pos;FLASH_CS=1;FLASH_CLK=0;FLASH_CS=0; IO_Send_Byte<W25P_FastReadData> IO_Send_Byte<<<nCurMp3Pos & 0xFFFFFF> >> 16>> IO_Send_Byte<<<nCurMp3Pos & 0xFFFF> >> 8>> IO_Send_Byte<nCurMp3Pos & 0xFF> IO_Send_Byte<0xFF>ucStatus = LD_ReadReg<0x06>while < !<ucStatus&MASK_FIFO_STATUS_AFULL> && <nMp3Pos<nMp3Size> >val=0;for<k=0;k<8;k+>FLASH_CLK=0;val<<=1;FLASH_CLK=1;val|=FLASH_DO;LD_WriteReg<0x01,val>/send_UART<val>nMp3Pos+;ucStatus = LD_ReadReg<0x06>FLASH_CS=1;FLASH_CLK=0;/ Return 1: success.uint8 LD_Check_ASRBusyFlag_b2<>uint8 j;uint8 flag = 0;for <j=0; j<10; j+>if <LD_ReadReg<0xb2> = 0x21>flag = 1;break;delay<10>return flag;void LD