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

📄 main.c

📁 这是一个在凌阳单片机上实现一个具有时钟显示和播报、播放音乐并跳舞、对机器人前进计时、避障等功能的机器人的程序
💻 C
字号:
#include "bsrSD.h"
#include "robot.h"

extern void RobotSystemInit(void);
extern void IOAInit(void);
extern unsigned int IsFirstDownLoad(void);
extern void FormatFlash(void);
extern void TrainFiveCommand(void);
extern void SaveFiveCommand(unsigned int uiAddr);
extern void ImportFiveCommand(unsigned int uiAddr_Import);
extern unsigned int TrainWord(unsigned int WordID,unsigned int SndIndex);
extern void PlaySnd(unsigned int SndIndex);
extern void Robot_DanceAgain(unsigned int n);
extern void Robot_Dance(unsigned int n);
extern void Robot_Go1(unsigned int n);
extern void Robot_Go2(unsigned int n);
extern void Robot_Backup(unsigned int n);
extern void Robot_TurnLeft(unsigned int n);
extern void Robot_TurnRight(unsigned int n);
extern void Robot_HeadTurnLeft(unsigned int n);
extern void Robot_HeadTurnRight(unsigned int n);
extern void Robot_Shoot_Prepare(unsigned int n);
extern void Robot_Shoot2(unsigned int n);
extern void Robot_Shoot_Five(unsigned int n);



extern void timeinit(void);//这是用于统计运行时间的
extern void opnirq5(void);//
extern void clsirq5(void);//
extern void showtime(void);//
extern void play_time(void);
extern void showtime2(void);

extern void irq3_init(void);
extern void stop_irq3(void);


extern void F_FlashWrite1Word(unsigned int,unsigned int);
extern void F_FlashErase(int);

extern void Delay(unsigned int);

int main(void)
	{
	unsigned int uiFlagFirst;				//是否为第一次下载
	unsigned int uiRes;						//识别结果
	unsigned int uiActivated;				//是否出于待命状态
	unsigned int uiTimerCount;				//时间是否超时
	unsigned int uiBS_Team;					//用于标识现在是第几组命令在内存当中
	unsigned int uiKey;						//存储键盘值,按下将重新训练
	
	RobotSystemInit();
	IOAInit();
	uiActivated = 0;

	uiFlagFirst = IsFirstDownLoad();		//判断是否为第一次下载程序
	
	if(uiFlagFirst == 1)
	{
		FormatFlash();						//格式化需要存储命令的存储器
		
		TrainFiveCommand();					//训练需要的五条命令(一组)
		SaveFiveCommand(0xf700);			//存储五条命令
		PlaySnd(OK);						//播放Ok,Let's go,表示一组命令存储结束
		PlaySnd(LETUSGO);	
		
		TrainFiveCommand();
		SaveFiveCommand(0xf900);
		PlaySnd(FOLLOWME);
			
		TrainFiveCommand();
		SaveFiveCommand(0xfb00);
		PlaySnd(HO);
		PlaySnd(HOO);
		PlaySnd(HOO);
		PlaySnd(HOOO);
		PlaySnd(HO);
		PlaySnd(HOO);
		PlaySnd(HOO);
		PlaySnd(HOOO);
		
		uiFlagFirst = 0xaaaa;
		F_FlashWrite1Word(0xfd00,0xaaaa);
	}
	
	ImportFiveCommand(0xf700);
	uiBS_Team = 0;
	
Loop:	
	BSR_InitRecognizer(BSR_MIC);			//初始化识别器
	
	IOAInit();
	while(1)
	{	
		*(unsigned int *)0x7012 = 1;		//清看门狗
		//开始识别命令
		uiRes = BSR_GetResult();			//取得识别结果
		if(uiRes > 0)
		{	
			if(uiActivated)
			{
				uiTimerCount = 0;
				switch(uiRes)
				{
					case NAME_ID:
					switch(uiBS_Team)
					{
						case 0:				//第一组的第一个命令(杰克)
						//播放Ok,Les's go,Yeah
						PlaySnd(OK);
						IOAInit();
						break;
						case 1:				//第二组的第一个命令(开始)
						PlaySnd(OK);
						PlaySnd(LETUSGO);
						PlaySnd(YEAH);
						//播放Ok,Les's go
						IOAInit();
						break;
						case 2:				//第三组的第一个命令(准备)
						PlaySnd(OK);
						//播放Ok
						IOAInit();
						break;
					}	
					break;
					
					
					case Command_One_ID:
					switch(uiBS_Team)
					{
						case 0:				//第一组的第二个命令(开始)
						
						//导入第二组命令,修改uiBS_Team为1,播放Wo,Ho,Hoo,Hooo,跳出循环
						ImportFiveCommand(0xf900);
						uiBS_Team = 1;
						PlaySnd(HO);
						PlaySnd(HOO);
						PlaySnd(HOO);
						PlaySnd(HOOO);
						goto Loop;
						break;
						case 1:				//第二组的第二个命令(向前走)
						
						//播放喀咔声音,控制电机向前走
						timeinit();
						opnirq5();
						Robot_Go2(4);
					//	PlaySnd(WALK);
						clsirq5();
						showtime();
						showtime();
						*P_IOA_Data=0x00f0;	
						play_time();
						showtime();
						showtime();
						showtime();
						ImportFiveCommand(0xf700);
						uiBS_Team = 0;
						uiActivated = 0;
						goto Loop;
						break;
						case 2:				//第三组的第二个命令(向左瞄准)
						
						//播放旋转声音,头部电机向左转
						Robot_HeadTurnLeft(1);
						PlaySnd(TURNHEAD);
						PlaySnd(TURNHEAD);
						PlaySnd(TURNHEAD);
						ImportFiveCommand(0xf700);
						uiBS_Team = 0;
						uiActivated = 0;
						goto Loop;
						break;
					}	
					*(unsigned int *)0x7012 = 1;
					uiActivated = 0;		//杰克为触发命令,每完成一个动作需要出发一次
					break;
					
					
					case Command_Two_ID:
					switch(uiBS_Team)
					{
						case 0:				//第一组的第三个命令(准备)
						
						//导入第三组命令,修改uiBS_Team为2,播放Wo,Ho,Hoo,Hooo,跳出循环
						ImportFiveCommand(0xfb00);
						uiBS_Team = 2;
						PlaySnd(HO);
						PlaySnd(HOO);
						PlaySnd(HOO);
						PlaySnd(HOOO);
						goto Loop;
						break;
						case 1:				//第二组的第三个命令(倒退)
						
						//播放喀咔声音,控制电机向后走
						Robot_Backup(1);
						PlaySnd(WALK);
						ImportFiveCommand(0xf700);
						uiBS_Team = 0;
						break;
						case 2:				//第三组的第三个命令(向右瞄准)
						
						//播放旋转声音,头部电机向右转
						Robot_HeadTurnRight(1);
						PlaySnd(TURNHEAD);
						PlaySnd(TURNHEAD);
						PlaySnd(TURNHEAD);
						ImportFiveCommand(0xf700);
						uiBS_Team = 0;
						uiActivated = 0;
						goto Loop;
						break;
					}
					*(unsigned int *)0x7012 = 1;
					uiActivated = 0;
					break;
					
					
					case Command_Three_ID:
					switch(uiBS_Team)
					{
						case 0:				//第一组的第四个命令(跳舞)
						
						//跳舞,清看门狗,时间比较长
						Robot_Dance(2);
						uiActivated = 0;
						*(unsigned int *)0x7012 = 0x0001;
						break;
						case 1:				//第二组的第四个命令(左转)
						
						//播放旋转声音,向左旋转
						Robot_TurnLeft(1);
						PlaySnd(WALK);
						ImportFiveCommand(0xf700);
						uiBS_Team = 0;
						uiActivated = 0;
						goto Loop;
						break;
						case 2:				//第三组的第四个命令(发射)
						
						//播放咚咚声音,发射飞盘
						Robot_Shoot_Prepare(4);
						Delay(1500);
						Robot_Shoot2(2);
						ImportFiveCommand(0xf700);
						uiBS_Team = 0;
						uiActivated = 0;
						goto Loop;
						break;
					}
					*(unsigned int *)0x7012 = 1;
					uiActivated = 0;
					break;
					
					
					case Command_Four_ID:
					switch(uiBS_Team)
					{
						case 0:				//第一组的第五个命令(检测)
						
				
					
						irq3_init();
						Robot_Go1(1);
						stop_irq3();
						uiActivated = 0;
						break;
						case 1:				//第二组的第五个命令(右转)
						
						//播放声音,向右旋转,导到第一组命令,设置uiBS_Team为0,推出循环
						Robot_TurnRight(1);
						PlaySnd(WALK);
						ImportFiveCommand(0xf700);
						uiBS_Team = 0;
						uiActivated = 0;
						goto Loop;
						break;
						case 2:				//第三组的第五个命令(连续发射)
						
						//连续发射飞盘,导到第一组命令,设置uiBS_Team为0,推出循环
						Robot_Shoot_Prepare(4);
						Delay(1500);
						Robot_Shoot_Five(2);
						ImportFiveCommand(0xf700);
						uiBS_Team = 0;
						
						uiActivated = 0;
						goto Loop;
						break;
					}
					*(unsigned int *)0x7012 = 1;
					uiActivated = 0;
					break;
				}
			}
			else
			{
				if(uiRes == NAME_ID)
				{
					*(unsigned int *)0x7012 = 1;
					uiActivated = 1;
					uiTimerCount = 0;
					PlaySnd(OK);
					IOAInit();					//播放应答OK
				}
			}				
		}
		else if(uiActivated)
		{
			if(++uiTimerCount > 700)
			{
				*(unsigned int *)0x7012 = 1;
				uiActivated = 0;
				uiTimerCount = 0;
				PlaySnd(HOOO);	
			}
		}
		uiKey = *P_IOA_Data;
		uiKey = uiKey&0x0004;
		if(uiKey == 0x0004)
		{
			F_FlashErase(0xfd00);
		}	//擦除标志位
	}	
}

⌨️ 快捷键说明

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