该程序中的录音地址是我的ISD1760中录的,你应该先录音到ISD1760中,在修改录音地址才能准确播放出来。对与SPI模式录的音可以通过按键模式放出来,这也是本人最近才知道的。在处理ISD1760录放音时,最容易出现地址错误导致录不进去,这是可以通过按键模式检测是否是地址错误。按一下播放键,如果led灯闪两下,说明没问题,如果是连续闪7下,说明地址错误,需完全擦出芯片才能正确录音,否则根本录不进去。这个长时间擦出时间大约是长按擦除键不放,等led灯闪烁7下之后继续按住不放,过几秒后喇叭里面会传来“滋滋”的声音,这时表示芯片完全擦出成功。
#include <mega128.h>
#include <delay.h>
#define uchar unsigned char
#define uint unsigned int
#define SS PORTE.0
#define SCLK PORTE.1
#define MOSI PORTE.2
#define MISO PORTE.3
uchar nu= 99 ;
/*-----------------------1#--录音地址列表-------------------------------*/
uint Rec_Adr[]={0x0021,0x0022,0x0025,0x0026,0x0029,0x002a,0x002d,0x002e,
// 0 1 2 3
0x0031,0x0032,0x0035,0x0037,0x0039,0x003a,0x003d,0x003e,
// 4 5 6 7
0x0040,0x0042,0x0045,0x0046,0x0048,0x004a,0x004d,0x004e,
// 8 9 十 百
// 8 9 10 11
0x0051,0x0052,0x0055,0x0056,0x0059,0x005a,0x005d,0x005f,
// 千 点 米 厘米
// 12 13 14 15
0x0061,0x0063,0x0065,0x0068,0x006a,0x006c,0x006f,0x0070,
// 毫米 小时 分 秒
// 16 17 18 19
0x0073,0x0074,0x0077,0x007a,0x007c,0x007f,0x0081,0x0084,
// 度 长度 距离 角度
// 20 21 22 23
0x0086,0x0088,0x008a,0x008d,0x008f,0x0092,0x0094,0x0097,
// 颜色 红色 蓝色 黄色
// 24 25 26 27
0x0099,0x00a2,0x00a4,0x00a8,0x00aa,0x00ae,0x00b0,0x00b6};
//距离前方障碍物 任务完成 谢谢大家 演示开始
// 28 29 30 31
/*************************************************************************/
//变量定义
uchar statu; //状态位
uint StartAdr=0x0010,EndAdr=0x01df; //录放音起始地址 与终止地址
uint Play_rec_num[3]; //录音播放表
void Play(uchar Play_flag); //放音函数
void Rec(); //录音函数
uchar ISD_SendData(uchar BUF_ISD); //SPI发送函数
void Erase_All(); //全部擦除函数
void delay_SPI(uint Start,uint End); //SPI放音,录音结束等待函数
void Comput_Num(uint num); //数据位分离函数
void Play_3Num(uint Data); //播放三位数据函数
void main()
{
uchar i;
DDRE=0xff;
PORTE=0xff;
while(1)
{ //Erase_All();
delay_ms(1300);
//Rec();
Play_3Num(nu); //播放三位数据
//Play(nu);
nu++;
}
}
/********************************
**********三位数据播报函数
********************************/
void Play_3Num(uint Data)
{
Comput_Num(Data); //计算播报数据
if(Data>99) //数据是三位数
{
Play(Play_rec_num[0]); //播放百位数据
Play(11); //播放百位
if(Play_rec_num[1]==0) //十位数据为0
if(Play_rec_num[2]!=0) //个位数据不为零
{
Play(0); //播放 0
Play(Play_rec_num[2]); //播放个位数据
}
else ; //十位数据为零,个位数据为零
else //十位数据不为零
{
Play(Play_rec_num[1]); //播放十位数据
Play(10); //播放十位
if(Play_rec_num[2]!=0) //个位数据不为0
Play(Play_rec_num[2]); //播放个位数据
}
}
else if(Data>9) //数据是两位数
{
if(Play_rec_num[1]==1) //十位为1
{
Play(10); //播放十位
}
else if(Play_rec_num[1]!=0) //十位数据不为0,也不为1
{
Play(Play_rec_num[1]); //播放十位数据
Play(10); //播放十位
}
if(Play_rec_num[2]!=0) //个位数据不为0
Play(Play_rec_num[2]); //播放个位数据
}
else
Play(Play_rec_num[2]); //数据为一位数,直接播放个位数据
}
/***********************************
*********三位数据播报取值函数
***********************************/
void Comput_Num(uint num)
{
Play_rec_num[0]=num/100; //分离百位数
Play_rec_num[1]=num%100/10; //分离十位数据
Play_rec_num[2]=num%10; //分离个位数据
}
void Rec() //16个地址是2秒。
{
ISD_SendData(0x03);// RESET
ISD_SendData(0x00);
SS=1;
delay_ms(50);
ISD_SendData(0x01);// pu
ISD_SendData(0x00);
SS=1;
delay_ms(50);
ISD_SendData(0x45);// WR_APC
ISD_SendData(0x40);
ISD_SendData(0x04); //
SS=1;
delay_ms(50);
statu=0;
while((statu&0x01)==0x00)
{
ISD_SendData(0x05);// READSTATU
ISD_SendData(0x00);
statu=ISD_SendData(0x00); //
SS=1;
}
delay_ms(50);
ISD_SendData(0x81);// SETREC
ISD_SendData(0x00);
ISD_SendData(StartAdr&0x00ff);//
ISD_SendData(StartAdr>>8);
ISD_SendData(EndAdr&0x00ff);//
ISD_SendData(EndAdr>>8);
ISD_SendData(0x00);
SS=1;
ISD_SendData(0x05);// READSTATU
ISD_SendData(0x00);
statu=ISD_SendData(0x00); //
SS=1;
while((statu&0x08)==0x08)
{
ISD_SendData(0x05);// READSTATU
ISD_SendData(0x00);
statu=ISD_SendData(0x00); //
SS=1;
}
ISD_SendData(0x07); //pd
ISD_SendData(0x00);
SS=1;
}
void Play(uchar Play_flag) //形参=1放1段,2放2段,3放3段,4放4段。16个地址是2秒。
{
uint start,end;
StartAdr=Rec_Adr[Play_flag*2];
EndAdr=Rec_Adr[Play_flag*2+1];
start=StartAdr;
end=EndAdr;
ISD_SendData(0x03);// RESET
ISD_SendData(0x00);
SS=1;
delay_ms(20);
ISD_SendData(0x01);// pu
ISD_SendData(0x00);
SS=1;
delay_ms(20);
ISD_SendData(0x45);// WR_APC
ISD_SendData(0x08);
ISD_SendData(0x0C); //
SS=1;
delay_ms(20);
statu=0;
while((statu&0x01)==0x00)
{
ISD_SendData(0x05);// READSTATU
ISD_SendData(0x00);
statu=ISD_SendData(0x00); //
SS=1;
}
delay_ms(20);
// ISD_SendData(0x49); //CHECK_mem
// ISD_SendData(0x00); //
// SS=1;
ISD_SendData(0x80);// SETPLAY
ISD_SendData(0x00);
ISD_SendData(StartAdr&0x00ff);//
ISD_SendData(StartAdr>>8);
ISD_SendData(EndAdr&0x00ff);//
ISD_SendData(EndAdr>>8);
ISD_SendData(0x00);
SS=1;
ISD_SendData(0x05);// READSTATU
ISD_SendData(0x00);
statu=ISD_SendData(0x00); //
SS=1;
// while((statu&0x04)==0x04)
// {
// ISD_SendData(0x05);// READSTATU
// ISD_SendData(0x00);
// statu=ISD_SendData(0x00); //
// SS=1;
// }
delay_SPI(start,end);
ISD_SendData(0x07); //pd
ISD_SendData(0x00);
SS=1;
}
void delay_SPI(uint Start,uint End)
{
uint len;
len=End-Start; //地址差值
len*=230; //转换为时间 ms
delay_ms(len);
}
void I_delay(void)
{
uchar i;
for(i=0;i<1;i++);
}
/**************************************************************************
* 函数原型: uchar ISD_SendData(uchar BUF_ISD);
* 功 能: 发送数据 返回接收数据
**************************************************************************/
uchar ISD_SendData(uchar BUF_ISD)
{
uchar i,dat;
dat=BUF_ISD;
SCLK=1;
SS=0;
for(i=0;i<8;i++)
{
SCLK=0;
I_delay();
if(dat&0x01)
{
MOSI=1;
}
else
{
MOSI=0;
}
dat>>=1;
if(MISO)
{
dat|=0x80;
}
SCLK=1;
I_delay();
}
MOSI=0;
// SS=1;
return(dat);
}
/**************************************************************************
* 函数原型: void Erase_All();
* 功 能: 全部删除
**************************************************************************/
void Erase_All()
{
ISD_SendData(0x42);
ISD_SendData(0x00);
SS=1;
delay_ms(20); //延迟10ms
}