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

📄 vr_function.c

📁 用C编写基于凌阳SPCE061A芯片的图象识别模块可实现(1)获得数据并处理。(2)控制按扭KEY1
💻 C
字号:
#include "Eagle_Lookaround.h"
#include "hardware.h"

extern 	int		VR_PrevResult_Color;
extern 	int		VR_PrevResult_Shape;
extern 	int 	VR_Result;
extern 	int 	VR_OverFlag;
extern 	int 	VR_PrevResult_CenterX;
extern 	int 	VR_PrevResult_CenterY;
extern 	int 	VR_PrevResult_AreaH;
extern	int 	VR_PrevResult_AreaL;
extern 	int 	gActivated;
extern 	int		R_PreColor;
extern  int     PlayFlag ;
extern  int     VR_TimeDeldy;
extern  int     VR_TimeFlag;
extern	void	PlayRespond(int Result);


//=================================================
//函数:VR_Search_Color()
//用途:调用
//描述:分辨物体的特征并采用语音播放
//参数:无
//返回:无
//==================================================
void VR_Search_Color(void)
{
	VR_PrevResult_Color = 0;					//变量初始化
	VR_PrevResult_Shape = 0;
	VR_OverFlag = 0;

	LookAround_Initial();						// 初始化

	while (VR_OverFlag!=1)
	{					
		LookAround();							// 判断物体分辨是否结束
	}

	switch(VR_PrevResult_Color)
	{		
		case C_Red:							
			PlayRespond(S_Red);					// 播放是红色
			VR_TimeFlag = 0;
			VR_TimeDeldy = 0;
			break;
	
		case C_Green:						
			PlayRespond(S_Green);				// 播放是绿色
			VR_TimeFlag = 0;
			VR_TimeDeldy = 0;
			break;
	
		case C_Blue:						
			PlayRespond(S_Blue);				// 播放是兰色
			VR_TimeFlag = 0;
			VR_TimeDeldy = 0;
			break;
	
		case C_Yellow:							
			PlayRespond(S_Yellow);				// 播放是黄色
			VR_TimeFlag = 0;
			VR_TimeDeldy = 0;
			break;
		default:
			break;
	}
	
	switch(VR_PrevResult_Shape)
	{
		
		case C_Triangle:						// 播放是三角形
			PlayRespond(S_Triangle);
			break;
		case C_Circle:							// 播放是圆形
			PlayRespond(S_Circle);	
			break;
		case C_Square:							// 播放是正方形	
			PlayRespond(S_Square);		
			break;
		case C_Rectangle:						// 播放是长方形
			PlayRespond(S_Rectangle);
			break;
		case C_Pentagon:						// 播放是五角形		
			PlayRespond(S_Pentagon);
			break;
		default:
			break;		
	}	
}
//============================= 子函数结束 ============================

int 	Delay(int time);
int  	EagleGoFormer(int VR_Step);
int 	EagleGoBack(int Step);
int 	EagleTurnRight(int VR_Step);
int 	EagleTurnLeft(int VR_Step); 	
void 	EagleStopMotor(void);
//=================================================
//函数:VR_Chase_Ball()
//用途:调用
//描述:跟踪移动的红色物体,其他颜色的物体不跟踪
//参数:无
//返回:无
//==================================================
void VR_Chase_Ball(void)
{
	int i,j,K;	
	VR_PrevResult_Color = 0;						// 初始化
	VR_PrevResult_Shape = 0;
	VR_OverFlag = 0;

	SP_Export(Port_IOB_Data,0x0000);
	LookAround_Initial();							// 分辨物体的特征
	while (VR_OverFlag!=1)
	{					
		LookAround();
	}
	
	if (VR_PrevResult_Color == C_Red )				// 是否是红色的物体	
	{		 	
		PlayRespond(S_Yes);							// 是红色物体做回答	
		PlayRespond(S_Red);		
		i = VR_PrevResult_Color;		
		LookAround_Initial();
	
		VR_TimeFlag = 0;
		VR_TimeDeldy = 0;
		
		while (i == C_Red )							// 一直跟踪红色的物体
		{																
			Find_Color_Shape();						// 分辨一个物体的特征
			i = VR_PrevResult_Color;															
			if ( VR_PrevResult_CenterX < 30)		// 30H<水平距离<70H	在视野内								
			{
//				EagleTurnRight(1);					// 水平距离<30H右移动
				EagleTurnLeft(1);					// 水平距离>70H左移动
			}				
			else if ( VR_PrevResult_CenterX >70)										
			{
//				EagleTurnLeft(1);					// 水平距离>70H左移动
				EagleTurnRight(1);					// 水平距离<30H右移动
			}			
			
			else					
			{
				j = VR_PrevResult_AreaH<<8;			// 空间位置判断
				j = j + VR_PrevResult_AreaL;	
				EagleStopMotor();				
				if ( j <2000)								
					EagleGoFormer(1);				// 物体移动远了则向前	
//					EagleGoBack(1);					// 物体移动近了则向后		
				else if ( j >3000)					   				    		    									
//					EagleGoFormer(1);				// 物体移动远了则向前	
					EagleGoBack(1);					// 物体移动近了则向后		
				else					
					EagleStopMotor();				// 在视野范围内电机不工作																															
			}			
		}													          		
		
		PlayRespond(S_Bingo);						// 分辨不到物体就结束跟踪
		
		VR_TimeFlag = 0;
		VR_TimeDeldy = 0;
	}
	else 	
	{
		
		VR_TimeFlag = 0;								// 不是红色的物体的跟踪说NO
		VR_TimeDeldy = 0;
		PlayRespond(S_No);	
		PlayRespond(S_No);
	}						
}

//======================== 子函数结束 ===========================
//=================================================
//函数:Delay(int time)
//用途:调用
//描述:延时
//参数:无
//返回:无
//==================================================
int Delay(int time)
{	
	if (VR_TimeDeldy == time) VR_TimeFlag = 1;			//延时时间到置标志				
}


//============================= 直流电机控制 ============================
//描述:
//	IOB10		IOB11		IOB12		IOB13	
//	左电机		左电机		右电机		右电机
// 	  1			 0			 0			1		 	后进0x2400
//	  0			 1			 1			0			前拐0x1800
//	  1			 0			 1		 	0			左拐0x1400
//	  0  		 1 			 0			1		 	右退0x2800
//	  0			 0			 0			0			停止0x0000
//======================== 2003.11.11 chengjie ======================
//=================================================
//函数:EagleGoFormer(int VR_Step)
//用途:调用
//描述:驱动电机前进
//参数:无
//返回:无
//==================================================

int  EagleGoFormer(int VR_Step)                     			//前进
{  
	unsigned	int i,j ;	 
	for(j=0;j<VR_Step;j++)
	{
//		* ClearWatchdog = 0x0001;
		SP_Export(Port_IOB_Data,C_GoFormer);
		VR_TimeFlag = 0;
		VR_TimeDeldy = 0;
		while (VR_TimeFlag != 1)	Delay(30);
			
		SP_Export(Port_IOB_Data,0);
		VR_TimeFlag = 0;
		VR_TimeDeldy = 0;
		while (VR_TimeFlag != 1)	Delay(30);		
	} 
}
//=================================================
//函数:EagleGoBack(int Step)
//用途:调用
//描述:驱动电机后退
//参数:无
//返回:无
//==================================================
int	 EagleGoBack(int Step)                        		//倒退
{  
	int i,k ;	
//	  * ClearWatchdog = 0x0001; 
	for(k=0;k < Step;k++)
	{
		SP_Export(Port_IOB_Data,C_GoBack);	
		VR_TimeFlag = 0;
		VR_TimeDeldy = 0;
		while (VR_TimeFlag != 1)	Delay(30);

		SP_Export(Port_IOB_Data,0);
		VR_TimeFlag = 0;
		VR_TimeDeldy = 0;	
		while (VR_TimeFlag != 1)	Delay(30);					
	} 
}
//=================================================
//函数:EagleTurnLeft(int VR_Step) 
//用途:调用
//描述:驱动电机左转
//参数:
//返回:
//==================================================
int 	EagleTurnLeft(int VR_Step)                       		//左转
{
	int i,j ;
//	* ClearWatchdog = 0x0001;	 
	for(j=0;j<VR_Step;j++)
	{
		SP_Export(Port_IOB_Data,C_TurnLeft);
		VR_TimeFlag = 0;
		VR_TimeDeldy = 0;
		while (VR_TimeFlag != 1)	Delay(40);
		
		SP_Export(Port_IOB_Data,0);
		VR_TimeFlag = 0;
		VR_TimeDeldy = 0;
		while (VR_TimeFlag != 1)	Delay(25);					
	} 
}
//=================================================
//函数:EagleTurnRight(int VR_Step) 
//用途:
//描述:
//参数:
//返回:
//==================================================
int   EagleTurnRight(int VR_Step)                            //右转
{
	int i,j ;
//	* ClearWatchdog = 0x0001;	 
	for(j=0;j<VR_Step;j++)
	{	
		SP_Export(Port_IOB_Data,C_TurnRight);
		VR_TimeFlag = 0;
		VR_TimeDeldy = 0;
		while (VR_TimeFlag != 1)	Delay(40);
			
		SP_Export(Port_IOB_Data,0);
		VR_TimeFlag = 0;
		VR_TimeDeldy = 0;
		while (VR_TimeFlag != 1)	Delay(25);		
	} 
}
//=================================================
//函数:EagleStopMotor(void)
//用途:
//描述:
//参数:
//返回:
//==================================================
void 	EagleStopMotor(void)
{
	SP_Export(Port_IOB_Data,0);
}


⌨️ 快捷键说明

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