×
单片机 > 单片机程序设计 > 详情

基于AT89S52的ISD4004语音芯片使用

发布时间:2020-08-24 发布时间:
|
//以下程序可对ISD4004语音芯片进行录音也可放音

//使用89S52单片机,12M晶振        
#include
#include<1602.h>
sbit ss=P0^0;
sbit mosi=P0^1;                                                                                  
sbit sclk=P0^2;
sbit int0=P0^3;
sbit rac=P0^4;
sbit key_stop=P3^7;//停止键
sbit key_rec=P3^5;//录音键
sbit key_play=P3^6;//放音键
uint rec_hang;//录音所用去的行数
void display()//显示函数  显示录音所用去的行数
{
 uchar i;
 uchar shu[]={'0','0','0','0'};
 shu[0]=rec_hang/1000+'0';
 shu[1]=rec_hang%1000/100+'0';
 shu[2]=rec_hang%100/10+'0';
 shu[3]=rec_hang%10+'0';
 write_com(0x80);
 //if(moden>=1)write_date('1');
 for(i=0;i<4;i++)
 {
  write_date(shu[i]);
 }
}
void send_8(uchar date)//仿SPI通信
{
 uchar i;
 //ss=1;如果不屏蔽掉该语句和下面的///ss=1;,且不另外在各子函数和
  //指令后面加ss=1;,则4004不能从指定地址进行录放操作,而从其他某个地址
  //进行操作,且按下停止键后,再按下放音键,4004会继续播放之前的音乐
  //而不会从指定的地址进行放音
 ss=0;//下降沿开始传输数据
 sclk=0;
 for(i=0;i<8;i++)
 {
  mosi=date&0x01;
  sclk=1;
  date>>=1;
  sclk=0;
 }
 ///ss=1;
}
void stop()
{
 send_8(0x30);//停止信号的控制码
 ss=1;
}
void power_up()
{
 send_8(0x20);//上电信号的控制码
 ss=1;
}
void setrec(uchar ad_high,uchar ad_low)//从指定地址开始录音 控制信号函数
{
 send_8(ad_low);//发送低8位地址码
 send_8(ad_high);//发送高8位地址码
 send_8(0xa0);//发送8位控制码
 ss=1;
}
void setplay(uchar ad_high,uchar ad_low)//从指定地址开始放音 控制信号函数
{
 send_8(ad_low);//发送低8位地址码
 send_8(ad_high);//发送高8位地址码
 send_8(0xe0);//发送8位控制码
 ss=1;
}
void record(uchar ad_high,uchar ad_low)//从某个地址录音
{
 power_up();//上电
 delay(27);
 power_up();
 delay(27);
 delay(27);
 setrec(ad_high,ad_low);//录音地址
 send_8(0xb0);//从当前地址开始录音
 ss=1;
}
void play(uchar ad_high,uchar ad_low)//从某个地址放音
{
 power_up();//上电
 delay(27);
 setplay(ad_high,ad_low);//放音地址
 send_8(0xf0);//从当前地址开始放音
 ss=1;
}
void main()
{
 init0();
 while(1)
 {
  if(key_rec==0)//按下录音键,开始录音
  {
   while(key_rec==0);
   record(0x00,0x00);
   while(1)
   {
    if(rac){delay(200);rec_hang++;}//计算录音所用去的行数
    if(key_stop==0)//如果按下停止键,则停止录音,并显示录音所用去的行数
    {
     while(key_stop==0);
     stop();display();break;
    } 
   }
  }
  
  if(key_play==0)//按下放音键,开始放音
  {
   while(key_play==0);
   play(0x00,0x00);
   while(int0);display();//这两条语句仅用来检测ISD4004放完一段音乐后int0脚产生下降沿,这两条语句可不用
  }

  if(key_stop==0)//按下停止键,停止录音或者放音
  {
   while(key_stop==0);
   stop();
  }
 }
}

//1602液晶显示头文件

#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P3^3;
sbit lcden=P3^2;
void delay(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void write_com(uchar com)
{
 lcdrs=0;
 P2=com;
 delay(5);
 lcden=1;
 delay(5);
 lcden=0;
}

void write_date(uchar date)
{
 lcdrs=1;
 P2=date;
 delay(5);
 lcden=1;
 delay(5);
 lcden=0;
}
void init0()
{
 lcden=0;
 write_com(0x38);//设置1602显示模式为5*7点阵
 write_com(0x01);//清屏
 write_com(0x0c);//开显示,不显示光标,光标不闪烁
 write_com(0x06);//设置当读或写一个字符后,地址指针加一,且光标加一
 //write_com(0x80);//设置写数据起始地址
}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32 USB HID 键盘