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

📄 main.c

📁 凌阳单片机语音录放程序。对于初次学习或使用凌阳单片机的人员很有帮助。
💻 C
字号:
//*********************************************************//
//名称:"复读机"
//描述:结合"61板"的三个按键完成简易完成录音、停止和播放功能:
//		1、KEY1--录音
//		2、KEY2--停止
//		3、KEY3--播放
//		最长录20秒
//日期:2003/5/16
//*********************************************************//
#include "hardware.h"
#include "dvr.h"
#define C_flashSize    	0xf000
#define sector 			0xa000				//定义FLASH写的起始地址

#define	Stop			0
#define	Record			1
#define Play			2	

#define	Full			1			
#define	Empty			2

#define	DAC1			1		
#define DAC2			2

#define	RceMonitorOff	0
#define	RceMonitorOn	1

#define Manual			0
#define	Auto			1

unsigned int Status;
unsigned int Ret;
unsigned int Key;
unsigned int Addr, Save_Addr;
//*********************************************************//
//函数:main()
//描述:主函数
//*********************************************************//
int main()
{	
	System_Initial();
	SACM_DVR_Initial(Manual);
	Status = Stop;
	while(1)
		{				
			Key = SP_GetCh();					//获取键值
			switch(Key)
			{
				case 0x0001:					//KEY1
//**********************录音(record)***********************//
//*********************************************************//					
			    	for(Addr=sector;Addr<0xf000;Addr+=256)							
			      { 
				    Clear_WatchDog();
					F_FlashErase(Addr); 				
		          }	
					Status = Record;
					Addr=sector;	            	
		            // DVR初始化
					SACM_DVR_InitQueue();
					SACM_DVR_InitEncoder(RceMonitorOn);
					break;

				case 0x0002:					//	KEY2 
//**********************停止(stop)*************************//
//*********************************************************//
					switch(Status)
					{
						case Record:    		// 仍在录音
							SACM_DVR_Stop();
							while(SACM_DVR_TestQueue() != Empty )
								{  
									Ret = SACM_DVR_FetchQueue();// 从队列中取数
									F_FlashWrite1Word(Addr,Ret);									
									Addr += 1;
								}			    	
							break;
						case Play:
							SACM_DVR_Stop();
							break;
						default:			
							break;
					}									
						Status = Stop;
						break;		
			
			case 0x0004:						//KEY3 
//************************回放(playback)*******************//
//*********************************************************//
				SACM_DVR_Stop();			
				if(Status == Record)
					{
						while(SACM_DVR_TestQueue() != Empty)
							{	
								Ret = SACM_DVR_FetchQueue();// Put remain dat to Queue
								F_FlashWrite1Word(Addr,Ret);// save to User Storage								 
								Addr+= 1;
							}
		    		 }				
			//	Save_Addr=Addr;
				Status = Play;				
				Addr = sector; 								//播放的首地址
				SACM_DVR_InitQueue();
				while(SACM_DVR_TestQueue() != Full)			//如果队列不满则继续填
					{	
                   		Ret=F_FlashRead(Addr);	     		//从flash中读出数据						
						SACM_DVR_FillQueue(Ret);			//填队列
						Addr+= 1;							 
					}
				SACM_DVR_InitDecoder(DAC1+DAC2);
				break;
					default:
					break;		
		   }
//************************状态判断处理*********************//
//*********************************************************//		
	  switch(Status)
		{	
			case Record:
//**********************停止(stop)*************************//
//*********************************************************//
				if(Addr< C_flashSize)
					{					
						SACM_DVR_Encode();				    // 取数据并编码						
						if(SACM_DVR_TestQueue() != Empty)	//如果队列没空则将数据保存
							{	
								Ret = SACM_DVR_FetchQueue();//从队列中取数								
								F_FlashWrite1Word(Addr,Ret);//将数据写入flash 
											
								Addr+= 1;
							}	
					}			
				else
					{
			    		SACM_DVR_Stop();
						while(SACM_DVR_TestQueue() != Empty )
							{
								Ret = SACM_DVR_FetchQueue();
	   							F_FlashWrite1Word(Addr,Ret);							
								Addr+= 1;
							}
	   					Status = Stop;					
				    }
				break;
				
			case Play:
//************************回放(playback)*******************//
//*********************************************************//		    
				if(SACM_DVR_Status()&0x01)              	//是否正在播放
					{
						if(SACM_DVR_TestQueue() != Full)
							{                          			
	                    	   Ret=F_FlashRead(Addr);		//读出flash中的数据                       
							   SACM_DVR_FillQueue(Ret);		// 填队列
							   Addr += 1;
							}						
					}
				else
					{
						SACM_DVR_Stop();
						Status = Stop;						
					//	SP_RampDnDAC1();
					//	SP_RampDnDAC2();
					}	
	    		SACM_DVR_Decode();							//解码
				break;
						
			case Stop:
				break;
			default:
				break;	
		}		   	
		 	System_ServiceLoop();							//键盘扫描		 
	}			 
}

⌨️ 快捷键说明

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