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

📄 1420.c

📁 51单片机控制ISD1420实现选段播放功能的实现
💻 C
字号:
/**********************************************************
功能:  使用STC2052单片机控制 ISD1420语音芯片的播放
       1、顺序连续分段放音
       2、选段播放(播放任意段)
       3、所有的播放控制都是通过接收串口的命令来执行
       
编写:  benladn911  AVR猎手

日期:  2006-6-28创建
       2008-2-21添加注释和完善
**********************************************************/

#include<STC12C2052.H>
#include<intrins.h>
#include<stdio.h>
#include<string.h>

//硬件端口的定义
#define  POW P3_7   //此引脚为单片机控制一个三极管给 ISD1420供电

#define  PL  P3_5   //接 ISD1420 的 PLAYL
#define  PE  P3_4   //接 ISD1420 的 PLAYE
#define  REC P3_3   //接 ISD1420 的 REC

#define  REC_LED  P3_2   //ISD1420 的 REC LED

//操作模式的定义
#define  mode1  0xC8 //循环放音操作,按一下 PE 键可循环放音,按 PL 键停止;或按 PL 键放音,松开即停止

#define  mode2  0xD0 //按顺序连续分段录放音,每段语音长度不限
#define  mode3  0xC0 //地址指针复位,开始录放第一段
#define  mode4  0xD1 //按 PE 键可快速选段放音

                //0xC1 //也为地址指针复位
                
unsigned char RX_index=0;		//
bit FLAG_rev = 0; //
unsigned char PC_COMMAND;
unsigned char RX_BUFFER[10];//串行接收缓存

void io_init(void);
void init_serialcomm(void);
void serial_out(unsigned char d);
void delay5ms(void);
void delay(unsigned int x);
void nop(unsigned char i);

void paly(unsigned char i);//选择播放当前段操作


void main(void)
{
	io_init();
	init_serialcomm();
	delay(1000);


 serial_out(0xaa);  //发送到PC机,看看PC端是否收到正确数据
 serial_out(0x55);
 serial_out(0x33);


	POW = 0;//开启电源
	
	//P1 = mode4;
	//P1 = 0X00;
	while(1)
	{

	}
	
}

//----- 端口初始化 
void io_init(void)
{	
	P1M0 = 0x00; //设置STC的 IO 为标准51 IO模式
	P1M1 = 0x00;
	P3M0 = 0x00;
	P3M1 = 0x00;	
	P1 = 0XFF;
	P3 = 0XFF;
}

//串行口初始化
void init_serialcomm(void)
{
    SCON  = 0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr 

    TMOD = 0x20;       //TMOD: timer 1, mode 2, 8-bit reload 

    TH1 = 0xf3;//12MHz, 2400 bps
    TL1 = 0xf3;
        //IE   |= 0x90;       //Enable Serial Interrupt 
    
    TR1   = 1;          // timer 1 run
   
	ES=1;
	EA=1;
}

//串行数据发送,查询模式
void serial_out(unsigned char d)
{
	ES=0;
	SBUF=d;while(TI==0){;}TI=0;	
	ES=1;	
}

//串行中断接收
void receive() interrupt 4
{
	if(RI)
	{
		RI = 0;
		ES = 0;
		PC_COMMAND = SBUF;
		

		//RX_BUFFER[RX_index] = PC_COMMAND;		//保存数据到数组里面
		//RX_index++;
	  switch(PC_COMMAND)
	  {

	  	          
	  	case 0xa0:
	  	
	  	          serial_out(0xa0);
	  	          P1 = mode2;      //按顺序连续分段录放音,每段语音长度不限  0xD0  连续寻址,A4
	  	          	  	          
	  	          PE = 0;
	  	          nop(10);
	  	          PE = 1;
	  	          
	  	          P1 = 0XFF;

	  	          break;
	  	          
	  	case 0xb0:
	  	          serial_out(0xb0);
	  	          P1 = mode3;      //地址指针复位  0xC0
	  	          
	  	          nop(10);
	  	          P1 = 0XFF;
	  	                      
	  	          break;
	  	          
	  	case 0xc0:                 //选段播放控制
	  	          serial_out(0xc0);
	  	          
 	          
	  	          P1 = 0xD1;      //第二步:快速选段放音


	  	          P1_0 = 0;	  	          
	  	          nop(10);
	  	          P1_0 = 1; 	  	          
	  	          nop(10);
	  	          
	  	          
	  	          PE = 0;
	  	          nop(10);
	  	          PE = 1;

	  	          
	  	          break;
	  	          
	  	case 0xd0:
	  	          serial_out(0xd0);
	  	          paly(3);
	  	          paly(1);
	  	          paly(5);
	  	          paly(5);
	  	          paly(6);
	  	          paly(4);
	  	          paly(3);
	  	          paly(6);
	  	          paly(1);	  	          

          
	  	          
	  	          break;

	  	case 0x30:	  	
	  	          serial_out(0x30);
	  	          //此操作循环放音操作,按一下 PE 键可循环放音,按 PL 键停止;或按 PL 键放音,松开即停止
	  	          //此操作没什么用
	  	          P1 = mode1;
	  	                      
	  	          PE = 0;
	  	          nop(10);
	  	          PE = 1;
	  	          //
	  	          break;
	  	          	  	          
	  	default: break;
	  }
		
		ES = 1;	
	}
}

/*************************************************************
          选段播放,i 的值就是要播放的当前段
          i的取值:1 ~ ...
**************************************************************/
void paly(unsigned char i) 
{
	i--;

	P1 = mode3;      //第一步:地址指针复位  0xC0		  A7--A0: 1100 0000  (A2、A5在应用中可直接接地)	          
	nop(10);
	//P1 = 0XFF;		
		
	delay(30);//必要的延时
	
	if(i>0)
	{	
		P1 = 0xD1;      //第二步:快速选段放音 0xD1     A7--A0: 1101 0001  (A2、A5在应用中可直接接地)
		do
		{		
			P1_0 = 0;	//给 A0 低电平脉冲          
			nop(10);
			P1_0 = 1; 	  	          
			nop(10);
			  	          
			PE = 0;
			nop(10);
			PE = 1;
			
			delay(50);//这个延时是非常必要的!		
			i--;
		}
		while(i!=0);	  	          
		
		delay(30);//必要的延时
	}

	
	P1 = mode2;     //第三步:播放当前段  0xD0        A7--A0: 1101 0000  (A2、A5在应用中可直接接地)
	
	PE = 0;
	nop(10);
	PE = 1;		  	          
	//P1 = 0XFF;	
	
	while(REC_LED==1){;}//等待播放
	while(REC_LED==0){;}//等待播放结束

}


//----------------------------软件延时函数----------------------------
//50ms延时
void delay5ms(void)
{
 unsigned char TempCyc = 250;
 while(TempCyc--);
}

void delay(unsigned int x)
{
	do
	{
		delay5ms();delay5ms();delay5ms();x--;
	}
	while(x!=0);
}

void nop(unsigned char i)
{
	do
	{
		_nop_();
		i--;
	}
	while(i!=0);	
}


⌨️ 快捷键说明

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