完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
//#include "stc15f2k60s2.h"
#include "reg51.h" #include #define uchar unsigned char #define uint unsigned int bit playbit,recbit; //定义两个位变量,放音和录音位 uint playcout,reccout; //放音和录音次数 ////////定义放音命令,定义常量////// #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从当前地址开始录音 ***it SS=P1^5; //定义引脚 ***it MOSI=P1^1; ***it MISO=P1^7; ***it SCLK=P1^4; ***it key1=P0^0; //时间 ***it key2=P0^1; //温度湿度 ***it key3=P0^2; //GPS ***it key4=P0^3; //录音 void delay(unsigned int i) //延时程序 { while(i--); } void delayms(uchar ms) { uchar j; while(ms--) { for(j = 0; j < 120; j++); } } /* void stop() //停止程序 { uchar y; SS=1; SS=0; //ss=0时芯片才是有效的 MOSI=0; //放音 SCLK=0; for(y=0;y<8;y++) { SCLK=0; if((0x30>>y)&0x01) //停止当前操作指令地址0x30,从最低位读取数据 MOSI=1; else MOSI=0; _nop_(); _nop_(); _nop_(); SCLK=1; //一个上升沿 时钟 _nop_(); _nop_(); _nop_(); } SS=1; } */ //////////////////////////lu音部分子程序,地址由ADDR决定///////////////////////// void luyin(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; } ////////////////放音部分子程序,放音地址由ADDR决定//// void fangyin(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; } //////////////////////////////// playsound() ///录放音子函数 { if(recbit) {recbit=0; switch(reccout) {case 1:{luyin(0x00);}break; case 2:{luyin(0x100);}break; case 3:{luyin(0x200);}break; case 4:{luyin(0x300);}break; } } } void scankey4() { playsound(); } void scankey3() { fangyin(0x100); } void scankey2() { fangyin(0x300); } void keyscan() { uchar value=0; P0=0x0f; value=P0&0x0f; if(value!=0x0f) { if(key2==0) { delay(10); while(key2==0) scankey2(); } if(key3==0) { delay(10); while(key3==0) scankey3(); } if(key4==0) { delay(10); while(key4==0) { recbit=1; reccout++; if(reccout>4) { reccout=0; break; } scankey4(); } } } } void main() { while(1) { keyscan(); } }
|
|
相关推荐
2个回答
|
|
改动完如下
#include #include #define uchar unsigned char #define uint unsigned int //=======分段录音首地址定义====================== #define ISD_ADDS1 0x0000 //录音存放地址1 #define ISD_ADDS2 0x0100 //录音存放地址2 #define ISD_ADDS3 0x0200 //录音存放地址3 #define ISD_ADDS4 0x0300 //录音存放地址4 #define ISD_ADDS5 0x0400 //录音存放地址5 //========ISD4004指令定义======================== #define POWER_UP 0x20 //上电指令 #define SET_PLAY 0xE0 //指定放音指令 #define PLAY 0xF0 //当前放音指令 #define SET_REC 0xA0 //指定录音指令 #define REC 0xB0 //当前录音指令 #define SET_MC 0xE1 //指定快进指令 #define MC 0xF1 //快进执行指令 #define STOP 0x30 //停止当前操作 #define STOP_WRDN 0x10 //停止当前操作并掉电 #define RINT 0x30 //读状态:OVF和EOM //=========ISD4004--c51接口定义================= ***it ISD_SS = P0^0; //片选 ***it ISD_MOSI = P0^1; //数据输入 ***it ISD_MISO = P0^2; //数据输出 ***it ISD_SCLK = P0^3; //ISD4004 时钟 ***it ISD_INT = P3^2; //溢出中断 ***it ISD_RAC = P3^3; //行地址时钟 //==========按键定义========================== ***it K1 = P3^7 ; //录音键 ***it K2 = P3^6; //放音键 ***it LED=P2^7; ***it K3=P3^5; ***it K4=P3^4; ***it K5=P3^3; //==========ISD4004函数定义=================== void ISD_SPI_Send8( uchar isdx8 ); //spi 串行发送子程序,8位数据,从低到高 void ISD_SPI_Send16( uint isdx16 ); //spi 串行发送子程序,16位数据.从低到高 uint ISD_SPI_Radd(void); //读取标行地址 void ISD_Stop(void); //发送 stop 指令 void ISD_PowerUp(void); //发送上电指令,并延迟 50ms void ISD_PowerDown(void); //发送掉电指令,并延迟 50ms void ISD_Play(void); //发送放音指令,并延迟 50ms void ISD_SetPlay(uint add); //发送指定放音指令,并延迟 50ms void ISD_Rec(void); //发送录音指令,并延迟 50ms void ISD_SetRec(uint add); //发送指定录音指令,并延迟 50ms uchar ISD_Chk_Isdovf(void); void PLAY_now(uchar add_sect); //按指定地址开始放音 void REC_now(uchar add_sect); //按指定地址开始录音 //========延时函数=========================== void Delay1Ms(uchar t); //延时t*1毫秒 void Delay(); //////////////////////////////////////////////////////////////////////// // 程序开始 // //////////////////////////////////////////////////////////////////////// /*******************************主程序*********************************/ main () { uchar i=0;//,j=0; while (1) { //=========================K1录音键================================ if(K1==0) //K1键按下。录音 { REC_now(i++); //录第一段 if(i>4) i = 0; while(K1==0) //等待录音完毕 { if (ISD_INT==0) //如果芯片OVF溢出,进行 蜂鸣器 提示,如果取消录音(松开 AN 键)则停止录音,芯片复 位 { while(K1==0) { LED=0; } } } ISD_Stop(); //发送停止命令 ISD_PowerDown(); } //============================K2放音键================================ if(K2==0) { Delay1Ms(10); if(K2==0) { PLAY_now(1); while(ISD_INT==1); ISD_Stop(); ISD_PowerDown(); } } if(K3==0) { Delay1Ms(10); if(K3==0) { PLAY_now(2); while(ISD_INT==1); ISD_Stop(); ISD_PowerDown(); } } if(K4==0) { Delay1Ms(10); if(K4==0) { PLAY_now(3); while(ISD_INT==1); ISD_Stop(); ISD_PowerDown(); } } if(K5==0) { Delay1Ms(10); if(K5==0) { PLAY_now(4); while(ISD_INT==1); ISD_Stop(); ISD_PowerDown(); } } /* if(K2==0) { PLAY_now(j++); //放第一段 if(j>4) j = 0; while(ISD_INT==1); //等待一段放音完毕的 EOM 中断信号 ISD_Stop(); //放音完毕,发送 stop 指令 ISD_PowerDown(); } */ } } void PLAY_now(uchar add_sect) { ISD_PowerUp(); //ISD 上电 Delay1Ms(50); switch (add_sect) //发送 setplay 指令,从 0x0000 地址开始放 { case 1: ISD_SetPlay(ISD_ADDS1);break; //发送地址的 SetRec 指令 case 2: ISD_SetPlay(ISD_ADDS2);break; //发送地址的 SetRec 指令 case 3: ISD_SetPlay(ISD_ADDS3);break; //发送地址的 SetRec 指令 case 4: ISD_SetPlay(ISD_ADDS4);break; //发送地址的 SetRec 指令 // case 5: ISD_SetPlay(ISD_ADDS5);break; //发送地址的 SetRec 指令 //case 6:…… } ISD_Play(); //发送放音指令 } void REC_now(uchar add_sect) { ISD_PowerUp(); //ISD 上电 Delay1Ms(50); //延迟录音 ISD_PowerUp(); //ISD 上电 Delay1Ms(100); //延迟录音 switch (add_sect) { case 1: ISD_SetRec(ISD_ADDS1);break; //发送地址的 SetRec 指令 case 2: ISD_SetRec(ISD_ADDS2);break; //发送地址的 SetRec 指令 case 3: ISD_SetRec(ISD_ADDS3);break; //发送地址的 SetRec 指令 case 4: ISD_SetRec(ISD_ADDS4);break; //发送地址的 SetRec 指令 // case 5: ISD_SetRec(ISD_ADDS5);break; //发送地址的 SetRec 指令 //case 6:…… } ISD_Rec(); //发送 rec 指令 } void ISD_SPI_Send8( uchar isdx8 ) { uchar i; ISD_SS = 0; //选中ISD4004 ISD_SCLK = 0; for(i=0;i<8;i++) //先发低位再发高位,依次发送。 { if ((isdx8 & 0x01) == 1) //发送最低位 ISD_MOSI = 1; else ISD_MOSI = 0; isdx8 >>= 1; //右移一位 ISD_SCLK = 1; //时钟下降沿发送 ISD_SCLK = 0; } } void ISD_SPI_Send16( uint isdx16 ) { uchar i; ISD_SS = 0; //选中ISD4004 ISD_SCLK = 0; for(i=0;i<16;i++) //先发低位再发高位,依次发送。 { if ((isdx16&0x0001)==1) //发送最低位 ISD_MOSI = 1; else ISD_MOSI = 0; isdx16 = isdx16 >> 1; //右移一位 ISD_SCLK=1; //时钟下降沿发送 ISD_SCLK=0; } } uint ISD_SPI_Radd(void) { uchar i; uint addsig; ISD_SS = 0; //选中ISD4004 ISD_SCLK = 0; //==============读16位地址================ for(i=0;i<16;i++) //读行地址 { ISD_SCLK = 1; //时钟下降沿数据移出ISD ISD_SCLK = 0; if (ISD_MISO == 1) addsig |= 0x8000; if (i<15) addsig >>= 1; //最先读出的是地址的低位,所以要左移,最后一次地址不用左移,否则地址溢出 } ISD_Stop(); //发送 stop 指令 ISD_SS = 1; //关闭 spi 通信端 return addsig; //返回地址值 } void ISD_Stop(void) { //ISD_SS = 0; ISD_SPI_Send8(STOP); ISD_SS = 1; //关闭片选 } void ISD_PowerUp(void) { ISD_SS = 0; //选中ISD4004 ISD_SPI_Send8(POWER_UP); ISD_SS = 1; } void ISD_PowerDown(void) { ISD_SS = 0; ISD_SPI_Send8(STOP_WRDN); ISD_SS = 1; } void ISD_Play(void) { ISD_SS = 0; ISD_SPI_Send8(PLAY); ISD_SS = 1; } void ISD_Rec(void) { ISD_SS = 0; ISD_SPI_Send8(REC); ISD_SS = 1; } void ISD_SetPlay(uint add) { Delay1Ms(1); ISD_SPI_Send16(add); //发送放音起始地址 ISD_SPI_Send8(SET_PLAY); //发送 setplay 指令字节 ISD_SS = 1; } void ISD_SetRec(uint add) { Delay1Ms(1); ISD_SPI_Send16(add); //发送录音起始地址 ISD_SPI_Send8(SET_REC); //发送 setrec 指令字节 ISD_SS = 1; } //************************************ //检查芯片是否溢出(读 OVF,并返回 OVF 值) //************************************ /*uchar ISD_Chk_Isdovf(void) { ISD_SS=0; ISD_SCLK=0; ISD_SCLK=1; ISD_SCLK=0; if (ISD_MISO==1) { ISD_SCLK=0; ISD_SS =1; //关闭 spi 通信端 ISD_Stop(); //发送 stop 指令 return 1; //OVF 为 1,返回 1 } else { ISD_SCLK=0; ISD_SS =1; //关闭 spi 通信端 ISD_Stop(); //发送 stop 指令 return 0; //OVF 为 0,返回 0 } }*/ void Delay1Ms(uchar t) { uchar i; for (;t>0;t--) { for (i=0;i<150;i++) { _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); } } } //======================================== void Delay() { uchar i; uint d=5000; while (d--) { i=255; while (i--); } } |
|
|
|
放音时全部播放完内容
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
749 浏览 0 评论
使用NDT2955代替2N6804,有没有人帮忙分析一下无输出的原因和能否替代?
1196 浏览 1 评论
1378 浏览 0 评论
1325 浏览 0 评论
1117 浏览 1 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-14 14:15 , Processed in 0.597164 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号