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

📄 car_prevent.c

📁 基于AT Mega16的多功能小车
💻 C
字号:
//======================================================================
//	The information contained herein is the exclusive property of
//	Beijing Bynatec Co., Ltd. And shall not be distributed, reproduced,
//	or disclosed in whole in part without prior written permission.
//	(C) COPYRIGHT 2009 Beijing Bynatec Co., Ltd.
//	ALL RIGHTS RESERVED
//	The entire notice above must be reproduced on all authorized copies.
//======================================================================

//============================================================
//	犀拓开发网 http://www.mcutop.com
//
//	工程名称:	car_prevent.aps
//	功能描述:	智能小车蔽障
//	IDE环境:	AVR Studio v4.14 WinAVR-20081205
//	操作系统:	windows xp sp3
//	涉及的库:	libc.a
//	组成文件:	main.c
//	硬件连接:	I/O---侧---有障---无障
//				PA4---左----0------1
//				PA5---右----0------1
//
//				晶振7.3728MHz
//	维护记录:	2009年3月2日	v1.0
//======================================================================

//======================================================================
//	文件名称:	main.c
//	功能描述:	智能小车蔽障
//	维护记录:	2009年3月2日	v1.0
//======================================================================


#include "avr/io.h"
#include "util/delay.h"
#include "avr/interrupt.h"
#include "car.h"
#include "key.h"

//======================================================================
//	函    数:	void sensor_init(void)
//	实现功能:	循迹传感器初始化
//	入口参数:	无
//	返回  值:	无
//======================================================================
void sensor_init(void)
{
	DDRA &= ~0x30;						// PA4~PA5 设置为输入
}

//======================================================================
//	函    数:	void car_prevent(void)
//	实现功能:	蔽障
//	入口参数:	无
//	返回  值:	无
//======================================================================
// 小车目前有无障碍 状态 

uint8_t g_state = 0;					// 小车当前状态

#define OBSTACLE_NONE		0			// 0 无障碍		简记为	A
#define OBSTACLE_LEFT		1			// 1 左侧有障碍			B
#define OBSTRACLE_RIGHT		2			// 2 右侧有障碍			C
#define OBSTRACLE_FRONT		3			// 3 前方有障碍			D

#define SENSOR_N			0x30		// 传感器没检测到信号
#define SENSOR_L			0x20		// 传感器左检测到信号
#define SENSOR_R			0x10		// 传感器右检测到信号
#define SENSOR_B			0x00		// 传感器左右 同时检测到信号

// 定义状态机
// 状态变为
// A ---> A:	无障碍 			小车直走
// A ---> B:	左侧障碍		小车右转
// A ---> C:	右侧障碍		小车左转
// A ---> D:	前方障碍		小车后退并右转

// B ---> A:	左侧障碍消除	小车直行
// B ---> B:	左->左侧障碍	小车右转
// B ---> C:	左->右侧障碍	小车右转
// B ---> D:	左->前方障碍	小车右转

// C ---> A:	右侧障碍消除	小车直行
// C ---> B:	右->左侧障碍	小车左转
// C ---> C:	右->右侧障碍	小车左转
// C ---> D:	右->前方障碍	小车左转

// D ---> A:	前方障碍消除	小车直行
// D ---> B:	前->左侧障碍	小车右转
// D ---> C:	前->右侧障碍	小车右转
// D ---> D:	前->前方障碍	小车后退并右转

void car_prevent(void)
{
	unsigned int sensor;
	sensor = (PINA&0x30);					// 蔽障传感器信号

	switch(g_state)
	{
		case OBSTACLE_NONE:
			switch(sensor)
			{
				case SENSOR_N:				// A ---> A:	无障碍 			小车直走
					car_ahead();
					_delay_ms(500);
					g_state = OBSTACLE_NONE;
					break;
				case SENSOR_L:				// A ---> B:	左侧障碍		小车右转
					car_right();
					_delay_ms(500);
					g_state = OBSTACLE_LEFT;
					break;
				case SENSOR_R:				// A ---> C:	右侧障碍		小车左转
					car_left();
					_delay_ms(500);
					g_state = OBSTRACLE_RIGHT;
					break;
				case SENSOR_B:				// A ---> D:	前方障碍		小车后退并右转
					car_backward();
					_delay_ms(600);
					car_right();
					_delay_ms(800);
					g_state = OBSTRACLE_FRONT;
					break;
			}
			break;
		case OBSTACLE_LEFT:
			switch(sensor)
			{
				case SENSOR_N:				// B ---> A:	左侧障碍消除	小车停止
					car_stop();
					g_state = OBSTACLE_NONE;
					break;
				case SENSOR_L:				// B ---> B:	左->左侧障碍	小车右转
					car_right();
					_delay_ms(500);
					g_state = OBSTACLE_LEFT;
					break;
				case SENSOR_R:				// B ---> C:	左->右侧障碍	小车右转
					car_right();
					_delay_ms(500);
					g_state = OBSTRACLE_RIGHT;
					break;
				case SENSOR_B:				// B ---> D:	左->前方障碍	小车右转
					car_right();
					_delay_ms(500);
					g_state = OBSTRACLE_FRONT;
					break;
			}
			break;
		case OBSTRACLE_RIGHT:
			switch(sensor)
			{
				case SENSOR_N:				// C ---> A:	右侧障碍消除	小车停止
					car_stop();
					g_state = OBSTACLE_NONE;
					break;
				case SENSOR_L:				// C ---> B:	右->左侧障碍	小车左转
					car_left();
					_delay_ms(500);
					g_state = OBSTACLE_LEFT;
					break;
				case SENSOR_R:				// C ---> C:	右->右侧障碍	小车左转
					car_left();
					_delay_ms(500);
					g_state = OBSTRACLE_RIGHT;
					break;
				case SENSOR_B:				// C ---> D:	右->前方障碍	小车左转
					car_left();
					_delay_ms(500);
					g_state = OBSTRACLE_FRONT;
					break;
			}
			break;
		case OBSTRACLE_FRONT:
			switch(sensor)
			{
				case SENSOR_N:				// D ---> A:	前方障碍消除	小车停止
					car_stop();
					g_state = OBSTACLE_NONE;
					break;
				case SENSOR_L:				// D ---> B:	前->左侧障碍	小车右转
					car_right();
					_delay_ms(500);
					g_state = OBSTACLE_LEFT;
					break;
				case SENSOR_R:				// D ---> C:	前->右侧障碍	小车右转
					car_right();
					_delay_ms(500);
					g_state = OBSTRACLE_RIGHT;
					break;
				case SENSOR_B:				// D ---> D:	前->前方障碍	小车后退并右转
					car_right();
					_delay_ms(500);
					g_state = OBSTRACLE_FRONT;
					break;
			}
			break;
	}
}

//======================================================================
//	函    数:	int main(void)
//	实现功能:	主函数 蔽障
//	入口参数:	无
//	返回  值:	
//======================================================================
int main(void)
{
	uint8_t key;

	Key_Init();
	car_init();
	sensor_init();

	while(1)						// 等待按键启动 KEY4
	{
		key = Key_Get();
		if(key == KEY_4)
			break;
	}

	car_ahead();					// 小车启动
	while(1)
	{
		car_prevent();
	}
}


// 定时器0
//ISR(SIG_OVERFLOW0)
ISR(TIMER0_OVF_vect)
{
	Key_Scan();
}


⌨️ 快捷键说明

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