有没有高人有51单片机与ISD4004语音芯片的程序可以给我发一下,不甚感激,邮箱2396427729@qq.com
展开全部
/**************************************************************************
* 说明: ISD4004在自己焊接的实物板上烧录声音用。
*修改时间:2011-4-19 22:56:53
*注意:由于用到STC单片机的P4端口以及P47端口,所以在使用STC_ISP下载程序是要把‘
选项’中的ALE pin 用作P4.5选上。
**************************************************************************/
//#include <reg52.h>
#include<STC89C51RC_RD_PLUS.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P2^0;//液晶数据命令选择端
sbit lcden=P2^1;//液晶使能端
sbit SS=P3^4;
sbit MOSI=P3^5;
sbit MISO=P3^6;
sbit SCLK=P3^7;
sbit K1=P4^4;
sbit K2=P4^5;
sbit K3=P4^6;
void delayms(uchar ms);
uchar code table1[]={"ISD4004 R/W OK "};
uchar code table2[]={"Status:Recording"};
uchar code table3[]={"Status:Playing "};
uchar code table4[]={"Status: Stop "};
/*****************************************************************************
函数名:void delay(uint z)
作 用:延时函数
/*******************************************************-*********************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*****************************************************************************
函数名:void write_com(uchar com)
作 用:向液晶屏写命令
/*******************************************************-*********************/
void write_com(uchar com)
{
lcdrs=0;
lcden=0;
P0=com;
delay(3);
lcden=1;
delay(3);
lcden=0;
}
/*****************************************************************************
函数名:write_date(uchar date);
作 用:向液晶屏写数据
/*****************************************************************************/
void write_date(uchar date)
{
lcdrs=1;
lcden=0;
P0=date;
delay(3);
lcden=1;
delay(3);
lcden=0;
}
/*****************************************************************************
函数名:init()
作 用:液晶屏初始化函数
/*******************************************************-*********************/
void init()
{
uchar num;
lcden=0;
write_com(0x38);//1602液晶初始化
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<17;num++) //写入液晶固定部分显示
{
write_date(table1[num]);
delay(5);
}
}
/*****************************************************************************
函数名:void play(uint addr)
作 用:放音函数,放音地址由addr决定
/*******************************************************-*********************/
void play(uint addr)
{ uint y;
SS=0;
MOSI=0;//发送开始
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0x20>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}//发送结束
SS=1;//上电结束
delayms(50);
SS=0;
MOSI=0;//发送地址
SCLK=0;
for(y=0;y<16;y++)
{
SCLK=0;
if((addr>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}//发送地址结束
MOSI=0;//放音
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0xe0>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}
SS=1;
SS=0;
MOSI=0;//放音
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0xf0>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}
SS=1; }
/*****************************************************************************
函数名:void rec(addr)
作 用:录音子函数,录音地址由addr决定
/*******************************************************-*********************/
void rec(addr)
{ uint y;
SS=0;
MOSI=0;//发送开始
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0x20>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}//发送结束
SS=1;//上电结束
delayms(50);
SS=0;
MOSI=0;//发送开始
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0x20>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}//发送结束
SS=1;//上电结束
delayms(50);
delayms(50);
SS=0;
MOSI=0;//发送地址
SCLK=0;
for(y=0;y<16;y++)
{
SCLK=0;
if((addr>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}//发送地址结束
MOSI=0;
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0xa0>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}
SS=1;
SS=0;
MOSI=0;
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0xb0>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}
SS=1; }
/*****************************************************************************
函数名:void stop()
作 用:停止放音
/*******************************************************-*********************/
void stop()
{
uchar y;
SS=1;
SS=0;
MOSI=0;//放音
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0x30>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}
SS=1;
}
/*****************************************************************************
函数名:void delayms(uint z)
作 用:延时函数
/*******************************************************-*********************/
void delayms(uchar ms)
{
uchar j;
while(ms--)
{
for(j = 0; j < 120; j++);
}
}
/*****************************************************************************
函数名:keyscan()
作 用:按键扫描
/*******************************************************-*********************/
keyscan()
{
uchar i;
if(K1==0)
{delayms(10);
while(K1==0); ///松手判断
write_com(0x80+0x40);
for(i=0;i<16;i++)
{
write_date(table2[i]);
delay(5);
}
/*****************/
rec(0x600); //修改此处地址,进行录音
}
if(K2==0)
{delayms(10);
while(K2==0);
write_com(0x80+0x40);
for(i=0;i<16;i++)
{
write_date(table3[i]);
delay(5);
}
/**************/
play(0x600);
}
if(K3==0)
{delayms(10);
while(K3==0);
write_com(0x80+0x40);
for(i=0;i<15;i++)
{
write_date(table4[i]);
delay(5);
}
stop();
}
}
/*****************************************************************************
函数名:main()
作 用:主函数
/*******************************************************-*********************/
void main()
{ init();
while(1)
{
keyscan();
// play(0x1000);
// while(1);
}
}
* 说明: ISD4004在自己焊接的实物板上烧录声音用。
*修改时间:2011-4-19 22:56:53
*注意:由于用到STC单片机的P4端口以及P47端口,所以在使用STC_ISP下载程序是要把‘
选项’中的ALE pin 用作P4.5选上。
**************************************************************************/
//#include <reg52.h>
#include<STC89C51RC_RD_PLUS.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P2^0;//液晶数据命令选择端
sbit lcden=P2^1;//液晶使能端
sbit SS=P3^4;
sbit MOSI=P3^5;
sbit MISO=P3^6;
sbit SCLK=P3^7;
sbit K1=P4^4;
sbit K2=P4^5;
sbit K3=P4^6;
void delayms(uchar ms);
uchar code table1[]={"ISD4004 R/W OK "};
uchar code table2[]={"Status:Recording"};
uchar code table3[]={"Status:Playing "};
uchar code table4[]={"Status: Stop "};
/*****************************************************************************
函数名:void delay(uint z)
作 用:延时函数
/*******************************************************-*********************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*****************************************************************************
函数名:void write_com(uchar com)
作 用:向液晶屏写命令
/*******************************************************-*********************/
void write_com(uchar com)
{
lcdrs=0;
lcden=0;
P0=com;
delay(3);
lcden=1;
delay(3);
lcden=0;
}
/*****************************************************************************
函数名:write_date(uchar date);
作 用:向液晶屏写数据
/*****************************************************************************/
void write_date(uchar date)
{
lcdrs=1;
lcden=0;
P0=date;
delay(3);
lcden=1;
delay(3);
lcden=0;
}
/*****************************************************************************
函数名:init()
作 用:液晶屏初始化函数
/*******************************************************-*********************/
void init()
{
uchar num;
lcden=0;
write_com(0x38);//1602液晶初始化
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<17;num++) //写入液晶固定部分显示
{
write_date(table1[num]);
delay(5);
}
}
/*****************************************************************************
函数名:void play(uint addr)
作 用:放音函数,放音地址由addr决定
/*******************************************************-*********************/
void play(uint addr)
{ uint y;
SS=0;
MOSI=0;//发送开始
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0x20>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}//发送结束
SS=1;//上电结束
delayms(50);
SS=0;
MOSI=0;//发送地址
SCLK=0;
for(y=0;y<16;y++)
{
SCLK=0;
if((addr>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}//发送地址结束
MOSI=0;//放音
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0xe0>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}
SS=1;
SS=0;
MOSI=0;//放音
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0xf0>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}
SS=1; }
/*****************************************************************************
函数名:void rec(addr)
作 用:录音子函数,录音地址由addr决定
/*******************************************************-*********************/
void rec(addr)
{ uint y;
SS=0;
MOSI=0;//发送开始
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0x20>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}//发送结束
SS=1;//上电结束
delayms(50);
SS=0;
MOSI=0;//发送开始
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0x20>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}//发送结束
SS=1;//上电结束
delayms(50);
delayms(50);
SS=0;
MOSI=0;//发送地址
SCLK=0;
for(y=0;y<16;y++)
{
SCLK=0;
if((addr>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}//发送地址结束
MOSI=0;
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0xa0>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}
SS=1;
SS=0;
MOSI=0;
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0xb0>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}
SS=1; }
/*****************************************************************************
函数名:void stop()
作 用:停止放音
/*******************************************************-*********************/
void stop()
{
uchar y;
SS=1;
SS=0;
MOSI=0;//放音
SCLK=0;
for(y=0;y<8;y++)
{
SCLK=0;
if((0x30>>y)&0x01)MOSI=1;
else MOSI=0;
_nop_();
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
_nop_();
}
SS=1;
}
/*****************************************************************************
函数名:void delayms(uint z)
作 用:延时函数
/*******************************************************-*********************/
void delayms(uchar ms)
{
uchar j;
while(ms--)
{
for(j = 0; j < 120; j++);
}
}
/*****************************************************************************
函数名:keyscan()
作 用:按键扫描
/*******************************************************-*********************/
keyscan()
{
uchar i;
if(K1==0)
{delayms(10);
while(K1==0); ///松手判断
write_com(0x80+0x40);
for(i=0;i<16;i++)
{
write_date(table2[i]);
delay(5);
}
/*****************/
rec(0x600); //修改此处地址,进行录音
}
if(K2==0)
{delayms(10);
while(K2==0);
write_com(0x80+0x40);
for(i=0;i<16;i++)
{
write_date(table3[i]);
delay(5);
}
/**************/
play(0x600);
}
if(K3==0)
{delayms(10);
while(K3==0);
write_com(0x80+0x40);
for(i=0;i<15;i++)
{
write_date(table4[i]);
delay(5);
}
stop();
}
}
/*****************************************************************************
函数名:main()
作 用:主函数
/*******************************************************-*********************/
void main()
{ init();
while(1)
{
keyscan();
// play(0x1000);
// while(1);
}
}
唯创智能
2024-05-10 广告
2024-05-10 广告
各行业语音芯片如何选型?目前各行用的较多的是8脚语音芯片,因为电路体积小、应用方便,而且价格比较低,一般为OTP类型的较为多,各行业均会优先考虑该类型。8脚语音芯片主要是指软封装为八个引脚,硬封装为DIP8或者SOP8的语音芯片,常见的八脚...
点击进入详情页
本回答由唯创智能提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询