📄 car_prevent.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 + -