⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 isd4004语音芯片c语言的驱动程序
💻 C
字号:
#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从当前地址开始录音
#define NOP       {_nop_();_nop_();_nop_();}

sbit   SS=P1^3;            //LOW IS ACTIVELY
sbit   MOSI=P1^2;
sbit   MISO=P1^7;
sbit   SCLK=P1^4;
sbit   K1=P2^7;           //REC
sbit   K2=P2^6;			   //PLAY
sbit   K3=P2^5;			  //STOP

sbit   LED1=P1^0;		  //REC_LED
sbit   LED2=P1^1;		  //PLAY_LED



uint code mat_s[]={0,2,4,6,8,10,12,14,16,18};	  //分9段,800ms

uint code  mat_10s[]={135,165,225,315,435,585,785,995,1235,1505};   //分9段,10s——90s    

uint counter,addre=0;	                          //RAC计数参量,地址
 
void delayms(uchar ms);
extern uchar kbscan(void) ;            //扫描子程序


/******************放音子程序******************************/
void play(uint addr)                //addr录放起始地址
{
    uchar n_bit,con_char;           //con_char操作码
	LED1=0;
	LED2=1;
	SS=1;
	SCLK=0;
	SS=0;
//发送地址
	for(n_bit=0;n_bit<16;n_bit++)
	{
	   SCLK=0;
	   addr>>=1;
	   MOSI=CY;
	   NOP;
	   SCLK=1;
	   NOP;

	}
//发送操作
    con_char=PLAYSET;
    for(n_bit=0;n_bit<8;n_bit++)
	{
	   SCLK=0;
	   con_char>>=1;
	   MOSI=CY;
	   NOP;
	   SCLK=1;
	   NOP;

	}
	SCLK=0;
	SS=1;
	con_char=PLAYCUR;
	SS=0;
	for(n_bit=0;n_bit<8;n_bit++)
	{
	   SCLK=0;
	   con_char>>=1;
	   MOSI=CY;
	   NOP;
	   SCLK=1;
	   NOP;

	}
	SCLK=0;
	SS=1;
	P1|=0x9C;

}

/*************************录音子程序********************************************/
void rec(uint addr)
{
    uchar n_bit,con_char;           //con_char操作码
	LED2=0;
	LED1=1;
	SS=1;
	SCLK=0;
	SS=0;
//发送地址
	for(n_bit=0;n_bit<16;n_bit++)
	{
	   SCLK=0;
	   addr>>=1;
	   MOSI=CY;
	   NOP;
	   SCLK=1;
	   NOP;

	}
//发送操作
    con_char=RECSET;
    for(n_bit=0;n_bit<8;n_bit++)
	{
	   SCLK=0;
	   con_char>>=1;
	   MOSI=CY;
	   NOP;
	   SCLK=1;
	   NOP;

	}
	SCLK=0;
	SS=1;
	con_char=RECCUR;
	SS=0;
	for(n_bit=0;n_bit<8;n_bit++)
	{
	   SCLK=0;
	   con_char>>=1;
	   MOSI=CY;
	   NOP;
	   SCLK=1;
	   NOP;

	}
	SCLK=0;
	SS=1;
	P1|=0x9C;

}

/*****************************上电*****************************************/
void power_up()
{
    uchar n_bit, con_char=ISDPOWERUP;
	SS=1;
	SS=0;
	for(n_bit=0;n_bit<8;n_bit++)
	{
	   SCLK=0;
	   con_char>>=1;
	   MOSI=CY;
	   NOP;
	   SCLK=1;
	   NOP;

	}
	SCLK=0;
	SS=1;
	P1|=0x9C;
    delayms(25);
}
void stop()
{
    uchar n_bit,con_char=OPERSTOP;
	LED1=0;
	LED2=0;
	EX0=0;
	SS=1;
	SS=0;
	for(n_bit=0;n_bit<8;n_bit++)
	{
	   SCLK=0;
	   con_char>>=1;
	   MOSI=CY;
	   NOP;
	   SCLK=1;
	   NOP;

	}
	SCLK=0;
	SS=1;
	P1|=0x9C;
}

void power_down()
{
   uchar n_bit,con_char=ISDSTOP;
	LED1=0;
	LED2=0;
	EX0=0;
	SS=1;
	SS=0;
	for(n_bit=0;n_bit<8;n_bit++)
	{
	   SCLK=0;
	   con_char>>=1;
	   MOSI=CY;
	   NOP;
	   SCLK=1;
	   NOP;

	}
	SCLK=0;
	SS=1;
	P1|=0x9C;


}

//**************延时子程序***************************
 void delayms(uchar ms) 
{      
 uchar j;
 while(ms--)
 {
  for(j = 0; j < 120; j++);
 }
}
  
/*********************键盘按键说明****************************
*    功能设定   *       上电    *      录音/   *    放音/    *  
*	 /确定		*				*	   数组0   *	数组1	 *
**************************************************************
*	  按键8     *       按键9	*	   掉电	   *	停止	 *
*				*				*			   *			 *
**************************************************************
*	  按键4     *       按键5   *      按键6   *    按键7    *
*				*				*			   *			 *
**************************************************************
*	  按键0     *       按键1   *      按键2   *    按键3	 *
*				*				*			   *			 *
*************************************************************/

void main()
{  
   uchar key,flag=0,labal=1,keys;   //2表示不用数组
   uchar i=100;
   P1=0xff;
   P2=0XFF;
   P3=0XFF;
   power_up();
   EA=1;
   EX0=0;
   IT0=1;
   
while(1)
   {
       key=kbscan();
	   if(key!=255)
	     switch(key)
		                 
	     {
		   case 15:LED2=0;delayms(10);LED2=1;	   
		           if(!flag)
				   {
				     if(labal==1)
					  	counter=(keys+1)*30;
					 else 	counter=(keys+1)*3;
					 EX0=1;
					 play(addre);
				   	}
				   else labal=1;
					 break;
		   case 14:LED2=0;delayms(10);LED2=1;		     //录音
		           if(!flag) 
				      {
					      if(labal==1)
					  	  counter=(keys+1)*30;
						  else 	counter=(keys+1)*3;
						  EX0=1;
						  rec(addre);
						}
				    else labal=0;
					  break;
			case 13:LED2=0;delayms(10);LED2=1;
		           if(!flag)
					  power_up();
					  break;
		   case 12:LED2=0;delayms(10);LED2=1;LED1=1;
		           flag=!flag;
				   if(!flag)
				     {
					    if(labal==0)
					   	   addre=mat_s[keys];
						if(labal==1)
						    addre=mat_10s[keys];
					 }
				    break;
		   case 11:LED2=0;delayms(10);LED2=1;
		           if(!flag)
					  stop();
					  ;
					  break;
		   case 10:LED2=0;delayms(10);LED2=1;
		           if(!flag)
					  power_down();
					  ;
					  break;
		   case  9:LED2=0;delayms(10);LED2=1;keys=9;break;
		   case  8:LED2=0;delayms(10);LED2=1;keys=8;break;
		   case  7:LED2=0;delayms(10);LED2=1;keys=7;break;
		   case  6:LED2=0;delayms(10);LED2=1;keys=6;break;
		   case  5:LED2=0;delayms(10);LED2=1;keys=5;break;
		   case  4:LED2=0;delayms(10);LED2=1;keys=4;break;
		   case  3:LED2=0;delayms(10);LED2=1;keys=3;break;
		   case  2:LED2=0;delayms(10);LED2=1;keys=2;break;
		   case  1:LED2=0;delayms(10);LED2=1;keys=1;break;
		   case  0:LED2=0;delayms(10);LED2=1;keys=0;break;
		   		   
	       }
        }
}
 
 
 //中断
void int_0() interrupt 0
{
  counter--;
  if(counter==0)
  stop();
   
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -