智能语音玩具 电子工程毕业论文 - 图文

更新时间:2024-04-24 07:46:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于单片机的语音玩具的制作

第一章 引言 .........................................................................................................................................................3 第二章 单片机及相关器件介绍 .........................................................................................................................5 (图2—4) ........................................................................................................................................................10 第三节 系统软件设计 .......................................................................................................................................11 第四章 系统硬件设计 .......................................................................................................................................41

4.1 元器件清单 ........................................................................................................................................41 4.3硬件实物成果图 ...........................................................................................................................................43 第五章 系统测试与总结 ...................................................................................................................................44

5.1 硬件电路调试 ....................................................................................................................................44

1.检查硬件焊接是不是有虚焊。 ...................................................................................................44 5.1.2 硬件功能检查 .........................................................................................................................44 5.2 软件功能模块的调试 ........................................................................................................................44 5.3 综合调试 ............................................................................................................................................44 第七章 参考文献 ...............................................................................................................................................45

第 1 页

摘要

现今,一些领先技术已广泛应用现在的玩具领域:如无线电、红外通讯、传感器、语音芯片,而嵌入了后两者的技术后使得玩具更具生命力。

基于此,我设计制作了一种基于单片机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 design

Keywords: SCM voive chipISD4002 Pronunciation toy

第 2 页

第一章 引言

1.1 选题意义

音识别以语音为研究对象,它是语音信号处理的一个重要研究方向,是模式识别的一个分支,涉及到生理学、心理学、语言学、计算机科学,以及信号处理等诸多领域,其最终目的是实现人与机器进行自然语言通信,用语言操纵计算机。

语音识别系统的分类方式及依据是根据对说话人说话方式的要求,可以分为孤立字(词) 语音识别系统,连接字语音识别系统,以及连续语音识别系统。 进一步分为两个方向:一是根据对说话人的依赖程度可以分为特定人和非特定人语音识别系统;二是根据词汇量大小,可以分为小词汇量、中等词汇量、大词汇量,以及无限词汇量语音识别系统。

不同的语音识别系统,虽然具体实现细节有所不同,但所采用的基本技术相似,一个典型语音识别系统的实现过程如图1 所示。

图1

目前,在智能语音玩具的研究中,语音—这种人类最简单、最自然、最方便和最有效的交

换信息的方式,在玩具上的应用还较少,显然,在玩具系统上增加语音接口,通过按键让玩具能听会说,不仅十分诱人,而且具有广泛的应用前景,同时,也是玩具智能化的重要标志之一.而语音识别技术是近年来十分活跃的研究领域,语音识别系统的实用化研究是语音识别研究的一个主要方向。本文是基于51单片机的语音玩具的制作的设计,系统以51单片机为核心,通过单片机来控制语音芯片输出语音信息。在玩具的表面装有带有图案的按键,一个按键对应一个图案,有按键按下时,玩具会报出按键对应的图案名称。

1.2 当今应用领域智能语音玩具的发展趋势

融合类个人电子终端发展到今天,我们已经看到PMP、手持游戏机、UMPC、PDA,以及智能手机的各显神通。但是在另一个领域——玩具领域,智能玩具正在悄悄兴起,成为新一类的融合电子终端,代表着世界玩具业发展的趋势。在香港的玩具出口量中传统玩具包

第 3 页

括洋娃娃的出口数字出现负增长,其占整体出口的比重,由2005年的约七成下跌至2007年的约五成,而非传统的智能玩具的比重,则由2005年的约27%上升至2007年的48%。说明互动性、高科技玩具已渐渐成为发展主流,电脑技术与玩具结合已成为创新的方向。去年,高科技玩具在美国玩具市场上的销售额已达到100亿美元,增长速度远远高于传统玩具。2007年世界智能玩具销售收入达到23.5亿美元。 In-Stat预计到2012年这个数字将增长到90亿美元。

智能玩具市场相比其他融合终端绝对是新兴市场,因为智能玩具是基于现成的主流融合终端上的技术而产生的创新,相对成本较低,不仅可以给投资者提供较好的投资回报,而且还有很好的市场反应。同时,中国内地玩具人均消费与欧美国家差距巨大,存在着很大的智能玩具市场空间。

1.3 本课题主要研究内容

智能语音玩具是现代玩具发展的一个必然趋势 。 1.3.1 玩具设计要求

1、基本要求

(1)一个按键对应一个图案,有按键 (2)、语音点播: ①、猫叫声 ②、鸡叫声 ③、狗叫声

④、羊叫声 ⑤、马叫声

(3)系统应具有启动和停止功能。

第 4 页

第二章 单片机及相关器件介绍

2.1 STC10L08XE 单片机介绍

2.1.1 STC11/10xx系列单片机简介

STC11/lOxx系列单片机是宏晶科技生产的单时钟/机器周期(IT)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成高可靠复位电路,针对高速通信,智能控制,强干扰场合。

11/lOxx系列单片机的定时器0/定时器1/串行口与传统8051兼容,增加了独立波特率发牛器,省去了定时器2。传统8051的111条指令执行速度全面提速,最快的指令快24倍,最慢的指令快3倍。

? 增强型8051 CPU,IT,单时钟/机器周期,指令代码完全兼容传统8051。 ? 工作电压:

STCIIFxx系列工作电压:5.5V - 4.1V/3.7V (5V单片机); STCIILxx系列工作电压:3.6V - 2.4V/2.1V (3V单片机); STCIOFxx系列工作电压:5.5V - 3.8V/3.3V (5V单片机); STCIOLxx系列工作电压:3.6V - 2.4V/2.1V (3V单片机)。 ? 工作频率范围:0~35MHz,相当于普通8051的0~420MHz。 ? STCIIF/Lxx系列单斤机用户应用程序空间:

1/2/3/4/5/6/8/16/20/3 2/40/4 8/5 2/5 6/60/62K字节。

STCIOF/Lxx系列单片机用户应用程序空间:4K6K/8K/10K/12K/14K字节。 ? STCllxx系列单片机:片上集成1280字节或256字节RAM;

STCllxx系列单片机:片上集成512字节或256字节RAM。 ? 通用I/O口(36/40/12/14/16个)每个1/0口驱动能力均可达到20mA,复位后为 (1)、准双向口/弱上拉(普通8051传统1/0口); (2)、可设置成四种模式: ①、准双向口/弱上拉; ②、强推挽/强上拉; ③、仅为输入/高阻; ④、开漏 。

? ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器。 可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片。 ? 有EEPROM功能。 ? 看门狗。

? 内部集成MAX810专用复位电路(晶体频率在24MHz以下时,要选择高的复位门 槛电压,如4.1V以下复位,晶体频率在12MHz以下时,可选择低的复位门槛电压, 如3.7V以下复位,复位脚接IK电阻到地)。

? 内置一个对内部Vcc迸行掉电检测的掉电检测电路,可设置为中断或复位。5v单片 机掉电检测门槛电压为4.IV/3. 7V附近,3.3V单片机掉电检测门槛电压为2.4V附近。 ? 时钟源:外部高精度晶体/时钟,内部R/C振荡器。用户在下载用户程序时,可选择

是使用内部R/C振荡器还是外部晶体/时钟;

第 5 页

常温下内部R/C振荡器频率为:4MHz~8MHz;

精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,以实际测试为准。 ? 共2个16位定时器(与传统8051兼容的定时器/计数器,16位定时器TO和T1), STCllxx/;

STClOxx全系列都有1个独立波特率发牛器(故小必用T2做为波特率发牛器,详 细使用方法请参考独立波特率发牛器做串口通讯的相关使用说明及示例程序)。 ? 3个时钟输出口,可由TO的溢出在P3. 4/TO输出时钟,可由Tl的溢出在P3. 5/TI 输

出时钟,独立波特率发生器可以在Pl.0口输出时钟(部分型号‘无独立波特率发牛器,详情请参阅单片机选型一览表)。

? 外部中断I/O口5路,传统的下降沿中断或低电平触发中断, Power Down模式可 ? 由外部中断唤醒,INTO/P3.2,INTl/P3.3,INT/TO/P3.4,INT/T1/P3.5, INTINT/RxD/P3.0 r或INT/RxD/P1.6)。

? PowcT、Down(掉电)模式可由内部掉电唤醒之‘用定时器唤醒(STCllxx系列有

此功能, STClOxx无此功能),也口J^由上而提到的外部中断口中断唤西星,由 于INT/RxD支持卜降沿中断,故也可支持远程通信唤醒。

? 一个独立的通用全双工异步串行口(UART),做主机时可以当2个串口便用

[RxD/P3.0,TxD/P3.1]可以切换到[RxD/PI.6,TxD/PI.7],通过将串口在P3口和Pl口之间来回切换,将1个串口作为2个主串口分时复用,可低成本实现2个串口,当然有其局限性。

? 工作温度范围:-40 - +85℃(工业级)/0- 75℃(商业级)。

? 封装: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系列单片机的内部结构

STC11/lOxx系列单片机的内部结构框图如图2-1所示。STC11/lOxx单片机中包含中央处理器(CPU)、程序存储器(Flash)、数据存储器(SRAM)、定时/计数器、UART串口、、I/O接口、看门狗及片内RjC振荡器和外部晶体振荡电路等模块。STC11/lOxx系列单片机几乎包含了数据采集和控制中所需的所有单元模块,可称得上一个片上系统。

2.2 主要器件介绍———LD3320

LD3320芯片(图2-2)是一款“语音识别”专用芯片,由ICRoute公司设计生产。该芯片集成了语音识别处理器和一些外部电路,包括AD、DA转换器、麦克风接口、声音输出接口等。本芯片在设计上注重节能与高效,不需要外接任何的辅助芯片如Flash、RAM等,直接集成在现有的产品中即可以实现语音识别/声控/人机对话功能。并且,识别的关键词语列表是可以任意动态编辑的。

第 6 页

( 图2-2 )

第 7 页

2.2.1 功能介绍

? 通过ICRoute公司特有的快速而稳定的优化算法,完成非特定人语音识别。不需要用

户事先训练和录音,识别准确率95%。 ? 不需要外接任何辅助的Flash芯片,RAM芯片和AD芯片,就可以完成语音识别功能。

真正提供了单芯片语音识别解决方案。

? 每次识别最多可以设置50项候选识别句,每个识别句可以是单字,词组或短句,长度

为不超过10个汉字或者79个字节的拼音串。另一方面,识别句内容可以动态编辑修改,因此可由一个系统支持多种场景。

? 芯片内部已经准备了16位A/D转换器、16位D/A转换器和功放电路,麦克风、立体

声耳机和单声道喇叭可以很方便地和芯片管脚连接。立体声耳机接口的输幽功率为20mW,而喇叭接口的输出功率为550mW,能产生清晰响亮的声音。 ? 支持并行和串行接口,串行方式可以简化与其他模块的连接。 ? 可设置为休眠状态,而且可以方便地激活。

? 支持MP3播放功能,无需外围辅助器件,主控MCU将MP3数据依次送入LD3320芯

片内部就可以从芯片的相应PIN输出声音。产品设计可以选择从立体声的耳机或者单声道喇叭来获得声音输出。支持MPEGI(ISO/IEC11172-3), MPEG2(ISO/IEC13818-3)和MPEG 2.5 layer 3等格式。

? 工作供电为3. 3V,如果用于便携式系统,使用3节AA电池就可以满足供电需要。

2.2.2 电路说明

以下为内部电路的简单逻辑图(图2—3):

(图2—3)

第 8 页

详细说明如下:

电压要求:VDD 数字电路用电源输入 3. 0 V - 3. 3 V VDDIO 数字1/0电路用电源输入 1. 65 V - VDD VDDA 模拟电路用电源输入 3. 0 V - 4. 0 V

建议用户可以用统一的3. 3v电压输入以简化设计。数字电压和模拟电压进 行隔离可以使得芯片有更好的效果。

芯片管脚输入电压范围:高电压(逻辑“1”):0. 7;lcVDDIO'VDDIO 低电压(逻辑“0”):0'0. 3~VDDIO

因此,开发者需要保证自己使用的主控MCU同样工作在3.3v,保证主控MCU向LD3320的管脚输出的高电压不超过3.3V。 ? 时钟(Clock)

芯片必须连接外部时钟,可接受的频率范围是4-48MHz;而芯片内部还有PLL频率合成器,可产生特定的频率供内部模块使用。 ? 复位

对芯片的复位信号(RSTB:1:)必须在VDD/VDDA/VDDIO都稳定后进行。无论芯片正在进行何种运算,复位信号都可以使它恢复初始状态,并使各寄存器复位。如果没有后续的指令(对寄存器的设置),复位后芯片将进入休眠状态。此后,一个CSB:1:信号就可以重新激活芯片进入工作状态。 ? 并行接口

本芯片可通过并行方式和外部主CPU连接,此时使用8根数据线(PO-P7),4个控制信号(WRB#,RDB#,CS冰,AO),以及一个中断返回信号(INTB#)。 ? 串行接口

串行接口通过SPI协议和外部主CPU连接,首先要将MD接高电平,而将(SPIS:1:)接地。此时只使用4个管脚:片选(SCS冰)、SPI时钟(SDCK)、SPI输入(SDI)和SPI输出(SDO)。 ? 寄存器

对芯片的设置和命令,包括传送数据和接受数据,都是通过对寄存器的操作来完成的。例如进行语音识别时,设置识别的关键词语列表,设定芯片的识别模式,谀别完成后获得识别结果都是通过读/写寄存器来完成。播放声音时,就是将MP3格式的数据循环放入FIFO对应的寄存器。(识别结果是通过寄存器返回识别出的关键词语在关键词语列表中的排列序号Index数值,该Index数值是在设置关键词语列表时指定)。 ? 喇叭音量的外部控制

除了特定寄存器来控制音量以外,芯片外部的电路可以控制喇叭的音量增益。使用的是EPI、EP2、EP3对应的管脚。

第 9 页

2.2.3 管脚分布图(图2—4)

(图2—4)

第 10 页

第三节 系统软件设计

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提供了最快速的对源代码的导航和任何程序编辑器的源信息。 Source Insight提供了快速和革新的访问源代码和源信息的能力。与众多其它编辑器产品不同,Source Insight能在你编辑的同时分析你的源代码,为你提供实用的信息并立即进行分析。

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 是一个小巧实用的多标签的文档编辑器,可替代系统自带的记事本软件。

第 11 页

3.2 程序流程图(图3—1)

程序流程图 (图3—1)

3.3 软件功能代码 #ifndef FlashDef_H

#define FlashDef_H

sbit 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 0x0B

第 12 页

void IO_Send_Byte(uint8 dataout);

#endif

sbit P10 = P1^0; sbit P11 = sbit P12 = sbit P13 = sbit P14 = sbit P15 = sbit P16 = sbit P17 =

sbit P30 = sbit P31 = sbit P32 = sbit P33 = sbit P34 = sbit P35 = sbit P36 = sbit P37 =

sbit P20 = sbit P21 = sbit P22 = sbit P23 = sbit P24 = sbit P25 = sbit P26 = sbit P27 =

sbit P00 = sbit P01 = sbit P02 = sbit P03 = sbit P04 = sbit P05 = sbit P06 = sbit P07 =

sbit P40 = sbit P41 = sbit P42 = sbit P43 = sbit P44 = sbit P45 = P1^1; P1^2; P1^3; P1^4; P1^5; P1^6; P1^7; P3^0; P3^1; P3^2; P3^3; P3^4; P3^5; P3^6; P3^7; P2^0; P2^1; P2^2; P2^3; P2^4; P2^5; P2^6; P2^7; P0^0; P0^1; P0^2; P0^3; P0^4; P0^5; P0^6; P0^7; P4^0; P4^1; P4^2; P4^3; P4^4; P4^5;

第 13 页

sbit P46 = P4^6; sbit P47 = P4^7;

#include \#include \#include \//#include \

sbit RSTB= P3^3;

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= 0

extern 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) {

第 14 页

LD_WriteReg(0x19, LD_PLL_19); LD_WriteReg(0x1B, LD_PLL_1B); LD_WriteReg(0x1D, LD_PLL_1D);

LD_WriteReg(0x79, LD_LEDMTR_FREQ); } else {

LD_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); }

第 15 页

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); 第 16 页

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; } } else { nAsrStatus= LD_ASR_ERROR;//LD_ASR_FOUNDZERO;20101124 }

LD_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 ; }

第 17 页

// }

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);

第 18 页

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);

第 19 页

IO_Send_Byte(0xFF);

ucStatus = LD_ReadReg(0x06);

while ( !(ucStatus&MASK_FIFO_STATUS_AFULL) && (nMp3Pos

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_AsrStart() {

LD_Init_ASR();

第 20 页

}

// Return 1: success. uint8 LD_AsrRun() {

LD_WriteReg(0x35, MIC_VOL); LD_WriteReg(0x1C, 0x09); LD_WriteReg(0xBD, 0x20); LD_WriteReg(0x08, 0x01); delay( 1 );

LD_WriteReg(0x08, 0x00); delay( 1 );

if(LD_Check_ASRBusyFlag_b2() == 0) {

return 0; }

LD_WriteReg(0xB2, 0xff); LD_WriteReg(0x37, 0x06); delay( 5 );

LD_WriteReg(0x1C, 0x0b); LD_WriteReg(0x29, 0x10);

LD_WriteReg(0xBD, 0x00); EX0=1; return 1; }

// Return 1: success.

uint8 LD_AsrAddFixed() {

uint8 k, flag;

uint8 nAsrAddLength;

const char sRecog[5][15] = {\er \

const uint8 pCode[5] = {CODE_TANGSHI, CODE_SUANSHU, CODE_SUANSHU, CODE_YIJIAYI,CODE_ERJIAER, };

flag = 1;

for (k=0; k<5; k++) {

if(LD_Check_ASRBusyFlag_b2() == 0) {

第 21 页

flag = 0; break; }

LD_WriteReg(0xc1, pCode[k] ); LD_WriteReg(0xc3, 0 ); LD_WriteReg(0x08, 0x04); delay(1);

LD_WriteReg(0x08, 0x00); delay(1);

for (nAsrAddLength=0; nAsrAddLength<20; nAsrAddLength++) { if (sRecog[k][nAsrAddLength] == 0) break; LD_WriteReg(0x5, sRecog[k][nAsrAddLength]); }

LD_WriteReg(0xb9, nAsrAddLength); LD_WriteReg(0xb2, 0xff); LD_WriteReg(0x37, 0x04); }

return flag; }

uint8 LD_GetResult() {

return LD_ReadReg(0xc5 ); }

#ifndef LD_CHIP_H #define LD_CHIP_H

#define uint8 unsigned char #define uint16 unsigned int #define uint32 unsigned long

#define LD_MODE_IDLE 0x00 #define LD_MODE_ASR_RUN 0x08 #define LD_MODE_MP3 0x40

#define LD_ASR_NONE 0x00 #define LD_ASR_RUNING 0x01 #define LD_ASR_FOUNDOK 0x10 #define LD_ASR_FOUNDZERO 0x11 #define LD_ASR_ERROR 0x31

第 22 页

#define CLK_IN 22.1184 /* user need modify this value according to clock in */ #define LD_PLL_11 (uint8)((CLK_IN/2.0)-1)

#define LD_PLL_1D (uint8)(((180.0*((LD_PLL_11)+1))/(CLK_IN))-1) #define LD_PLL_19 0x1f #define LD_PLL_1B 0x40

#define LD_LEDMTR_FREQ (uint8)((CLK_IN*1000000/8)/12700)

// LD chip fixed values.

#define RESUM_OF_MUSIC 0x01 #define CAUSE_MP3_SONG_END 0x20

#define MASK_INT_SYNC 0x10 #define MASK_INT_FIFO 0x04 #define MASK_AFIFO_INT 0x01 #define MASK_FIFO_STATUS_AFULL 0x08 #define MASK_ADPCM_START 0x01

#define LD_INDEX_PORT (*((volatile uint8 xdata*)(0x8100))) #define LD_DATA_PORT (*((volatile uint8 xdata*)(0x8000)))

void LD_WriteReg( uint8 ulAddr, uint8 ucVal ); uint8 LD_ReadReg( uint8 ulAddr ); void LD_reset();

void LD_Init_Common(); void LD_Init_MP3(); void LD_Init_ASR();

void LD_play();

void LD_AdjustMIX2SPVolume(uint8 value); void LD_ReloadMp3Data();

void LD_ReloadMp3Data_Online();

uint8 LD_ProcessAsr(uint32 RecogAddr); void LD_AsrStart(); uint8 LD_AsrRun();

uint8 LD_AsrAddFixed(); uint8 LD_GetResult();

void LD_ReadMemoryBlock(uint8 dev, uint8 * ptr, uint32 addr, uint8 count); void LD_WriteMemoryBlock(uint8 dev, uint8 * ptr, uint32 addr, uint8 count);

extern uint32 nMp3StartPos; extern uint32 nMp3Size;

第 23 页

extern uint32 nMp3Pos; extern uint8 bMp3Play;

extern uint8 idata nLD_Mode;

//CODE_TANGSHI, CODE_SUANSHU, CODE_YIJIAYI, CODE_ERJIAER,

#define CODE_DEFAULT 0 #define CODE_TANGSHI 1 #define CODE_SUANSHU 3 #define CODE_YIJIAYI 7 #define CODE_ERJIAER 8 #define CODE_ABORT 9 #define CODE_AGAIN 11

void delay(unsigned long uldata);

#define MIC_VOL 0x43 #endif

sbit LED_ERJIAER =P2^4; sbit LED_DEFAULT =P2^5;

uint8 idata nAsrStatus=0; uint8 idata nInt0Flag=0;

uint8 idata nMP3Flag=0;//MP3播放完毕标志 uint8 idata nSuanshuFlag=0;//\你出题\播放标志 //uint8 idata nFlag=0;//播放标志

//#define MP3_ANOTHER_START 0xE000;//还想玩些什么 //#define MP3_ANOTHER_SIZE 0x1000;

#define MP3_TANGSHI_START 0x4000;//鹅鹅鹅,曲颈向天歌 #define MP3_TANGSHI_SIZE 0x4000;

#define MP3_FOUR_START 0x2000;//等于四 #define MP3_FOUR_SIZE 0x2000;

#define MP3_TWO_START 0x0000;//等于二 #define MP3_TWO_SIZE 0x2000;

#define MP3_AGAIN_START 0x10000;//我听不清 #define MP3_AGAIN_SIZE 0x2000;

#define MP3_ABORT_START 0xD000;//我实在听不清 #define MP3_ABORT_SIZE 0x3000;

#define MP3_WANT_START 0xB000;//你出题我来算 #define MP3_WANT_SIZE 0x2000;

#define MP3_NIHAO_START 0x8000;//你好,我是小艾 #define MP3_NIHAO_SIZE 0x3000;

extern void _nop_ (void);

第 24 页

void MCU_init();

void FlashLED(uint8 nTimes); void PlaySound(uint8 nCode); uint8 RunASR(); void ProcessInt0();

void main() {

uint8 idata nAsrRes; uint8 idata nTemp = 0; uint8 idata nflag = 0; uint16 idata ncount = 0;

FlashLED(3);

MCU_init();

serial_port_initial();//串口初始化

send_UART(0x34); //串口发送数据表示单片机串口正常工作 LD_reset();

nAsrStatus = LD_ASR_NONE; nSuanshuFlag = 0;

PlaySound(CODE_DEFAULT);//PlaySound(CODE_TANGSHI); while(1) {

if(ncount<10000) {

ncount++; } else {

ncount = 0; if(nflag) { LED_DEFAULT = 1; nflag = 0; } else { LED_DEFAULT = 0; nflag = 1; } }

第 25 页

if (nInt0Flag) { ProcessInt0();//对识别结果预读,置位识别成功标志位 continue; }

if (bMp3Play!=0) continue;

switch(nAsrStatus)//根据ASR的状态进行操作

{ case LD_ASR_RUNING:break; case LD_ASR_ERROR: break; case LD_ASR_NONE: { FlashLED(4); nAsrStatus=LD_ASR_RUNING; if (RunASR()==0)//此时进行声音识别 { nAsrStatus = LD_ASR_ERROR; LED1=0; LED2=0; } break; } case LD_ASR_FOUNDOK://识别成功,进行相应操作 { FlashLED(2); P2=0; nAsrRes = LD_GetResult(); PlaySound(nAsrRes);//播放声音

send_UART(0xAA); //串口发送数据表示单片机串口正常工作 send_UART(nAsrRes); //串口发送数据表示单片机串口正常工作 nAsrStatus = LD_ASR_NONE; break; } case LD_ASR_FOUNDZERO: { if(nTemp) {

PlaySound(CODE_ABORT); nTemp = 0; } else {

第 26 页

}

void MCU_init() {

LED1=0; LED2=0; P0 = 0xff;

P1 = 0xfe;//选中LD3320的并行模式 P2 = 0;//0xBf; P3 = 0xf7; P4 = 0x0f;

IP=0; IPH=0;

PX0=1; PT0=1; PS=1;

IPH |= 1;

EX0=0; EX1=0; ET0=0; EA=1; }

void delay(unsigned long uldata) {

unsigned int j = 0; unsigned int g = 0; for (j=0;j<5;j++)

}break; default: { FlashLED(1); nAsrStatus = LD_ASR_NONE; break; } }// switch }// while

PlaySound(CODE_AGAIN);

nTemp = 1; }/**/

nAsrStatus = LD_ASR_NONE;

第 27 页

{

for (g=0;g

void FlashLED(uint8 nTimes) {

uint8 k;

for (k=0; k

LED1=0; LED2=0; delay(15000); LED1=1; LED2=1; delay(15000); } }

void PlaySound(uint8 nCode) {

switch(nCode) {

case CODE_TANGSHI://播放“鹅鹅鹅,曲颈向天歌” nMp3StartPos = MP3_TANGSHI_START; nMp3Size = MP3_TANGSHI_SIZE; LED_TANGSHI=1; nSuanshuFlag = 0; break;

case CODE_SUANSHU://播放“你出题我来算” nMp3StartPos = MP3_WANT_START; nMp3Size = MP3_WANT_SIZE; LED_SUANSHU=1; nSuanshuFlag = 1; break;

case CODE_YIJIAYI://播放“等于二” { if(nSuanshuFlag) {

nMp3StartPos = MP3_TWO_START;

第 28 页

nMp3Size = MP3_TWO_SIZE;

LED_YIJIAYI=1; } else { nMp3StartPos = 0x000; nMp3Size = 0x5; } }break;

case CODE_ERJIAER://播放“等于四” { if(nSuanshuFlag) {

nMp3StartPos = MP3_FOUR_START; nMp3Size = MP3_FOUR_SIZE; LED_ERJIAER=1; } else { nMp3StartPos = 0x000; nMp3Size = 0x5; } }

break;

case CODE_ABORT://播放“我实在听不清” 播放nMp3StartPos = MP3_ABORT_START; nMp3Size = MP3_ABORT_SIZE; break;

case CODE_AGAIN://“我听不清” nMp3StartPos = MP3_AGAIN_START; nMp3Size = MP3_AGAIN_SIZE; break;

case CODE_DEFAULT://播放”我是小艾” nMp3StartPos = MP3_NIHAO_START; nMp3Size = MP3_NIHAO_SIZE; break;

default:break; }

LD_Init_MP3();

LD_AdjustMIX2SPVolume(15); LD_play(); }

void IO_Send_Byte(uint8 dataout)

第 29 页

{

uint8 i = 0; FLASH_CS = 0; for (i=0; i<8; i++) {

if ((dataout & 0x80) == 0x80) FLASH_DIO = 1; else FLASH_DIO = 0; FLASH_CLK = 1;

dataout = (dataout << 1); FLASH_CLK = 0; } }

uint8 RunASR() {

uint8 i=0;

uint8 asrflag=0; for (i=0; i<5; i++) {

LD_AsrStart(); delay(100);

if (LD_AsrAddFixed()==0) { LD_reset(); delay(100); continue;

}

delay(10);

if (LD_AsrRun() == 0) { LD_reset(); delay(100); continue; }

asrflag=1; break; }

return asrflag;

}

第 30 页

void ExtInt0Handler(void) interrupt 0 {

nInt0Flag = 1; }

#define RELOAD_COUNT 0xFA //22.1184MHz,12T,9600baud

void serial_port_initial();

void send_UART(unsigned char i); //void UART_Interrupt_Receive(void);

/*void serial_port_initial() //使用定时器1作为波特率发生器 {

SCON = 0x50; //0101 0000 8位可变波特率,无奇偶校验位

TMOD = 0x21; //0010 0001 设置定时器1为8位自动重装计数器 TH1 = RElOAD_COUNT; //设置定时器1自动重装数 TL1 = RElOAD_COUNT; //设置定时器1自动重装数 TR1 = 1; //开定时器1 ES = 1; //允许串口中断 EA = 1; //开总中断

}*/

void serial_port_initial() //使用独立波特率发生器作为波特率发生器 {

SCON = 0x50; //0101 0000 8位可变波特率,无奇偶校验位 BRT = RELOAD_COUNT; //设置自动重装数 AUXR1 = 0; //串口在P3上 AUXR = 0x11;

//T0x12,T1x12,UART_M0x6,BRTR,S2SMOD,BRTx12,XRAM,S1BRS

//Baud = Fosc/(256-RELOAD_COUNT)/32/12(12T模式)

//Baud = Fosc/(256-RELOAD_COUNT)/32(1T模式) //此时为12T模式

//BRTR =1,启动独立波特率发生器

//S1BRS=1,串口1选择独立波特率发生器作为波特率发生器

//此时定时器1可以释放出来作为定时器,计数器,时钟输出使用 //AUXR1 = 0x80; //释放该行指令,则串行口从P3口切换至P1口 ES = 1; //允许串口中断 EA = 1; //开总中断

}

第 31 页

void send_UART(unsigned char i) {

ES = 0; //关串口中断

TI = 0; //清零串口发送完成中断请求标志 SBUF = i;

while(TI==0); //等待发送完成

TI = 0; //清零串口发送完成中断请求标志 ES = 1; //允许串口中断 }

/--------------------------------------------------------------------------------

C51 Core SFRs

// 7 6 5 4 3 2 1 0 Reset Value

SfrACC=0xE0//Accumulator 0000,0000

sfrB=0xF0//BRegister 0000,0000

sfr PSW = 0xD0; //Program Status Word CY AC F0 RS1 RS0 OV F1 P 0000,0000

//----------------------------------- sbit CY = PSW^7; sbit AC = PSW^6; sbit F0 = PSW^5; sbit RS1 = PSW^4; sbit RS0 = PSW^3; sbit OV = PSW^2; sbit P = PSW^0;

//-----------------------------------

sfrSP=0x81;//StackPointer 0000,0111

sfrDPL=0x82;//DataPointerLowByte 0000,0000

sfrDPH=0x83;//DataPointerHighByte 0000,0000

//-------------------------------------------------------------------------------- //新一代 1T 8051系列 单片机系统管理特殊功能寄存器 // 7 6 5 4 3 2 1 0 Reset Value

sfr PCON = 0x87; //Power Control SMOD SMOD0 LVDF POF GF1 GF0 PD IDL 0001,0000

// 7 6 5 4 3 2 1 0 Reset Value

sfr AUXR = 0x8E; //Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS 0000,0000 //-----------------------------------

sfr AUXR1 = 0xA2; //Auxiliary Register 1 - PCA_P4 SPI_P4 S2_P4 GF2

第 32 页

//新一代 1T 8051系列 单片机内核特殊功能寄存器

ADRJ - DPS 0000,0000

/*

PCA_P4:

0, 缺省PCA 在P1 口

1,PCA/PWM 从P1 口切换到P4 口: ECI 从P1.2 切换到P4.1 口, PCA0/PWM0 从P1.3 切换到P4.2 口 PCA1/PWM1 从P1.4 切换到P4.3 口 SPI_P4:

0, 缺省SPI 在P1 口

1,SPI 从P1 口切换到P4 口: SPICLK 从P1.7 切换到P4.3 口 MISO 从P1.6 切换到P4.2 口 MOSI 从P1.5 切换到P4.1 口 SS 从P1.4 切换到P4.0 口 S2_P4:

0, 缺省UART2 在P1 口

1,UART2 从P1 口切换到P4 口: TxD2 从P1.3 切换到P4.3 口 RxD2 从P1.2 切换到P4.2 口 GF2: 通用标志位

ADRJ:

0, 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器

1,10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器

DPS: 0, 使用缺省数据指针DPTR0 1,使用另一个数据指针DPTR1 */

//-----------------------------------

sfr WAKE_CLKO = 0x8F; //附加的 SFR WAK1_CLKO /*

7 6 5 4 3 2 1 0 Reset Value

PCAWAKEUP RXD_PIN_IE T1_PIN_IE T0_PIN_IE LVD_WAKE _ T1CLKO T0CLKO 0000,0000B

b7 - PCAWAKEUP : PCA 中断可唤醒 powerdown。

b6 - RXD_PIN_IE : 当 P3.0(RXD) 下降沿置位 RI 时可唤醒 powerdown(必须打开相应中断)。

b5 - T1_PIN_IE : 当 T1 脚下降沿置位 T1 中断标志时可唤醒 powerdown(必须打开相应中断)。

b4 - T0_PIN_IE : 当 T0 脚下降沿置位 T0 中断标志时可唤醒 powerdown(必须打开相应中断)。

b3 - LVD_WAKE : 当 CMPIN 脚低电平置位 LVD 中断标志时可唤醒 powerdown(必须打开相应中断)。

第 33 页

b2 -

b1 - T1CLKO : 允许 T1CKO(P3.5) 脚输出 T1 溢出脉冲,Fck1 = 1/2 T1 溢出率 b0 - T0CLKO : 允许 T0CKO(P3.4) 脚输出 T0 溢出脉冲,Fck0 = 1/2 T1 溢出率 */

//-----------------------------------

sfr CLK_DIV = 0x97; //Clock Divder - - CLKS2 CLKS1 CLKS0 xxxx,x000 //-----------------------------------

sfr BUS_SPEED = 0xA1; //Stretch register - ALES1 ALES0 - RWS2 RWS1 RWS0 xx10,x011

/*

ALES1 and ALES0:

00 : The P0 address setup time and hold time to ALE negative edge is one clock cycle 01 : The P0 address setup time and hold time to ALE negative edge is two clock cycles. 10 : The P0 address setup time and hold time to ALE negative edge is three clock cycles. (default)

11 : The P0 address setup time and hold time to ALE negative edge is four clock cycles.

RWS2,RWS1,RWS0:

000 : The MOVX read/write pulse is 1 clock cycle. 001 : The MOVX read/write pulse is 2 clock cycles. 010 : The MOVX read/write pulse is 3 clock cycles.

011 : The MOVX read/write pulse is 4 clock cycles. (default) 100 : The MOVX read/write pulse is 5 clock cycles. 101 : The MOVX read/write pulse is 6 clock cycles. 110 : The MOVX read/write pulse is 7 clock cycles. 111 : The MOVX read/write pulse is 8 clock cycles. */

//-------------------------------------------------------------------------------- //新一代 1T 8051系列 单片机中断特殊功能寄存器

//有的中断控制、中断标志位散布在其它特殊功能寄存器中,这些位在位地址中定义 //其中有的位无位寻址能力,请参阅 新一代 1T 8051系列 单片机中文指南

// 7 6 5 4 3 2 1 0 Reset Value

sfr IE = 0xA8; //中断控制寄存器 EA ELVD EADC ES ET1 EX1 ET0 EX0 0x00,0000

//----------------------- sbit EA = IE^7;

sbit ELVD = IE^6; //低压监测中断允许位 sbit EADC = IE^5; //ADC 中断允许位 sbit ES = IE^4; sbit ET1 = IE^3; sbit EX1 = IE^2; sbit ET0 = IE^1; sbit EX0 = IE^0; //-----------------------

第 34 页

sfr IE2 = 0xAF; //Auxiliary Interrupt - ESPI ES2 0000,0000B //-----------------------

// 7 6 5 4 3 2 1 0 Reset Value

sfr IP = 0xB8; //中断优先级低位 PPCA PLVD PADC PS PT1 PX1 PT0 PX0 0000,0000

//--------

sbit PPCA = IP^7; //PCA 模块中断优先级 sbit PLVD = IP^6; //低压监测中断优先级 sbit PADC = IP^5; //ADC 中断优先级 sbit PS = IP^4; sbit PT1 = IP^3; sbit PX1 = IP^2; sbit PT0 = IP^1; sbit PX0 = IP^0; //-----------------------

// 7 6 5 4 3 2 1 0 Reset Value

sfr IPH = 0xB7; //中断优先级高位 PPCAH PLVDH PADCH PSH PT1H PX1H PT0H PX0H 0000,0000

sfr IP2 = 0xB5; // - - - - - - PSPI PS2 xxxx,xx00

sfr IPH2 = 0xB6; // - - - - - - PSPIH PS2H xxxx,xx00

//-----------------------

//新一代 1T 8051系列 单片机I/O 口特殊功能寄存器

// 7 6 5 4 3 2 1 0 Reset Value

sfr P0 = 0x80; //8 bitPort0 P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 1111,1111

sfrP0M0=0x94;// 0000,0000

sfrP0M1=0x93;// 0000,0000

sfr P1 = 0x90; //8 bitPort1 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 1111,1111

sfrP1M0=0x92;// 0000,0000

sfrP1M1=0x91;// 0000,0000

sfr P1ASF = 0x9D; //P1 analog special function

sfr P2 = 0xA0; //8 bitPort2 P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0 1111,1111

sfrP2M0=0x96;// 0000,000

sfrP2M1=0x95;// 0000,0000

sfr P3 = 0xB0; //8 bitPort3 P3.7 P3.6 P3.5 P3.4 P3.3 P3.2 P3.1 P3.0

第 35 页

1111,1111

sfrP3M0=0xB2;// 0000,0000

sfrP3M1=0xB1;// 0000,0000

sfr P4 = 0xC0; //8 bitPort4 P4.7 P4.6 P4.5 P4.4 P4.3 P4.2 P4.1 P4.0 1111,1111

sfrP4M0=0xB4;// 0000,0000

sfrP4M1=0xB3;// 0000,0000

// 7 6 5 4 3 2 1 0 Reset Value

sfr P4SW = 0xBB; //Port-4 switch - LVD_P4.6 ALE_P4.5 NA_P4.4 - x000,xxxx

sfr P5 = 0xC8; //8 bitPort5 - P5.3 P5.2 P5.1 P5.0 xxxx,1111

sfrP5M0=0xCA;// 0000,0000

sfrP5M1=0xC9;// 0000,0000

//-------------------------------------------------------------------------------- //新一代 1T 8051系列 单片机定时器特殊功能寄存器

// 7 6 5 4 3 2 1 0 Reset Value

sfr TCON = 0x88; //T0/T1 Control TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 0000,0000

//----------------------------------- sbit TF1 = TCON^7; sbit TR1 = TCON^6; sbit TF0 = TCON^5; sbit TR0 = TCON^4; sbit IE1 = TCON^3; sbit IT1 = TCON^2; sbit IE0 = TCON^1; sbit IT0 = TCON^0;

//-----------------------------------

sfr TMOD = 0x89; //T0/T1 Modes GATE1 C/T1 M1_1 M1_0 GATE0 C/T0 M0_1 M0_0 0000,0000

sfrTL0=0x8A;//T0LowByte 0000,0000

sfrTH0=0x8C;//T0HighByte 0000,0000

sfrTL1=0x8B;//T1LowByte 0000,0000

sfrTH1=0x8D;//T1HighByte

第 36 页

0000,0000

//-------------------------------------------------------------------------------- //新一代 1T 8051系列 单片机串行口特殊功能寄存器

// 7 6 5 4 3 2 1 0 Reset Value

sfr SCON = 0x98; //Serial Control SM0/FE SM1 SM2 REN TB8 RB8 TI RI 0000,0000

//----------------------------------- sbit SM0 = SCON^7; //SM0/FE sbit SM1 = SCON^6; sbit SM2 = SCON^5; sbit REN = SCON^4; sbit TB8 = SCON^3; sbit RB8 = SCON^2; sbit TI = SCON^1; sbit RI = SCON^0;

//-----------------------------------

sfrSBUF=0x99;//SerialDataBuffer xxxx,xxxx

sfrSADEN=0xB9;//SlaveAddressMask 0000,0000

sfrSADDR=0xA9;//SlaveAddress 0000,0000

//-----------------------------------

// 7 6 5 4 3 2 1 0 Reset Value

sfr S2CON = 0x9A; //S2 Control S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI 00000000B

sfrS2BUF=0x9B;//S2SerialBuffer xxxx,xxxx

sfrBRT=0x9C;//S2Baud-RateTimer 0000,0000

//-------------------------------------------------------------------------------- //新一代 1T 8051系列 单片机看门狗定时器特殊功能寄存器 sfr WDT_CONTR = 0xC1; //Watch-Dog-Timer Control register

// 7 6 5 4 3 2 1 0 Reset Value

// WDT_FLAG - EN_WDT CLR_WDT IDLE_WDT PS2 PS1 PS0 xx00,0000 //-----------------------

//-------------------------------------------------------------------------------- //新一代 1T 8051系列 单片机PCA/PWM 特殊功能寄存器 // 7 6 5 4 3 2 1 0 Reset Value

sfr CCON = 0xD8; //PCA 控制寄存器。 CF CR - CCF1 CCF0 00xx,xx00 //-----------------------

第 37 页

sbit CF = CCON^7; //PCA计数器溢出标志,由硬件或软件置位,必须由软件清0。 sbit CR = CCON^6; //1:允许 PCA 计数器计数, 必须由软件清0。 //- //-

sbit CCF1 = CCON^1; //PCA 模块1 中断标志, 由硬件置位, 必须由软件清0。 sbit CCF0 = CCON^0; //PCA 模块0 中断标志, 由硬件置位, 必须由软件清0。 //-----------------------

sfr CMOD = 0xD9; //PCA 工作模式寄存器。 CIDL - - - CPS2 CPS1 CPS0 ECF 0xxx,x000

/*

CIDL: idle 状态时 PCA 计数器是否继续计数, 0: 继续计数, 1: 停止计数。

CPS2: PCA 计数器脉冲源选择位 2。 CPS1: PCA 计数器脉冲源选择位 1。 CPS0: PCA 计数器脉冲源选择位 0。 CPS2 CPS1 CPS0

0 0 0 系统时钟频率 fosc/12。 0 0 1 系统时钟频率 fosc/2。 0 1 0 Timer0 溢出。

0 1 1 由 ECI/P3.4 脚输入的外部时钟,最大 fosc/2。 1 0 0 系统时钟频率, Fosc/1 1 0 1 系统时钟频率/4,Fosc/4 1 1 0 系统时钟频率/6,Fosc/6 1 1 1 系统时钟频率/8,Fosc/8

ECF: PCA计数器溢出中断允许位, 1--允许 CF(CCON.7) 产生中断。 */

//-----------------------

sfrCL=0xE9; //PCA 计数器低位 0000,0000

sfrCH=0xF9; //PCA 计数器高位 0000,0000

//-----------------------

// 7 6 5 4 3 2 1 0 Reset Value

sfr CCAPM0 = 0xDA; //PCA 模块0 PWM 寄存器 - ECOM0 CAPP0 MAT0 TOG0 PWM0 ECCF0 x000,0000

sfr CCAPM1 = 0xDB; //PCA 模块1 PWM 寄存器 - ECOM1 CAPP1 MAT1 TOG1 PWM1 ECCF1 x000,0000

//ECOMn = 1:允许比较功能。

//CAPPn = 1:允许上升沿触发捕捉功能。 //CAPNn = 1:允许下降沿触发捕捉功能。

//MATn = 1:当匹配情况发生时, 允许 CCON 中的 CCFn 置位。 //TOGn = 1:当匹配情况发生时, CEXn 将翻转。

第 38 页

CAPN0 CAPN1 //PWMn = 1:将 CEXn 设置为 PWM 输出。 //ECCFn = 1:允许 CCON 中的 CCFn 触发中断。

//ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn

// 0 0 0 0 0 0 0 0x00 未启用任何功能。

// x 1 0 0 0 0 x 0x21 16位CEXn上升沿触发捕捉功能。 // x 0 1 0 0 0 x 0x11 16位CEXn下降沿触发捕捉功能 // x 1 1 0 0 0 x 0x31 16位CEXn边沿(上、下沿)触发捕捉功能。

// 1 0 0 1 0 0 x 0x49 16位软件定时器。 // 1 0 0 1 1 0 x 0x4d 16位高速脉冲输出。 // 1 0 0 0 0 1 0 0x42 8位 PWM。

//ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn // 0 0 0 0 0 0 0 0x00 无此操作

// 1 0 0 0 0 1 0 0x42 普通8位PWM, 无中断

// 1 1 0 0 0 1 1 0x63 PWM输出由低变高可产生中断 // 1 0 1 0 0 1 1 0x53 PWM输出由高变低可产生中断 // 1 1 1 0 0 1 1 0x73 PWM输出由低变高或由高变低都可产生中断

//-----------------------

sfr CCAP0L = 0xEA; //PCA 模块0的捕捉/比较寄存器低8位。 0000,0000

sfr CCAP0H = 0xFA; //PCA 模块0的捕捉/比较寄存器高8 位。 0000,0000

sfr CCAP1L = 0xEB; //PCA 模块1的捕捉/比较寄存器低8位。 0000,0000

sfr CCAP1H = 0xFB; //PCA 模块1的捕捉/比较寄存器高8位。 0000,0000

//-----------------------

// 7 6 5 4 3 2 1 0 Reset Value

sfr PCA_PWM0 = 0xF2; //PCA 模块0 PWM 寄存器。 - EPC0H EPC0L xxxx,xx00 sfr PCA_PWM1 = 0xF3; //PCA 模块1 PWM 寄存器。 - EPC1H EPC1L xxxx,xx00 //PCA_PWMn: 7 6 5 4 3 2 1 0 // - EPCnH EPCnL //B7-B2: 保留

//B1(EPCnH): 在 PWM 模式下,与 CCAPnH 组成 9 位数。 //B0(EPCnL): 在 PWM 模式下,与 CCAPnL 组成 9 位数。

//--------------------------------------------------------------------------------

//新一代 1T 8051系列 单片机 ADC 特殊功能寄存器

// 7 6 5 4 3 2 1 0 Reset Value

sfr ADC_CONTR = 0xBC; //A/D 转换控制寄存器 ADC_POWER SPEED1 SPEED0

第 39 页

ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000

sfr ADC_RES = 0xBD; //A/D 转换结果高8位 ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2 0000,0000

sfr ADC_RESL = 0xBE; //A/D 转换结果低2位 ADCV.1 ADCV.0 0000,0000

//--------------------------------------------------------------------------------

//新一代 1T 8051系列 单片机 SPI 特殊功能寄存器 // 7 6 5 4 3 2 1 0 Reset Value

sfr SPCTL = 0xCE; //SPI Control Register SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0 0000,0100

sfr SPSTAT = 0xCD; //SPI Status Register SPIF WCOL - - 00xx,xxxx

sfrSPDAT=0xCF;//SPIDataRegister 0000,000

//--------------------------------------------------------------------------------

//新一代 1T 8051系列 单片机 IAP/ISP 特殊功能寄存器 sfr IAP_DATA = 0xC2; sfr IAP_ADDRH = 0xC3; sfr IAP_ADDRL = 0xC4;

// 7 6 5 4 3 2 1 0 Reset Value

sfr IAP_CMD = 0xC5;

//IAP Mode Table 0 - - - MS1 MS0 0xxx,xx00 sfr IAP_TRIG = 0xC6;

第 40 页

第四章 系统硬件设计

4.1 元器件清单

元器件清单 元器件名称 型号/个数 第 41 页 元器件名称 型号/个数 1U2Audio InputC2MLCPAIN_NMICInput2KR4CON3R5DC6C91516C10LINL1uF1uFCF2R2R633KC815KLineInputHPOLHPORLINR1uF02KMLCN1uFC3123R1R30AIN_PMBSJ223456VCC33VU1VCCJ1RN1LINRLINL+C1MICPMICNMONOMBS1413CF10.1uF1uFMONO10uF/16VLINRLINL9101112MICPMICNMONOMBSDA0HPOLHPORLOUTLLOUTR2728LOUTLLOUTR123456C51_A844SPOPSPON2625SPOPSPONTEST2TEST3TEST4TEST5C51_AD0C51_AD1C51_AD2C51_AD3C51_AD4C51_AD5C51_AD6C51_AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/INT/R*D373635343332313010K*4P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD718192021222324255C51_A8C51_A9C51_A10C51_A11C51_A12C51_A13C51_A14C51_A15C51_RX0C51_AD0C51_AD1C51_AD2C51_AD3C51_AD4C51_AD5C51_AD6C51_AD7P0/SDIP1/SDOP2/SDCKP3P4P5P6P741403938373635344.2 原理图

CON6VCC33VC51_RSTVCC33V1724L1CF40.4uFCF50.4uF47UHC111uFSpeakerOutput0.1uF833GNDDGNDDLD3320AGNDAGNDASPOPSPONVDDA=3.0-4.5VVDDA=3.0-4.5V192338VCC33VVDD=3.0-3.3VVDDIO=1.65V-VDDVDDIO=1.65-VDDVCCC51_KEY2C51_KEY1C51_KEY0C51_KEY3C51_TP1C51_ALER8C51810uF/16VC3R11R12+C51_CLK12SVCC33VJ3C51_RDC51-WRC51_A14C51_INT0ICR-RSTICR-MODERDBWRB/SPISCSB/SCSINTBRSTBMDEQ1EQ2EQ30.01uFTEST30TEST29220pFVREFWREF29TEST2930TEST30202122EQ1EQ2EQ34542434847461234TEST2TEST3TEST4TEST5TEST2TEST3TEST4TEST5TEST6CLKJTAG/RUNC51_RX0C51_TX0ICR_MODEC51_MODEFLASH_IO0FLASH_CLKFLASH_IO3FLASH_IO2FLASH_IO1FLASH_CS4041424344123CON4P1.0/CLKOUT2P3.1/T*DP1.1P3.2/NT0P1.2P3.3/NT1P1.3P3.4/CLKOUT0/INT/T0P1.4P3.1/CLKOUT1/INT/T1P1.5PP3.6/WRP1.6/R*D/INTP3.7/RDP1.7/T*D78910111213C51_TX0C51_INT0ICR_RSTC51_LED0C51_LED1C51_WRC51_RDC51_CLK1001514XTAL1XTAL22345631X1Audio00+OutputJ7AOUT_L12322.1184MHZ36GNDP4.0P4.1P4.2P4.3P4.4/NAP4.5/ALEP4.6/NAP4.7/RST713217283962627294STC10L08*ECC433pFC733pFCHPOLC13CON347uF/16VHeadphoneOutputHPORC14+47uF/16VVCC33VLOUTLLine outputC151uFLOUTRC161uFCF60.1uFCF70.1uFCF80.1uFCF90.1uFVCC33VVCC33VU3RN2FLASH_CS1C51_RX0C51_TX0CSC51_RDC51_INT0FLASH_CLK6CLKDI/IO0DQ/IO1WP/IO2HOLD/IO35237FLASH_IO0FLASH_IO1FLASH_IO2FLASH_IO38VCCTP1C51_TP11CON1CON1CON1111CON1TP4TP2TP3VCC33V10K*4VCCGND4V25Q40AVSNIG第 42 页 ICR_MODEC51_MODEVCC33VC51_LEDL0ED1VCCVCC33VJ83VinADJ/GNDVoutLM1117MPX-3.3++C18VCC33VVCC33VRN3C51_RDVCC33VK1KEYK2KEYK3KEYVCC33VK4KEYKey Matrix1206GC51_LED1LED2Vout42TEST30LED31206GC51_KEY3C51_KEY2C51_KEY1C51_KEY0BBC51_AD0C51_AD1C51_AD2C51_AD3J61324JUMPER2VCC33V1K*4RN4C51_AD4C51_AD5C51_AD6C51_AD7U4121C1710uF/16VCON2MK1111K*4CON1VCC33V1206GTEST29LED4C1210uF/16VVCC33v+1206GLED DisplayATitleMK2RN510uF/16VA11ICR_MODEC51_MODEC51_RSTC51_A14CON1Power Supply800mA/-3.3V1206E: RED10K*4SizeBDate:File:345NumberRevision19-Apr-2011F:\\新建文件夹 (6)\\MyDesign.ddbSheet of Drawn By:6124.3硬件实物成果图

第 43 页

第五章 系统测试与总结

5.1 硬件电路调试

1.检查硬件焊接是不是有虚焊。

2.对照电路图检查是不是有焊接错误。 3.线路连接是不是有问题。 5.1.2 硬件功能检查

根据编写的语言要求,加电池后检查是不是能按照程序运行。

5.2 软件功能模块的调试

根据功能图检查玩具是否能完成要求。

5.3 综合调试

把硬件系统和软件系统进行整合,对期间出现的故障进行排除,使两者融合,实现完整的系统功能。

第 44 页

第七章 参考文献

[1] 李光飞,李光飞等著.单片机课程设计实例指导[M].北京:北京航空航天大学出版社,2005 [2] 沈红卫著.单片机应用系统设计实例与分析[M].北京:北京航空航天大学出版社,2002

开 机(加电) 自检(51芯片) 欢迎语音(调用播放函数) 芯片待识别状态(寄存器清空,设备初始化) 你好,我是小艾 背唐诗 YES 鹅鹅鹅,曲颈向天歌 做算术题 NO 我听不清 你出题我来算 YES YES NO 背唐诗 NO 我实在听不清 1+1=? 2+2=? 等于二 等于四

第 45 页

本文来源:https://www.bwwdw.com/article/yrrp.html

Top