|
发表于 2014-11-28 19:17:01
|
显示全部楼层
我帮lz把代码放上来
- //ISD4004是一款不错的语音录放IC,和单片机通信采用SPI方式,以下为模块提供的源程序/////////ISD4004语音播放部分/////////////////////////////
- ////当按下P3.5键时,从指定地址开始录音
- /// 当按下P3.6键时,从指定地址开始放音
- /// 当按下P3.7键时,停止当前的操作
- /// 程序中的录放停部分已做成子函数,可以直接调用, 只需要输入录音的地址就行
- // 录音地址的设定与芯片型号有关系,以ISD4004-16为例,ISD40044-16录音时间为16
- // 分钟,即16*60=960S, 根据4004的资料,960秒可分为2400段,也就是1S的段数为
- // 2.5段,即从,0000-0019H的内容为10S,
- ///作者:长沙致望科技电子公司 WWW.CSMCU.COM
- ///版本:V1.0(2008.12.1)
- #include <reg51.h>
- #include <intrins.h>
- #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从当前地址开始放音
- #define RECSET 0XA0 //ISD4004从指定地址开始录音
- #define RECCUR 0XB0 //ISD4004从当前地址开始录音
- sbit SS=P2^0; //LOW IS ACTIVELY
- sbit MOSI=P2^1;
- sbit MISO=P2^2;
- sbit SCLK=P2^3;
- sbit K1=P1^0;
- sbit K2=P1^1;
- sbit K3=P1^2;
- //sbit LED1=P0^1;
- //sbit LED2=P0^2;
- sbit RS =P0^0;
- sbit RW =P0^1;
- sbit EN =P0^2;
- unsigned char code tab0[]="0123456789";
- unsigned char code tab1[]="状态";
- unsigned char code tab2[]="地址";
- unsigned char code tab4[]="唯见长江天际流。";
- unsigned char code tab5[]="温度";
- void delayms(uchar ms);
- uchar add=0,status=0;////全局变量//// 放音地址
- uint addr[]={0x05,0x1e,0x37,0x50};
- uint nnewaddr=0;
- ////////////////放音部分子程序,放音地址由ADDR决定////
- uchar play(uint addrp)
- { 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((addrp>>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;*/
- return(1); }
- //////////////////////////lu音部分子程序,地址由ADDR决定/////////////////////////
- uchar rec(uint addrr)
- { 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((addrr>>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;*/
- return(2); }
- ////////////////////////////////////
- ////////////////////////////////
- uchar 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;
- return(0);}
- ////////////////////////////////////
- //////////////////////////lu音部分子程序,地址由ADDR决定/////////////////////////
- uint ad()//提取播放的位置
- { uint y,newaddr;
- 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=1;
- _nop_();
- SCLK=0;
- _nop_();
- _nop_();
- if(MISO==0)newaddr&=0x7fff;//接受地址
- else newaddr|=0x8000;
- newaddr>>=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;*/
- return(newaddr); }
- ////////////////////////////////////
- ////////////////////////////////////
- void delayms(uchar ms)
- // 延时子程序
- {
- uchar j;
- while(ms--)
- {
- for(j=0;j<120;j++);
- }
- }
- ////////////////////////////////
- void Delay(unsigned int time)
- {
- while(time--);
- }
- //=======================================================================
- //函数名:
- //函数功能:写数据
- //作者: //日期:2007.8.12
- //=======================================================================
- void write_data(uchar date)
- {
- uchar i,j,tem=0xfa;
- RS=1;
- Delay(20);
- for(i=8;i>0;i--)
- {
- EN=0;
- RW=tem&0x80;
- EN=1;
- tem<<=1;
- }
- for(j=2;j>0;j--)
- for(i=8;i>0;i--)
- {
- if(i>4)
- {
- EN=0;
- RW=date&0x80;
- EN=1;
- date<<=1;
- }
- else
- {
- EN=0;
- RW=0;
- EN=1;
- }
- }
- RS=0;
- }
- //=======================================================================
- //函数名:
- //函数功能:写命令
- //作者://日期:2007.8.12
- //=======================================================================
- void write_com(uchar Command)
- {
- uchar i,j,tem=0xf8;
- RS=1;
- Delay(20);
- for(i=8;i>0;i--)
- {
- EN=0;
- RW=tem&0x80;
- EN=1;
- tem<<=1;
- }
- for(j=2;j>0;j--)
- for(i=8;i>0;i--)
- {
- if(i>4)
- {
- EN=0;
- RW=Command&0x80;
- EN=1;
- Command<<=1;
- }
- else
- {
- EN=0;
- RW=0;
- EN=1;
- }
- }
- RS=0;
- }
- ///////////////////////////////////////////////////
- /*****************初始化LCD*********************/
- void lcd_init( void )
- {
- //TMOD=0x01;
- //TH0=(65536-50000)/256;
- //TL0=(65536-50000)%256;
- //EA=1;
- //ET0=1;
- //TR0=1;
- write_com(0x30);
- write_com(0x03);
- write_com(0x0C);
- write_com(0x01);
- write_com(0x06);
- }
- void lcd_clear_txt( void )
- {
- unsigned char i;
- write_com(0x30);
- write_com(0x80);
- for(i=0;i<64;i++)
- write_data(0x20);
- }
- //=======================================================================
- //函数名:主函数
- //函数功能:
- //作者: //日期:2007.8.12
- //=======================================================================
- void disp(void)
- {
- uchar i;
- write_com(0x82);
- write_data(tab0[status/10]);
- write_data(tab0[status%10]);
- write_com(0x8a);
- write_data(tab0[add/10]);
- write_data(tab0[add%10]);
- // write_data('.');Delay(10);
- // write_data(tab5[c/100]);
- // write_data('C');
- write_com(0x98);
- write_data(tab0[nnewaddr/10000]);
- write_data(tab0[nnewaddr/1000%10]);
- write_data(tab0[nnewaddr/100%10]);
- write_data(tab0[nnewaddr/10%10]);
- write_data(tab0[nnewaddr%10]);
- // write_com(0x8a);
- // write_data(tab5[shi/10]);
- // write_data(tab5[shi%10]);
- // write_data(':');Delay(10);
- // write_data(tab5[fen/10]);
- // write_data(tab5[fen%10]);
- // write_data(':');Delay(10);
- // write_data(tab5[miao/10]);
- // write_data(tab5[miao%10]);
- write_com(0x88);
- for(i=0;i<4;i++)
- {
- write_data(tab2[i]);
- }
- write_com(0x80);
- for(i=0;i<4;i++)
- {
- write_data(tab1[i]);
- }
- /* write_com(0x90);
- for(i=0;i<16;i++)
- {
- write_data(tab2[i]);
- }
- write_com(0x98);
- for(i=0;i<16;i++)
- {
- write_data(tab4[i]);
- }*/
- }
- ////////////////////////////////////
- void main()
- { Delay(1000);
- lcd_init();
- lcd_clear_txt();
- while(1)
- {if(K1==0)
- {delayms(50);
- while(K1==0);
- ///松手判断
- // LED1=0;
- // LED2=1;
- //addr=0X05;/////从0X05单元开始录音
- status=rec(addr[add]);
- P1=0XFF;}
- if(K2==0)
- {delayms(50);
- while(K2==0);
- // LED1=1;
- // LED2=0;
- // addr=0X05;//从0x05单元开始放音
- status=play(addr[add]);
- P1=0XFF;}
- if(K3==0)
- {delayms(50);
- while(K3==0);
- add++;
- if(add==4)
- add=0;
- // LED1=1;
- // LED2=1;
- status=stop();
- nnewaddr=ad();
- //停止录放
- P1=0XFF; }
-
- disp(); }
- }
复制代码 |
|