ISD4004語(yǔ)音程序
- ///////////ISD4004語(yǔ)音播放部分/////////////////////////////
- ////當(dāng)按下P3.5鍵時(shí),從指定地址開(kāi)始錄音
- /// 當(dāng)按下P3.6鍵時(shí),從指定地址開(kāi)始放音
- /// 當(dāng)按下P3.7鍵時(shí),停止當(dāng)前的操作
- /// 程序中的錄放停部分已做成子函數(shù),可以直接調(diào)用, 只需要輸入錄音的地址就行
- // 錄音地址的設(shè)定與芯片型號(hào)有關(guān)系,以ISD4004-16為例,ISD40044-16錄音時(shí)間為16
- // 分鐘,即16*60=960S, 根據(jù)4004的資料,960秒可分為2400段,也就是1S的段數(shù)為
- // 25段,即從,0000-0019H的內(nèi)容為1S,
- ///作者:長(zhǎng)沙致望科技電子公司 WWW.CSMCU.COM
- ///版本:V1.0(2008.12.1)
- //實(shí)驗(yàn)使用注意,按錄音鍵,要切換到放音時(shí),可按停止再放音,也可以先按一下放音鍵,再按一次放音鍵,那可
- //原因:本程序在放音前,沒(méi)有做停止和下電處理,感興趣的朋友可以直接到停止部分加到放音子函數(shù)中。
- #include
- #include
- #defineucharunsignedchar
- #defineuintunsignedint
- ////////定義放音命令,定義常量//////
- #defineISDPOWERUP 0X20//ISD4004上電
- #defineISDSTOP 0X10//ISD4004下電
- #defineOPERSTOP 0X30//ISD4004停止當(dāng)前操作
- #definePLAYSET 0XE0//ISD4004從指定地址開(kāi)始放音
- #definePLAYCUR 0XF0//ISD4004從當(dāng)前地址開(kāi)始放音
- #defineRECSET 0XA0//ISD4004從指定地址開(kāi)始錄音
- #defineRECCUR 0XB0//ISD4004從當(dāng)前地址開(kāi)始錄音
- sbit SS=P1^4;//LOW IS ACTIVELY
- sbit MOSI=P1^5;
- //sbit MISO=P1^7;
- sbit SCLK=P1^7;
- sbit K1=P3^5;
- sbit K2=P3^6;
- sbit K3=P3^7;
- sbitINT=P3^2;
- sbit LED1=P1^0;
- sbit LED2=P1^3;
- voiddelayms(uchar ms);
- uint addr;////全局變量//// 放音地址
- ////////////////放音部分子程序,放音地址由ADDR決定////
- voidplay()
- {
- uint y;
- SS=0;
- MOSI=0;//發(fā)送開(kāi)始
- SCLK=0;
- for(y=0;y<8;y++)//上電
- {
- SCLK=0;
- if((0x20>>y)&0x01)MOSI=1;
- elseMOSI=0;
- _nop_();
- _nop_();
- _nop_();
- SCLK=1;
- _nop_();
- _nop_();
- _nop_();
- }//發(fā)送結(jié)束
- SS=1;//上電結(jié)束
- delayms(50);
- SS=0;
- MOSI=0;//發(fā)送地址
- SCLK=0;
- for(y=0;y<16;y++)
- {
- SCLK=0;
- if((addr>>y)&0x01)MOSI=1;
- elseMOSI=0;
- _nop_();
- _nop_();
- _nop_();
- SCLK=1;
- _nop_();
- _nop_();
- _nop_();
- }//發(fā)送地址結(jié)束
- MOSI=0;//放音
- SCLK=0;
- for(y=0;y<8;y++)
- {
- SCLK=0;
- if((0xe0>>y)&0x01)MOSI=1;
- elseMOSI=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;
- elseMOSI=0;
- _nop_();
- _nop_();
- _nop_();
- SCLK=1;
- _nop_();
- _nop_();
- _nop_();
- }
- SS=1;
- }
- //////////////////////////lu音部分子程序,地址由ADDR決定/////////////////////////
- voidrec()
- {uint y;
- SS=0;
- MOSI=0;//發(fā)送開(kāi)始
- SCLK=0;
- for(y=0;y<8;y++)
- {
- SCLK=0;
- if((0x20>>y)&0x01)MOSI=1;
- elseMOSI=0;
- _nop_();
- _nop_();
- _nop_();
- SCLK=1;
- _nop_();
- _nop_();
- _nop_();
- }//發(fā)送結(jié)束
- SS=1;//上電結(jié)束
- delayms(50);
- SS=0;
- MOSI=0;//發(fā)送開(kāi)始
- SCLK=0;
- for(y=0;y<8;y++)
- {
- SCLK=0;
- if((0x20>>y)&0x01)MOSI=1;
- elseMOSI=0;
- _nop_();
- _nop_();
- _nop_();
- SCLK=1;
- _nop_();
- _nop_();
- _nop_();
- }//發(fā)送結(jié)束
- SS=1;//上電結(jié)束
- delayms(50);
- delayms(50);
- SS=0;
- MOSI=0;//發(fā)送地址
- SCLK=0;
- for(y=0;y<16;y++)
- {
- SCLK=0;
- if((addr>>y)&0x01)MOSI=1;
- elseMOSI=0;
- _nop_();
- _nop_();
- _nop_();
- SCLK=1;
- _nop_();
- _nop_();
- _nop_();
- }//發(fā)送地址結(jié)束
- MOSI=0;
- SCLK=0;
- for(y=0;y<8;y++)
- {
- SCLK=0;
- if((0xa0>>y)&0x01)MOSI=1;
- elseMOSI=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;
- elseMOSI=0;
- _nop_();
- _nop_();
- _nop_();
- SCLK=1;
- _nop_();
- _nop_();
- _nop_();
- }
- SS=1;
- }
- ////////////////////////////////////
- ////////////////////////////////
- voidstop()
- {
- uchar y;
- SS=1;
- SS=0;
- MOSI=0;//放音
- SCLK=0;
- for(y=0;y<8;y++)
- {
- SCLK=0;
- if((0x30>>y)&0x01)MOSI=1;
- elseMOSI=0;
- _nop_();
- _nop_();
- _nop_();
- SCLK=1;
- _nop_();
- _nop_();
- _nop_();
- }
- SS=1;
- }
- ////////////////////////////////////
- ////////////////////////////////////void press_key()
- voiddelayms(uchar ms)
- // 延時(shí)子程序
- {
- uchar j;
- while(ms--)
- {
- for(j=0;j<120;j++);
- }
- }
- ////////////////////////////////
- ////////////////////////////////////
- voidmain()
- {
- P1=0xff;
- P2=0XFF;
- P3=0XFF;
- while(1)
- {
- LED1=INT;
- LED2=0;
- if(K1==0)
- {
- delayms(10);
- while(K1==0);///松手判斷
- LED2=1;
- addr=0X05;/////從0X05單元開(kāi)始
- rec();
- P1=0XFF;
- while(K1==1);
- delayms(10);
- while(K1==0);///松手判斷
- }
- if(K2==0)
- {
- delayms(10);
- while(K2==0);
- addr=0X05;
- play();
- P1=0XFF;
- }
- if(K3==0)
- {
- delayms(10);
- while(K3==0);
- LED1=1;
- LED2=1;
- stop();
- P1=0XFF;
- }
- }
- }
評(píng)論