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

📄 main.c

📁 凌阳单片机的录音,方音程序,用c语言边的,可用性强.
💻 C
字号:
//======================================================
//	The information contained herein is the exclusive property of
//	Sunnnorth Technology Co. And shall not be distributed, reproduced,
//	or disclosed in whole in part without prior written permission.
//	(C) COPYRIGHT 2003  SUNNORTH TECHNOLOGY CO.
//	ALL RIGHTS RESERVED
//	The entire notice above must be reproduced on all authorized copies.
//========================================================
//============================================================
//	工程名称:	SD_Recording_Demo
//	功能描述:	61板与SD卡相连
//				按下Key3键开始录音,再次按下停止录音
//				支持多段录音,Key2为播放上一曲,Key1为播放下一曲
//				长按Key1停止播放,长按Key2擦除录音
//	涉及的库:	CMacro.lib
//				clib.lib
//            	SACM_DVR1600_V40a.lib
//				SDDriver_061A.lib
//	组成文件:	main.c,
//				.\DVRSystem\sacmv40.asm, .\DVRSystem\sacmv40.h, .\DVRSystem\sacmv40.inc, sacm_DVR1600_user.asm,
//				.\DVRSystem\spce.inc, .\DVRSystem\PlaySnd.c, .\DVRSystem\PlaySnd.h,
//
//				.\Driver\SD\SD_Hardware.asm, .\Driver\SD\SD_CFG.inc, .\Driver\SD\SD_Hardware.h,
//
//				.\Driver\KEY\DvrKEY.c, .\Driver\KEY\DvrKEY.h, .\Driver\KEY\KEY.c, .\Driver\KEY\KEY.h,
//
//				.\FS\FS.c, .\FS\FS.h,
//
//				.\System\SetInterruptStatus.asm, .\System\SetInterruptStatus.h, .\System\ISR.asm
//	硬件连接:	将SD卡座模组插接到61板的IOB口的低八位
//	维护记录:	2006-9-18 v1.0
//===============================================
#include "SD_Recording_Demo.h"
#include ".\Driver\SD\SD_Driver.h"
#include ".\FS\fs.h"
#include ".\DVRSystem\sacmV40.h"
#include ".\DVRSystem\PlaySnd.h"
#include ".\System\SetInterruptStatus.h"
#include ".\Driver\KEY\Key.h"

#define ADC_Channel Mic		 				// 0~7 (Mic, Line_In1 ~ Line_In6)

void KeyProcess();
void StatusProcess();

SysStatus Status;							//	系统状态,SysStatus定义在SDDVR.h中

int SpeechIndex;

int WriteProtect;
//=============================================================
// 语法格式:	int main(void)
// 实现功能:	主函数
// 参数:		无
// 返回值:		无
//=============================================================
int main()
{
	SpeechIndex = 0;
	WriteProtect = 0;
	Status = IDLE;

	DrvKeyInit();
	SD_IOInit();
	SetINTStatus(C_IRQ5_2Hz);
	SetINTStatus(C_IRQ4_1KHz);
	__asm("IRQ ON");
	SACM_DVR1600_Initial();					//	语音初始化
	if(0 == SD_ChkCard())
	{										//	检测卡是否插入
		PlaySnd(VOICE_ATTENTION, DAC1 + DAC2);
		PlaySnd(VOICE_SDCARDNOTINSERT, DAC1 + DAC2);
		while(0 == SD_ChkCard());			//	等待卡插入
	}
	if(1 == SD_ChkCardWP())					//	检测卡是否有写保护
	{
		WriteProtect = 1;
		PlaySnd(VOICE_ATTENTION, DAC1 + DAC2);
		PlaySnd(VOICE_SDCARDWRITEPROTECT, DAC1 + DAC2);
	}
	else
	{
		FS_Init();							//	没有写保护,执行初始化操作
		PlaySnd(VOICE_READY, DAC1 + DAC2);
	}
	//-----------------------------------------------------------------
	while(1)
	{
		KeyProcess();						//	按键处理
		StatusProcess();					//	系统状态处理
		SACM_DVR1600_ServiceLoop();			//	录/放音服务
	}
   	return 0;
}

//=============================================================
// 语法格式:	int StatusProcess(void)
// 实现功能:	系统状态处理函数
// 参数:		无
// 返回值:		无
//=============================================================
void StatusProcess()
{
	switch(Status)
	{
		case RECORD:
			if(FS_GetUnusedSecNum() < 1)	//	检测是否超出SD卡容量范围
			{
				SACM_DVR1600_Stop();	    
				Status = IDLE;
			}
			break;
		case PLAY:
			if(FS_CheckFileEnd())			//	检测当前语音是否播放完毕
			{
				SACM_DVR1600_Stop();
				FS_CloseOpenFile();
				Status = IDLE;
			}
//		case IDLE:
		default:
			break;
	}
}
//=============================================================
// 语法格式:	int KeyProcess(void)
// 实现功能:	按键处理函数
// 参数:		无
// 返回值:		无
//=============================================================
void KeyProcess()
{
	unsigned int Key, KeyType;
	Key = KeyScan_GetKey(&KeyType);
	if(1 == WriteProtect)					//	卡有写保护,拒绝按键操作
	{
		if((C_SReleaseKeyState == KeyType) || (C_LReleaseKeyState == KeyType))
		{
			PlaySnd(VOICE_SDCARDWRITEPROTECT, DAC1 + DAC2);
		}
		return;
	}
	switch(Key)
	{	
		case C_Record:  					// Record
			if(C_SReleaseKeyState == KeyType)
			{								//	短按键,录/放音控制
				if(PLAY == Status)
				{
					SACM_DVR1600_Stop();	//	如果正在放音,则先停止播放
					FS_CloseOpenFile();
					Status = IDLE;
				}
				if(IDLE == Status)
				{
					if((g_FileNum >= FS_MAX_FILENUM) || (FS_GetUnusedSecNum() <= 0))
					{						//	文件已满,退出
						PlaySnd(VOICE_DANG, DAC1 + DAC2);
						break;
					}
					PlaySnd(VOICE_START, DAC1 + DAC2);
					FS_CreatFile();
					FS_WriteFile(0);		//	为语音长度跳过两个word
					FS_WriteFile(0);
					SACM_DVR1600_Rec(RceMonitorOff, ADC_Channel, BIT_RATE_24K);
					Status = RECORD;
				}
				else if(RECORD == Status)
				{
					SACM_DVR1600_Stop();
					while(RECORD == Status)	//	等待完成录音收尾工作
						SACM_DVR1600_ServiceLoop();
					PlaySnd(VOICE_OVER, DAC1 + DAC2);
					SpeechIndex = g_FileNum - 1;
				}
			}
			break;
		case C_Prev:						// Play Prev
			if((C_SReleaseKeyState != KeyType) && (C_LReleaseKeyState != KeyType))
				break;
			if(g_FileNum > 0)
			{
				if(PLAY == Status)			//	如果正在放音,则先停止播放
				{
					SACM_DVR1600_Stop();
					FS_CloseOpenFile();
				}
				else if(RECORD == Status)	//	如果正在录音则不处理
				{
					break;
				}
				if(C_LReleaseKeyState == KeyType)
				{							//	长按键,擦除所有语音段
					FS_Init();
					PlaySnd(VOICE_SDCARDERASED, DAC1 + DAC2);
					Status = IDLE;
					break;
				}
				else if(C_SReleaseKeyState == KeyType)
				{							//	短按键,播放上一曲
					if(--SpeechIndex <= 0)
					{
						SpeechIndex = g_FileNum;
					}
					FS_OpenFile(SpeechIndex);
					SACM_DVR1600_Play(Manual_Mode_Index, DAC1 + DAC2, Ramp_Up + Ramp_Dn);
					Status = PLAY;
				}
			}
			break;
		case C_Next:						//	Play Next
			if((C_SReleaseKeyState != KeyType) && (C_LReleaseKeyState != KeyType))
				break;
			if(g_FileNum > 0)
			{
				if(PLAY == Status)			//	如果正在放音,则先停止播放
				{
					SACM_DVR1600_Stop();
					FS_CloseOpenFile();
				}
				else if(RECORD == Status)	//	如果正在录音则不处理
				{
					break;
				}
				if(C_LReleaseKeyState == KeyType)
				{							//	长按键,停止当前播放
					Status = IDLE;
					break;
				}
				else if(C_SReleaseKeyState == KeyType)
				{							//	短按键,播放下一曲
					if(++SpeechIndex > g_FileNum)
					{
						SpeechIndex = 1;
					}
					FS_OpenFile(SpeechIndex);
					SACM_DVR1600_Play(Manual_Mode_Index, DAC1 + DAC2, Ramp_Up + Ramp_Dn);
					Status = PLAY;
				}
			}
			break;
		default:
			break;
	}
}

⌨️ 快捷键说明

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