?? 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 + -