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

📄 main.c

📁 智能小车控制系统
💻 C
📖 第 1 页 / 共 2 页
字号:
//======================================================
//  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.
//========================================================
//			2006四川省电子设计大赛
//========================================================
//  工程名称:	Car_Demo
//  功能描述:	实现小车的语音控制
//  涉及的库:	CMacro1016.lib
//            	bsrv222SDL.lib
//				sacmv26e.lib
//              clib100.lib
//  组成文件:	main.c
//				Flash.asm, hardware.asm,ISR.asm 
//     			hardware.h,s480.h,math.h, hardware.inc
//	硬件连接:	IOA0-----KEY1
//				IOA1-----KEY2
//				IOA2-----KEY3
//				IOB8-----前进
//				IOB9-----倒车
//				IOB10----左拐
//				IOB11----右拐
//	维护记录:	2006-12-9 v1.0
//========================================================

#include "s480.h"
#include "bsrsd.h"
#include "math.h"

#define	P_IOA_Data 			(volatile unsigned int *)0x7000   
#define P_IOA_Dir 			(volatile unsigned int *)0x7002
#define P_IOA_Attrib 		(volatile unsigned int *)0x7003
#define P_IOB_Data			(volatile unsigned int *)0x7005  
#define P_IOB_Dir			(volatile unsigned int *)0x7007   
#define P_IOB_Attrib		(volatile unsigned int *)0x7008 
#define	P_Feedback		    (volatile unsigned int *)0x7009  
#define P_TimerA_Data		(volatile unsigned int *)0x700A   
#define P_TimerA_Ctrl		(volatile unsigned int *)0x700B   
#define P_TimerB_Data		(volatile unsigned int *)0x700C   
#define P_TimerB_Ctrl		(volatile unsigned int *)0x700D   
#define P_Watchdog_Clear	(volatile unsigned int *)0x7012   
#define P_INT_Mask			(volatile unsigned int *)0x702D   
#define P_INT_Clear			(volatile unsigned int *)0x7011   

#define NAME_ID 				0x100
#define COMMAND_ACT1_ID 		0x101
#define COMMAND_ACT2_ID 		0x102
#define COMMAND_ACT3_ID 		0x103
#define COMMAND_ACT4_ID 		0x104


#define S_NAME				0							//给我取个名字吧
#define S_ACT1				1							//循线
#define S_ACT2				2							//画圆
#define S_ACT3				3							//定点
#define S_ACT4				4							//自动	
#define S_RDY				5							//OK
#define S_AGAIN				6							//请再说一遍
#define S_NOVOICE			7							//没有听到任何声音
#define S_CMDDIFF			8							//说什么暗语呀
#define S_NOISY				8							//说什么暗语呀
#define S_START				9							//准备就绪,开始辨识	
#define S_OX				10							//目标点X坐标
#define S_OY				11							//目标点Y坐标
#define S_FINISHED			12  						//任务完成,行驶总时间为:
#define S_WANBI				13							//完毕
#define S_Twenty			14							//20
#define S_THREEty			15							//30
#define S_FOURty			16							//40
#define S_Sixty				17							//60
#define S_Sevty				18							//70
#define S_NINEty			19							//90
#define S_DaoChe			20							//倒车请注意
	


extern  unsigned int BSR_SDModel[100];					//外部变量BSR_SDModel[100],辨识器自带
extern void F_FlashWrite1Word(unsigned int addr,unsigned int Value);
extern void F_FlashErase(unsigned int sector);
//unsigned int uiTimeset = 20;								//运行时间定时,调整该参数控制运行时间
unsigned int uiTimecont; 								//运行时间计时
unsigned int  nowstate,stated;                     //路面传感器状态存储单元
float speed = 1.0; 								//运行速度
//float OneTime = 0.1; 								//转固定角度时间
int g_flag = 0;
//int g_SetFlag = 0;

//=============================================================
// 语法格式:	void Delay();
// 实现功能:	延时
// 参数:		无
// 返回值:		无
//=============================================================
int Delay()							
{
	unsigned int i;
	for(i=0;i<0x00ff;i++)
	{
		*P_Watchdog_Clear=0x0001;
	}
	return 1;
}
//=============================================================
// 语法格式:	void PWMOut();
// 实现功能:	PWM输出子函数
// 参数:		unsigned int pa,unsigned int pb
// 返回值:		无
//=============================================================
void PWMOut(unsigned int pa,unsigned int pb)
{ 
			    	 
	*P_Feedback = 0x0000;          //设置IOB8,IOB9口为APWMO端口
		        
	*P_TimerA_Data = pa;       //设定TA 
	*P_TimerB_Data = pb; 
	
	*P_TimerA_Ctrl = 0x0132;		//*P_TimerA_Ctrl = 0x0132;
	*P_TimerB_Ctrl = 0x00f2;		//*P_TimerB_Ctrl = 0x00b2;
}
//=============================================================
// 语法格式:	void PlaySnd(unsigned SndIndex,unsigned DAC_Channel);
// 实现功能:	语音播放函数
// 参数:		SndIndex-播放语音资源索引号
//				DAC_Channel-播放声道选择
// 返回值:		无
//=============================================================
void PlaySnd(unsigned SndIndex,unsigned DAC_Channel)
{
	BSR_StopRecognizer();								//停止识别器
	SACM_S480_Initial(1);								//初始化为自动播放
	//*P_TimerA_Ctrl = 0x0a00;
	SACM_S480_Play(SndIndex, DAC_Channel, 3);			//开始播放一段语音
	while((SACM_S480_Status()&0x0001)!= 0)				//是否播放完毕?
	{
		SACM_S480_ServiceLoop();						//解码并填充队列
		*P_Watchdog_Clear=0x0001;						//清看门狗
	}
	SACM_S480_Stop();									//停止播放
	BSR_InitRecognizer(BSR_MIC);						//初始化识别器
}
//=============================================================
// 语法格式:	void FormatFlash(void);
// 实现功能:	存储命令的Flash空间函数
// 参数:		无
// 返回值:		无
//=============================================================

void FormatFlash(void)
{
	F_FlashErase(0xF700);				//存储命令的Flash空间
	F_FlashErase(0xF700+100);			//每条命令占用96个字,用函数导出占用100个字
	F_FlashErase(0xF700+200);
	F_FlashErase(0xF700+300);
	F_FlashErase(0xF700+400);

}
//=============================================================
// 语法格式:	int TrainWord(int WordID,int SndID);
// 实现功能:	训练一条指令
// 参数:		WordID-指令编码
//				SndID-指令提示音索引号
// 返回值:		无
//=============================================================
int TrainWord(unsigned int WordID,unsigned int SndID)
{
	int Result;
	PlaySnd(SndID,3);									//引导训练,播放指令对应动作
	while(1)
	{
		Result = BSR_Train(WordID,BSR_TRAIN_TWICE);		//训练两次,获得训练结果
										
		if(Result==0)break;
		switch(Result)
		{
		case -1:										//没有检测出声音
			PlaySnd(S_NOVOICE,3);
			return -1;
		case -2: 										//需要训练第二次
			PlaySnd(S_AGAIN,3);
			break;
		case -3:										//环境太吵
			PlaySnd(S_NOISY,3);
			return -3;	
		case -4:										//数据库满
	 		return -4;	
		case -5: 			            				//检测出声音不同
			PlaySnd(S_CMDDIFF,3);
			return -5;
		case -6: 			            				//序号错误
			return -6;
		default:
			break;
		}
	}
	return 0;
}

//=============================================================
// 语法格式:	void TrainSD();
// 实现功能:	训练函数
// 参数:		无
// 返回值:		无
//=============================================================
void TrainSD()
{
	while(TrainWord(NAME_ID,S_NAME) != 0) ;  			//训练名称
	while(TrainWord(COMMAND_ACT1_ID,S_ACT1) != 0) ;  	//训练第1个动作
	while(TrainWord(COMMAND_ACT2_ID,S_ACT2) != 0) ;  	//训练第2个动作
	while(TrainWord(COMMAND_ACT3_ID,S_ACT3) != 0) ;  	//训练第3个动作
	while(TrainWord(COMMAND_ACT4_ID,S_ACT4) != 0) ;		//训练第4个动作

	
}

//=============================================================
// 语法格式:	void StoreSD();
// 实现功能:	存储语音模型函数
// 参数:		unsigned int Addr
// 返回值:		无
//=============================================================
void StoreSD()                           			
{	unsigned int ulAddr,i,commandID,g_Ret;
	//F_FlashWrite1Word(0xef00,0xaaaa);
 	//F_FlashErase(0xf700);
   	//F_FlashErase(0xe100);
   	//F_FlashErase(0xe200);
   	ulAddr=0xf700;//********

	for(commandID=0x100;commandID<0x105;commandID++)
	{
		g_Ret=BSR_ExportSDWord(commandID);			
		while(g_Ret!=0)									//模型导出成功?
		g_Ret=BSR_ExportSDWord(commandID);		
		for(i=0;i<100;i++)								//保存语音模型SD1(0xe000---0xe063)
		{
		    F_FlashWrite1Word(ulAddr,BSR_SDModel[i]);
		    *(unsigned int *)0x7012 = 1;
			ulAddr+=1;												
		}
	}
}

//=============================================================
// 语法格式:	void LoadSD();
// 实现功能:	装载语音模型函数
// 参数:		无
// 返回值:		无
//=============================================================
void LoadSD()                           			
{	unsigned int *p,k,jk,Ret,g_Ret;
	p=(int *)0xf700;
																				
	for(jk=0;jk<5;jk++)
	{
		for(k=0;k<100;k++)
		{
			Ret=*p;							
			BSR_SDModel[k]=Ret;					//装载语音模型			
			p+=1;													
		}					
		g_Ret=BSR_ImportSDWord();				
		while(g_Ret!=0)							//模型装载成功?
		g_Ret=BSR_ImportSDWord();							
	}
}

//=============================================================
// 语法格式:	void GoAhead();
// 实现功能:	前进子函数
// 参数:		无
// 返回值:		无
//=============================================================
void GoAhead()                     				//前进
{  
	unsigned int i,j;
	
	for(j=0;j<20;j++)	
		{
			*P_IOB_Data=0x0300;								
			Delay();                       //延时
			*P_IOB_Data=0x0000;
			
			for(i=0;i<4;i++)
				{
					Delay();
				}
		}
		*P_IOB_Data=0x0000;
}
//=============================================================
// 语法格式:	void GoAhead();
// 实现功能:	前进子函数
// 参数:		无
// 返回值:		无
//=============================================================
void GoAheadzd()                     				//前进
{  
	unsigned int i,j;
	
	for(j=0;j<20;j++)	
		{
			*P_IOB_Data=0x0300;								
			Delay();                       //延时
			*P_IOB_Data=0x0000;
			
			for(i=0;i<3;i++)
				{
					Delay();
				}
		}
		*P_IOB_Data=0x0000;
}
//=============================================================
// 语法格式:	void BackUp();
// 实现功能:	后退子函数
// 参数:		无
// 返回值:		无
//=============================================================
void BackUp()                        			//倒退
{	
	unsigned int i,j;
///PlaySnd(S_DaoChe,3);                            //提示
	
		for(j=0;j<20;j++)	
		{
			*P_IOB_Data=0x0c00;							
			Delay();                               //延时
		                      
			*P_IOB_Data=0x0000;
			
			for(i=0;i<4;i++)
				{
					Delay();                       //延时
				}
		  
		}

	*P_IOB_Data=0x0000;							//停车

}

//=============================================================
// 语法格式:	void TurnLeft();
// 实现功能:	左转子函数
// 参数:		无
// 返回值:		无
//=============================================================
void TurnLeft()                       			//左转
{
	unsigned int i, j;

	for(j=0;j<20;j++)
		{
			*P_IOB_Data=0x0600;	
			Delay();
			*P_IOB_Data=0x0000;
			
				for(i=0;i<4;i++)

⌨️ 快捷键说明

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