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

📄 mouse_drive.c

📁 周立功电子鼠V1.3内部演示版源程序
💻 C
📖 第 1 页 / 共 3 页
字号:
//------------------------------------------------------------------------------------
// 函数名称: 
// 函数功能: 
//
//------------------------------------------------------------------------------------
void map_xy(void)
{
	switch(MAP.dir)
	{
	case 0:
		MAP.y++;
		ZLG7289_Download(1, 6, 0, MAP.y/10);
	    ZLG7289_Download(1, 7, 0, MAP.y%10);
		break;
	case 1:
		MAP.x++;
		ZLG7289_Download(1, 0, 0, MAP.x/10);
	    ZLG7289_Download(1, 1, 0, MAP.x%10);
		break;
	case 2:
		MAP.y--;
		ZLG7289_Download(1, 6, 0, MAP.y/10);
	    ZLG7289_Download(1, 7, 0, MAP.y%10);
		break;
	case 3:
		MAP.x--;
		ZLG7289_Download(1, 0, 0, MAP.x/10);
	    ZLG7289_Download(1, 1, 0, MAP.x%10);
		break;
	default:
		break;
	}
}
//------------------------------------------------------------------------------------
// 函数名称: 
// 函数功能: 
//
//------------------------------------------------------------------------------------
void MappulseClear(void)
{
	if((MAP.rightpulse>20)&&(MAP.leftpulse>20))
		map_xy();
	MAP.rightpulse = 0;
	MAP.leftpulse  = 0;
}

//------------------------------------------------------------------------------------
// 函数名称: Timer1A_ISR
// 函数功能: 定时器1中断服务函数,定时检测小车在迷宫中的状态。
//
//------------------------------------------------------------------------------------
void Timer1A_ISR(void)
{
	static int32 e[3] = {0,0,0},signl = 0,signr = 0;
	TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT);
	Check_Infrared();
	if(Check_Maze_State[0].front_2 && Check_Maze_State[1].front_2)
	{
		if(g_Run.COM_Run == GO_ON)
		{
			g_Run.MousePulCount = 0;
			MouseRUN(STOP);
		}
	}

	if(goahead)
	{
		if((Check_Maze_State[1].left_2 == 0) && (Check_Maze_State[0].left_2 ==0))
		{
			if(signl == 0)
			{
				MappulseClear();
				g_Run.MousePulCount = 0;
				MouseRUN(STOP);
				signl = 1;
			}
		}
		if((Check_Maze_State[1].right_2 == 0) && (Check_Maze_State[0].right_2 ==0))
		{
			if(signr == 0)
			{
				MappulseClear();
				g_Run.MousePulCount = 0;
				MouseRUN(STOP);
				signr = 1;
			}
		}
	}
	else
	{
		signl = 0;
		signr = 0;
	}
	if((MAP.leftpulse>=31)&&(MAP.rightpulse>=31))
	{
		map_xy();
		MAP.leftpulse -=31;
		MAP.rightpulse -= 31;
	}
	if((g_Run.WheelStop&0x11)!=0x11)
	{
		e[2] = e[1];
		e[1] = e[0];
		if((g_Run.WheelStop&0x11)==0x00)
		{
			if(g_Run.LeftTime > g_Run.RightTime)
			{
				e[0] = g_Run.SysTick - g_Run.LeftTime;
			}
			else
			{
				e[0] = g_Run.SysTick - g_Run.RightTime;
			}
		}
		if((g_Run.WheelStop&0x11)==0x01)
		{
			e[0] =g_Run.SysTick - g_Run.LeftTime;
		}
	
		if((g_Run.WheelStop&0x11)==0x10)
		{
			e[0] =g_Run.SysTick - g_Run.RightTime;
		}
		e[0] = e[0] - 20;
		g_Run.percent += (3*(e[0]-e[1])/2+e[0]/15 + (e[0]-2*e[1]+e[2])/10);
		if(g_Run.percent<25)
			g_Run.percent = 25;
		if(g_Run.percent>75)
			g_Run.percent = 75;
		PwmPercent(g_Run.percent);
	}

}

//------------------------------------------------------------------------------------
// 函数名称: Check_Infrared
// 函数功能: 红外检测函数
//------------------------------------------------------------------------------------
void Check_Infrared(void)
{
	unsigned char l = 0,f = 0,r = 0,i = 0;
	Check_Maze_State[1] = Check_Maze_State[0];
	SendInfrared(37000);
    Delay(1500);
    
    for(i=0,l = 0,f = 0,r = 0;i<10;i++)
    {
        if(GPIOPinRead(GPIO_PORTA_BASE, STATE_L)==0)
            l++;
        if(GPIOPinRead(GPIO_PORTA_BASE, STATE_F)==0)
            f++;
        if(GPIOPinRead(GPIO_PORTA_BASE, STATE_R)==0)
            r++;
    }

	ForbidInfrared();

    if(l>8)															// 左边存在挡板
    {
		Check_Maze_State[0].left_2 = 1;
    }
    else															// 左边存在支路
    {
		Check_Maze_State[0].left_2 = 0;
    }
    if(f>8)															// 前面存在挡板
    {
		Check_Maze_State[0].front_2 = 1;
    }
    else															// 前面没有挡板
    {
		Check_Maze_State[0].front_2 = 0;
    }
    if(r>8)															// 右边存在挡板
    {
		Check_Maze_State[0].right_2 = 1;
    }
    else															// 右边存在支路
    {
		Check_Maze_State[0].right_2 = 0;
    }
	Delay(2000);		

	SendInfrared(30500);
    Delay(1500);
    for(i=0,l = 0,f = 0,r = 0;i<10;i++)
    {
        if(GPIOPinRead(GPIO_PORTA_BASE, STATE_L)==0)
            l++;
        if(GPIOPinRead(GPIO_PORTA_BASE, STATE_F)==0)
            f++;
        if(GPIOPinRead(GPIO_PORTA_BASE, STATE_R)==0)
            r++;
    }
    ForbidInfrared();
    if(l>8)															// 左边存在挡板
    {
		Check_Maze_State[0].left_1 = 1;
    }
    else															// 左边存在支路
    {
		Check_Maze_State[0].left_1 = 0;
    }
    if(f>8)															// 前面存在挡板
    {
		Check_Maze_State[0].front_1 = 1;
    }
    else															// 前面没有挡板
    {
		Check_Maze_State[0].front_1 = 0;
    }
    if(r>8)															// 右边存在挡板
    {
		Check_Maze_State[0].right_1 = 1;
    }
    else															// 右边存在支路
    {
		Check_Maze_State[0].right_1 = 0;
    }

}

//------------------------------------------------------------------------------------
//
//
//------------------------------------------------------------------------------------
void MicroMouseInit(void)
{
	SysCtlClockSet( SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
	              SYSCTL_XTAL_6MHZ );                  					// 使能PLL,20M

	SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOA );        				// 使能GPIO A口外设
	SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOB );         				// 使能GPIO B口外设
	SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOC );						// 使能GPIO C口外设


	GPIODirModeSet(GPIO_PORTB_BASE, KEY, GPIO_DIR_MODE_IN);
	if(GPIOPinRead(GPIO_PORTB_BASE, KEY)==0)
	{
		while(1);
	}
	
	GPIODirModeSet(GPIO_PORTC_BASE, LED1 | LED2 | LED3 | LED4, GPIO_DIR_MODE_OUT);
	GPIODirModeSet(GPIO_PORTB_BASE, LED5 , GPIO_DIR_MODE_OUT);
	GPIODirModeSet(GPIO_PORTA_BASE, STATE_L | STATE_R | STATE_F, GPIO_DIR_MODE_IN);
	Timer0Ini();
	Timer1Ini();
	WheelPulseIni();
	SysTickIni();
}
//------------------------------------------------------------------------------------
// 函数名称: CheckKey
// 函数功能: 读取按键状态
// 出口参数: 有按键返回真,否则返回假
//------------------------------------------------------------------------------------
uint32 CheckKey(void)
{
	if(GPIOPinRead(GPIO_PORTB_BASE, KEY)==0)
	{
		Delay(50);
		while(GPIOPinRead(GPIO_PORTB_BASE, KEY)==0);
		return(true);
	}
	else
		return(false);
}
//------------------------------------------------------------------------------------
// 函数名称: LEDDisplay
// 函数功能: 控制LED熄灭和点亮
// 入口参数: number: 选择所要控制的LED
//           option: 控制方式参数,(0,熄灭。1,点亮。2,状态取反)
//------------------------------------------------------------------------------------
void LEDDisplay(uint32 number,uint32 option)
{
	switch(number)
	{
		case 0:
		case 1:
			if(option == 0)
				GPIOPinWrite(GPIO_PORTC_BASE, LED1, 0xff);
			if(option == 1)
				GPIOPinWrite(GPIO_PORTC_BASE, LED1, 0x00);
			if(option == 2)
				GPIOPinWrite(GPIO_PORTC_BASE, LED1, GPIOPinRead(GPIO_PORTC_BASE, LED1)^LED1);
			if(number != 0)
				break;
		case 2:
			if(option == 0)
				GPIOPinWrite(GPIO_PORTC_BASE, LED2, 0xff);
			if(option == 1)
				GPIOPinWrite(GPIO_PORTC_BASE, LED2, 0x00);
			if(option == 2)
				GPIOPinWrite(GPIO_PORTC_BASE, LED2, GPIOPinRead(GPIO_PORTC_BASE, LED2)^LED2);
			if(number != 0)
				break;
		case 3:
			if(option == 0)
				GPIOPinWrite(GPIO_PORTC_BASE, LED3, 0xff);
			if(option == 1)
				GPIOPinWrite(GPIO_PORTC_BASE, LED3, 0x00);
			if(option == 2)
				GPIOPinWrite(GPIO_PORTC_BASE, LED3, GPIOPinRead(GPIO_PORTC_BASE, LED3)^LED3);
			if(number != 0)
				break;
		case 4:
			if(option == 0)
				GPIOPinWrite(GPIO_PORTC_BASE, LED4, 0xff);
			if(option == 1)
				GPIOPinWrite(GPIO_PORTC_BASE, LED4, 0x00);
			if(option == 2)
				GPIOPinWrite(GPIO_PORTC_BASE, LED4, GPIOPinRead(GPIO_PORTC_BASE, LED4)^LED4);
			if(number != 0)
				break;
		case 5:
			if(option == 0)
				GPIOPinWrite(GPIO_PORTB_BASE, LED5, 0xff);
			if(option == 1)
				GPIOPinWrite(GPIO_PORTB_BASE, LED5, 0x00);
			if(option == 2)
				GPIOPinWrite(GPIO_PORTB_BASE, LED5, GPIOPinRead(GPIO_PORTB_BASE, LED5)^LED5);
			break;
	}
}
void DirDisplay(void)
{
	switch(MAP.dir)
	{
	case 0:
		ZLG7289_Download(2, 3, 0, 0x47);		// F
		break;
	case 1:
		ZLG7289_Download(2, 3, 0, 0x77);		// R
		break;
	case 2:
		ZLG7289_Download(2, 3, 0, 0x1f);		// b
		break;
	case 3:
		ZLG7289_Download(2, 3, 0, 0x0e);		// L
		break;
	default :
		ZLG7289_Download(2, 3, 0, 0x4f);		// E
		break;
	}
}

⌨️ 快捷键说明

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