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

📄 robot_function.c

📁 语音控制小车应用的开发程序可以控制小车的前进后退左右转
💻 C
字号:
#include "bsrSD.h"
#include "s480.h"
#include "robot_s.h"

void Robot_SystemInit(void);
void PlaySnd(unsigned int);
void Robot_LeftLegGo(unsigned int n);
void Robot_LeftLegBack(unsigned int n);
void Robot_RightLegGo(unsigned int n);
void Robot_RightLegBack(unsigned int n);
void Robot_Light(unsigned int n);
void Robot_DanceAgain(unsigned int n);
void Robot_Dance(unsigned int n);
void Robot_Go(unsigned int n);
void Robot_Backup(unsigned int n);
void Robot_TurnLeft(unsigned int n);
void Robot_TurnRight(unsigned int n);
void Robot_HeadTurnLeft(unsigned int n);
void Robot_HeadTurnRight(unsigned int n);

extern void SACM_S480_ServiceLoop();
extern unsigned int SACM_S480_Status();
extern void Delay(unsigned int n);
extern void Set_IOB_Bit(unsigned int,unsigned int,unsigned int
						,unsigned int,unsigned int);


void Robot_SystemInit(void)
{
	*(unsigned int *)0x7012 = 1;
	Delay(500);
	*P_IOB_Data = 0xffff;
	*P_IOB_Attrib = 0xffff;
	*P_IOB_Dir = 0xffff;
	
	*P_IOB_Data = 0x0000;
	Delay(500);
}

void PlaySnd(unsigned int SndIndex)
{
	BSR_StopRecognizer();
	SACM_S480_Initial(1);
	SACM_S480_Play(SndIndex,3,3);
	while((SACM_S480_Status()&0x0001) != 0)
	{
		SACM_S480_ServiceLoop();
		*(unsigned int *)0x7012 = 1;
	}
	SACM_S480_Stop();
	BSR_InitRecognizer(BSR_MIC);
	BSR_EnableCPUIndicator();
}

void Robot_LeftLegGo(unsigned int n)
{
	unsigned int uiP_IOB_Data;
	unsigned int uiP_IOB_Dir;
	unsigned int uiP_IOB_Attrib;
	
	*(unsigned int *)0x7012 = 1;
	
	uiP_IOB_Dir = *P_IOB_Dir;					//读回IOB口的状态值
	uiP_IOB_Attrib = *P_IOB_Attrib;
	uiP_IOB_Data = *P_IOB_Data;
	
	uiP_IOB_Dir |= 0x0200;						//改变IOB9位
	uiP_IOB_Attrib |= 0x0200;
	uiP_IOB_Data |= 0x0200;
	
	*P_IOB_Dir = uiP_IOB_Dir;					//设置IOB9为高电平输出
	*P_IOB_Attrib = uiP_IOB_Attrib;				//其它IO口不变
	*P_IOB_Data = uiP_IOB_Data;
	
	Delay(n);
		
	uiP_IOB_Dir = *P_IOB_Dir;					//读回IOB口的状态值
	uiP_IOB_Attrib = *P_IOB_Attrib;
	uiP_IOB_Data = *P_IOB_Data;
	
	uiP_IOB_Dir |= 0x0200;						//改变IOB9位
	uiP_IOB_Attrib |= 0x0200;
	uiP_IOB_Data &= 0xfdff;
	
	*P_IOB_Dir = uiP_IOB_Dir;					//设置IOB9为低电平输出
	*P_IOB_Attrib = uiP_IOB_Attrib;				//其它IO口不变
	*P_IOB_Data = uiP_IOB_Data;
}

void Robot_LeftLegBack(unsigned int n)
{
	unsigned int uiP_IOB_Data;
	unsigned int uiP_IOB_Dir;
	unsigned int uiP_IOB_Attrib;
	
	*(unsigned int *)0x7012 = 1;
	
	uiP_IOB_Dir = *P_IOB_Dir;					//读回IOB口的状态值
	uiP_IOB_Attrib = *P_IOB_Attrib;
	uiP_IOB_Data = *P_IOB_Data;
	
	uiP_IOB_Dir |= 0x0100;						//改变IOB8位
	uiP_IOB_Attrib |= 0x0100;
	uiP_IOB_Data |= 0x0100;
	
	*P_IOB_Dir = uiP_IOB_Dir;					//设置IOB8为高电平输出
	*P_IOB_Attrib = uiP_IOB_Attrib;				//其它IO口不变
	*P_IOB_Data = uiP_IOB_Data;
	
	Delay(n);
		
	uiP_IOB_Dir = *P_IOB_Dir;					//读回IOB口的状态值
	uiP_IOB_Attrib = *P_IOB_Attrib;
	uiP_IOB_Data = *P_IOB_Data;
	
	uiP_IOB_Dir |= 0x0100;						//改变IOB8位
	uiP_IOB_Attrib |= 0x0100;
	uiP_IOB_Data &= 0xfeff;
	
	*P_IOB_Dir = uiP_IOB_Dir;					//设置IOB8为低电平输出
	*P_IOB_Attrib = uiP_IOB_Attrib;				//其它IO口不变
	*P_IOB_Data = uiP_IOB_Data;
}

void Robot_RightLegGo(unsigned int n)
{
	unsigned int uiP_IOB_Data;
	unsigned int uiP_IOB_Dir;
	unsigned int uiP_IOB_Attrib;
	
	*(unsigned int *)0x7012 = 1;
	
	uiP_IOB_Dir = *P_IOB_Dir;					//读回IOB口的状态值
	uiP_IOB_Attrib = *P_IOB_Attrib;
	uiP_IOB_Data = *P_IOB_Data;
	
	uiP_IOB_Dir |= 0x0800;						//改变IOB11位
	uiP_IOB_Attrib |= 0x0800;
	uiP_IOB_Data |= 0x0800;
	
	*P_IOB_Dir = uiP_IOB_Dir;					//设置IOB11为高电平输出
	*P_IOB_Attrib = uiP_IOB_Attrib;				//其它IO口不变
	*P_IOB_Data = uiP_IOB_Data;
	
	Delay(n);
		
	uiP_IOB_Dir = *P_IOB_Dir;					//读回IOB口的状态值
	uiP_IOB_Attrib = *P_IOB_Attrib;
	uiP_IOB_Data = *P_IOB_Data;
	
	uiP_IOB_Dir |= 0x0800;						//改变IOB11位
	uiP_IOB_Attrib |= 0x0800;
	uiP_IOB_Data &= 0xf7ff;
	
	*P_IOB_Dir = uiP_IOB_Dir;					//设置IOB11为低电平输出
	*P_IOB_Attrib = uiP_IOB_Attrib;				//其它IO口不变
	*P_IOB_Data = uiP_IOB_Data;
}

void Robot_RightLegBack(unsigned int n)
{
	unsigned int uiP_IOB_Data;
	unsigned int uiP_IOB_Dir;
	unsigned int uiP_IOB_Attrib;
	
	*(unsigned int *)0x7012 = 1;
	
	uiP_IOB_Dir = *P_IOB_Dir;					//读回IOB口的状态值
	uiP_IOB_Attrib = *P_IOB_Attrib;
	uiP_IOB_Data = *P_IOB_Data;
	
	uiP_IOB_Dir |= 0x0400;						//改变IOB10位
	uiP_IOB_Attrib |= 0x0400;
	uiP_IOB_Data |= 0x0400;
	
	*P_IOB_Dir = uiP_IOB_Dir;					//设置IOB10为高电平输出
	*P_IOB_Attrib = uiP_IOB_Attrib;				//其它IO口不变
	*P_IOB_Data = uiP_IOB_Data;
	
	Delay(n);
		
	uiP_IOB_Dir = *P_IOB_Dir;					//读回IOB口的状态值
	uiP_IOB_Attrib = *P_IOB_Attrib;
	uiP_IOB_Data = *P_IOB_Data;
	
	uiP_IOB_Dir |= 0x0400;						//改变IOB10位
	uiP_IOB_Attrib |= 0x0400;
	uiP_IOB_Data &= 0xfbff;
	
	*P_IOB_Dir = uiP_IOB_Dir;					//设置IOB10为低电平输出
	*P_IOB_Attrib = uiP_IOB_Attrib;				//其它IO口不变
	*P_IOB_Data = uiP_IOB_Data;
}

void Robot_Light(unsigned int n)
{
	unsigned int uiP_IOB_Data;
	unsigned int uiP_IOB_Dir;
	unsigned int uiP_IOB_Attrib;
	
	*(unsigned int *)0x7012 = 1;
	
	uiP_IOB_Dir = *P_IOB_Dir;					//读回IOB口的状态值
	uiP_IOB_Attrib = *P_IOB_Attrib;
	uiP_IOB_Data = *P_IOB_Data;
	
	uiP_IOB_Dir |= 0x1000;						//改变IOB12位
	uiP_IOB_Attrib |= 0x1000;
	uiP_IOB_Data |= 0x1000;
	
	*P_IOB_Dir = uiP_IOB_Dir;					//设置IOB12为高电平输出
	*P_IOB_Attrib = uiP_IOB_Attrib;				//其它IO口不变
	*P_IOB_Data = uiP_IOB_Data;
	
	Delay(n);
		
	uiP_IOB_Dir = *P_IOB_Dir;					//读回IOB口的状态值
	uiP_IOB_Attrib = *P_IOB_Attrib;
	uiP_IOB_Data = *P_IOB_Data;
	
	uiP_IOB_Dir |= 0x1000;						//改变IOB12位
	uiP_IOB_Attrib |= 0x1000;
	uiP_IOB_Data &= 0xefff;
	
	*P_IOB_Dir = uiP_IOB_Dir;					//设置IOB12为低电平输出
	*P_IOB_Attrib = uiP_IOB_Attrib;				//其它IO口不变
	*P_IOB_Data = uiP_IOB_Data;
}

void Robot_DanceAgain(unsigned int n)
{
	unsigned int uiCount;
	unsigned int uiP_IOB_Data;
	unsigned int uiP_IOB_Dir;
	unsigned int uiP_IOB_Attrib;
	
	*(unsigned int *)0x7012 = 1;
	
	for(uiCount = 0;uiCount < n;uiCount++)
	{
		uiP_IOB_Dir = *P_IOB_Dir;					//读回IOB口的状态值
		uiP_IOB_Attrib = *P_IOB_Attrib;
		uiP_IOB_Data = *P_IOB_Data;
	
		uiP_IOB_Dir |= 0x2900;						//改变IOB8、IOB11、IOB13位
		uiP_IOB_Attrib |= 0x2900;
		uiP_IOB_Data |= 0x2900;
	
		*P_IOB_Dir = uiP_IOB_Dir;					//设置IOB8、IOB11、IOB13为高电平输出
		*P_IOB_Attrib = uiP_IOB_Attrib;				//其它IO口不变
		*P_IOB_Data = uiP_IOB_Data;
		
		PlaySnd(D24);
		Robot_SystemInit();
		
		
		uiP_IOB_Dir = *P_IOB_Dir;					//读回IOB口的状态值
		uiP_IOB_Attrib = *P_IOB_Attrib;
		uiP_IOB_Data = *P_IOB_Data;
	
		uiP_IOB_Dir |= 0x4600;						//改变IOB9、IOB10、IOB14位
		uiP_IOB_Attrib |= 0x4600;
		uiP_IOB_Data |= 0x4600;
	
		*P_IOB_Dir = uiP_IOB_Dir;					//设置IOB9、IOB10、IOB14为高电平输出
		*P_IOB_Attrib = uiP_IOB_Attrib;				//其它IO口不变
		*P_IOB_Data = uiP_IOB_Data;
		
		PlaySnd(D25);
		Robot_SystemInit();
		
		
		uiP_IOB_Dir = *P_IOB_Dir;					//读回IOB口的状态值
		uiP_IOB_Attrib = *P_IOB_Attrib;
		uiP_IOB_Data = *P_IOB_Data;
	
		uiP_IOB_Dir |= 0x0900;						//改变IOB8、IOB11位
		uiP_IOB_Attrib |= 0x0900;
		uiP_IOB_Data |= 0x0900;
	
		*P_IOB_Dir = uiP_IOB_Dir;					//设置IOB8、IOB11为高电平输出
		*P_IOB_Attrib = uiP_IOB_Attrib;				//其它IO口不变
		*P_IOB_Data = uiP_IOB_Data;
		
		PlaySnd(D26);
		Robot_SystemInit();
		
		
		uiP_IOB_Dir = *P_IOB_Dir;					//读回IOB口的状态值
		uiP_IOB_Attrib = *P_IOB_Attrib;
		uiP_IOB_Data = *P_IOB_Data;
	
		uiP_IOB_Dir |= 0x0a00;						//改变IOB9、IOB11位
		uiP_IOB_Attrib |= 0x0a00;
		uiP_IOB_Data |= 0x0a00;
	
		*P_IOB_Dir = uiP_IOB_Dir;					//设置IOB9、IOB11为高电平输出
		*P_IOB_Attrib = uiP_IOB_Attrib;				//其它IO口不变
		*P_IOB_Data = uiP_IOB_Data;
		
		PlaySnd(D24);
		Robot_SystemInit();
		
		
		uiP_IOB_Dir = *P_IOB_Dir;					//读回IOB口的状态值
		uiP_IOB_Attrib = *P_IOB_Attrib;
		uiP_IOB_Data = *P_IOB_Data;
	
		uiP_IOB_Dir |= 0x0500;						//改变IOB8、IOB10位
		uiP_IOB_Attrib |= 0x0500;
		uiP_IOB_Data |= 0x0500;
	
		*P_IOB_Dir = uiP_IOB_Dir;					//设置IO8、IOB10为高电平输出
		*P_IOB_Attrib = uiP_IOB_Attrib;				//其它IO口不变
		*P_IOB_Data = uiP_IOB_Data;
		
		PlaySnd(D25);
		Robot_SystemInit();
		
		
		uiP_IOB_Dir = *P_IOB_Dir;					//读回IOB口的状态值
		uiP_IOB_Attrib = *P_IOB_Attrib;
		uiP_IOB_Data = *P_IOB_Data;
	
		uiP_IOB_Dir |= 0x0a00;						//改变IOB9、IOB11位
		uiP_IOB_Attrib |= 0x0a00;
		uiP_IOB_Data |= 0x0a00;
	
		*P_IOB_Dir = uiP_IOB_Dir;					//设置IOB9、IOB11为高电平输出
		*P_IOB_Attrib = uiP_IOB_Attrib;				//其它IO口不变
		*P_IOB_Data = uiP_IOB_Data;
		
		PlaySnd(D26);
		Robot_SystemInit();
		
		
		uiP_IOB_Dir = *P_IOB_Dir;					//读回IOB口的状态值
		uiP_IOB_Attrib = *P_IOB_Attrib;
		uiP_IOB_Data = *P_IOB_Data;
	
		uiP_IOB_Dir |= 0x2200;						//改变IOB9、IOB13位
		uiP_IOB_Attrib |= 0x2200;
		uiP_IOB_Data |= 0x2200;
	
		*P_IOB_Dir = uiP_IOB_Dir;					//设置IOB9、IOB13为高电平输出
		*P_IOB_Attrib = uiP_IOB_Attrib;				//其它IO口不变
		*P_IOB_Data = uiP_IOB_Data;
		
		PlaySnd(D27);
		Robot_SystemInit();
		
		
		uiP_IOB_Dir = *P_IOB_Dir;					//读回IOB口的状态值
		uiP_IOB_Attrib = *P_IOB_Attrib;
		uiP_IOB_Data = *P_IOB_Data;
	
		uiP_IOB_Dir |= 0x4800;						//改变IOB11、IOB14位
		uiP_IOB_Attrib |= 0x4800;
		uiP_IOB_Data |= 0x4800;
	
		*P_IOB_Dir = uiP_IOB_Dir;					//设置IOB11、IOB14为高电平输出
		*P_IOB_Attrib = uiP_IOB_Attrib;				//其它IO口不变
		*P_IOB_Data = uiP_IOB_Data;
		
		PlaySnd(D28);
		Robot_SystemInit();
		
		
		uiP_IOB_Dir = *P_IOB_Dir;					//读回IOB口的状态值
		uiP_IOB_Attrib = *P_IOB_Attrib;
		uiP_IOB_Data = *P_IOB_Data;
	
		uiP_IOB_Dir |= 0x0200;						//改变IOB9位
		uiP_IOB_Attrib |= 0x0200;
		uiP_IOB_Data |= 0x0200;
	
		*P_IOB_Dir = uiP_IOB_Dir;					//设置IOB9为高电平输出
		*P_IOB_Attrib = uiP_IOB_Attrib;				//其它IO口不变
		*P_IOB_Data = uiP_IOB_Data;
		
		PlaySnd(D29);
		Robot_SystemInit();
	}
	Robot_SystemInit();
}

void Robot_Dance(unsigned int n)
{
	unsigned int uiCount;
	
	*(unsigned int *)0x7012 = 1;
	
	for(uiCount = 0;uiCount < n;uiCount++)
	{
		Set_IOB_Bit(11,1,1,1,1);
		PlaySnd(MUSIC1);
		Set_IOB_Bit(11,1,1,0,0);
		Set_IOB_Bit(9,1,1,1,1);
		*(unsigned int *)0x7012 = 0x0001;
		PlaySnd(MUSIC2);
		Set_IOB_Bit(9,1,1,0,0);
		Set_IOB_Bit(11,1,1,1,1);
		Set_IOB_Bit(9,1,1,1,1);
		*(unsigned int *)0x7012 = 0x0001;
		PlaySnd(MUSIC3);
		Set_IOB_Bit(11,1,1,0,0);
		Set_IOB_Bit(9,1,1,0,0);
		Set_IOB_Bit(13,1,1,1,1);
    	*(unsigned int *)0x7012 = 0x0001;
		PlaySnd(MUSIC4);
		Set_IOB_Bit(13,1,1,0,0);
		Set_IOB_Bit(14,1,1,1,1);
		Set_IOB_Bit(9,1,1,1,1);
		*(unsigned int *)0x7012 = 0x0001;
		PlaySnd(MUSIC4);
		Set_IOB_Bit(9,1,1,0,0);
		Set_IOB_Bit(8,1,1,1,1);
		Set_IOB_Bit(11,1,1,1,1);
		Set_IOB_Bit(14,1,1,1,1);
    	*(unsigned int *)0x7012 = 0x0001;
    	Delay(400);
    	Robot_SystemInit();
	}
	Robot_SystemInit();
}

void Robot_Go(unsigned int n)
{
	unsigned int uiCount;
	for(uiCount = 0;uiCount < n;uiCount++)
	{
		Set_IOB_Bit(9,1,1,1,1);
		PlaySnd(WALK);
		Set_IOB_Bit(9,1,1,0,0);
		Set_IOB_Bit(11,1,1,1,1);
		Delay(2000);
		*(unsigned int *)0x7012 = 0x0001;
		PlaySnd(WALK);
		Set_IOB_Bit(9,1,1,1,1);
		Set_IOB_Bit(11,1,1,0,0);
		Delay(2000);
		*(unsigned int *)0x7012 = 0x0001;
		PlaySnd(WALK);
		Set_IOB_Bit(9,1,1,0,0);
		Set_IOB_Bit(11,1,1,1,1);
		Delay(2000);
		*(unsigned int *)0x7012 = 0x0001;
		PlaySnd(WALK);
		Set_IOB_Bit(9,1,1,1,1);
		Set_IOB_Bit(11,1,1,0,0);
		Delay(2000);
		*(unsigned int *)0x7012 = 0x0001;
		PlaySnd(WALK);
		Set_IOB_Bit(9,1,1,0,0);
		Set_IOB_Bit(11,1,1,1,1);
		Delay(2000);
		*(unsigned int *)0x7012 = 0x0001;
		PlaySnd(WALK);
		Set_IOB_Bit(9,1,1,1,1);
		Set_IOB_Bit(11,1,1,0,0);
		Delay(2000);
		*(unsigned int *)0x7012 = 0x0001;
		PlaySnd(WALK);
		Set_IOB_Bit(9,1,1,0,0);
		Set_IOB_Bit(11,1,1,1,1);
		Delay(2000);
		*(unsigned int *)0x7012 = 0x0001;
		Robot_SystemInit();
	}
	Robot_SystemInit();
}

void Robot_Backup(unsigned int n)
{
	unsigned int uiCount;
	for(uiCount = 0;uiCount < n;uiCount++)
	{
		Set_IOB_Bit(8,1,1,1,1);
		PlaySnd(WALK);
		Set_IOB_Bit(8,1,1,0,0);
		Set_IOB_Bit(10,1,1,1,1);
		Delay(2000);
		PlaySnd(WALK);
		Set_IOB_Bit(8,1,1,1,1);
		Set_IOB_Bit(10,1,1,0,0);
		Delay(2000);
		PlaySnd(WALK);
		Set_IOB_Bit(8,1,1,0,0);
		Set_IOB_Bit(10,1,1,1,1);
		Delay(2000);
		Robot_SystemInit();
	}
	Robot_SystemInit();
}

void Robot_TurnLeft(unsigned int n)
{
	unsigned int uiCount;
	for(uiCount = 0;uiCount < n;uiCount++)
	{
		Set_IOB_Bit(9,1,1,1,1);
		Set_IOB_Bit(10,1,1,1,1);
		PlaySnd(WALK);
		Delay(2000);
		Robot_SystemInit();
	}
}

void Robot_TurnRight(unsigned int n)
{
	unsigned int uiCount;
	
	for(uiCount = 0;uiCount < n;uiCount++)
	{
		Set_IOB_Bit(8,1,1,1,1);
		Set_IOB_Bit(11,1,1,1,1);
		PlaySnd(WALK);
		Delay(2000);
		Robot_SystemInit();
	}
}

void Robot_HeadTurnLeft(unsigned int n)
{
	unsigned int uiCount;
	for(uiCount = 0;uiCount < n; uiCount++)
	{
		Set_IOB_Bit(13,1,1,1,1);
		PlaySnd(TURNHEAD);
		Delay(200);
		Robot_SystemInit();
	}
}

void Robot_HeadTurnRight(unsigned int n)
{
	unsigned int uiCount;
	for(uiCount = 0;uiCount < n;uiCount++)
	{
		Set_IOB_Bit(14,1,1,1,1);
		PlaySnd(TURNHEAD);
		Delay(200);
		Robot_SystemInit();
	}
}

⌨️ 快捷键说明

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