isd4004语音程序
ISD4004语音合成系统在铁路车辆监控中的应用
能 化 控 制 与 管理 。
【 关键词】ID 0 4 S 4 0 ;语音合成;车辆监控 【 中图分类号 】T 1 N9 2 【 文献标识码】B
p a b c r s e il n r d c d Vo c e me t a e c mb n d t g t e n r ly d b c c o ig t e S I ly a k a e p cal i t u e . e y o i e s g n s r o i e o eh ra d a e p a e a k a c r n o t P d h s r l p oo o n o told b e a r tc la d c n r l y MCU. C mbn d wi C1 4 mir c mp tr i e o i e t P 0 c o o ue , t e sae a l a e il n t h h t ts o r i y v h ce a d i f w s c n r le e u in a e r p r d a d r c r e o t x c t r ot n e o d o o e e d .
A c r i g t I D4 0 u cin , c odn o S 0 4 S fn t s o t e ad a e c ru t a d ot r e d sg s o mpe n v ie e o d n a d h h r w r ic i n s f wa e in t i lme t oc rc r ig n
【 摘 要】介绍 了应用于铁路 车辆监控 系统 中的基于 ID S删
基于51单片机的ISD4004多段语音录放实验
/////////======基于51单片机的ISD4004多段语音录放实验=======//////////////////==================== isd.c ===================/////////////////// 控制IC: AT89C51/52,STC89C51/52RC /////////////////// 系统晶振:22.1184MHz /////////////////// 程序编写:东冬(自然风)/////////////////// 调试时间:2009/02/13 /////////////////// 版本:ISD4004_1.0V ///////////////////////////////////////////////////////////////////////////////*操作说明:1、按住K1键开始录音,放开K1键结束录音;再按住K1键,开始录第二段;以此类推;2、按一下K2键,开始放音,等该段放音结束,继续等待;再按下K2键,放第二段,以此类推PS:每一段录音长度要手动设置,不能自主控制录音长度(以待后改)*/#include "STC89C52RC.H"//#include <reg52.h>#include <intrins.h>#include "MyType.h"//=======分段录音首地址定义======================#define ISD_ADDS1 0x0000 //录音存放地址1#define ISD_ADDS2 0x0100 //录音存放地址2#define ISD_ADDS3 0x0200 //录音存放地址3#define ISD_ADDS4 0x0300 //录音存放地址4#define ISD_ADDS5 0x0400 //录音存放地址5//========ISD4004指令定义========================#define POWER_UP 0x20 //上电指令#define SET_PLAY 0xE0 //指定放音指令#define PLAY 0xF0 //当前放音指令#define SET_REC 0xA0 //指定录音指令#define REC 0xB0 //当前录音指令#define SET_MC 0xE1 //指定快进指令#define MC 0xF1 //快进执行指令#define STOP 0x30 //停止当前操作#define STOP_WRDN 0xF1 //停止当前操作并掉电#define RINT 0x30 //读状态:OVF和EOM//=========ISD4004--c51接口定义=================sbit ISD_SS = P0^0; //片选sbit ISD_MOSI = P0^1; //数据输入sbit ISD_SCLK = P0^2; //ISD4004 时钟sbit ISD_INT = P3^3; //溢出中断sbit ISD_RAC = P3^2; //行地址时钟sbit ISD_MISO = P3^6; //数据输出//==========按键定义==========================sbit K1 = P1^0 ; //录音键sbit K2 = P1^1; //放音键//==========BEEP开关定义======================#define Beep_ON (P0&=0x7f) //蜂鸣器开#define Beep_OFF (P0|=0x80) //蜂鸣器关//==========ISD4004函数定义===================void ISD_SPI_Send8( uchar isdx8 ); //spi 串行发送子程序,8位数据,从低到高void ISD_SPI_Send16( uint isdx16 ); //spi 串行发送子程序,16位数据.从低到高uint ISD_SPI_Radd(void); //读取标行地址void ISD_Stop(void); //发送stop 指令void ISD_PowerUp(void); //发送上电指令,并延迟50msvoid ISD_PowerDown(void); //发送掉电指令,并延迟50msvoid ISD_Play(void); //发送放音指令,并延迟50msvoid ISD_SetPlay(uint add); //发送指定放音指令,并延迟50msvoid ISD_Rec(void); //发送录音指令,并延迟50msvoid ISD_SetRec(uint add); //发送指定录音指令,并延迟50msuchar ISD_Chk_Isdovf(void);void PLAY_now(uchar add_sect); //按指定地址开始放音void REC_now(uchar add_sect); //按指定地址开始录音//========延时函数===========================void Delay1Ms(uchar t); //延时t*1毫秒void Delay();////////////////////////////////////////////////////////////////////////// 程序开始///*******************************主程序*********************************/main (){uchar i,j;while (1){//=========================K1录音键if(K1==0) //K1键按下。
ISD4004在具有接近功能的立体声语音系统中的应用
ISD4004在具有接近功能的立体声语音系统中的应用姜杏辉,邹丽新,孙 平,马励行,季晶晶(苏州大学物理科学与技术学院 江苏苏州 215006)摘 要:双声道是一项应用最为普遍的立体声技术之一。
实际应用中当需要实现双声道语音系统时,往往采用复杂的硬件电路才能构成,使得其制作成本大为提高。
因此用一个较为简单的电路来实现双声道立体声语音系统就显得很有实用价值。
在简要介绍ISD4004工作原理的基础上,重点介绍ISD4004的立体声录放技术以及该技术在由单片机所构成的具有接近功能的立体声语音系统中的应用,并给出了实际系统的硬件构成和软件设计流程。
关键词:ISD4004;立体声;单片机;语音系统中图分类号:TN912.12 文献标识码:B 文章编号:10042373X (2007)212187203Application of ISD4004on the Approaching 2Alarming System of Stereo VoiceJ IAN G Xinghui ,ZOU Lixin ,SUN Ping ,MA Lixing ,J I Jingjing(Physics Science and Technology Institute ,Soochow University ,Suzhou ,215006,China )Abstract :Twin track is one of the most popular stereo technologies.In practice ,when it is needed ,the twin track stereo is often constructed by complex hardware and circuit and the cost increases rapidly.So it is practically worthful to build the sys 2tem with simple circuit.A brief introduction of chip ISD4004,with emphasis on its stereo f unction ,is provided.Based on this technology ,Approaching -Alarming system of stereo voice controlled by MCU is constructed under the applicable hardware and software of its unique feature.This is valuable to guiding the design of practical system of stereo voice.K eywords :ISD4004;stereo ;microchip ;system of voice收稿日期:2007204206 在实际的语音系统中双声道立体声是一项应用最为普遍的技术,他是利用人们的听觉错觉,通过改变两个扬声器的声级差,能使聆听者前方产生一定角度的声音方向信息,从而使人们在聆听时有“身临其境”的听觉感受[1]。
ISD4004语音芯片在语音报站器中的应用
ISD4004 语音芯片在语音报站器中的应用 摘要ISD4004语音系列芯片是美国ISD公司推出的产品,具 有可多次重复录放、存储时间长、使用时不需扩充存储器、所需外围电路 简单等特点。
介绍了ISD4004芯片在语音报站器中的一个实际应用,并说明 了其功能和使用方法,从而使读者对ISD4004系列语音芯片的使用 有个初步的了解。
关键词 4004 单片机语音报站器 ISD4004语音芯片是由美国ISD公司推出的新产品。
关于该语音芯片的引脚说明以及内部电路等,很容易在ISD公司提 供的芯片资料中查到,笔者就不进行过多的描述,只简单地对其特点做一 介绍。
与普通的录音/重放芯片相比,ISD4004具有如下特点首先, 记录声音没有段长度限制, 并且声音记录不需要A/D转换和压缩; 其次, 将快速闪存作为存储介质,无需电源即可保存数据长达100年,重复记 录10000次以上;此外,ISD4004具有记录时间长可达16分 钟,本文采用的为8分钟的ISD4004语音芯片的优点;最后,IS D4004的开发应用具有所需外围电路简单的优点,这一点从本文介绍 的其在语音报站器中的实际应用可以体会到。
1语音报站器硬件电路设计 目前市场上流通的语音报站器,大多采用的不是ISD4004系列 的芯片,这与其刚推出不久以及价格偏高有关。
但随着ISD4004应用的增多以及价格的回落,再加上ISD4 004系列芯片本身的优点,可以相信,在语音报站器中采用ISD40 04系列语音芯片是完全可行的。
笔者设计了该装置的硬件电路,并进行了上车调试,取得了较为满意 的效果。
图 1 报站器硬件电路连接图 本文讨论的语音报站器主要是指装在车上的放音电路,不包含录音电 路。
而在实际应用中,录音电路则完成报站内容的录音工作,并收录内容 存储到语音芯片中。
本文主要结合ISD4004在放音电路中的使用介绍ISD40 04的典型应用。
本文讨论的报站器主电路主要由单片机89C52和ISD400 4构成。
ISD4004系列语音芯片中文资料
ISD4004系列单片语音录放电路一、简述●单片8至16分钟语音录放●内置微控制器串行通信接口●3V单电源工作●多段信息处理●工作电流25-30mA,维持电流1μA●不耗电信息保存100年(典型值)●高质量、自然的语音还原技术●10万次录音周期(典型值)●自动静噪功能●片内免调整时钟,可选用外部时钟ISD4004系列工作电压3V,单片录放时间8至16分钟,音质好,适用于移动电话及其他便携式电子产品中。
芯片采用CMOS技术,内含振荡器、防混淆滤波器、平滑滤波器、音频放大器、自动静噪及高密度多电平闪烁存贮陈列。
芯片设计是基于所有操作必须由微控制器控制,操作命令可通过串行通信接口(SPI或Microwire)送入。
芯片采用多电平直接模拟量存储技术, 每个采样值直接存贮在片内闪烁存贮器中,因此能够非常真实、自然地再现语音、音乐、音调和效果声,避免了一般固体录音电路因量化和压缩造成的量化噪声和"金属声"。
采样频率可为4.0,5.3,6.4,8.0kHz,频率越低,录放时间越长,而音质则有所下降,片内信息存于闪烁存贮器中,可在断电情况下保存100年(典型值),反复录音10万次。
二、引脚描述电源:(VCCA,VCCD)为使噪声最小,芯片的模拟和数字电路使用不同的电源总线,并且分别引到外封装的不同管脚上,模拟和数字电源端最好分别走线,尽可能在靠近供电端处相连,而去耦电容应尽量靠近器件。
地线:(VSSA,VSSD)芯片内部的模拟和数字电路也使用不同的地线。
同相模拟输入(ANA IN+)这是录音信号的同相输入端。
输入放大器可用单端或差分驱动。
单端输入时,信号由耦合电容输入,最大幅度为峰峰值32mV,耦合电容和本端的3KΩ电阻输入阻抗决定了芯片频带的低端截止频率。
差分驱动时,信号最大幅度为峰峰值16mV,为ISD33000系列相同。
反相模拟输入(ANA IN-)差分驱动时,这是录音信号的反相输入端。
ISD4004系列器件语音拷贝系统的设计
放音时 , 遇到 E M标志时 , O 放音 自动停止 , 产生中断 ; 录 音时 , 需要向器件发送 SO T P命令 , 写入一个 E M标志 , O
结 束 录音 .
放音时 ,每播放一行语音 ,产生一个 R C周期信 A
1 D 0 4语音芯片介绍 I 40 S I S D系列语音芯片是 Wi od公司推出的产品.该 nn b
芯片采用多 电平直接模拟存储专利技术 ,声音不需要
器 的行 地 址 .行 是 语 音 信 息 段 的基 本 组 成 单 位 . 以
A D转换和压缩 , / 模拟信号直接存储在片内的闪烁存储 器中, 没有 A D 转换误差 ,因此能够真实 , / 自然地再现
后, 要等待To 后器件才能停止工 sp t 作. 对于I 40-M , =0 s S 04 8 P t 5m o D To sp
( )为 了达到较好 的放音和录 3 音质量 , 录音和放音时 , 建议采用下 面 的操 作 顺序 :
放音时 :①发送 P W R P命 O EU
I 40 系列语音芯片的所有操作由微控制器控制, S 04 D 操作命令通过串行通信接 口(P 或 Mc wr) SI i i 送人. o r e 录音
采样频率可为 4O z53 z641, H , . , H , 1 8O z 录放时间可为 H . . z . 8 i,0 i,2 i,6 i.采样频率越低 ,录放时间越 mn 1mn mn mn 1 1 长, 但音质则有所下降.片内信息存于闪烁存储器中, 可 在断电情况下保存 10年 , 0 反复录音 1 0万次( 典型值 ) . 器件工作 电压为 3 工作 电流为 巧- 5 A, V, 2m 维持 电流为
基于ISD4004单片机的火车站自动语音播报系统
基于ISD4004单片机的火车站自动语音播报系统
笔者成功应用ISD4004 和AT89C51 单片机设计了火车站信号自动语音播报系统,通过对火车站铁路线的上行和下行控制、车辆调度、系统主副电
源的启用等多路信号进行检测并采集,根据安全隐患的防范要求,由单片机控
制查询安全警示语音信息并播报,实现安全操作提示及报警。
系统在火车站信
号室控制台上安装使用,运行稳定,信号播报准确,取得了很好的效果。
1 硬件电路设计
系统硬件电路设计原理框
1.1 ISD4004 的特性
ISD4004 系列语音存储芯片采用CMOS 技术,内含振荡器、防混淆滤波器、平滑滤波器、音频放大器、自动静噪及高密度多电平闪烁存贮陈列,内置
微控制器串行通信接口。
芯片所有操作必须由微控制器控制,操作命令可通过
串行通信接口(SPI 或Microwire)送人。
外部的音源信号在芯片内采用多电平直接模拟量存储技术,信息可进行多段处理,每个采样值直接存贮在片内闪烁存
贮器中,因此能够非常真实、自然地再现语音、音乐、音调和效果声。
存于片
内闪烁存贮器中的信息,可在断电情况下保存100 年。
芯片工作电压为3 V,工作电流为25~30 mA,维持电流1μA,不耗电,单片录放时间8~16 min,可反复录音10 万次。
1.2 ISD4004 的引脚及封装形式
ISD4004 采用28 脚的SOIC 封装,其引脚排列如
1.3 ISD4004 与AT89C51 单片机的接口
ISD4004 工作于SPI 串行接口,按照同步串行数据传输的SPI 协议,所有串行数据传输开始于单片机主控器发送给ISD4004 的片选信号SS 下降沿。
课程论文 基于ISD4004语音芯片的实时播报系统设计
本科生课程设计论文(2009)届论文(设计)题目:基于ISD4004语音芯片的实时播报系统设计学院:电子工程学院专业:电子信息工程学号:姓名:指导老师姓名及职称:时间:2012年5月目录【内容摘要】 (2)【关键词】 (2)【Abstract】 (3)【Keywords】 (3)引言 (4)第一章绪论 (5)1.1 系统设计的目的 (5)1.2 系统设计的意义 (5)1.3 系统设计的基本要求 (6)1.4 系统设计的实现方法 (6)第二章系统设计用到的开发环境介绍 (7)2.1 Protel和Altium Designer 6软件介绍 (7)2.2 STC89C52单片机性能介绍 (8)2.3 C++ Builder6.0开发软件介绍 (8)2.4 keil开发软件介绍 (8)第三章系统总体设计 (10)3.1 系统硬件电路设计 (10)3.1.1 系统硬件电路总设计图 (10)3.1.2 STC89C52单片机核心部分 (10)3.1.3 PCF8563模块 (12)3.1.4 DS18B20模块 (13)3.1.5 ISD4004语音模块 (13)3.1.6 其它外围辅助电路模块 (18)3.2 系统软件设计 (20)3.2.1 上位机部分程序设计 (21)3.2.2 ISD4004模块程序设计 (22)3.2.3 DS18B20程序流程图 (22)3.2.4 PCF8563时钟芯片程序流程图 (23)3.2.5 红外接收模块程序设计流程图 (25)3.2.6 整个系统的软件流程图 (26)第四章测试结果 (27)第五章总结 (28)(1)利用ISD4004专用语音芯片实现语音录放功能; (28)致谢 (29)参考文献 (30)基于ISD4004语音芯片的实时播报系统设计X X X(广西师范大学电子工程学院广西桂林 541004)【内容摘要】本文介绍了基于ISD4004的语音播报系统。
系统由STC89C52单片机为核心,控制整个系统的协调工作。
基于ISD4004芯片的语音录放系统设计论文常一鸣jiefu
大连理工大学城市学院本科生毕业设计学院:电子与自动化学院专业:电子信息工程班学生:常一鸣指导教师:**完成日期:2012年 5月 31日大连理工大学城市学院本科生毕业设计(论文)基于ISD4004芯片的语音录放系统设计总计毕业设计(论文)48 页表格 5 个插图18 幅摘要基于ISD4004芯片的语音录放系统设计用单片机控制语音芯片,再把单片机和语音芯片嵌入到通信设备,智能仪器,治安报警及儿童玩具中,就可做成语音播放的机器。
本文介绍了基于AT89C2051单片机及ISD4004语音板为主要部件的语音录放电路的工作原理、硬件和软件的设计。
ISD4004系列工作电压3V,单片录放时间8至16分钟,音质好,适用于移动电话及其他便携式电子产品中。
芯片设计是基于所有操作必须由微控制器控制,操作命令可通过串行通信接口SPI送入。
论文概述了语音录放电路的原理,并且在介绍语音录放系统功能的基础上,提出了系统的总体构成。
针对录放系统的录音、放音部分的总体设计方案进行了论证。
进一步介绍了单片机AT89C2051应用在系统中的应用,分析了系统各部分的硬件及软件实现。
关键词:ISD4004 AT89C2051单片机语音录放AbstractThe design of voice recording and playback system based onisd4004With the single-chip microcomputer control, and then make the pronunciation chip microcontroller and pronunciation chip embedded in communication equipment, intelligent instruments, security alarm and children's toys, so can make a speech broadcast machine.This paper introduces ISD4004 based on AT89C52 single chip computer and of the main parts of speech plate as the working principle of voice recording circuit and the design of hardware and software. ISD4004 series working voltage, monolithic 3V recording time 8 to 16 minutes, timbre, suitable for mobile phones and other portable electronics. Chip design is based on all the operation must by SPI into. This paper summarizes the principle of voice recording circuit, and introduces the function of speech on the basis of recording system, puts forward the general structure of the system. Recording system for the recording, playback part of the overall design scheme is demonstrated. This paper introduces microcontroller AT89C52 single applications in system, the application system were analyzed each part of hardware and software realization.Keywords: ISD4004;89C2051microcontroller;voice recording and playback目录摘要 (I)ABSTRACT (II)目录 (III)引言................................................................ 错误!未定义书签。
ISD4004语音录课程设计
单片机原理及接口技术课程设计(论文)摘要语音不仅是人与人之间进行信息交流最直接、最方便和最有效的工具,而且也是人与机器之间进行通信的重要工具。
1874年电话的发展可以认为是现代处理的开端。
电话的理论基础是尽可能不失真地传送语音波形。
这种“波形原则”几乎统治了其后整整一百年。
1939年产生了一种概念全新的语音处理技术,这就是著名的通道声码器技术。
声码器的理论基础是认为语音是由人的声带振动产生的生源(载波)受到运动的声道的控制(调制)而产生的,因而将载波和调制两部分分开来进行传送便可极大地压缩频带。
这一概念已经包含着其后出现的语音参数模型的基本思想。
40年代后期,研制成功了能够把语音信号的时变谱用语音表示出来的仪器——语音仪,为语音信号分析提供了一个有力的工具。
对于语音信号,数字处理比模拟处理具有更多的优点。
这是因为:第一,数字技术能够完成许多很复杂的信号处理工作;第二,通过语音进行交换的信息本质上具有离散的性质,因为语音可以看成是因素的组合,这就特别适合于数字处理;第三,数字系统具有高可靠性、价廉、紧凑、快速等特点,很容易完成实时处理任务;第四,数字语音适合于在强干扰通信中传输,易于和数据一起在通信网中传输,也易于进行加密传输。
因此数字语音信号处理是主要研究方向。
单片机的应用无处不在,利用单片机控制语音的录放也多不胜举。
用单片机控制语音芯片,再把单片机和语音芯片嵌入到通信设备,智能仪器,治安报警及儿童玩具中,就可做成语音播放的机器,应用范围广泛。
用单片机控制语音芯片设计语音录放系统,该系统功能多,录放音音质好,外围电路简单。
关键词:STC89C52;录音放音;ISD4004目录第1章绪论 (1)第2章课程设计的方案 (2)2.1概述 (2)2.2系统组成总体结构 (2)第3章硬件设计 (4)3.189C2051单片机性能和引脚介绍 (4)3.2语音信号功率放大电路 (5)3.3ISD4004语音芯片介绍 (6)3.3.1 芯片性能简述和引脚图 (6)3.3.2 ISD4004芯片主要引脚描述 (7)3.3.3 SPI协议 (8)第4章软件设计 (10)4.1总体方案 (10)4.2程序流程图 (10)4.2.1 系统程序流程 (10)4.2.2 子程序流程 (11)4.3模块说明 (11)4.3.1 ISD4004驱动程序 (11)4.3.2 1602液晶底层驱动 (13)第5章制作与调试 (15)5.1硬件电路的布线与焊接 (15)5.1.1 总体特点 (15)5.1.2 Altium designer软件画PCB (15)5.1.3 焊接 (15)5.2调试 (15)5.2.1 硬件调试 (16)5.2.2 软件调试 (16)第6章课程设计总结 (17)参考文献 (18)附录 ................................................................................................ 错误!未定义书签。
ISD4004语音模块
delay(20);
if(key3==0)
{
while(!key3);
dz_jia++;
if(dz_jia==3)
dz_jia=0;
}
}
if(dz_jia==1)
{
ye=0;
adl=0x00;
adh=0x00;
}
if(dz_jia==2)
{
ye=1;
adl=0x80;
adh=0x80;
}
}
}*/
void in_stc()//单片机初始化函数
}
}
}
while(play_flag);//等待放音完毕的EOM中断信号
led2=1;//关放音指示灯
stop();//放音完毕,发送stop指令
power_down();//进入下电模式
}
void keyscan()
{
if(kay(20);
if(key1 == 0)
{
isd_play();
do
{
play_flag = 1;
led2=0;//开放音指示灯
if(int_4004==0)break;//如果芯片溢出,进行LED闪烁指示
if(key0 == 0)
{
delay(20);
if(key0 == 0)
{//等待key0停止键释放
while(!key0);
play_flag = 0;//key0按下play_flag = 0,则停止放音
led1=1;//录音完毕,LED熄灭
stop();//发送停止命令
power_down();//进入下电模式
}
void play(adl,adh)//放音函数
基于51单片机控制的ISD4004语音模块引脚电平触发发音程序
uchar second_count=170,msecond_count=0;
//second_count为芯片录音的起始地址,起始地址本来是A0,也就是160,
//我们从170开始录音吧。
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
// ISD4004控制口定义:
sbit SS =P1^0;//4004片选
sbit MOSI=P1^1;//4004数据输入
sbit MISO=P1^2;//4004数据输出
sbit SCLK=P1^3;//ISD4004时钟
sbit INT =P1^4;//4004中断
sbit STOP=P3^4;//4004复位
DisplayOneChar( 0,12,'-');
DisplayOneChar( 0,13,'X');
sbit LED1 =P1^6;//录音指示灯
//===============================LCD1602接口定义=====================
/*注意,P2.2到P2.4需要接上拉电阻
---------------------------------------------------
sbit K6= P3^3; //
sbit K7= P3^5; //
sbit K8= P3^6; //
sbit K9= P3^7; //
////////////////////////////////////////////////
void main(void)
isd 4004 语音录放模块用户说明书 rec-1000
Rec-1000 语音录放模块用户手册版本-V1.01第一章概述Rec-1000语音录放模块是NewWay电子基于ISD4003/4004 语音录放芯片开发的语音录放系统,板载LM386音频放大器和STC15F104E 单片机,使得它能够很方便的和其他单片机系统级联,您甚至不需要知ISD4004/4003 底层命令,只要给板载单片机控制信号就能实现语音的录放。
Rec-1000 语音录放模块有如下特点:1.板载一枚STC51单片机,能够实现一键录放功能,当然,更为复杂的功能可由您来实现,送单片机的全套资料,编程和普通的51单片机没有任何区别。
2.板载ID4004/4003 语音录放芯片,能够进行高保真的录音。
3.ISD4004/4003的全部控制口引出,做了清晰准确的标注,方便您使用任何其他单片机编程。
4.板载耳机插口,插入耳机后能够自动断开外部功放,您也可以由此接到自己的功放系统,方便2次开发。
5.板载麦克风插口,插入接头后自动断开板载麦克风,方便高品质录音。
6.板载LM386功放系统,足够应付普通需求。
7.板载3.3V电源转换芯片,方便与5V的系统级联。
8.板载MINI-USB接口,用于取电,使您不用到处找电源,在电脑面前就能开发。
9.板载供电插座,使您在实际应用方便连接,安全可靠。
10.板载2个按键,全部与单片机相连,方便开发。
11.板载开关,与电源指示灯。
技术参数:模块供电电压5.0V-3.3V模块尺寸:60mm*80mm录音时间:4/8/16 min(根据录音芯片不同而有区别)录音保存时间:100年录音次数:10万次第二章接口与连接Rec-1000 语音录放模块接口丰富,能够方便的完成您对ISD4003/ISD4004 的开发,现做如下简述PLAY:此接口是为方便外部单片机与板载单片机通讯制作的,连接板载STC单片机的P3.1脚RECORD:此接口是为方便外部单片机与板载单片机通讯制作的,连接板载STC单片机的P3.0脚VCC3.3:电源3.3V 电源输出/输入口VCC5.0;电源5.0V 输出/输入口GND: 模块地线RAC:ISD4004/4003 RAC 输出口INT:ISD4004/4003 INT 输出口SCLK:ISD4004/4003 SCLK输出口MISO:ISD4004/4003 MISO输出口MOSI:ISD4004/4003 MOSI输出口SS:ISD4004/4003 SS输出口V olume:板载LM386语音功放音量调节MK2,speek:扬声器接口(+接扬声器正极,-接扬声器负极)phone:耳机接口,可接外部功放,插入耳机时板载LM386断开。
教室作息时间语音播报点阵显示屏控制系统的设计和实现
教室作息时间语音播报点阵显示屏控制系统的设计和实现[摘要] 教室作息时间控制系统以STC89C516RD+单片机为核心,用DS1302日历时钟芯片提供时间信息、用ISD4004语音芯片播报时间信息及用LED点阵显示屏同步显示时间信息,本系统具有语音播报、时间校时及时间显示等功能,同时还具有价廉,运行稳定和可靠,时间准确等优点。
[关键词] STC89C516RD+单片机DS1302 ISD4004 LED点阵显示屏1、引言随着信息社会的不断发展,尤其是随着各种嵌入式系统在现实生活中的深入和广泛应用,各种信息处理和信息传输的方法也越来越丰富,世界各大主要芯片生产商先后推出IIC三总线传输协议、单总线传输协议、SPI同步传输协议等,这些传输协议的出现为各种微处理和微控制器和外围信息处理芯片快速通信提供了极大的便利,由于各种传输协议都具有固定和严格的传输格式,也就为各种嵌入式系统编写方便移植的总线传输功能函数提供了可能,本文就是通过“基于STC89C516RD+的教室作息时间语音点阵显示屏控制系统的设计和制作”来详细介绍各种嵌入式系统中总线传输协议中的各种功能子函数的编写方法。
基于STC89C516RD+的教室作息时间语音点阵显示屏控制系统,它采用了具有IIC三总线接口的日历时钟芯片DS1302和具有SPI同步传输总线的录放音芯片ISD4004,以及STC89C516RD+微控制器芯片,通过对一个能实现时钟显示和播报及定时功能的时间控制系统的设计学习,达到应用IIC三总线协议和SPI 同步传输总线协议来为广大的师生提供一套可用于学校作息,实现实时时间的显示、校正和智能语音播报,并且具有体积小,价格便宜,功耗低,可靠性高等优点的教室作息时间语音点阵显示屏控制系统。
2、系统的组成和工作原理本系统主要是由单片机模块、电源模块、ISD4004录放音模块、LED点阵显示屏模块、DS1302时钟模块、按键输入时间校正模块和MAX232在系统编程模块组成,系统组成框图见图1所示。
ISD4004录放程序
功能:1.录音状态,按AN键,LED亮开始录音,松口AN即可停止录音再次按下AN键,LED点亮,开始录第二段音,依次类推,直到芯片溢出。
按stop键芯片复位,从第一段开始录音2.放音时,按一下AN(AN=0)键,即播放一段语言,再按一次播放下一段。
按stop键芯片复位至第一段开始。
#include <reg52.h>sbit SS =P1^0; //片选sbit MOSI=P1^2; //数据输入sbit MISO=P1^3; //数据输出sbit SCLK=P1^1; //ISD4004时钟sbit INT =P3^2; //中断sbit LED =P1^7; //指示灯sbit PR =P1^4; //录音和放音选择开关sbit STOP=P1^5; //复位sbit AN =P1^6; //执行void delay(unsigned int time) //延迟n微秒{while(time!=0){time--;}}void delayms(unsigned int time) //延迟n毫秒{TMOD=0x01;for(time;time>0;time--){TH0=0xfc;TL0=0x6b;TR0=1;while(TF0!=1){;}TF0=0;TR0=0;}}void spi_send(unsigned char isdx)//spi串行发送子程序,8位数据{unsigned char isx_counter;SS=0;//ss=0,打开spi通信端SCLK=0;for(isx_counter=0;isx_counter<8;isx_counter++)//先发低位再发高位,依次发送。
{if((isdx&0x01)==1)MOSI=1;elseMOSI=0;isdx=isdx>>1;SCLK=1;delay(2);SCLK=0;delay(2);}}void isd_stop()//stop指令(停止当前操作){delay(10);spi_send(0x30);SS=1;delayms(50);}void isd_pu(void)//发送上电指令{delay(10);SS=0;spi_send(0x20);SS=1;delayms(50);}void isd_pd(void)//发送掉电指令{delay(10);spi_send(0x10);SS=1;delayms(50);}void isd_play()//发送play指令{LED=0;spi_send(0xf0);SS=1;}void isd_rec(void)//发送rec指令{LED=0;spi_send(0xb0);SS=1;}void isd_setplay(unsigned char adl,unsigned char adh)//发送setplay指令{delayms(1);spi_send(adl); //发送放音起始地址低位delay(2);spi_send(adh); //发送放音起始地址高位delay(2);spi_send(0xe0); //发送setplay指令字节SS=1;}void isd_setrec(unsigned char adl,unsigned char adh)//发送setrec指令{delayms(1);spi_send(adl); //发送放音起始地址低位delay(2);spi_send(adh); //发送放音起始地址高位delay(2);spi_send(0xa0); //发送setplay指令字节SS=1;}void isd_overflow()//芯片溢出,LED闪烁提醒停止录音{while(AN==0){LED=1;delayms(300);LED=0;delayms(300);}}unsigned char chk_isdovf()//检查芯片是否溢出(读OVF,并返回OVF值) {SS=0;delay(2);SCLK=0;delay(2);SCLK=1;SCLK=0;delay(2);if(MISO==1){SCLK=0;SS=1; //关闭spi通信端isd_stop(); //发送stop指令return 1; //OVF为1,返回1}else{SCLK=0;SS=1; //关闭spi通信端isd_stop(); //发送stop指令return 0; //OVF为0,返回0}}void main(void){unsigned char ovflog;while(1){P0=P1=P2=P3=0xff;//初始化while (AN==1)//等待AN按下{if(AN==0)//按键防抖动{delayms(20);}}isd_pu(); //AN键按下,ISD上电并延迟50msisd_pd();isd_pu();if(PR==1)//如果PR=1 则转入录音模式{delayms(500); //延迟500ms录音isd_setrec(0x00,0x00); //发送0x0000h地址的setplay指令do{isd_rec(); //发送rec指令while(AN==0) //等待录音完毕{if(INT==0) //如果芯片溢出,进行LED闪烁提示,isd_overflow(); //如果取消录音(松开AN键)则停止录音,芯片复位}if(INT==0)break;LED=1; //录音完毕,LED熄灭isd_stop(); //发送停止命令while(AN==1) //如果AN再次按下,开始录制下一段语音{if(STOP==0) //如果按下STOP按键,则芯片复位break;if(AN==0)delayms(500);}}while(AN==0);}if(PR==0)//如果PR==0 转入放音部分{while(AN==0){;}isd_setplay(0x00,0x00);//发送setplay 指令,从0x0000地址开始放音do{isd_play();//发送放音指令delay(20);while(INT==1)//等待放音完毕的EOM中断信号{;}LED=1;isd_stop(); //放音完毕,发送stop指令if (ovflog=chk_isdovf()) //检查芯片是否溢出,如溢出则停止放音,芯片复位break;while(AN==1) //等待AN键再次按下{if(STOP==0)break;if(AN==0)delayms(20);}}while(AN==0); // AN键再次按下,播放下一段语音}}isd_stop();isd_pd();}。
ISD4004 中文资料与基本程序
ISD4004 中文资料与基本程序-语音芯片1.ISD4000系列语音录放电路分为以下三个系列:2.4002-120/150/180/240 2、2.5、3、4分钟3.4003-04/05/06/08M 4、5、6、8分钟4.4004-08/10/12/16M 8、10、12、16分钟4004系列独有的特性除前面介绍的ISD语音电路主要特性外,4000系列独有的特性为:1. 3v单电源供电。
2.内置微机串行通信接口。
五、典型应用线路图/********************************************************************ISD4004基本程序 AVR meag16Pafone SPI端口 1M内部晶振13th April 2007 It took me about 3 days********************************************************************/#i nclude<iom16v.h>#i nclude<macros.h>#define uchar unsigned char#define DDR_SPI DDRB#define DD_MOSI 5#define DD_SCK 7#define DD_SS 4//*******************************延时100ms*****************************void delay100ms(){unsigned char i,j;for(j = 0;j<316;j++)for(i = 0;i<316;i++);//1MHz的晶振}//************************初始化SPI***********************************void SPI_MasterInit(){DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);//设置MOSI,SCK,SS为OUTPUT,其它为INPUTSPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|BIT(SPR1)|BIT(DORD);//SPI使能,主机方式,设置SCK为fosc/1 28,上升沿,LSB First}//****************************数据传送函数**********************************void SpiTransmit(unsigned char data){SPDR = (unsigned char)data;while(!(SPSR&(1<<SPIF)));//Wait for transmission finish}//****************cmdSend*********************************void cmdSend(unsigned int Addr,unsigned char cmd){PORTB = PORTB&(~(1<<DD_SS));//变低SSNOP();//为保证那个500nsSpiTransmit(Addr); //传地址低位SpiTransmit(Addr>>8); //传地址高字节SpiTransmit(cmd); //传命令PORTB = PORTB|(1<<DD_SS);//变高SSNOP();//为保证那个500ns}//*************************放音函数**********************void play(unsigned int addrs){cmdSend(0x0000,0x20);//Power updelay100ms();//上电延时cmdSend(addrs,0xe0);//发地址值为addr的Setplay命令cmdSend(0x0000,0xf0);//发Play命令}//************录音函数*******************************void rec(unsigned int addrs){cmdSend(0x0000,0x20);//发POWER UP命令;delay100ms();//等待TPUD(上电延时);cmdSend(0x0000,0x20);//发POWER UP命令cmdSend(addrs,0xa0);//发地址值为00的SETREC命令;cmdSend(0x0000,0xb0);//发REC命令。
毕业设计——无线智能报站系统(NRF905及ISD4004语音芯
毕业设计——无线智能报站系统(NRF905及ISD4004语音芯毕业设计说明书无线智能报站系统(NRF905及ISD4004语音芯片的应用)学生姓名专业名称指导教师无线智能报站器Radiofrequency bus stop reporter摘要这篇文章介绍了AT89C51单片机、ISD4004语音芯片等一些器件,并说明了它们的原理及功能。
文章中给出了采用ISD4004语音芯片的一种公交车报站系统的应用电路,重点介绍其接口原理和实现方法。
文章分析了使用单片机实现的报站系统的意义。
在整个设计过程中,需要充分理解MCS-51单片机实现的报站系Protel99se,绘制出系统的原理图。
通统的组成原理,并且要求使用绘图软件过分析其工作原理,建立了程序流程。
文章中使用了Visio绘制了流程图,并且采用了Ultra Edit和Keil等软件编写出了部分系统程序。
本文最后还介绍了如何使用Insight仿真器,并通过使用这种仿真器对所编写的系统程序进行了调试。
本文针对ISD4004语音芯片和AT89C51的特点设计的这种语音报站系统涵盖了许多智能化、人性化及自动化的因素,具备信息管理的功能,而且可以做到循环录放,从而节省了存储空间,降低了成本,具有较高的使用价值。
关键词:AT89C51单片机;ISD4004语音芯片;nRF905模块ABSTRACTThis article introduces AT89C51 MCU,ISD4004 and other devices, and on theirprinciples and functions. The paper gives an application cicurit of bus station system employing ISD4004, emphasizes mainly on interface principle and method.The article analyzes the meaning of the programme. Throughout the design process, the need to fully understand the integral theory of the system .And requires the use of mapping softwareProtel99se,mapping out the tenets of the system.Then works through the analysis of its principles, and establishes procedures.The article tells us how to use Visio mapping the flow and use of software such as Ultra Edit and Keil prepareing some system procedures.In conclusion, the article also describes how to use Insight simulation devices, and through the devices to prepare a systematic procedure debugging.The design of bus station system based on AT89C51 MCU and ISD4004 covers many factors such as intelligent, and the humanization of automated.The system have information management functions, and it also can cycle recording.So that it is saving storage space and reducing the cost of a higher value.Key words:AT89C51MCU;ISD4004sound chip;nRF905 module目录第1章系统设计背景 ....................................................... 1 第2章系统工作原理 ....................................................... 2 第3章系统硬件设计 .......................................................33.1系统框图 (3)3.2 ISM射频收发系统 (3)3.2.1 ISM射频收发系统的射频模块部分 .................................33.2.2 ISM射频系统的液晶模块 .........................................43.2.3 ISM射频模块的中央处理器部分 ...................................53.3语音报站系统 (9)3.3.1 ISD4004语音芯片的主要性能 .....................................93.3.2 ISD4004语音芯片的录放部分 ....................................153.3.3语音功放电路 ..................................................163.4电源电路部分 .....................................................183.5 MAX813复位电路 (20)AT89C51单片机与ISD4004语音芯片接口电路 ..........................21 3.6第4章系统软件部分 (23)4(1 系统软件流程设计 ................................................234(2系统软件流程图 ..................................................234(3 语音部分程序设计及分析 ..........................................24 第5章设计使用的软件说明 (25)5(1 使用PROTEL 99SE绘制原理图 (25)5(2 使用VISIO2003 绘制系统流程图 (26)5(3 使用KEILUVISION2 ................................................. 27 第6章系统调试 (29)6.1 80S51仿真器及其部件 (29)6.2 连接与测试 (30)6.3 调试 ............................................................. 32 致谢 (34)参考文献 (35)附录 ...................................................................36第1章系统设计背景第1章系统设计背景城市的快速发展和城市人口数量的不断增多,公交车已成为人们最主要的交通工具,然而随之而来的公交车乘坐拥挤、等车废时等问题越来越突出。
基于ISD4004芯片的语音录放系统设计说明
ANYANG INSTITUTE OF TECHNOLOGY本科毕业论文基于ISD4004芯片的语音录放系统设计The Design of Voice Recording and Playback SystemBased on ISD4004系(院)名称:计算机科学与信息工程学院专业班级:11届网络工程学生姓名:红红学生学号:7指导教师:领指导教师职称:讲师2011年5月毕业设计(论文)原创性声明和使用授权说明原创性声明本人重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得工学院及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了意。
作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解工学院关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部容。
作者签名:日期:基于ISD4004芯片的语音录放系统设计摘要:用单片机控制语音芯片,再把单片机和语音芯片嵌入到通信设备,智能仪器,治安报警及儿童玩具中,就可做成语音播放的机器。
本文介绍了基于AT89C52单片机及ISD4004语音板为主要部件的语音录放电路的工作原理、硬件和软件的设计。
ISD4004系列工作电压3V,单片录放时间8至16分钟,音质好,适用于移动及其他便携式电子产品中。
芯片设计是基于所有操作必须由微控制器控制,操作命令可通过串行通信接口SPI送入。
论文概述了语音录放电路的原理,并且在介绍语音录放系统功能的基础上,提出了系统的总体构成。
SID4004语音芯片实验程序
#include <STC12C5A60S2.h>#include <intrins.h>sbit isdss=P1^0;sbit mosi=P1^1;sbit miso=P1^2;sbit sclk=P1^3;sbit isdint=P1^4;sbit isdrac=P1^5; //sid4004ÓïÒôоƬ¿ØÖƶËsbit lcdcs=P0^7;sbit lcdsid=P0^6;sbit lcdclk=P0^5;unsigned char BUF0[]={"¿ªÊ¼Â¼Òô! "};unsigned char BUF1[]={"±¾´Î¼Òôµ½µØÖ·: "};unsigned char BUF2[]={"¿ªÊ¼·ÅÒô"};unsigned char BUF3[]={"·ÅÒô½áÊø! "};void delay(int n) //ÑÓʱN*1ms{int i,j;for(i=0;i<n;i++)for(j=0;j<120;j++);}void lcdwrtype(unsigned char date)//ÏòÒº¾§Ğ´Ò»×Ö½ÚÊı¾İ {int i;unsigned char temp;temp=date;for(i=0;i<8;i++){temp<<=1;lcdclk=0;if(CY==1) lcdsid=1;else lcdsid=0;lcdclk=1; //Ğ´ÈëһλÊı¾İ}}void lcdwr_com(unsigned char com)//Ğ´Ö¸ÁÊı{unsigned char fcom;// lcdcs=1;lcdwrtype(0xf8);fcom=com;fcom&=0xf0;lcdwrtype(fcom);fcom=com;fcom<<=4;lcdwrtype(fcom);// lcdcs=0;}void lcdwr_data(unsigned char date) //Ğ´Êı¾İ{unsigned char fdata;// lcdcs=1;lcdwrtype(0xfa);fdata=date;fdata&=0xf0;lcdwrtype(fdata);fdata=date;fdata<<=4;lcdwrtype(fdata);// lcdcs=0;}void lcdinit()//³õʼ»¯º¯Êı{// lcdpsb=0;// delay(100);lcdcs=1;lcdwr_com(0x0f);delay(1);lcdwr_com(0x06);delay(1);lcdwr_com(0x30);delay(1);lcdwr_com(0x01);delay(10);}/*void drawinit() //»æͼ³õʼ»¯{lcdwr_com(0x34);delay(1);}*/void delayus(int n) //΢Ã뼶ÑÓʱ{int i;i=n;while(--i>0);}void powerdown() //ϵçÖ¸Áî{unsigned char com,i,j;isdss=1;delayus(5);sclk=0;delayus(5);isdss=0;delayus(5);com=0x10; //Ö¸Áîfor(i=0;i<8;i++){com=_cror_(com,1); //Ñ-»·ÓÒÒÆj=com<<1;mosi=CY;sclk=0;delayus(5);sclk=1;delayus(5);}isdss=1;delayus(10);}void powerup() //ÉϵçÖ¸Áî{unsigned char com,i,j;isdss=1;delayus(5);sclk=0;delayus(5);isdss=0;delayus(5);com=0x20; //Ö¸Áîfor(i=0;i<8;i++){com=_cror_(com,1); //Ñ-»·ÓÒÒÆj=com<<1;mosi=CY;sclk=0;delayus(5);sclk=1;delayus(5);}isdss=1;delayus(10);}void record(unsigned int addr) //¼Òôģʽ {int i;unsigned char temp,j;unsigned int tempa,date;powerup();delay(50);powerup();delay(50);delay(50);isdss=1;delayus(5);sclk=0;delayus(5);temp=0xa0;tempa=addr; //±£´æµØÖ·isdss=0; //½øÈëÖ¸Áîģʽdelayus(5);for(i=0;i<16;i++){tempa=_iror_(tempa,1);date=tempa<<1;mosi=CY;sclk=0;delayus(5);sclk=1;delayus(10);}for(i=0;i<8;i++){temp=_cror_(temp,1);j=temp<<1;mosi=CY;sclk=0;delay(5);sclk=1;delay(5);}isdss=1;delay(10);sclk=0;delay(5);temp=0xb0;isdss=0;delay(5);for(i=0;i<8;i++){temp=_cror_(temp,1);j=temp<<1;mosi=CY;sclk=0;delay(5);sclk=1;delay(5);}isdss=1;delay(10);P0=0xff;}void audioout(unsigned int addr)//·ÅÒôģʽ {int i;unsigned char temp,j;unsigned int tempa,date;powerup();delay(50);isdss=1;delayus(5);sclk=0;delayus(5);temp=0xe0;tempa=addr; //±£´æµØÖ·isdss=0; //½øÈëÖ¸Áîģʽdelayus(5);for(i=0;i<16;i++){tempa=_iror_(tempa,1);date=tempa<<1;mosi=CY;sclk=0;delayus(5);sclk=1;delayus(10);}for(i=0;i<8;i++){temp=_cror_(temp,1);j=temp<<1;mosi=CY;sclk=0;delay(5);sclk=1;delay(5);}isdss=1;delay(10);sclk=0;delay(5);temp=0xf0;isdss=0;delay(5);for(i=0;i<8;i++){temp=_cror_(temp,1);j=temp<<1;mosi=CY;sclk=0;delay(5);sclk=1;delay(5);}isdss=1;delay(10);P0=0xff;}void delays(int n){int i,j,z;for(i=0;i<n;i++)for(j=0;j<120;j++)for(z=0;z<1000;z++);}void main(){int i,recordtime;P1=0xff;lcdinit();recordtime=0;// /*lcdwr_com(0x80);for(i=0;i<8;i++) lcdwr_data(BUF2[i]);audioout(0); //´Ó0µØÖ·¿ªÊ¼·ÅÒôwhile(recordtime<=1042){if(isdrac==0) recordtime++;while(isdrac==0);}powerdown();lcdwr_com(0x80);for(i=0;i<10;i++) lcdwr_data(BUF3[i]);while(1);//*//*lcdwr_com(0x80);for(i=0;i<10;i++) lcdwr_data(BUF0[i]);record(0); //¼Òôwhile(isdint!=0){if(isdrac==0) recordtime++;while(isdrac==0);}powerdown();lcdwr_com(0x90);for(i=0;i<16;i++) lcdwr_data(BUF1[i]);lcdwr_com(0x88);lcdwr_data(recordtime/1000%10+'0');lcdwr_data(recordtime/100%10+'0');lcdwr_data(recordtime/10%10+'0');lcdwr_data(recordtime%10+'0');while(1); */}。
基于ISD4004芯片的语音录放设计
公益语音部分基于ISD4004芯片的语音录放设计1、器件介绍ISD4004 系列单片语音一、简述●单片8 至16 分钟语音录放●内置微控制器串行通信接口●3V 单电源工作●多段信息处理●工作电流25-30mA,维持电流1μA●不耗电信息保存100 年(典型值)●高质量、自然的语音还原技术●10 万次录音周期(典型值)●自动静噪功能●片内免调整时钟,可选用外部时钟ISD4004 系列工作电压3V,单片录放时间8 至16 分钟,音质好,适用于移动电话及其他便携式电子产品中。
芯片采用CMOS 技术,内含振荡器、防混淆滤波器、平滑滤波器、音频放大器、自动静噪及高密度多电平闪烁存贮陈列。
芯片设计是基于所有操作必须由微控制器控制,操作命令可通过串行通信接口(SPI 或Microwire)送入。
芯片采用多电平直接模拟量存储技术, 每个采样值直接存贮在片内闪烁存贮器中,因此能够非常真实、自然地再现语音、音乐、音调和效果声,避免了一般固体录音电路因量化和压缩造成的量化噪声和"金属声"。
采样频率可为 4.0,5.3,6.4,8.0kHz,频率越低,录放时间越长,而音质则有所下降,片内信息存于闪烁存贮器中,可在断电情况下保存1 00 年(典型值),反复录音10 万次。
二、引脚描述电源:(VCCA,VCCD) 为使噪声最小,芯片的模拟和数字电路使用不同的电源总线,并且分别引到外封装的不同管脚上,模拟和数字电源端最好分别走线,尽可能在靠近供电端处相连,而去耦电容应尽量靠近器件。
地线:(VSSA,VSSD) 芯片内部的模拟和数字电路也使用不同的地线。
同相模拟输入(ANA IN+) 这是录音信号的同相输入端。
输入放大器可用单端或差分驱动。
单端输入时,信号由耦合电容输入,最大幅度为峰峰值32mV,耦合电容和本端的3KΩ电阻输入阻抗决定了芯片频带的低端截止频率。
差分驱动时,信号最大幅度为峰峰值16mV,为ISD33000 系列相同。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <reg52.h> //51单片机头文件#include <intrins.h> //汇编函数指令#include "ISD4004_drive.h" //语音芯片驱动#include "LCD_drive.h" //液晶驱动#include "DS18B20_drive.h" //DS18B20驱动#define uchar unsigned char#define uint unsigned intsbit K1 = P3^4; //K1键,模式选择按键sbit K2 = P3^5; //K2键,按下K2键,录音或放音按键 count值加sbit K3 = P3^6; //K3键,按下K3键,录音或放音按键 count减少sbit K4 = P3^7; //K4键,播放键uint keystate; //模式的状态uchar ovflog; //溢出声明bit temp_flag ; //判断DS18B20是否正常标志位,正常时为1,不正常时为0uchar temp_comp; //用来存放测量温度的整数部分uchar disp_buf[8]={0}; //显示缓冲uchar temp_data[2] = {0x00,0x00}; //用来存放温度数据的高位和低位uchar hour=23,min=59,sec=45; //定义小时、分钟和秒变量uchar count_10ms; //定义10ms计数器uchar code line1_data[] = " DS18B20 OK "; //DS18B20正常时第1行显示的信息uchar code line2_data[] = " TEMP: "; //DS18B20正常时第2行显示的信息uchar code menu1_error[] = " DS18B20 ERR "; //DS18B20出错时第1行显示的信息uchar code menu2_error[] = " TEMP: ---- "; //DS18B20出错时第2行显示的信息uchar code line3_data[] = {"Recording V oice"}; //定义第1行显示的字符uchar code line4_data[]= {"Num:"};uchar code line5_data[] = {"Welcome ZangChuq"};uchar code line6_data[] = {"Graduate Design"};sbit BEEP=P1^0; //定义蜂鸣器bit K1_FLAG=0; //定义按键标志位 当按下K1键时 该位置1 K1键未按下时 该位为0。
uchar code line1_data_time[] = {"---LCD Clcok---"}; //定义第1行显示的字符uchar code line2_data_time[] = {"****"}; //定义第2行显示的字符uchar disp_buf_time[6]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //定义显示缓冲单元uchar disp_buf1[2]={0x00,0x00}; //定义显示缓冲单元,并赋值uchar code addh_tab[73]={00,00,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01, 02,02,02,02,02,02,02,02,02,02,02,02,02,02,02,03,03,03,03,03,03,03,03,03,03,03,03,03,03,03,04,04,04,04,04,04,04,04,04,04,04,04,04,04,04,05,05,05,05,05,05,05,05,05,05,05 };//ISD4004高位地址表uchar code addl_tab[73]={00,22,00,07,14,21,28,35,42,49,56,63,70,77,84,91,98,00,07,14,21,28,35,42,49,56,63,70,77,84,91,98,00,07,14,21,28,35,42,49,56,63,70,77,84,91,98,00,07,14,21,28,35,42,49,56,63,70,77,84,91,98,00,07,14,21,28,35,42,49,56,63,70 };//ISD4004低位地址表uchar count=1; //站计数器,初始为第1站/********以下是函数声明,由于本例采用的函数较多,应加入函数声明部分********/void TempDisp(); //温度值显示函数声明void MenuError(); //DS18B20出错菜单函数声明void MenuOk(); //DS18B20正常菜单函数声明void Delay_ms(uint xms);void time_char_disp();/*********以下是蜂鸣器响一声函数********/void beep() { BEEP=0; //蜂鸣器响Delay_ms(100); BEEP=1; //关闭蜂鸣器Delay_ms(100);}/********以下是转换函数,负责将走时数据转换为适合LCD显示的数据********/void LCD_conv_time(uchar in1,in2,in3 ) //形参in1、in2、in3接收实参hour,min、sec 传来的数据{ disp_buf_time[0]=in1/10+0x30; //小时十位数据disp_buf_time[1]=in1%10+0x30; //小时个位数据disp_buf_time[2]=in2/10+0x30; //分钟十位数据disp_buf_time[3]=in2%10+0x30; //分钟个位数据disp_buf_time[4]=in3/10+0x30; //秒十位数据disp_buf_time[5]=in3%10+0x30; //秒个位数据}*******指示灯闪烁函数*******/void LED_flash1() //约18秒的延时{ uint i;for(i=0;i<10;i++){LED=1;Delay_ms(200);LED=0;Delay_ms(200);}}void LED_flash2() //约1.5秒的延时{ uint i;for(i=0;i<3;i++){ LED=1;Delay_ms(200);LED=0;Delay_ms(200);}}/********以下是DS18B20正常时的菜单函数********/void MenuOk(){ uchar i;lcd_wcmd(0x00|0x80); //设置显示位置为第1行第0列i=0;while(line1_data[i] != '\0') //在第1行显示" DS18B20 OK "{lcd_wdat(line1_data[i]); //显示第1行字符i++; //指向下一字符}lcd_wcmd(0x40|0x80); //设置显示位置为第2行第0列i = 0;while(line2_data[i] != '\0') //在第2行显示" TEMP:"{lcd_wdat(line2_data[i]); //显示第2行字符i++; //指向下一字符}}/********以下是DS18B20出错时的菜单函数********/void MenuError(){ uchar i; lcd_clr(); //LCD清屏lcd_wcmd(0x00|0x80); //设置显示位置为第1行第0列i=0;while(menu1_error[i] != '\0') //在第1行显示" DS18B20 ERR "{lcd_wdat(menu1_error[i]); //显示第1行字符i++; //指向下一字符}lcd_wcmd(0x40|0x80); //设置显示位置为第2行第0列i=0;while(menu2_error[i] != '\0') //"TEMP:---- "{lcd_wdat(menu2_error [i]); //显示第2行字符i++; //指向下一字符}lcd_wcmd(0x4b | 0x80); //从第2行第11列开始显示lcd_wdat(0xdf); //0xdf是圆圈°的代码,以便和下面的C配合成温度符号℃lcd_wdat('C'); //显示C}void TempDisp(){lcd_wcmd(0x46 | 0x80); //从第2行第6列开始显示温度值lcd_wdat(disp_buf[3]); //百位数显示lcd_wdat(disp_buf[2]); //十位数显示lcd_wdat(disp_buf[1]); //个位数显示lcd_wdat('.'); //显示小数点lcd_wdat(disp_buf[0]); //小数位数显示lcd_wdat(0xdf);//0xdf是圆圈°的代码,以便和下面的C配合成温度符号℃lcd_wdat('C'); //显示C}/********液晶显示函数********/void LCD_disp (){uint i;if(keystate==0) // 开机界面{lcd_wcmd(0x00|0x80); //设置显示位置为第1行第1列i=0;while(line5_data[i]!='\0'){lcd_wdat(line5_data[i]); //显示第2行字符i++; //指向下一字符}lcd_wcmd(0x40|0x80); //从第2行第1列开始显示i=0;while(line6_data[i]!='\0'){lcd_wdat(line6_data[i]); //显示第2行字符i++; //指向下一字符}}else if(keystate==1) // 此时处于录音模式{ lcd_wcmd(0x00|0x80); //设置显示位置为第1行第1列i=0;while(line3_data[i]!='\0'){lcd_wdat(line3_data[i]); //显示第2行字符i++; //指向下一字符}lcd_wcmd(0x40|0x80); //从第2行第1列开始显示lcd_wdat(line4_data[0]);cd_wdat(line4_data[1]);lcd_wdat(line4_data[2]);lcd_wdat(line4_data[3]);lcd_wdat(disp_buf1[0]); //显示十位lcd_wdat(disp_buf1[1]); //显示个位_nop_();_nop_();_nop_();_nop_();_nop_();}else if (keystate==2) //温度显示,K4按键播放当前温度{lcd_wcmd(0x46 | 0x80); //从第2行第6列开始显示温度值lcd_wdat(disp_buf[3]); //百位数显示lcd_wdat(disp_buf[2]); //十位数显示lcd_wdat(disp_buf[1]); //个位数显lcd_wdat('.'); //显示小数点lcd_wdat(disp_buf[0]); //小数位数显示lcd_wdat(0xdf); //0xdf是圆圈°的代码,以便和下面的C 配合成温度符号℃lcd_wdat('C'); //显示C_nop_();_nop_();_nop_();_nop_();_nop_();}else if(keystate==3){lcd_wcmd(0x44 | 0x80); //从第2行第4列开始显示lcd_wdat(disp_buf_time[0]); //显示小时十位lcd_wdat(disp_buf_time[1]); //显示小时个位lcd_wdat(0x3a); //显示':' lcd_wdat(disp_buf_time[2]); //显示分钟十位lcd_wdat(disp_buf_time[3]); //显示分钟个位lcd_wdat(0x3a); //显示':' lcd_wdat(disp_buf_time[4]); //显示秒十位lcd_wdat(disp_buf_time[5]); //显示秒个位}}/***********每段数值转换**********/void NumConv(){disp_buf1[0]=count/10+0x30; // 取十位disp_buf1[1]=count%10+0x30; //取个位if(disp_buf1[0]==0x30){disp_buf1[0]=0x20;}}/********以下是读取温度值函数********/void GetTemperture(void){EA=0; //关中断,防止读数错误Init_DS18B20(); //DS18B20初始化if(yes0==0) // yes0为Init_DS18B20函数的返回值,若yes0为0,说明DS18B20正常{WriteOneByte(0xCC); // 跳过读序号列号的操作WriteOneByte(0x44); // 启动温度转换Delay_ms(1000); //延时1s,等待转换结束Init_DS18B20();WriteOneByte(0xCC); //跳过读序号列号的操作WriteOneByte(0xBE); //读取温度寄存器temp_data[0] = ReadOneByte(); //温度低8位temp_data[1] = ReadOneByte(); //温度高8位temp_flag=1;}else temp_flag=0; //否则,出错标志置0EA=1; //温度数据读取完成后再开中断}/********以下是温度数据转换函数,将温度数据转换为适合LCD显示的数据********/ void TempConv(){ uchar sign=0; //定义符号标志位uchar temp; //定义温度数据暂存if(temp_data[1]>127) //大于127即高4位为全1,即温度为负值{temp_data[0]=(~temp_data[0])+1; //取反加1,将补码变成原码if((~temp_data[0])>=0xff) //若大于或等于0xfftemp_data[1]=(~temp_data[1])+1; //取反加1else temp_data[1]=~temp_data[1]; //否则只取反sign=1; //置符号标志位为1}temp =temp_data[0]&0x0f; //取小数位disp_buf[0]=(temp *10/16)+0x30; //将小数部分变换为ascii码temp_comp =((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//取温度整数部分disp_buf[3]= temp_comp /100+0x30; //百位部分变换为ascii码temp = temp_comp%100; //十位和个位部分disp_buf[2]= temp /10+0x30; //分离出十位并变换为ascii码disp_buf[1]= temp %10+0x30; //分离出个位并变换为ascii码if(disp_buf[3]==0x30) //百位ascii码为0x30(即数字0),不显示{disp_buf[3]=0x20; //0x20为空字符码,即什么也不显示if(disp_buf[2]==0x30) //十位为0,不显示disp_buf[2]=0x20;}if(sign)disp_buf[3]=0x2d; //如果符号标志位为1,则显示负号(0x2d为负号的字符码) }/********以下是录音函数********/void Recorder(){EA=0; //录音时关中断if(K2==0) //等待K1键按下{Delay_ms(10); //若K1键按下,延时10ms,防抖动if (K2==0){while(!K2); //等待K1键释放count++; //指向下一地址if(count>73)count=1; //若录完第8站,则返回到第1站}}if(K3==0){Delay_ms(10);if (K3==0){while(!K3); //等待K1键释放count--; //指向下一地址if(count==0) count=73; //若录完第8站,则返回到第1站}}if (K4==0){Delay_ms(10);if (K4==0){while(!K4); //等待K1键释放if(count==1){isd_powerup(); //ISD上电isd_poweroff(); //掉电isd_powerup(); //上电Delay_ms(500); //延迟500ms录音isd_setrec(addl_tab[count-1],addh_tab[count-1]); //设置ISD低位和高位地址表Delay_ms(100);isd_rec(); //发送rec指令LED_flash1();LED=1;count++; //指向下一地址isd_stop(); //发送停止命令if(count>73)count=1; //若录完第8站,则返回到第1站}else{isd_powerup(); //ISD上电isd_poweroff(); //掉电isd_powerup(); //上电Delay_ms(500); //延迟500ms录音isd_setrec(addl_tab[count-1],addh_tab[count-1]); //设置ISD低位和高位地址表Delay_ms(100);isd_rec(); //发送rec指令LED_flash2();LED=1;count++; //指向下一地址isd_stop(); //发送停止命令if(count>73)count=1; //若录完第8站,则返回到第1站}}}EA=1; //录音完毕打开中断}void time_char_disp(){uchar i; //清屏函数 在LCD驱动程序软件包中lcd_wcmd(0x00|0x80); //设置显示位置为第1行第0列i=0;while(line1_data_time [i]!= '\0') //在第1行显示"---LCD Clcok---"{lcd_wdat(line1_data_time[i]); //显示第1行字符i++; //指向下一字符}lcd_wcmd(0x40|0x80); //设置显示位置为第2行第0列i=0;while(line2_data_time[i]!= '\0') //在第2行0~3列显示"****" { lcd_wdat(line2_data_time[i]); //显示第2行字符i++; //指向下一字符}lcd_wcmd(0x4c|0x80); //设置显示位置为第2行第12列i=0;while(line2_data_time[i] != '\0') //在第2行12列之后显示"****" {lcd_wdat(line2_data_time[i]); //显示第2行字符i++; //指向下一字符}}/*********以下是定时器T0初始化函数********/void timer0_init(){ TMOD=0x11; //定时器0、1 工作方式1TH0=0xf8;TL0=0xcc; //定时时间为2ms计数初值TH1 = 0xdc;TL1 = 0x00; // 装定时器T1计数初值,定时时间为10msEA=1;ET0=1; //开总中断和定时器T0、1中断TR0=1; //T0开始运行ET1=1; //开总中断和定时器T1中断TR1 = 1; //启动定时器T1}/*****按键处理函数*****/void Key_process(){if(K1==0){ Delay_ms(10); //若K2键按下,延时10ms,防抖动if (K1==0){while(!K1); //等待K2键释放keystate++; //指向下一刂?if(keystate>3) keystate=0; //若播放完第10站,则返回到第1站}}else if((keystate==0)&&(K4==0)){Delay_ms(10);if((keystate==0)&&(K4==0))while(!K4);isd_setplay(addl_tab[0],addh_tab[0]); //设置ISD低位和高位地址表isd_play(); //发送放音指令LED=0; //开LED灯Delay1(20);while(ISD_INT==1) ;//若放音完毕则中断信号ISD_INT=0,若放音未完毕,则等待中断信号LED=1; //关LED灯isd_stop(); //发送停止命令if (ovflog=check_ovf())isd_poweroff(); //检查芯片是否溢出 如溢出则停止放音 芯片复位}elseif((keystate==3)&&(K4==0) ){ Delay_ms(10);if((keystate==3)&&(K4==0) )while(!K4);isd_setplay(addl_tab[4],addh_tab[4]); //设置ISD低位和高位地址表isd_play(); //发送放音指令LED=0; //开LED灯Delay1(20);while(ISD_INT==1);//若放音完毕则中断信号ISD_INT=0,若放音未完毕,则等待中断信号LED=1; //关LED灯isd_stop(); //发送停止命令if (ovflog=check_ovf())isd_poweroff(); //检查芯片是否溢出 如溢出则停止放音 芯片复位isd_setplay(addl_tab[hour+13],addh_tab[hour+13]); //设置ISD低位和高位地址表isd_play(); //发送放音指令LED=0; //开LED灯Delay1(20);while(ISD_INT==1);//若放音完毕则中断信号ISD_INT=0,若放音未完毕,则等待中断信号LED=1; //关LED灯isd_stop(); //发送停止命令if (ovflog=check_ovf())isd_poweroff(); //检查芯片是否溢出 如溢出则停止放音 芯片复位isd_setplay(addl_tab[6],addh_tab[6]); //设置ISD低位和高位地址表isd_play(); //发送放音指令LED=0; //开LED灯Delay1(20);while(ISD_INT==1);//若放音完毕则中断信号ISD_INT=0,若放音未完毕,则等待中断信号LED=1; //关LED灯isd_stop(); //发送停止命令if (ovflog=check_ovf())isd_poweroff(); //检查芯片是否溢出 如溢出则停止放音 芯片复位isd_setplay(addl_tab[min+13],addh_tab[min+13]); //设置ISD低位和高位地址表isd_play(); //发送放音指令LED=0; //开LED灯Delay1(20);while(ISD_INT==1);//若放音完毕则中断信号ISD_INT=0,若放音未完毕,则等待中断信号LED=1; //关LED灯isd_stop(); //发送停止命令if (ovflog=check_ovf())isd_poweroff(); //检查芯片是否溢出 如溢出则停止放音 芯片复位isd_setplay(addl_tab[7],addh_tab[7]); //设置ISD低位和高位地址表isd_play(); //发送放音指令LED=0; //开LED灯Delay1(20);while(ISD_INT==1);//若放音完毕则中断信号ISD_INT=0,若放音未完毕,则等待中断信号LED=1; //关LED灯isd_stop(); //发送停止命令if (ovflog=check_ovf())isd_poweroff(); //检查芯片是否溢出 如溢出则停止放音 芯片复位}else if((keystate==2)&&(K4==0)){ Delay_ms(10);if((keystate==2)&&(K4==0))while(!K4);isd_setplay(addl_tab[1],addh_tab[1]); //设置ISD低位和高位地址表isd_play(); //发送放音指令LED=0; //开LED灯Delay1(20);while(ISD_INT==1) ;//若放音完毕则中断信号ISD_INT=0,若放音未完毕,则等待中断信号LED=1; //关LED灯isd_stop(); //发送停止命令if (ovflog=check_ovf())isd_poweroff(); //检查芯片是否溢出 如溢出则停止放音 芯片复位isd_setplay(addl_tab[temp_comp+13],addh_tab[temp_comp+13]); //设置ISD低位和高位地址表isd_play(); //发送放音指令LED=0; //开LED灯Delay1(20);while(ISD_INT==1) ;//若放音完毕则中断信号ISD_INT=0,若放音未完毕,则等待中断信号LED=1; //关LED灯isd_stop(); //发送停止命令if (ovflog=check_ovf())isd_poweroff(); //检查芯片是否溢出 如溢出则停止放音 芯片复位isd_setplay(addl_tab[2],addh_tab[2]); //设置ISD低位和高位地址表isd_play(); //发送放音指令LED=0; //开LED灯Delay1(20);while(ISD_INT==1) ;//若放音完毕则中断信号ISD_INT=0,若放音未完毕,则等待中断信号LED=1; //关LED灯isd_stop(); //发送停止命令if (ovflog=check_ovf())isd_poweroff(); //检查芯片是否溢出 如溢出则停止放音 芯片复位isd_setplay(addl_tab[disp_buf[0]-0x30+13],addh_tab[disp_buf[0]-0x30+ 13]); //设置ISD低位和高位地址表isd_play(); //发送放音指令LED=0; //开LED灯Delay1(20);while(ISD_INT==1) ;//若放音完毕则中断信号ISD_INT=0,若放音未完毕,则等待中断信号 LED=1; //关LED灯isd_stop(); //发送停止命令if (ovflog=check_ovf())isd_poweroff(); //检查芯片是否溢出 如溢出则停止放音 芯片复位isd_setplay(addl_tab[3],addh_tab[3]); //设置ISD低位和高位地址表isd_play(); //发送放音指令LED=0; //开LED灯Delay1(20);while(ISD_INT==1) ;//若放音完毕则中断信号ISD_INT=0,若放音未完毕,则等待中断信号LED=1; //关LED灯isd_stop(); //发送停止命令if (ovflog=check_ovf())isd_poweroff(); //检查芯片是否溢出 如溢出则停止放音 芯片复位}}void key_timechange(){ if(K2==0) //若按下K2键{Delay_ms(10); //延时去抖if(K2==0){while(!K2); //等待K2键释放beep();hour++; //小时调整if(hour==24){hour = 0;}}}if(K3==0) //若按下K3键{Delay_ms(10);if(K3==0){while(!K3); //等待K3键释放beep();min++; //分钟调整if(min==60){min = 0;}}}}/********以下是主函数********/void main(void){P0=0xff;P1=0xff;P2=0xff;P3=0xff; //端口初始化timer0_init(); //调定时器T0初始化函数lcd_init();lcd_clr();keystate=0;while(1){Key_process();if(keystate==3){time_char_disp();Delay_ms(5);key_timechange();}else if(keystate==1){lcd_clr();Recorder(); //如果keystate=1则转入录音部分 }else if (keystate==2){GetTemperture(); //读取温度数据if(temp_flag==0){MenuError(); //显示出错信息函数TempDisp();}else if(temp_flag==1) //若DS18B20正常,则往下执行{TempConv(); //将温度转换为适合LCD显示的数据MenuOk(); //显示温度值菜单}}}}/********以下是定时器T0中断函数********/void timer0() interrupt 1{TH0=0xf8; TL0=0x30; //重置计数初值,定时时间为2msNumConv(); //调数值转换函数LCD_conv_time(hour,min,sec); //调走时转换函数LCD_disp (); //调显示函数}/********以下是定时器T1中断函数, 用于产生用于产生秒、分钟和小时信号********/void timer1() interrupt 3{TH1 = 0xdc;TL0 = 0x00; //重装计数初值,定时时间为10mscount_10ms++; //10ms计数器加1if(count_10ms >= 100){ count_10ms = 0; //计数100次后恰好为1s,此时10ms计数器清0 sec++; //秒加1if(sec == 60){sec = 0;min++; //若到60秒 分钟加1if(min ==60){min = 0;hour++; //若到60分钟 小时加1if(hour ==24){hour = 0;min=0;sec=0; //若到24小时 小时、分钟和秒单元清0 }}}}}2 ISD4004驱动程序#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit SS = P1^4; //ISD4004片选端sbit SCLK = P1^5; //ISD4004时钟端sbit MOSI = P1^6; //ISD4004数据输入sbit MISO = P1^7; //ISD4004数据输出sbit ISD_INT= P1^3; //中断sbit LED = P1^0; //指示灯/********以下是yus微秒延时函数********/void delay(uint yus){while(yus!=0)yus-- ;}/********以下是xms毫秒延时函数********/void Delay_ms(uint xms) //延时程序 xms是形式参数{uint i, j;for(i=xms;i>0;i--) // i=xms,即延时xms, xms由实际参数传入一个值for(j=115;j>0;j--); //此处分号不可少}/********以下是SPI串行发送函数********/void spi_send(uchar isdx){ uchar isd_count; SS=0; //ss=0,打开SPI通信端SCLK=0;for(isd_count=0;isd_count<8;isd_count++) //先发低位再发高位 依次发送{if ((isdx&0x01)==1)MOSI=1;else MOSI=0;isdx=isdx>>1;SCLK=1;delay(2);SCLK=0;delay(2);}}/********以下是发送上电指令********/void isd_powerup(void){delay(10);SS=0;spi_send(0x20);SS=1;Delay_ms(50);} /********以下是发送掉电指令函数********/void isd_poweroff(void){delay(10);spi_send(0x10);SS=1;Delay_ms(50);}/********以下是发送play(播放)指令函数********/void isd_play(void){ LED=0;spi_send(0xf0);SS=1;}/********以下是发送rec(录音)指令函数********/void isd_rec(void){LED=0;spi_send(0xb0);SS=1;}/********以下是发送stop(停止)指令函数********/void isd_stop(void){delay(10);spi_send(0x30);SS=1;Delay_ms(50);}/********以下是发送setplay(放音起始地址)指令函数********/ void isd_setplay(uchar adl,uchar adh){Delay_ms(1);spi_send(adl); //发送放音起始地址低位delay(2);spi_send(adh); //发送放音起始地址高位delay(2);spi_send(0xe0); //发送setplay指令字节SS=1;}/********以下是发送setrec(录音起始地址)指令函数********/void isd_setrec(uchar adl,uchar adh){Delay_ms(1);spi_send(adl); //发送放音起始地址低位delay(2);spi_send(adh); //发送放音起始地址高位delay(2);spi_send(0xa0); //发送setplay指令字节SS=1;}/********以下是检查芯片是否溢出函数(读OVF,并返回OVF值)********/ uchar check_ovf(void){ SS=0;delay(2);SCLK=0;delay(2);SCLK=1;SCLK=0;delay(2);if (MISO==1){ SCLK=0;SS =1; //关闭spi通信端isd_stop(); //发送stop指令return 1; //OVF为1 返回1}else {SCLK=0;SS =1; //关闭spi通信端isd_stop(); //发送stop指令return 0; //OVF为0 返回0}}3 液晶驱动程序#include <reg52.h> #include <intrins.h>#define uchar unsigned char#define uint unsigned int sbitLCD_RS=P3^2;sbit LCD_RW=P3^1 ;sbit LCD_EN=P3^0;void Delay_ms(uint xms) ;bit lcd_busy();void lcd_wcmd(uchar cmd);void lcd_wdat(uchar dat) ;void lcd_clr() ;void lcd_init() ;/********以下是LCD忙碌检查函数********/Bit lcd_busy() {bitresult;LCD_RS=0;LCD_RW=1;LCD_EN=1;_nop_();_nop_();_nop_();_nop_();result=(bit)(P2&0x80);LCD_EN=0;return result;}/********以下是写指令寄存器IR函数********/voidlcd_wcmd(ucharcmd){while(lcd_busy());LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_();P2=cmd;_nop_();_nop_();_nop_();_nop_();LCD_EN=1;_nop_();_nop_();_nop_();_nop_();LCD_EN=0;}/********以下是写寄存器DR函数********/Void lcd_wdat(uchar dat) {while(lcd_busy()); LCD_RS=1;LCD_RW=0;LCD_EN=0;P2=dat;_nop_();_nop_();_nop_();_nop_();LCD_EN=1;_nop_();_nop_();_nop_();_nop_();LCD_EN=0;}/********以下是LCD清屏函数********/Void lcd_clr() {lcd_wcmd(0x01); //清除LCD的显示内容Delay_ms(5);}/********以下是LCD初始化函数********/void lcd_init() {Delay_ms(15); //等待LCD电源稳定lcd_wcmd(0x38); //16*2显示 5*7点阵 8位数据Delay_ms(5);lcd_wcmd(0x38);Delay_ms(5);lcd_wcmd(0x38);Delay_ms(5);lcd_wcmd(0x0c); //显示开 关光标Delay_ms(5);lcd_wcmd(0x06); //移动光标Delay_ms(5);lcd_wcmd(0x01); //清除LCD的显示内容Delay_ms(5);}4DS18B20驱动程序#define uchar unsigned char#define uint unsigned int sbit DQ = P0^0; //定义DS18B20端口DQbit yes0 ;/**********************************************************/void Delay(uint num)//延时函数{while( --num );}/**********************************************************/bit Init_DS18B20(void)//初始化ds1820{ DQ = 1; //DQ复位Delay(8); //稍做延时DQ = 0; //单片机将DQ拉低Delay(90); //精确延时大于 480usDQ = 1; //拉高总线 Delay(8);yes0 = DQ; //如果=0则初始化成功 =1则初始化失败Delay(100);DQ = 1;return(yes0); //返回信号 若yes0为0则存在,若yes0为1则不存在}/**********************************************************/ ReadOneByte(void)//读一个字节{uchar i = 0;uchar dat = 0;for (i = 8; i > 0; i--){ DQ = 0; // 给脉冲信号dat>>= 1;DQ = 1; // 给脉冲信号if(DQ) dat |= 0x80; Delay(4);}return (dat);}/**********************************************************/ WriteOneByte(uchar dat)//写一个字节{ uchar i = 0;for (i = 8; i > 0; i--){ DQ = 0;DQ = dat&0x01;Delay(5);DQ = 1;dat>>=1;}}。