ISD4004录放多段音乐C程序

来源:本站
导读:目前正在解读《ISD4004录放多段音乐C程序》的相关信息,《ISD4004录放多段音乐C程序》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《ISD4004录放多段音乐C程序》的详细说明。
简介:如需要录更多的段数,只需要注意更改段数的值和录音的时间。程序中的录放停部分已做成子函数,可以直接调用,只需要输入录音的地址就行。

///////////ISD4004语音播放模块----四段语音部分演示程序////////////////////////////////当按下P3.5键时,从指定地址开始录音,每按一次,录一段语音,总共可以录四次。/// 当按下P3.4键时,从指定地址开始放音,每按一次,放一段语音。总共可以放四段。///如需要录更多的段数,只需要注意更改段数的值和录音的时间。///程序中的录放停部分已做成子函数,可以直接调用, 只需要输入录音的地址就行//录音地址的设定与芯片型号有关系,以ISD4004-8为例,ISD4004-8录音时间为8//  分钟,即8*60=480S, 根据4004的资料,480秒可分为2400段,也就是1S的段数为//  5段,即从,0000-0005H的内容为1秒。//本程序在放音前,没有做停止和下电处理,感兴趣的朋友可以把停止部分加到放音子函数中。#include <reg51.h>#include <intrins.h>#define uchar unsigned  char#define uint  unsigned  intbit playbit,recbit;//定义两个位变量,放音和录音位////////定义放音命令,定义常量//////#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=P1^5;            //LOW IS ACTIVELYsbit   MOSI=P1^1;sbit   MISO=P1^7;sbit   SCLK=P1^4; sbit   K1=P3^5;sbit   K2=P3^6;sbit   K3=P3^7;sbit   LED1=P0^1;sbit   LED2=P0^2;void delayms(uchar ms);uchar playcout,reccout; //放音和录音次数。////////////////放音部分子程序,放音地址由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;  }//////////////////////////lu音部分子程序,地址由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(){     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(uchar ms)// 延时子程序{uchar j;while(ms--){for(j = 0; j < 120; j++);}}////////////////////////////////playsound()///录放音子函数{if(playbit) {playbit=0;   switch(playcout)    {case 0x01:{play(0x00);}break;//此处第一段音乐的开始地址为0X00,到0X100地址结束,约为51秒。     case 0x02:{play(0x100);}break;     case 0x03:{play(0x200);}break;     case 0x04:{play(0x300);}break;      }   }  if(recbit)   {recbit=0;    switch(reccout)    {case 0x01:{rec(0x00);}break;     case 0x02:{rec(0x100);}break;     case 0x03:{rec(0x200);}break;     case 0x04:{rec(0x300);}break;      }    }}////////////////////////////////////keyscan()  //直控键盘扫描子程序。{uchar temp,temp1; temp=P3; if((temp&0xf0)!=0xf0)   {  delayms(10);      temp&=0xf0;  while(((temp1=P3)&0xf0)!=0xf0);       {     switch(temp)    {case 0xe0:      {playbit=1;       playcout++;   LED1=~LED1;   if(playcout>4)   playcout=0;}break;     case 0xd0:      { recbit=1;    reccout++; LED2=~LED2;    if(reccout>4)    reccout=0;}break; case 0xb0:    { stop();  LED2=1;  LED1=1;}break;         }    }  } } /////////////////////////////////////////////////////////以下部分为主程序///////////////////void main(){  P1=0xff;   P2=0XFF;   P3=0XFF;while(1)   { keyscan();     playsound();   }}            

提醒:《ISD4004录放多段音乐C程序》最后刷新时间 2024-03-14 01:02:30,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《ISD4004录放多段音乐C程序》该内容的真实性请自行鉴别。