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

📄 1420.c

📁 语音芯片1420P。可录音20秒。自己编的程序。
💻 C
字号:
#include<reg51.h>
#include<intrins.h>

sbit key_REC=P1^0;
sbit key_PLAYE=P1^1;
sbit key_PLAYL=P1^2;
sbit key_function=P1^6;

sbit REC=P1^3;
sbit PLAYE=P1^4;
sbit PLAYL=P1^5;


sbit key0=P2^7;



unsigned char key;
bit flag_rec=0,flag_playl=0,flag_playe=0,flag=0;
bit f0=0,f1=0;

//地址是0x00~0x9F 共160个  8个为一秒
unsigned char voice_addr[]=              // 录音的各地址
{0x00,0x08,0x10,0x18,0x20,
0x28,0x30,0x38,0x40,0x48,
0x50,0x58,0x60,0x68,0x70,
};
//
void delay_10us(unsigned char n)
{
	do
	{
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		}while(--n);
}
//
void delay_ms(unsigned int n)
	{
		do
		{
			delay_10us(230);
		}while(--n);

}




//键控录音
void Record()
{
	while(flag_rec==1)
		{
			 		key=P2;
					if(key==0xff)continue;//当key_REC按下过一次之后,则程序一直在这里执行直到有命令才开始录音
																//这是因为有continue与while的结果
					delay_ms(10);
					key=P2;
					if(key==0xff)continue;
		switch(key)
						{
							case 0xfe:
							{
								P0=voice_addr[0];
								//录音时因控制延时时间
								//应让延时时间小于录音时间
								REC=0;
								delay_ms(500);

								REC=1;
								break;
							}
							case 0xfd:
							{
								P0=voice_addr[1];
								REC=0;

								delay_ms(500);

								REC=1;

								break;
							}
							case 0xfb:
							{
								P0=voice_addr[2];
								REC=0;
								delay_ms(500);

								REC=1;
								break;
							}

							default:
							{
								break;
							}
					}

		flag_rec=0;
		}



}


//电平放音子程序中的子程序
 Playl1()
 {
 		switch(key)
					{
						case 0xfe:
						{
							P0=0X00;
							P0=voice_addr[0];
							PLAYL=0;

							delay_ms(600);

							PLAYL=1;
							break;
						}
						case 0xfd:
						{
							P0=0X00;
							P0=voice_addr[1];
							PLAYL=0;
							//可以不延时,因为它碰到末尾的EOM就会结束
							//如果延时就可以自由的播放我想要的录音长度
							//在我的录音范围之内
							delay_ms(300);

							PLAYL=1;
							break;
						}
						case 0xfb:
						{
							P0=0X00;
							P0=voice_addr[2];
							PLAYL=0;
							delay_ms(600);

							PLAYL=1;
							break;
						}

						default:
						{
							break;
						}


				}
			flag_playl=0;



 	}
//电平触发播放函数
//变为低电平并保持直到变高或遇到结束标志
void Playl()
{

	while(flag_playl==1)
	  {
				if(f0==1)								//循环
   			{
	   			while(f0==1)
	   			{

	   				P0=0xc8;
	   				PLAYL=0;
	   				while(key_PLAYL==0);
	   				PLAYL=1;
	   				f0=0;
	   				flag_playl=0;
	   			}

	   		}
	   	else


		{


	   			key=P2;
					if(key==0xff)continue;
					delay_ms(10);
					key=P2;
					if(key==0xff)continue;
 					Playl1();//把下面的程序写成了一个函数  在上面
	      }

	}


}


//脉冲放音
Playe()
{
		while(flag_playe==1)
	 		{///////////此功能未实现
   			if(f0==1)									//循环
   				{

   					while(f0==1)
   					{
   					PLAYE=1;
   					P0=0xc8;
   					PLAYE=0;
   					if(key_PLAYL==1)continue;
   					delay_ms(10);
   					if(key_PLAYL==1)continue;
   					PLAYL=0;
   					key_PLAYL=1;
//   					PLAYE=1;
//   					PLAYL=0;////////////////???????????????????
//
//
//   					PLAYL=1;
   					f0=0;
   					flag_playe=0;
   					}

   				}
   				///////////此功能未实现
				if(f1==1)									//快进
	 				{
		 				PLAYE=1;
		 				P0=0xd1;//
		 				PLAYE=0;
		 				f1=0;
		 				flag_playe=0;
		 				PLAYE=1;
		 				PLAYE=0;

	 				}
				if((f0==0)&&(f1==0))				//在无操作模式下
					{
						key=P2;
						if(key==0xff)continue;
						delay_ms(10);
						key=P2;
						if(key==0xff)continue;
						switch(key)
							{
								case 0xfe:
									{
									P0=0X00;
									P0=voice_addr[0];
									PLAYE=1;
									PLAYE=0;//播放


									break;
									}
								case 0xfd:
									{
									P0=0X00;
									P0=voice_addr[1];

									PLAYE=1;
									PLAYE=0;

									break;
									}
								case 0xfb:
									{
									P0=0X00;
									P0=voice_addr[2];

									PLAYE=1;
									PLAYE=0;

									break;
									}

								default:
								{
									break;
								}


							}
						flag_playe=0;

					}
		}
}



//操作模式
void work()
{
	while(flag==1)
	  {
	   			key=P2;
					if(key==0xff)continue;
					delay_ms(10);
					key=P2;
					if(key==0xff)continue;
					switch(key)
					{
						case 0xfe:
						{
						//	P0=0Xff;
						//	P0=0xc8;
							f0=1;//循环
							break;
						}
						case 0xfd:
						{
						//	P0=0Xff;
						//	P0=0xd1;//
							f1=1;//快进
							break;
						}


						default:
						{
							break;
						}
				}
			flag=0;
		}


}




/**************************/
//主函数
main()
{

P0=0x00;
while(1)
{
//录音
if( key_REC==0)
	{
		delay_ms(10);
		if( key_REC==0)
			{
				flag_rec=1;
				while(key_REC==0);
				delay_ms(8);
			//	Record();
			}
 }

//电平放音
if( key_PLAYL==0)
 {
	delay_ms(10);
	if( key_PLAYL==0)
			{
			flag_playl=1;
		//	while(key_PLAYL==0);
		//	delay_ms(8);
     //  Playl();
      }
 }



//脉冲放音
if( key_PLAYE==0)
  {
	delay_ms(10);
	if( key_PLAYE==0)
		{
     flag_playe=1;
     while(key_PLAYE==0);
		 delay_ms(8);

//		 P0=0xc8;
//		 					PLAYE=1;
//   					PLAYE=0;
//   					while(key_PLAYL==1);
////   					if(key_PLAYL==1)continue;
////   					delay_ms(10);
////   					if(key_PLAYL==1)continue;
//   						PLAYL=0;
//                                              delay_ms(1000);  
//   							PLAYL=1;
//   				//	key_PLAYL=1;
//    //  Playe();
  	}
}
//操作模式
if(key_function==0)
	{
	delay_ms(10);
	if( key_function==0)
		{
    	flag=1;
    	while(key_function==0);
		  delay_ms(8);
  	}
	}




//各函数
Record();//
Playl();
work();
Playe();

///测试各录音
if(key0==0)
	{
		delay_ms(10);
		if(key0==0)
			{
				//while(key0==0);
				//delay_ms(10);
				key=0xfe;
				flag_playl=1;
			 Playl1();

				key=0xfb;
			  flag_playl=1;
			 Playl1();

			}
	}



}

}

⌨️ 快捷键说明

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