选择分类:当前分类——当前分类
本站推荐:
89C51-ISD4000语音单片机通用开发板
文章长度[] 加入时间[2008/3/30] 更新时间[2024/12/22 20:46:25] 级别[0] [评论] [收藏]

89C51-ISD4000语音单片机通用开发板

  本板采用国内最常用的MCS-51语言单片机89C51,与最新的ISD4000系列语音芯片结合,可供用户开发各种最新的智能型数码语音产品。

一、 结构

89C51-ISD4000语音电路程序AT89C51单片机
板上已装配好:
89C51--单片机,8031内核,4K可反复擦写的程序存储器,32条I/O口,5V工作
ISD4003-08--语音芯片,音质优异的模拟存储技术,可反复录放,8分钟,可分1200段,SPI接口方式,3V供电
LM386--功率放大器,0.5W驱动
24C01(选配件)--I2C总线串行存储器。
还有驻极体话筒(MIC)、话筒放大器、音量电位器、发光管等部件。 二、 性能参数
外接电源电压:5V(稳压)
外接喇叭:4-16欧姆,0 .5W
工作电流:25~30mA ( 录音),50~80mA (放音)
静态电流:13mA
随板提供的演示程序功能:
1、录音
跳线插在"REC"一侧是录音状态,按住"AN"键不放,指示灯亮即可对着板上话筒讲话录音,松键时录音停止并形成一段。再按则录下一段。按"STOP"键为复位,再录音时又从第一段开始。
2、放音
跳线插在"PLAY"一侧是放音状态,按一下"AN"键即播放一段,一段结束后自动停止放音,再按"AN"则播放下一段
按"STOP"键为复位,再放音时又从第一段开始。

89C51-ISD4000语音电路程序AT89C51单片机
89C51单片机12MHz
注:本程序为ISD40024003的控制程序,ISD4004的程序须加些改动,请注意程序后边的注释。
SS EQU P1.0 ;片选
SCLK EQU P1.1 ;ISD4003时钟
MOSI EQU P1.2 ;数据输入
MISO EQU P1.3 ;数据输出
LED EQU P1.7 ;指示灯
INT EQU INT0 ;中断
AN EQU P1.6 ;执行
STOP EQU P1.5 ;复位
PR EQU P1.4 ;PR=1录音 PR=0放音
;初始化
ORG 0000H ;
AJMP MAIN ;
MAIN: MOV SP,#10H ;
MOV P1,#0FFH ;
MOV P2,#0FFH ;
MOV P3,#0FFH ;
MOV P0,#0FFH ;
CLR EA ;
MAII: SETB LED ;关指示灯
ACALL DSTOP ;ISD掉电
MAS0: MOV 3AH,#200 ;
MAS1: JB AN,MAS0 ;等按AN键
DJNZ 3AH,MAS1 ;
ACALL UP ;ISD上电
MOV 20H,#00H ;ISD低位地址
MOV 21H,#00H ;ISD高位地址
JB PR,REC ;PR=1 录音
AJMP PLAY ;PR=0 放音
;SETREC 16位
;从指定地址录音 10100 <X A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 >
REC: MOV A,20H ;发地址 A7-A0
ACALL ISDX ;
MOV A,21H ;发地址 A9-A8
SETB ACC.7 ;
CLR ACC.6 ;
SETB ACC.5 ;
CLR ACC.4 ;
CLR ACC.3 ;
ACALL ISDX ;
SETB SS ;关片选
;REC 8位
;从当前地址录音 10110 <X A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 >
REC1: MOV 36H,#10 ;
REC2: ACALL YS50 ;延时录音
DJNZ 36H,REC2 ;
CLR LED ;开指示灯
MOV A,#0B0H ;发 1011 0XXX
ACALL ISDX ;
SETB SS ;关片选
REC3: MOV 35H,#200 ;
REC4: JNB INT,REC7 ;OVF=0芯片溢出
JNB AN,REC3 ;
DJNZ 35H,REC4 ;
SETB LED ;关指示灯
ACALL STOPP ;停止当前操作
REC5: JNB STOP,REC6 ;中断RESET
JB AN,REC5 ;等待AN=0
ACALL STOPP ;停止当前操作
AJMP REC1 ;
REC6: CLR SCLK ;时钟SCLK=0
SETB SS ;关片选
ACALL STOPP ;停止当前操作
AJMP MAII ;
REC7: SETB LED ;关指示灯
MOV 36H,#15 ;
REC8: ACALL YS50 ;延时录音
JB AN,REC6 ;等待AN=1
DJNZ 36H,REC8 ;
CLR LED ;
MOV 36H,#15 ;
REC9: ACALL YS50 ;延时录音
JB AN,REC6 ;等待AN=1
DJNZ 36H,REC9 ;
AJMP REC7 ;
;SETPLAY 16位
;从指定地址放音 11100 <X A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 >
PLAY: JNB AN,PLAY ;等待AN=1
MOV A,20H ;发地址 A7-A0
ACALL ISDX ;
MOV A,21H ;发地址 A9-A8
SETB ACC.7 ;
SETB ACC.6 ;
SETB ACC.5 ;
CLR ACC.4 ;
CLR ACC.3 ;
ACALL ISDX ;
SETB SS ;关片选
;PLAY 8位
;从当前地址放音 11110 <X A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 >
PLAY1: CLR LED ;LED开指示灯
MOV A,#0F0H ;发 11110 XXXXXXXX
ACALL ISDX ;发 << SETPLAY >>
SETB SS ;关片选
PLAY2: JNB STOP,REC6 ;STOP=0停止放音
JB INT,PLAY2 ;无OVF EOM继续放音
SETB LED ;关指示灯
ACALL STOPP ;停止当前操作
;检测OVF
CLR SS ;开片选
CLR SCLK ;时钟SCLK=0
SETB SCLK ;时钟SCLK=1
JB MISO,REC6 ;芯片到未
CLR SCLK ;时钟SCLK=0
SETB SS ;关片选
ACALL STOPP ;停止当前操作
PLAY3: JNB STOP,REC6 ;中断放音
JB AN,PLAY3 ;等待AN=0
AJMP PLAY1 ;顺序放音
;ISD上电 << POWERUP >>
UP: MOV A,#20H ;发00100 XXXXXXXXXXX
ACALL ISDX ;
SETB SS ;关片选
ACALL YS50 ;50mS延时
ACALL YS50 ;50mS延时
RET ;
;停止当前操作<< STOP >> 8位
STOPP: MOV A,#30H ;发 0X11 0XXX
ACALL ISDX ;
SETB SS ;关片选
ACALL YS50 ;50mS延时
ACALL YS50 ;50mS延时
RET ;
;停止当前操作掉电<< STOPPWRDN >> 8位
DSTOP: MOV A,#10H ;发0X010 XXXXXXXXXX
ACALL ISDX ;
SETB SS ;关片选
ACALL YS50 ;50mS延时
ACALL YS50 ;50mS延时
RET ;
;ISD3300,4003 SPI写入程序 8位 数据在A
ISDX: CLR SS ;开片选
MOV R6,#8 ;
CLR SCLK ;时钟SCLK=0
ISD1: MOV C,ACC.0 ;
MOV MOSI,C ;数据写 MOSI
SETB SCLK ;时钟SCLK=1
RR A ;
CLR SCLK ;时钟SCLK=0
DJNZ R6,ISD1 ;
RET ;
;**** 10mS延时 ****
YS1: MOV TMOD,#01H ;
MOV TH0,#0D8H ;10mS延时初值置入
MOV TL0,#0F0H ;(65536-X)*1=10MS
SETB TR0 ;65536-(10000/1)=D8F0H
JNB TF0,$ ;
CLR TF0 ;
CLR TR0 ;
RET ;
;**** 50mS延时 ****
YS50: MOV TMOD,#01H ;
MOV TH0,#3CH ;50mS延时初值置入
MOV TL0,#0B0H ;(65536-X)*1=50MS
SETB TR0 ;65536-(50000/1)
JNB TF0,$ ;
CLR TF0 ;
CLR TR0 ;
RET ;
END ;

附:ISD4004的程序改动注明:
SETREC: ;指定地址录音
MOV 20H,#00H ;低八为地址
MOV 21H,#00H ;高八位地址
MOV 22H,#0a0H ;操作码
MOV A,20H
ACALL ISDX
MOV A,21H
ACALL ISDX
MOV A,22H
ACALL ISDX
SETB SS
指定地址录音(SETPLAY)和指定地址快进(SETMC)的改动与上述相同

ISD4000-89c51开发板C程序示例

//*****************************************************
//      ISD4002-89c51开发板演示例程    C51版本        *
//              作者:中青世纪       Lell             *
//                     2008.2.27                      *
//                                                    *
//      更多ISD4000使用心得请登陆中青世纪论坛         *
//        http://www.atvoc.com/bbs                    *
//                                                    *
//*****************************************************
#include <reg51.h>
sbit SS   =     P1^0;              //片选
sbit SCLK =     P1^1;              //ISD4003时钟
sbit MOSI =     P1^2;              //数据输入
sbit MISO =     P1^3;              //数据输出
sbit LED =     P1^7;              //指示灯
sbit ISD_INT=   P3^2;           //中断
sbit AN =     P1^6;              //执行
sbit STOP =     P1^5;             //复位
sbit PR =     P1^4;              //PR=1录音? PR=0放音
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=0x18;
TR0=1;
while(TF0!=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_counter<8;isx_counter++) //先发低位再发高位,依次发送。
{ if ((isdx&0x01)==1)
MOSI=1;
else
MOSI=0;
isdx=isdx>>1;
SCLK=1;
delay(2);

   SCLK=0;
delay(2);
}
}

//*******************************
//发送stop指令
//*******************************
void isd_stop(void)
{   delay(10);
spi_send(0x30);
SS=1;
delayms(50);
}
//*******************************
//发送上电指令,并延迟50ms
//*******************************
void isd_pu(void)
{  delay(10);
SS=0;
spi_send(0x20);
SS=1;
delayms(50);
}
//*******************************
//发送掉电指令,并延迟50ms
//*******************************

void 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(unsigned 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;
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,返回1
}
else
{ SCLK=0;
SS =1;         //关闭spi通信端
isd_stop();     //发送stop指令
return 0;     //OVF为0,返回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上电并延迟50ms
isd_pd();
isd_pu();

    if (PR==1)     //如果PR=1则转入录音部分
{
delayms(500);     //延迟录音

     isd_setrec(0x00,0x00);     //发送0x0000h地址的setplay指令
do
{ isd_rec();    //发送rec指令
while(AN==0)    //等待录音完毕
{if (ISD_INT==0)     //如果芯片溢出,进行LED闪烁提示,
isd_overflow();    //如果取消录音(松开AN键)则停止录音,芯片复位
}

     if (ISD_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);

    }
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=chk_isdovf())         //检查芯片是否溢出 ,如溢出则停止放音,芯片复位
break;
while(AN==1)     //等待AN键再次按下
{if (STOP==0)
break;
if(AN==0)
delayms(20);
}
}while(AN==0);     // AN键再次按下,播放下一段语音
}

isd_stop();
isd_pd();
}
}
注意:与ISD4002/03不同的是,由于ISD4004芯片的语音地址是16位,在发送带地址指令(如setplay,setrec,setmc)时,需要先发送两个字节的地址信息,再发送一个字节的命令字,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;
}

1、 本站不保证以上观点正确,就算是本站原创作品,本站也不保证内容正确。
2、如果您拥有本文版权,并且不想在本站转载,请书面通知本站立即删除并且向您公开道歉! 以上可能是本站收集或者转载的文章,本站可能没有文章中的元件或产品,如果您需要类似的商品请 点这里查看商品列表!