收藏 分享(赏)

isd4004电路图和程序.doc

上传人:kpmy5893 文档编号:7334831 上传时间:2019-05-15 格式:DOC 页数:25 大小:1.26MB
下载 相关 举报
isd4004电路图和程序.doc_第1页
第1页 / 共25页
isd4004电路图和程序.doc_第2页
第2页 / 共25页
isd4004电路图和程序.doc_第3页
第3页 / 共25页
isd4004电路图和程序.doc_第4页
第4页 / 共25页
isd4004电路图和程序.doc_第5页
第5页 / 共25页
点击查看更多>>
资源描述

1、/CS1 MOSI2MISO3 VSSD4NC5 NC6NC7 NC8NC9 NC10VSSA11 VSSA12OUT13 AMCAP14SCLK 28VCCD 27XCLK 26/INT 25RAC 24VSSA 23NC 22NC 21NC 20NC 19VCCA 18IN+ 17IN- 16NC 15ISD4004U6ISD4004D6IN4001D7IN4001D9IN4001 C2622UFC1810UFC193.3UFC20220UFC161UFC174.7UFC210.047C220.1C250.1R1510KR191KR2010R1410KC1 +2-3 GND4R 8C 7V

2、CC 6OUT 5U15LM386VCC4004/CSP1.2MISOP1.1VCCR110KP1.7INT1J6PHONEJACK STEREO SW电压增益为 20 倍放大电路电压增益为 50 倍放大电路电压增益 200 倍放大电路/*/ ISD4002-89c51 开发板演示例程 C51 版本 */ 作者:中青世纪 Lell */ 2008.2.27 */ */ 更多 ISD4000 使用心得请登陆中青世纪论坛 */ http:/ */ */*#include sbit SS = P10; /片选sbit SCLK = P11; /ISD4003 时钟sbit MOSI = P12; /

3、数据输入sbit MISO = P13; /数据输出sbit LED = P17; /指示灯sbit ISD_INT= P32; /中断sbit AN = P16; /执行sbit STOP = P15; /复位sbit PR = P14; /PR=1 录音 PR=0 放音void delay(unsigned int time) /延迟 n 微秒while(time!=0)time- ;void delayms(unsigned int time) /延迟 n 毫秒 TMOD=0x01;for(time;time0;time-)TH0=0xfc;TL0=0x18;TR0=1;while(TF

4、0!=1);TF0=0;TR0=0;/*/ISD4002 spi 串行发送子程序,8 位数据/*void spi_send(unsigned char isdx) unsigned char isx_counter;SS=0; /ss=0,打开 spi 通信端SCLK=0;for(isx_counter=0;isx_counter1;SCLK=1;delay(2);SCLK=0;delay(2);/*/发送 stop 指令/*void isd_stop(void) delay(10);spi_send(0x30);SS=1;delayms(50);/*/发送上电指令,并延迟 50ms/*voi

5、d isd_pu(void) delay(10);SS=0;spi_send(0x20);SS=1;delayms(50);/*/*发送掉电指令,并延迟 50msvoid isd_pd(void) delay(10);spi_send(0x10);SS=1;delayms(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;/*/发送 setplay 指令/*void isd_setplay(unsign

6、ed char adl,unsigned char adh) spi_send(adl); /发送放音起始地址低位adh=adh|0xe0;spi_send(adh); /发送放音起始地址高位SS=1;/*/发送 setrec 指令void isd_setrec(unsigned char adl,unsigned char adh)spi_send(adl); /发送放音起始地址低位adh=adh|0xa0;spi_send(adh); /发送放音起始地址高位SS=1;/*/芯片溢出,LED 闪烁提醒停止录音/*void isd_overflow(void)while(AN=0) LED=1

7、;delayms(300);LED=0;delayms(300);/*/检查芯片是否溢出(读 OVF,并返回 OVF 值)/*unsigned char chk_isdovf(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,返回 1else SCLK=0;SS =1; /关闭 spi 通信端isd_stop(); /发送 stop 指令return 0; /OVF 为 0

8、,返回 0/*/主程序/功能:1.录音时,按住 AN 键,LED 点亮开始录音,松开 AN 即可停止录音/ 再次按下 AN 键,LED 点亮开始录第二段音,依次类推,直到芯片溢出。/ 按 stop 键芯片复位/ 2.放音时,按一下 AN 键,即播放一段语音。 按 stop 键芯片复位。/*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_

9、pd();isd_pu();if (PR=1) /如果 PR=1 则转入录音部分delayms(500); /延迟录音isd_setrec(0x00,0x00); /发送 0x0000h 地址的 setplay 指令do isd_rec(); /发送 rec 指令delay(20);while(AN=0) /等待录音完毕 if (ISD_INT=0) /如果芯片溢出,进行 LED 闪烁提示,isd_overflow(); /如果取消录音(松开 AN 键)则停止录音,芯片复位if (ISD_INT=0)break;LED=1; /录音完毕, LED 熄灭isd_stop(); /发送停止命令wh

10、ile(AN=1) /如果 AN 再次按下,开始录制下一段语音 if(STOP=0) /如果按下 STOP 按键,则芯片复位break;if (AN=0)delayms(500);while(AN=0);else /如果 PR=0 则转入放音部分while(AN=0);isd_setplay(0x00,0x00); /发送 setplay 指令,从 0x0000 地址开始放音do isd_play(); /发送放音指令delay(20);while(ISD_INT=1) /等待放音完毕的 EOM 中断信号;LED=1;isd_stop(); /放音完毕,发送 stop 指令if (ovflog

11、=chk_isdovf() /检查芯片是否溢出 ,如溢出则停止放音,芯片复位break;while(AN=1) /等待 AN 键再次按下 if (STOP=0)delayms(20);if (STOP=0)break;if(AN=0)delayms(20);LED=0;while(AN=0); / AN 键再次按下,播放下一段语音isd_stop();isd_pd();/*注意:与 ISD4002/03 不同的是,由于 ISD4004 芯片的语音地址是 16 位,/ISD4004 芯片在发送带地址指令(如 setplay,setrec,setmc)时,/需要先发送两个字节的地址信息,再发送一个

12、字节的命令字,ISD4004 的程序编写与ISD4002/03 的区别/例如,ISD4004 的 setplay 指令程序应为:void isd_setplay(unsigned char adl,unsigned char adh)delayms(1);spi_send(adl); /发送放音起始地址低位delay(2);spi_send(adh); /发送放音起始地址高位delay(2);spi_send(0xe0); /发送 setplay 指令字节SS=1;*/ISD4004 语音播放部分/当按下 P3.5 键时,从指定地址开始录音/ 当按下 P3.6 键时,从指定地址开始放音/ 当按

13、下 P3.7 键时,停止当前的操作/ 程序中的录放停部分已做成子函数,可以直接调用, 只需要输入录音的地址就行/ 录音地址的设定与芯片型号有关系,以 ISD4004-16 为例,ISD40044-16 录音时间为 16/ 分钟,即 16*60=960S, 根据 4004 的资料,960 秒可分为 2400 段,也就是 10S 的段数为/ 25 段,即从,00000019H 的内容为 10S,/作者:长沙致望科技电子公司 WWW.CSMCU.COM/版本:V1.0(2008.12.1)/实验使用注意,按录音键,要切换到放音时,可按停止再放音,也可以先按一下放音键,再按一次放音键,那可/原因:本程

14、序在放音前,没有做停止和下电处理,感兴趣的朋友可以直接到停止部分加到放音子函数中。#include #include #define uchar unsigned char#define uint unsigned int/定义放音命令,定义常量/#define ISDPOWERUP 0X20 /ISD4004 上电#define ISDSTOP 0X10 /ISD4004 下电#define OPERSTOP 0X30 /ISD4004 停止当前操作#define PLAYSET 0XE0 /ISD4004 从指定地址开始放音#define PLAYCUR 0XF0 /ISD4004 从当前

15、地址开始放音#define RECSET 0XA0 /ISD4004 从指定地址开始录音#define RECCUR 0XB0 /ISD4004 从当前地址开始录音sbit SS=P00; /LOW IS ACTIVELYsbit MOSI=P01;sbit MISO=P02;sbit SCLK=P03;/sbit INT=P12;sbit K1=P31; /用串口烧写程序时会用到sbit K2=P32;sbit K3=P33;sbit LED1=P10;sbit LED2=P11;sbit LED3=P12;void delayms(uchar ms);uint addr;/全局变量 / 放

16、音地址/放音部分子程序,放音地址由 ADDR 决定/void play() uint y;SS=1;SS=0;MOSI=0;/发送开始SCLK=0;for(y=0;yy) /发送上电命令,从低位往高位发else MOSI=0;_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();_nop_();SCLK=0;/发送结束SS=1;/上电结束delayms(25);SS=0;/MOSI=0;/发送地址/SCLK=0;for(y=0;yy)else MOSI=0;_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();_n

17、op_();SCLK=0;SS=1;/上电结束delayms(25);SS=0;/MOSI=0;/放音/SCLK=0;for(y=0;yy)else MOSI=0;_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();_nop_();SCLK=0;SS=1;delayms(25);SS=0;/MOSI=0;/放音/SCLK=0;for(y=0;yy)else MOSI=0;_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();_nop_();SCLK=0;SS=1; /lu 音部分子程序,地址由 ADDR 决定/v

18、oid rec() uint y;SS=0;MOSI=0;/发送开始SCLK=0;for(y=0;yy)else MOSI=0;_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();_nop_();SCLK=0;/发送结束SS=1;/上电结束delayms(25);SS=0;/MOSI=0;/发送开始/SCLK=0;for(y=0;yy)else MOSI=0;_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();_nop_();SCLK=0;/发送结束SS=1;/上电结束delayms(50);/delayms(

19、50);SS=0;/ MOSI=0;/发送地址/SCLK=0;for(y=0;yy)else MOSI=0;_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();_nop_();SCLK=0;/发送地址结束*/SS=1;/上电结束delayms(25);SS=0;/ MOSI=0;/ SCLK=0;for(y=0;yy)else MOSI=0;_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();_nop_();SCLK=0;SS=1;delayms(25);SS=0;/MOSI=0;/SCLK=0;for(y=0

20、;yy)else MOSI=0;_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();_nop_();SCLK=0;SS=1; /void stop() uchar y;SS=1;SS=0;MOSI=0;/放音SCLK=0;for(y=0;yy)else MOSI=0;_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();_nop_();SCLK=0;SS=1;delayms(50);/delayms(50);/void Dstop() uchar y;SS=1;SS=0;MOSI=0;/放音SCLK=0;for(

21、y=0;yy)else MOSI=0;_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();_nop_();SCLK=0;SS=1;delayms(50);/delayms(50);/void press_key()void delayms(uchar ms)/ 延时子程序uchar j;while(ms-)for(j =0;j#include #define uchar unsigned char#define uint unsigned int/定义放音命令,定义常量/#define ISDPOWERUP 0X20 /ISD4004 上电#defin

22、e ISDSTOP 0X10 /ISD4004 下电#define OPERSTOP 0X30 /ISD4004 停止当前操作#define PLAYSET 0XE0 /ISD4004 从指定地址开始放音#define PLAYCUR 0XF0 /ISD4004 从当前地址开始放音#define RECSET 0XA0 /ISD4004 从指定地址开始录音#define RECCUR 0XB0 /ISD4004 从当前地址开始录音sbit SS=P13; /LOW IS ACTIVELYsbit MOSI=P12;sbit MISO=P17;sbit SCLK=P14;sbit K1=P35;

23、sbit K2=P36;sbit K3=P37;sbit LED1=P01;sbit LED2=P02;void delayms(uchar ms);uint addr;/全局变量/ 放音地址 /放音部分子程序,放音地址由 ADDR 决定/void play() uint y;SS=0;MOSI=0;/发送开始SCLK=0;for(y=0;yy)else MOSI=0;_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();_nop_();/发送结束SS=1;/上电结束delayms(50);SS=0;MOSI=0;/发送地址SCLK=0;for(y=0;

24、yy)else MOSI=0;_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();_nop_();/发送地址结束MOSI=0;/放音SCLK=0;for(y=0;yy)else MOSI=0;_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();_nop_();SS=1;SS=0;MOSI=0;/放音SCLK=0;for(y=0;yy)else MOSI=0;_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();_nop_();SS=1; /lu 音部分子程序,地址由 AD

25、DR 决定/void rec() uint y; SS=0;MOSI=0;/发送开始SCLK=0;for(y=0;yy)else MOSI=0;_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();_nop_();/发送结束SS=1;/上电结束delayms(50);SS=0;MOSI=0;/发送开始SCLK=0;for(y=0;yy)else MOSI=0;_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();_nop_();/发送结束SS=1;/上电结束delayms(50);delayms(50);SS=0;

26、MOSI=0;/发送地址SCLK=0;for(y=0;yy)else MOSI=0;_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();_nop_();/发送地址结束MOSI=0;SCLK=0;for(y=0;yy)else MOSI=0;_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();_nop_();SS=1;SS=0;MOSI=0;SCLK=0;for(y=0;yy)else MOSI=0;_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();_nop_();SS

27、=1; /void stop()uchar y;SS=1;SS=0;MOSI=0;/放音SCLK=0;for(y=0;yy)else MOSI=0;_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();_nop_();SS=1;/void press_key()void delayms(uchar ms) / 延时子程序 uchar j;while(ms-)for(j = 0; j 120; j+);/void main() P1=0xff;P2=0XFF;P3=0XFF;while(1)if(K1=0)delayms(10);while(K1=0); /松手判断LED1=0;LED2=1;addr=0X05;/从 0X05 单元开始rec();P1=0XFF;if(K2=0)delayms(10);while(K2=0);LED1=1;LED2=0;addr=0X05;play();P1=0XFF;if(K3=0)delayms(10);while(K3=0);LED1=1;LED2=1;stop();P1=0XFF;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报