超聲波避障代碼
#include "sys.h"
#include "delay.h"
#define EN1 PAout(2) //L293D控制管腳定義
#define IN1 PAout(3) //L293D控制管腳定義
#define IN2 PAout(4) //L293D控制管腳定義
#define EN2 PAout(7) //L293D控制管腳定義
#define IN3 PAout(6) //L293D控制管腳定義
#define IN4 PAout(5) //L293D控制管腳定義
#define BEEP PBout(5) //蜂鳴器控制管腳定義
#define KEY1 PAin(8) //功能按鍵對應的管腳
#define BZ_LEFT PAin(13) //左邊避障信號
#define BZ_RIGHT PAin(14) //右邊避障信號
#define ControlPort PAout(0) //舵機控制介面
#define Stop 0 //舵機圖示志
#define Right 1 //舵機右轉標志
#define Left 2 //舵機左轉標志
#define OLED_RST_Clr() PCout(13)=0 //RST
#define OLED_RST_Set() PCout(13)=1 //RST
#define OLED_RS_Clr() PBout(4)=0 //DC
#define OLED_RS_Set() PBout(4)=1 //DC
#define OLED_SCLK_Clr() PCout(15)=0 //SCL
#define OLED_SCLK_Set() PCout(15)=1 //SCL
#define OLED_SDIN_Clr() PCout(14)=0 //SDA
#define OLED_SDIN_Set() PCout(14)=1 //SDA
#define OLED_CMD 0 //寫命令
#define OLED_DATA 1 //寫資料
u32 JuLi; //超聲波測距
u8 pwmval_left = 0; //左電機調速變數
u8 pwmval_right = 0; //右電機調速變數
u8 pwmval_left_init = 6; //左電機速度值
u8 pwmval_right_init = 6; //右電機速度值
u8 right_pwm = 1; //左電機調速開關
u8 left_pwm = 1; //右電機調速開關
u8 TimeOutCounter = 0;
u8 LeftOrRight = 0;
u16 timer = 0;
u8 hw_flag;
u32 S_temp;
u8 OLED_GRAM[128][8];
const unsigned char oled_asc2_1206[95][12]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x00,0x00,0x00,0x00,0x3F,0x40,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/
{0x00,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x40,0x00,0x00,0x00},/*""",2*/
{0x09,0x00,0x0B,0xC0,0x3D,0x00,0x0B,0xC0,0x3D,0x00,0x09,0x00},/*"#",3*/
{0x18,0xC0,0x24,0x40,0x7F,0xE0,0x22,0x40,0x31,0x80,0x00,0x00},/*"$",4*/
{0x18,0x00,0x24,0xC0,0x1B,0x00,0x0D,0x80,0x32,0x40,0x01,0x80},/*"%",5*/
{0x03,0x80,0x1C,0x40,0x27,0x40,0x1C,0x80,0x07,0x40,0x00,0x40},/*"&",6*/
{0x10,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x20,0x40,0x40,0x20},/*"(",8*/
{0x00,0x00,0x40,0x20,0x20,0x40,0x1F,0x80,0x00,0x00,0x00,0x00},/*")",9*/
{0x09,0x00,0x06,0x00,0x1F,0x80,0x06,0x00,0x09,0x00,0x00,0x00},/*"*",10*/
{0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0x00,0x00},/*"+",11*/
{0x00,0x10,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*",",12*/
{0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00},/*"-",13*/
{0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",14*/
{0x00,0x20,0x01,0xC0,0x06,0x00,0x38,0x00,0x40,0x00,0x00,0x00},/*"/",15*/
{0x1F,0x80,0x20,0x40,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00},/*"0",16*/
{0x00,0x00,0x10,0x40,0x3F,0xC0,0x00,0x40,0x00,0x00,0x00,0x00},/*"1",17*/
{0x18,0xC0,0x21,0x40,0x22,0x40,0x24,0x40,0x18,0x40,0x00,0x00},/*"2",18*/
{0x10,0x80,0x20,0x40,0x24,0x40,0x24,0x40,0x1B,0x80,0x00,0x00},/*"3",19*/
{0x02,0x00,0x0D,0x00,0x11,0x00,0x3F,0xC0,0x01,0x40,0x00,0x00},/*"4",20*/
{0x3C,0x80,0x24,0x40,0x24,0x40,0x24,0x40,0x23,0x80,0x00,0x00},/*"5",21*/
{0x1F,0x80,0x24,0x40,0x24,0x40,0x34,0x40,0x03,0x80,0x00,0x00},/*"6",22*/
{0x30,0x00,0x20,0x00,0x27,0xC0,0x38,0x00,0x20,0x00,0x00,0x00},/*"7",23*/
{0x1B,0x80,0x24,0x40,0x24,0x40,0x24,0x40,0x1B,0x80,0x00,0x00},/*"8",24*/
{0x1C,0x00,0x22,0xC0,0x22,0x40,0x22,0x40,0x1F,0x80,0x00,0x00},/*"9",25*/
{0x00,0x00,0x00,0x00,0x08,0x40,0x00,0x00,0x00,0x00,0x00,0x00},/*":",26*/
{0x00,0x00,0x00,0x00,0x04,0x60,0x00,0x00,0x00,0x00,0x00,0x00},/*";",27*/
{0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0x40,0x40},/*"<",28*/
{0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x00,0x00},/*"=",29*/
{0x00,0x00,0x40,0x40,0x20,0x80,0x11,0x00,0x0A,0x00,0x04,0x00},/*">",30*/
{0x18,0x00,0x20,0x00,0x23,0x40,0x24,0x00,0x18,0x00,0x00,0x00},/*"?",31*/
{0x1F,0x80,0x20,0x40,0x27,0x40,0x29,0x40,0x1F,0x40,0x00,0x00},/*"@",32*/
{0x00,0x40,0x07,0xC0,0x39,0x00,0x0F,0x00,0x01,0xC0,0x00,0x40},/*"A",33*/
{0x20,0x40,0x3F,0xC0,0x24,0x40,0x24,0x40,0x1B,0x80,0x00,0x00},/*"B",34*/
{0x1F,0x80,0x20,0x40,0x20,0x40,0x20,0x40,0x30,0x80,0x00,0x00},/*"C",35*/
{0x20,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00},/*"D",36*/
{0x20,0x40,0x3F,0xC0,0x24,0x40,0x2E,0x40,0x30,0xC0,0x00,0x00},/*"E",37*/
{0x20,0x40,0x3F,0xC0,0x24,0x40,0x2E,0x00,0x30,0x00,0x00,0x00},/*"F",38*/
{0x0F,0x00,0x10,0x80,0x20,0x40,0x22,0x40,0x33,0x80,0x02,0x00},/*"G",39*/
{0x20,0x40,0x3F,0xC0,0x04,0x00,0x04,0x00,0x3F,0xC0,0x20,0x40},/*"H",40*/
{0x20,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x00,0x00},/*"I",41*/
{0x00,0x60,0x20,0x20,0x20,0x20,0x3F,0xC0,0x20,0x00,0x20,0x00},/*"J",42*/
{0x20,0x40,0x3F,0xC0,0x24,0x40,0x0B,0x00,0x30,0xC0,0x20,0x40},/*"K",43*/
{0x20,0x40,0x3F,0xC0,0x20,0x40,0x00,0x40,0x00,0x40,0x00,0xC0},/*"L",44*/
{0x3F,0xC0,0x3C,0x00,0x03,0xC0,0x3C,0x00,0x3F,0xC0,0x00,0x00},/*"M",45*/
{0x20,0x40,0x3F,0xC0,0x0C,0x40,0x23,0x00,0x3F,0xC0,0x20,0x00},/*"N",46*/
{0x1F,0x80,0x20,0x40,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00},/*"O",47*/
{0x20,0x40,0x3F,0xC0,0x24,0x40,0x24,0x00,0x18,0x00,0x00,0x00},/*"P",48*/
{0x1F,0x80,0x21,0x40,0x21,0x40,0x20,0xE0,0x1F,0xA0,0x00,0x00},/*"Q",49*/
{0x20,0x40,0x3F,0xC0,0x24,0x40,0x26,0x00,0x19,0xC0,0x00,0x40},/*"R",50*/
{0x18,0xC0,0x24,0x40,0x24,0x40,0x22,0x40,0x31,0x80,0x00,0x00},/*"S",51*/
{0x30,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x30,0x00,0x00,0x00},/*"T",52*/
{0x20,0x00,0x3F,0x80,0x00,0x40,0x00,0x40,0x3F,0x80,0x20,0x00},/*"U",53*/
{0x20,0x00,0x3E,0x00,0x01,0xC0,0x07,0x00,0x38,0x00,0x20,0x00},/*"V",54*/
{0x38,0x00,0x07,0xC0,0x3C,0x00,0x07,0xC0,0x38,0x00,0x00,0x00},/*"W",55*/
{0x20,0x40,0x39,0xC0,0x06,0x00,0x39,0xC0,0x20,0x40,0x00,0x00},/*"X",56*/
{0x20,0x00,0x38,0x40,0x07,0xC0,0x38,0x40,0x20,0x00,0x00,0x00},/*"Y",57*/
{0x30,0x40,0x21,0xC0,0x26,0x40,0x38,0x40,0x20,0xC0,0x00,0x00},/*"Z",58*/
{0x00,0x00,0x00,0x00,0x7F,0xE0,0x40,0x20,0x40,0x20,0x00,0x00},/*"[",59*/
{0x00,0x00,0x70,0x00,0x0C,0x00,0x03,0x80,0x00,0x40,0x00,0x00},/*"\",60*/
{0x00,0x00,0x40,0x20,0x40,0x20,0x7F,0xE0,0x00,0x00,0x00,0x00},/*"]",61*/
{0x00,0x00,0x20,0x00,0x40,0x00,0x20,0x00,0x00,0x00,0x00,0x00},/*"^",62*/
{0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10},/*"_",63*/
{0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
{0x00,0x00,0x02,0x80,0x05,0x40,0x05,0x40,0x03,0xC0,0x00,0x40},/*"a",65*/
{0x20,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x03,0x80,0x00,0x00},/*"b",66*/
{0x00,0x00,0x03,0x80,0x04,0x40,0x04,0x40,0x06,0x40,0x00,0x00},/*"c",67*/
{0x00,0x00,0x03,0x80,0x04,0x40,0x24,0x40,0x3F,0xC0,0x00,0x40},/*"d",68*/
{0x00,0x00,0x03,0x80,0x05,0x40,0x05,0x40,0x03,0x40,0x00,0x00},/*"e",69*/
{0x00,0x00,0x04,0x40,0x1F,0xC0,0x24,0x40,0x24,0x40,0x20,0x00},/*"f",70*/
{0x00,0x00,0x02,0xE0,0x05,0x50,0x05,0x50,0x06,0x50,0x04,0x20},/*"g",71*/
{0x20,0x40,0x3F,0xC0,0x04,0x40,0x04,0x00,0x03,0xC0,0x00,0x40},/*"h",72*/
{0x00,0x00,0x04,0x40,0x27,0xC0,0x00,0x40,0x00,0x00,0x00,0x00},/*"i",73*/
{0x00,0x10,0x00,0x10,0x04,0x10,0x27,0xE0,0x00,0x00,0x00,0x00},/*"j",74*/
{0x20,0x40,0x3F,0xC0,0x01,0x40,0x07,0x00,0x04,0xC0,0x04,0x40},/*"k",75*/
{0x20,0x40,0x20,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00},/*"l",76*/
{0x07,0xC0,0x04,0x00,0x07,0xC0,0x04,0x00,0x03,0xC0,0x00,0x00},/*"m",77*/
{0x04,0x40,0x07,0xC0,0x04,0x40,0x04,0x00,0x03,0xC0,0x00,0x40},/*"n",78*/
{0x00,0x00,0x03,0x80,0x04,0x40,0x04,0x40,0x03,0x80,0x00,0x00},/*"o",79*/
{0x04,0x10,0x07,0xF0,0x04,0x50,0x04,0x40,0x03,0x80,0x00,0x00},/*"p",80*/
{0x00,0x00,0x03,0x80,0x04,0x40,0x04,0x50,0x07,0xF0,0x00,0x10},/*"q",81*/
{0x04,0x40,0x07,0xC0,0x02,0x40,0x04,0x00,0x04,0x00,0x00,0x00},/*"r",82*/
{0x00,0x00,0x06,0x40,0x05,0x40,0x05,0x40,0x04,0xC0,0x00,0x00},/*"s",83*/
{0x00,0x00,0x04,0x00,0x1F,0x80,0x04,0x40,0x00,0x40,0x00,0x00},/*"t",84*/
{0x04,0x00,0x07,0x80,0x00,0x40,0x04,0x40,0x07,0xC0,0x00,0x40},/*"u",85*/
{0x04,0x00,0x07,0x00,0x04,0xC0,0x01,0x80,0x06,0x00,0x04,0x00},/*"v",86*/
{0x06,0x00,0x01,0xC0,0x07,0x00,0x01,0xC0,0x06,0x00,0x00,0x00},/*"w",87*/
{0x04,0x40,0x06,0xC0,0x01,0x00,0x06,0xC0,0x04,0x40,0x00,0x00},/*"x",88*/
{0x04,0x10,0x07,0x10,0x04,0xE0,0x01,0x80,0x06,0x00,0x04,0x00},/*"y",89*/
{0x00,0x00,0x04,0x40,0x05,0xC0,0x06,0x40,0x04,0x40,0x00,0x00},/*"z",90*/
{0x00,0x00,0x00,0x00,0x04,0x00,0x7B,0xE0,0x40,0x20,0x00,0x00},/*"{",91*/
{0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0x00,0x00},/*"|",92*/
{0x00,0x00,0x40,0x20,0x7B,0xE0,0x04,0x00,0x00,0x00,0x00,0x00},/*"}",93*/
{0x40,0x00,0x80,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x40,0x00},/*"~",94*/
};
const unsigned char oled_asc2_1608[95][16]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xCC,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/
{0x00,0x00,0x08,0x00,0x30,0x00,0x60,0x00,0x08,0x00,0x30,0x00,0x60,0x00,0x00,0x00},/*""",2*/
{0x02,0x20,0x03,0xFC,0x1E,0x20,0x02,0x20,0x03,0xFC,0x1E,0x20,0x02,0x20,0x00,0x00},/*"#",3*/
{0x00,0x00,0x0E,0x18,0x11,0x04,0x3F,0xFF,0x10,0x84,0x0C,0x78,0x00,0x00,0x00,0x00},/*"$",4*/
{0x0F,0x00,0x10,0x84,0x0F,0x38,0x00,0xC0,0x07,0x78,0x18,0x84,0x00,0x78,0x00,0x00},/*"%",5*/
{0x00,0x78,0x0F,0x84,0x10,0xC4,0x11,0x24,0x0E,0x98,0x00,0xE4,0x00,0x84,0x00,0x08},/*"&",6*/
{0x08,0x00,0x68,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x18,0x18,0x20,0x04,0x40,0x02,0x00,0x00},/*"(",8*/
{0x00,0x00,0x40,0x02,0x20,0x04,0x18,0x18,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00},/*")",9*/
{0x02,0x40,0x02,0x40,0x01,0x80,0x0F,0xF0,0x01,0x80,0x02,0x40,0x02,0x40,0x00,0x00},/*"*",10*/
{0x00,0x80,0x00,0x80,0x00,0x80,0x0F,0xF8,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00},/*"+",11*/
{0x00,0x01,0x00,0x0D,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*",",12*/
{0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80},/*"-",13*/
{0x00,0x00,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",14*/
{0x00,0x00,0x00,0x06,0x00,0x18,0x00,0x60,0x01,0x80,0x06,0x00,0x18,0x00,0x20,0x00},/*"/",15*/
{0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00},/*"0",16*/
{0x00,0x00,0x08,0x04,0x08,0x04,0x1F,0xFC,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00},/*"1",17*/
{0x00,0x00,0x0E,0x0C,0x10,0x14,0x10,0x24,0x10,0x44,0x11,0x84,0x0E,0x0C,0x00,0x00},/*"2",18*/
{0x00,0x00,0x0C,0x18,0x10,0x04,0x11,0x04,0x11,0x04,0x12,0x88,0x0C,0x70,0x00,0x00},/*"3",19*/
{0x00,0x00,0x00,0xE0,0x03,0x20,0x04,0x24,0x08,0x24,0x1F,0xFC,0x00,0x24,0x00,0x00},/*"4",20*/
{0x00,0x00,0x1F,0x98,0x10,0x84,0x11,0x04,0x11,0x04,0x10,0x88,0x10,0x70,0x00,0x00},/*"5",21*/
{0x00,0x00,0x07,0xF0,0x08,0x88,0x11,0x04,0x11,0x04,0x18,0x88,0x00,0x70,0x00,0x00},/*"6",22*/
{0x00,0x00,0x1C,0x00,0x10,0x00,0x10,0xFC,0x13,0x00,0x1C,0x00,0x10,0x00,0x00,0x00},/*"7",23*/
{0x00,0x00,0x0E,0x38,0x11,0x44,0x10,0x84,0x10,0x84,0x11,0x44,0x0E,0x38,0x00,0x00},/*"8",24*/
{0x00,0x00,0x07,0x00,0x08,0x8C,0x10,0x44,0x10,0x44,0x08,0x88,0x07,0xF0,0x00,0x00},/*"9",25*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x03,0x0C,0x00,0x00,0x00,0x00,0x00,0x00},/*":",26*/
{0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*";",27*/
{0x00,0x00,0x00,0x80,0x01,0x40,0x02,0x20,0x04,0x10,0x08,0x08,0x10,0x04,0x00,0x00},/*"<",28*/
{0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00},/*"=",29*/
{0x00,0x00,0x10,0x04,0x08,0x08,0x04,0x10,0x02,0x20,0x01,0x40,0x00,0x80,0x00,0x00},/*">",30*/
{0x00,0x00,0x0E,0x00,0x12,0x00,0x10,0x0C,0x10,0x6C,0x10,0x80,0x0F,0x00,0x00,0x00},/*"?",31*/
{0x03,0xE0,0x0C,0x18,0x13,0xE4,0x14,0x24,0x17,0xC4,0x08,0x28,0x07,0xD0,0x00,0x00},/*"@",32*/
{0x00,0x04,0x00,0x3C,0x03,0xC4,0x1C,0x40,0x07,0x40,0x00,0xE4,0x00,0x1C,0x00,0x04},/*"A",33*/
{0x10,0x04,0x1F,0xFC,0x11,0x04,0x11,0x04,0x11,0x04,0x0E,0x88,0x00,0x70,0x00,0x00},/*"B",34*/
{0x03,0xE0,0x0C,0x18,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x08,0x1C,0x10,0x00,0x00},/*"C",35*/
{0x10,0x04,0x1F,0xFC,0x10,0x04,0x10,0x04,0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00},/*"D",36*/
{0x10,0x04,0x1F,0xFC,0x11,0x04,0x11,0x04,0x17,0xC4,0x10,0x04,0x08,0x18,0x00,0x00},/*"E",37*/
{0x10,0x04,0x1F,0xFC,0x11,0x04,0x11,0x00,0x17,0xC0,0x10,0x00,0x08,0x00,0x00,0x00},/*"F",38*/
{0x03,0xE0,0x0C,0x18,0x10,0x04,0x10,0x04,0x10,0x44,0x1C,0x78,0x00,0x40,0x00,0x00},/*"G",39*/
{0x10,0x04,0x1F,0xFC,0x10,0x84,0x00,0x80,0x00,0x80,0x10,0x84,0x1F,0xFC,0x10,0x04},/*"H",40*/
{0x00,0x00,0x10,0x04,0x10,0x04,0x1F,0xFC,0x10,0x04,0x10,0x04,0x00,0x00,0x00,0x00},/*"I",41*/
{0x00,0x03,0x00,0x01,0x10,0x01,0x10,0x01,0x1F,0xFE,0x10,0x00,0x10,0x00,0x00,0x00},/*"J",42*/
{0x10,0x04,0x1F,0xFC,0x11,0x04,0x03,0x80,0x14,0x64,0x18,0x1C,0x10,0x04,0x00,0x00},/*"K",43*/
{0x10,0x04,0x1F,0xFC,0x10,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0C,0x00,0x00},/*"L",44*/
{0x10,0x04,0x1F,0xFC,0x1F,0x00,0x00,0xFC,0x1F,0x00,0x1F,0xFC,0x10,0x04,0x00,0x00},/*"M",45*/
{0x10,0x04,0x1F,0xFC,0x0C,0x04,0x03,0x00,0x00,0xE0,0x10,0x18,0x1F,0xFC,0x10,0x00},/*"N",46*/
{0x07,0xF0,0x08,0x08,0x10,0x04,0x10,0x04,0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00},/*"O",47*/
{0x10,0x04,0x1F,0xFC,0x10,0x84,0x10,0x80,0x10,0x80,0x10,0x80,0x0F,0x00,0x00,0x00},/*"P",48*/
{0x07,0xF0,0x08,0x18,0x10,0x24,0x10,0x24,0x10,0x1C,0x08,0x0A,0x07,0xF2,0x00,0x00},/*"Q",49*/
{0x10,0x04,0x1F,0xFC,0x11,0x04,0x11,0x00,0x11,0xC0,0x11,0x30,0x0E,0x0C,0x00,0x04},/*"R",50*/
{0x00,0x00,0x0E,0x1C,0x11,0x04,0x10,0x84,0x10,0x84,0x10,0x44,0x1C,0x38,0x00,0x00},/*"S",51*/
{0x18,0x00,0x10,0x00,0x10,0x04,0x1F,0xFC,0x10,0x04,0x10,0x00,0x18,0x00,0x00,0x00},/*"T",52*/
{0x10,0x00,0x1F,0xF8,0x10,0x04,0x00,0x04,0x00,0x04,0x10,0x04,0x1F,0xF8,0x10,0x00},/*"U",53*/
{0x10,0x00,0x1E,0x00,0x11,0xE0,0x00,0x1C,0x00,0x70,0x13,0x80,0x1C,0x00,0x10,0x00},/*"V",54*/
{0x1F,0xC0,0x10,0x3C,0x00,0xE0,0x1F,0x00,0x00,0xE0,0x10,0x3C,0x1F,0xC0,0x00,0x00},/*"W",55*/
{0x10,0x04,0x18,0x0C,0x16,0x34,0x01,0xC0,0x01,0xC0,0x16,0x34,0x18,0x0C,0x10,0x04},/*"X",56*/
{0x10,0x00,0x1C,0x00,0x13,0x04,0x00,0xFC,0x13,0x04,0x1C,0x00,0x10,0x00,0x00,0x00},/*"Y",57*/
{0x08,0x04,0x10,0x1C,0x10,0x64,0x10,0x84,0x13,0x04,0x1C,0x04,0x10,0x18,0x00,0x00},/*"Z",58*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFE,0x40,0x02,0x40,0x02,0x40,0x02,0x00,0x00},/*"[",59*/
{0x00,0x00,0x30,0x00,0x0C,0x00,0x03,0x80,0x00,0x60,0x00,0x1C,0x00,0x03,0x00,0x00},/*"\",60*/
{0x00,0x00,0x40,0x02,0x40,0x02,0x40,0x02,0x7F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00},/*"]",61*/
{0x00,0x00,0x00,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x00,0x00},/*"^",62*/
{0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01},/*"_",63*/
{0x00,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
{0x00,0x00,0x00,0x98,0x01,0x24,0x01,0x44,0x01,0x44,0x01,0x44,0x00,0xFC,0x00,0x04},/*"a",65*/
{0x10,0x00,0x1F,0xFC,0x00,0x88,0x01,0x04,0x01,0x04,0x00,0x88,0x00,0x70,0x00,0x00},/*"b",66*/
{0x00,0x00,0x00,0x70,0x00,0x88,0x01,0x04,0x01,0x04,0x01,0x04,0x00,0x88,0x00,0x00},/*"c",67*/
{0x00,0x00,0x00,0x70,0x00,0x88,0x01,0x04,0x01,0x04,0x11,0x08,0x1F,0xFC,0x00,0x04},/*"d",68*/
{0x00,0x00,0x00,0xF8,0x01,0x44,0x01,0x44,0x01,0x44,0x01,0x44,0x00,0xC8,0x00,0x00},/*"e",69*/
{0x00,0x00,0x01,0x04,0x01,0x04,0x0F,0xFC,0x11,0x04,0x11,0x04,0x11,0x00,0x18,0x00},/*"f",70*/
{0x00,0x00,0x00,0xD6,0x01,0x29,0x01,0x29,0x01,0x29,0x01,0xC9,0x01,0x06,0x00,0x00},/*"g",71*/
{0x10,0x04,0x1F,0xFC,0x00,0x84,0x01,0x00,0x01,0x00,0x01,0x04,0x00,0xFC,0x00,0x04},/*"h",72*/
{0x00,0x00,0x01,0x04,0x19,0x04,0x19,0xFC,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00},/*"i",73*/
{0x00,0x00,0x00,0x03,0x00,0x01,0x01,0x01,0x19,0x01,0x19,0xFE,0x00,0x00,0x00,0x00},/*"j",74*/
{0x10,0x04,0x1F,0xFC,0x00,0x24,0x00,0x40,0x01,0xB4,0x01,0x0C,0x01,0x04,0x00,0x00},/*"k",75*/
{0x00,0x00,0x10,0x04,0x10,0x04,0x1F,0xFC,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00},/*"l",76*/
{0x01,0x04,0x01,0xFC,0x01,0x04,0x01,0x00,0x01,0xFC,0x01,0x04,0x01,0x00,0x00,0xFC},/*"m",77*/
{0x01,0x04,0x01,0xFC,0x00,0x84,0x01,0x00,0x01,0x00,0x01,0x04,0x00,0xFC,0x00,0x04},/*"n",78*/
{0x00,0x00,0x00,0xF8,0x01,0x04,0x01,0x04,0x01,0x04,0x01,0x04,0x00,0xF8,0x00,0x00},/*"o",79*/
{0x01,0x01,0x01,0xFF,0x00,0x85,0x01,0x04,0x01,0x04,0x00,0x88,0x00,0x70,0x00,0x00},/*"p",80*/
{0x00,0x00,0x00,0x70,0x00,0x88,0x01,0x04,0x01,0x04,0x01,0x05,0x01,0xFF,0x00,0x01},/*"q",81*/
{0x01,0x04,0x01,0x04,0x01,0xFC,0x00,0x84,0x01,0x04,0x01,0x00,0x01,0x80,0x00,0x00},/*"r",82*/
{0x00,0x00,0x00,0xCC,0x01,0x24,0x01,0x24,0x01,0x24,0x01,0x24,0x01,0x98,0x00,0x00},/*"s",83*/
{0x00,0x00,0x01,0x00,0x01,0x00,0x07,0xF8,0x01,0x04,0x01,0x04,0x00,0x00,0x00,0x00},/*"t",84*/
{0x01,0x00,0x01,0xF8,0x00,0x04,0x00,0x04,0x00,0x04,0x01,0x08,0x01,0xFC,0x00,0x04},/*"u",85*/
{0x01,0x00,0x01,0x80,0x01,0x70,0x00,0x0C,0x00,0x10,0x01,0x60,0x01,0x80,0x01,0x00},/*"v",86*/
{0x01,0xF0,0x01,0x0C,0x00,0x30,0x01,0xC0,0x00,0x30,0x01,0x0C,0x01,0xF0,0x01,0x00},/*"w",87*/
{0x00,0x00,0x01,0x04,0x01,0x8C,0x00,0x74,0x01,0x70,0x01,0x8C,0x01,0x04,0x00,0x00},/*"x",88*/
{0x01,0x01,0x01,0x81,0x01,0x71,0x00,0x0E,0x00,0x18,0x01,0x60,0x01,0x80,0x01,0x00},/*"y",89*/
{0x00,0x00,0x01,0x84,0x01,0x0C,0x01,0x34,0x01,0x44,0x01,0x84,0x01,0x0C,0x00,0x00},/*"z",90*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x3E,0xFC,0x40,0x02,0x40,0x02},/*"{",91*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00},/*"|",92*/
{0x00,0x00,0x40,0x02,0x40,0x02,0x3E,0xFC,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"}",93*/
{0x00,0x00,0x60,0x00,0x80,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x20,0x00},/*"~",94*/
};
void Motor_Init(void); //電機介面初始化
void forward(void); //小車前進控制函式
void back(void); //小車后退控制函式
void left_turn(void); //向左轉
void right_turn(void); //向右轉
void stop(void); //停車
void circle_left(void); //原地向左轉圈
void circle_right(void); //原地向右轉圈
void left_moto(void); //左電機調速函式
void right_moto(void); //右電機調速函式
void Timer1_Init(u16 arr,u16 psc); //定時器1初始化函式
void Timer2_Init(u16 arr,u16 psc); //定時器2初始化函式
void Timer3_Init(u16 arr,u16 psc); //定時器3初始化函式
void Beep_Init(void); //蜂鳴器介面初始化
void Key_Init(void); //按鍵介面初始化函式
void Key_Scan(void); //按鍵1掃描函式
void Bz_Init(void); //紅外避障信號介面初始化函式
void OLED_WR_Byte(u8 dat,u8 cmd);
void OLED_Display_On(void);
void OLED_Display_Off(void);
void OLED_Refresh_Gram(void);
void Oled_Init(void);
void OLED_Clear(void);
void OLED_DrawPoint(u8 x,u8 y,u8 t);
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode);
void OLED_ShowNumber(u8 x,u8 y,u32 num,u8 len,u8 size);
void OLED_ShowString(u8 x,u8 y,const u8 *p);
void Oled_Show(void);
void Dj_Init(void);
void ControlLeftOrRight(void);
void Hw_bz(void);
void process(void);
/****************************************************************
程式功能
將超聲波模塊、舵機安裝好并連接好杜邦線,智能小車上電后,按下開發
板啟動按鍵(靠近電源開關那個)小車開始避障礙運動,同時測到的距離
值會在OLED中顯示出來,
接線說明:
電機驅動線:
開發板的PA2接小車底盤的M6
開發板的PA3接小車底盤的M5
開發板的PA4接小車底盤的M4
開發板的PA5接小車底盤的M3
開發板的PA6接小車底盤的M2
開發板的PA7接小車底盤的M1
超聲波模塊接線:
超聲波模塊的VCC接開發板的5V
超聲波模塊的GND接開發板的GND
超聲波模塊的Trig接開發板的PB1
超聲波模塊的Echo接開發板的PB0
舵機接線:
將舵機線接到小車底盤的舵機介面上(注意方向,舵機棕線是GND,紅線是VCC,
橙線是信號線,它們分別對應小車底盤舵機介面上的GND,5V和S),另外,舵機
的信號線需要一條單獨的杜邦線連接到開發板的PA0,
電源線:
開發板的5V接小車底盤的5V
開發板的GND接小車底盤的GND
紅外避障信號線:
開發板的PA13接小車底盤的H3
開發板的PA14接小車底盤的H4
(本實驗采用紅外避障作為超聲波避障的輔助,所以紅外避障信號線也要
連接)
****************************************************************/
int main(void)
{
u8 k;
Stm32_Clock_Init(9); //系統時鐘設定
delay_init(72); //延時初始化
JTAG_Set(JTAG_SWD_DISABLE); //關閉JTAG介面
JTAG_Set(SWD_ENABLE); //打開SWD介面
Oled_Init(); //OLED初始化
Timer3_Init(0XFFFF,72-1); //超聲波初始化
Timer1_Init(499,7199);
Motor_Init(); //初始化與電機連接的硬體介面
Timer2_Init(25,719); //10Khz的計數頻率,計數到9為1ms
Beep_Init(); //蜂鳴器介面初始化
Key_Init(); //按鍵介面初始化
Bz_Init(); //紅外避障信號介面初始化
Dj_Init(); //舵機控制介面初始化
ControlLeftOrRight(); //舵機初始化
Key_Scan(); //按鍵掃描
while(1)
{
if(timer>=400)
{
timer = 0;
Oled_Show(); //oled顯示提示資訊
S_temp = JuLi; //超聲波模塊測到的距離值
Hw_bz(); //紅外避障
if((S_temp>=250)&&(hw_flag == 0)) //如果不滿足避障條件(超聲波模塊測到前方障礙物距離大于25厘米或紅外避障感應到前方有障礙物)
{
BEEP = 1;
forward(); //智能小車繼續前進
}
else //如果滿足避障條件
{
BEEP = 0; //蜂鳴器響
stop(); //智能小車停下
for(k=0;k<=8;k++)
{
delay_ms(1000);
}
BEEP = 1; //蜂鳴器不響
process(); //避障處理
}
}
Oled_Show(); //OLED顯示資訊
}
}
void Dj_Init(void) //舵機控制介面初始化函式
{
RCC->APB2ENR|=1<<2; //使能PORTA口時鐘
GPIOA->CRL&=0XFFFFFFF0; //PORTA.0 推挽輸出
GPIOA->CRL|=0X00000003;
GPIOA->ODR|=1<<0; //輸出1
}
void ControlLeftOrRight(void) //舵機自檢函式
{
u8 i;
LeftOrRight = Stop; //舵機停在中間
TimeOutCounter = 0;
for(i=0;i<=9;i++)
{
delay_ms(1000);
}
LeftOrRight = Left; //舵機左邊
TimeOutCounter = 0;
for(i=0;i<=9;i++)
{
delay_ms(1000);
}
LeftOrRight = Right; //舵機右邊
TimeOutCounter = 0;
for(i=0;i<=13;i++)
{
delay_ms(1000);
}
LeftOrRight = Stop; //舵機停在中間
TimeOutCounter = 0;
for(i=0;i<=9;i++)
{
delay_ms(1000);
}
}
void Hw_bz(void) //紅外避障函式
{
if((BZ_LEFT == 0)||(BZ_RIGHT == 0)) //如果左右兩邊任何一個紅外避障模塊感應到障礙物
{
hw_flag = 1; //設定紅外避障標志
}
else
{
hw_flag = 0; //屏蔽紅外避障標志
}
}
void Beep_Init(void) //蜂鳴器介面初始化
{
RCC->APB2ENR|=1<<3; //使能PORTB時鐘
GPIOB->CRL&=0XFF0FFFFF;
GPIOB->CRL|=0X00300000; //PB5推挽輸出
GPIOB->ODR|=1<<5; //PB5輸出高
}
void Bz_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA時鐘
GPIOA->CRH&=0XFF0FFFFF;
GPIOA->CRH|=0X00800000; //PA13上拉輸入
GPIOA->ODR|=1<<13; //PA13上拉
GPIOA->CRH&=0XF0FFFFFF;
GPIOA->CRH|=0X08000000; //PA14上拉輸入
GPIOA->ODR|=1<<14; //PA14上拉
}
void Key_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA時鐘
GPIOA->CRH&=0XFFFFFFF0;
GPIOA->CRH|=0X00000008; //PA8上拉輸入
GPIOA->ODR|=1<<8; //PA8上拉
}
void Key_Scan(void) //按鍵掃描函式
{
LOOP:if(KEY1==0) //第一次判斷是否有按鍵按下
{
delay_ms(5);
if(KEY1==0) //第二次判斷是否有按鍵按下
{
BEEP = 0; //蜂鳴器響
while(KEY1 == 0); //等待按鍵松開
BEEP = 1; //蜂鳴器不響
}
else
{
goto LOOP; //第一次判斷時如果按鍵沒有按下重新掃描
}
}
else
{
goto LOOP; //第二次判斷時如果按鍵沒有按下重新掃描
}
}
void Motor_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA介面時鐘
GPIOA->CRL&=0XFFFFF0FF;
GPIOA->CRL|=0X00000300; //PA2推挽輸出
GPIOA->ODR|=1<<2; //PA2輸出高電平
GPIOA->CRL&=0XFFFF0FFF;
GPIOA->CRL|=0X00003000; //PA3推挽輸出
GPIOA->ODR|=1<<3; //PA3輸出高電平
GPIOA->CRL&=0XFFF0FFFF;
GPIOA->CRL|=0X00030000; //PA4推挽輸出
GPIOA->ODR|=1<<4; //PA4輸出高電平
GPIOA->CRL&=0XFF0FFFFF;
GPIOA->CRL|=0X00300000; //PA5推挽輸出
GPIOA->ODR|=1<<5; //PA5輸出高電平
GPIOA->CRL&=0XF0FFFFFF;
GPIOA->CRL|=0X03000000; //PA6推挽輸出
GPIOA->ODR|=1<<6; //PA6輸出高電平
GPIOA->CRL&=0X0FFFFFFF;
GPIOA->CRL|=0X30000000; //PA7推挽輸出
GPIOA->ODR|=1<<7; //PA7輸出高電平
}
void forward(void) //小車前進控制函式
{
IN1 = 1;
IN2 = 0;
IN3 = 1;
IN4 = 0;
}
void back(void) //小車后退控制函式
{
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 1;
}
void left_turn(void) //向左轉
{
IN1 = 1;
IN2 = 0;
IN3 = 0;
IN4 = 0;
}
void right_turn(void) //向右轉
{
IN1 = 0;
IN2 = 0;
IN3 = 1;
IN4 = 0;
}
void stop(void) //停車
{
IN1 = 0;
IN2 = 0;
IN3 = 0;
IN4 = 0;
}
void circle_left(void) //原地向左轉圈
{
IN1 = 1;
IN2 = 0;
IN3 = 0;
IN4 = 1;
}
void circle_right(void) //原地向右轉圈
{
IN1 = 0;
IN2 = 1;
IN3 = 1;
IN4 = 0;
}
void left_moto(void) //左電機調速函式
{
if(left_pwm)
{
if(pwmval_left <= pwmval_left_init)
{
EN1 = 1;
}
else
{
EN1 = 0;
}
if(pwmval_left >= 20)
{
pwmval_left = 0;
}
}
else
{
EN1 = 0;
}
}
void right_moto(void) //右電機調速函式
{
if(right_pwm)
{
if(pwmval_right <= pwmval_right_init)
{
EN2 = 1;
}
else if(pwmval_right > pwmval_right_init)
{
EN2 = 0;
}
if(pwmval_right >= 20)
{
pwmval_right = 0;
}
}
else
{
EN2 = 0;
}
}
void OLED_Refresh_Gram(void)
{
u8 i,n;
for(i=0;i<8;i++)
{
OLED_WR_Byte (0xb0+i,OLED_CMD); //設定頁地址(0~7)
OLED_WR_Byte (0x00,OLED_CMD); //設定顯示位置—列低地址
OLED_WR_Byte (0x10,OLED_CMD); //設定顯示位置—列高地址
for(n=0;n<128;n++)
{
OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA);
}
}
}
void OLED_WR_Byte(u8 dat,u8 cmd)
{
u8 i;
if(cmd)
{
OLED_RS_Set();
}
else
{
OLED_RS_Clr();
}
for(i=0;i<8;i++)
{
OLED_SCLK_Clr();
if(dat&0x80)
{
OLED_SDIN_Set();
}
else
{
OLED_SDIN_Clr();
}
OLED_SCLK_Set();
dat<<=1;
}
OLED_RS_Set();
}
void OLED_Display_On(void)
{
OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令
OLED_WR_Byte(0X14,OLED_CMD); //DCDC ON
OLED_WR_Byte(0XAF,OLED_CMD); //DISPLAY ON
}
void OLED_Display_Off(void)
{
OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令
OLED_WR_Byte(0X10,OLED_CMD); //DCDC OFF
OLED_WR_Byte(0XAE,OLED_CMD); //DISPLAY OFF
}
void OLED_Clear(void)
{
u8 i,n;
for(i=0;i<8;i++)for(n=0;n<128;n++)OLED_GRAM[n][i]=0X00;
OLED_Refresh_Gram(); //更新顯示
}
void OLED_DrawPoint(u8 x,u8 y,u8 t)
{
u8 pos,bx,temp=0;
if(x>127||y>63)return; //超出范圍了.
pos=7-y/8;
bx=y%8;
temp=1<<(7-bx);
if(t)OLED_GRAM[x][pos]|=temp;
else OLED_GRAM[x][pos]&=~temp;
}
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode)
{
u8 temp,t,t1;
u8 y0=y;
chr=chr-' '; //得到偏移后的值
for(t=0;t<size;t++)
{
if(size==12) //呼叫1206字體
{
temp=oled_asc2_1206[chr][t];
}
else //呼叫1608字體
{
temp=oled_asc2_1608[chr][t];
}
for(t1=0;t1<8;t1++)
{
if(temp&0x80)
{
OLED_DrawPoint(x,y,mode);
}
else
{
OLED_DrawPoint(x,y,!mode);
}
temp<<=1;
y++;
if((y-y0)==size)
{
y=y0;
x++;
break;
}
}
}
}
u32 oled_pow(u8 m,u8 n)
{
u32 result=1;
while(n--)result*=m;
return result;
}
void OLED_ShowNumber(u8 x,u8 y,u32 num,u8 len,u8 size)
{
u8 t,temp;
u8 enshow=0;
for(t=0;t<len;t++)
{
temp=(num/oled_pow(10,len-t-1))%10;
if(enshow==0&&t<(len-1))
{
if(temp==0)
{
OLED_ShowChar(x+(size/2)*t,y,' ',size,1);
continue;
}
else
{
enshow=1;
}
}
OLED_ShowChar(x+(size/2)*t,y,temp+'0',size,1);
}
}
void OLED_ShowString(u8 x,u8 y,const u8 *p)
{
#define MAX_CHAR_POSX 122
#define MAX_CHAR_POSY 58
while(*p!='\0')
{
if(x>MAX_CHAR_POSX){x=0;y+=16;}
if(y>MAX_CHAR_POSY){y=x=0;OLED_Clear();}
OLED_ShowChar(x,y,*p,12,1);
x+=8;
p++;
}
}
void Oled_Init(void)
{
RCC->APB2ENR|=1<<3; //使能PORTB時鐘
GPIOB->CRL&=0XFFF0FFFF;
GPIOB->CRL|=0X00020000; //PB4 推挽輸出
RCC->APB2ENR|=1<<4; //使能PORTC時鐘
RCC->APB2ENR|=1<<0; //使能AFIO時鐘
GPIOC->CRH&=0X000FFFFF; //PC13,14,15設定成輸出 2MHz 推挽輸出
GPIOC->CRH|=0X22200000;
PWR->CR|=1<<8; //取消備份區寫保護
RCC->BDCR&=0xFFFFFFFE; //外部低俗振蕩器關閉 PC14,PC15成為普通IO
BKP->CR&=0xFFFFFFFE; //侵入檢測TAMPER引腳作為通用IO口使用
PWR->CR&=0xFFFFFEFF; //備份區寫保護
OLED_RST_Clr();
delay_ms(100);
OLED_RST_Set();
OLED_WR_Byte(0xAE,OLED_CMD); //關閉顯示
OLED_WR_Byte(0xD5,OLED_CMD); //設定時鐘分頻因子,震蕩頻率
OLED_WR_Byte(80,OLED_CMD); //[3:0],分頻因子;[7:4],震蕩頻率
OLED_WR_Byte(0xA8,OLED_CMD); //設定驅動路數
OLED_WR_Byte(0X3F,OLED_CMD); //默認0X3F(1/64)
OLED_WR_Byte(0xD3,OLED_CMD); //設定顯示偏移
OLED_WR_Byte(0X00,OLED_CMD); //默認為0
OLED_WR_Byte(0x40,OLED_CMD); //設定顯示開始行 [5:0],行數.
OLED_WR_Byte(0x8D,OLED_CMD); //電荷泵設定
OLED_WR_Byte(0x14,OLED_CMD); //bit2,開啟/關閉
OLED_WR_Byte(0x20,OLED_CMD); //設定記憶體地址模式
OLED_WR_Byte(0x02,OLED_CMD); //[1:0],00,列地址模式;01,行地址模式;10,頁地址模式;默認10;
OLED_WR_Byte(0xA1,OLED_CMD); //段重定義設定,bit0:0,0->0;1,0->127;
OLED_WR_Byte(0xC0,OLED_CMD); //設定COM掃描方向;bit3:0,普通模式;1,重定義模式 COM[N-1]->COM0;N:驅動路數
OLED_WR_Byte(0xDA,OLED_CMD); //設定COM硬體引腳配置
OLED_WR_Byte(0x12,OLED_CMD); //[5:4]配置
OLED_WR_Byte(0x81,OLED_CMD); //對比度設定
OLED_WR_Byte(0xEF,OLED_CMD); //1~255;默認0X7F (亮度設定,越大越亮)
OLED_WR_Byte(0xD9,OLED_CMD); //設定預充電周期
OLED_WR_Byte(0xf1,OLED_CMD); //[3:0],PHASE 1;[7:4],PHASE 2;
OLED_WR_Byte(0xDB,OLED_CMD); //設定VCOMH 電壓倍率
OLED_WR_Byte(0x30,OLED_CMD); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;
OLED_WR_Byte(0xA4,OLED_CMD); //全域顯示開啟;bit0:1,開啟;0,關閉;(白屏/黑屏)
OLED_WR_Byte(0xA6,OLED_CMD); //設定顯示方式;bit0:1,反相顯示;0,正常顯示
OLED_WR_Byte(0xAF,OLED_CMD); //開啟顯示
OLED_Clear();
}
void Oled_Show(void)
{
OLED_ShowString(20,10,"ChaoSB-TEST");
OLED_ShowString(0,30,"Distance:");
OLED_ShowNumber(80,30,(u16)JuLi,4,12);
OLED_ShowString(110,30,"mm");
OLED_Refresh_Gram(); //重繪
}
void process(void) //避障處理函式
{
u8 j;
u8 p;
u32 S1_temp = 0;
u32 S2_temp = 0;
LeftOrRight = Left; //舵機轉到左邊
TimeOutCounter = 0;
for(j=0;j<=9;j++)
{
delay_ms(1000);
}
Oled_Show(); //顯示障礙物距離資訊
S1_temp = JuLi; //小車左邊障礙物距離存在變數S1_temp中
LeftOrRight = Right; //舵機轉到右邊
TimeOutCounter = 0;
for(j=0;j<=13;j++)
{
delay_ms(1000);
}
Oled_Show(); //顯示障礙物距離資訊
S2_temp = JuLi; //小車右邊障礙物距離存在變數S2_temp中
LeftOrRight = Stop; //舵機回到中間
TimeOutCounter = 0;
for(j=0;j<=9;j++)
{
delay_ms(1000);
}
if((S1_temp<=200)||(S2_temp<=200)) //如果超聲波模塊測得左邊或右邊障礙物的距離小于20厘米
{
back(); //小車后退
for(p=0;p<=10;p++)
{
delay_ms(1000);
}
}
else
{
back(); //小車后退
for(p=0;p<=8;p++)
{
delay_ms(1000);
}
}
stop(); //小車停下
for(p=0;p<=2;p++)
{
delay_ms(1000);
}
if(S1_temp>S2_temp) //如果左邊障礙物離小車遠
{
circle_left(); //小車向左轉
for(p=0;p<=2;p++)
{
delay_ms(1000);
}
}
else if(S1_temp<S2_temp) //如果右邊障礙物離小車遠
{
circle_right(); //小車向右轉
for(p=0;p<=2;p++)
{
delay_ms(1000);
}
}
}
void Timer3_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1; //TIM3時鐘使能
RCC->APB2ENR|=1<<3; //使能PORTB時鐘
GPIOB->CRL&=0XFFFFFF00;
GPIOB->CRL|=0X00000028; //PB.0 輸入 PB.1輸出
TIM3->ARR=arr; //設定計數器自動重裝值
TIM3->PSC=psc; //預分頻器
TIM3->CCMR2|=1<<0; //選擇輸入端
TIM3->CCMR2|=0<<4; //配置輸入濾波器 不濾波
TIM3->CCMR2|=0<<2; //配置輸入分頻,不分頻
TIM3->CCER|=0<<9; //上升沿捕獲
TIM3->CCER|=1<<8; //允許捕獲計數器的值到捕獲暫存器中
TIM3->DIER|=1<<3; //允許捕獲中斷
TIM3->DIER|=1<<0; //允許更新中斷
TIM3->CR1|=0x01; //使能定時器3
MY_NVIC_Init(1,3,TIM3_IRQChannel,1);
}
/**************************************************************************
函式功能:超聲波接識訓波函式
入口引數:無
回傳 值:無
**************************************************************************/
u16 TIM3CH3_CAPTURE_STA,TIM3CH3_CAPTURE_VAL;
void Read_Distane(void)
{
PBout(1)=1;
delay_us(15);
PBout(1)=0;
if(TIM3CH3_CAPTURE_STA&0X80) //成功捕獲到了一次高電平
{
JuLi=TIM3CH3_CAPTURE_STA&0X3F;
JuLi*=65536; //溢位時間總和
JuLi+=TIM3CH3_CAPTURE_VAL; //得到總的高電平時間
JuLi=JuLi*170/1000;
TIM3CH3_CAPTURE_STA=0; //開啟下一次捕獲
}
}
/**************************************************************************
函式功能:超聲波回波脈寬讀取中斷
入口引數:無
回傳 值:無
**************************************************************************/
void TIM3_IRQHandler(void)
{
u16 tsr;
tsr=TIM3->SR;
if((TIM3CH3_CAPTURE_STA&0X80)==0) //還未成功捕獲
{
if(tsr&0X01) //溢位
{
if(TIM3CH3_CAPTURE_STA&0X40) //已經捕獲到高電平了
{
if((TIM3CH3_CAPTURE_STA&0X3F)==0X3F) //高電平太長了
{
TIM3CH3_CAPTURE_STA|=0X80; //標記成功捕獲了一次
TIM3CH3_CAPTURE_VAL=0XFFFF;
}
else
{
TIM3CH3_CAPTURE_STA++;
}
}
}
if(tsr&0x08) //捕獲3發生捕獲事件
{
if(TIM3CH3_CAPTURE_STA&0X40) //捕獲到一個下降沿
{
TIM3CH3_CAPTURE_STA|=0X80; //標記成功捕獲到一次高電平脈寬
TIM3CH3_CAPTURE_VAL=TIM3->CCR3; //獲取當前的捕獲值.
TIM3->CCER&=~(1<<9); //CC1P=0 設定為上升沿捕獲
}
else //還未開始,第一次捕獲上升沿
{
TIM3CH3_CAPTURE_STA=0; //清空
TIM3CH3_CAPTURE_VAL=0;
TIM3CH3_CAPTURE_STA|=0X40; //標記捕獲到了上升沿
TIM3->CNT=0; //計數器清空
TIM3->CCER|=1<<9; //CC1P=1 設定為下降沿捕獲
}
}
}
TIM3->SR=0; //清除中斷標志位
}
/**************************************************************************
函式功能:定時中斷初始化
入口引數:arr:自動重裝值 psc:時鐘預分頻數
回傳 值:無
**************************************************************************/
void Timer1_Init(u16 arr,u16 psc)
{
RCC->APB2ENR|=1<<11; //TIM1時鐘使能
TIM1->ARR=arr; //設定計數器自動重裝值
TIM1->PSC=psc; //預分頻器7200,得到10Khz的計數時鐘
TIM1->DIER|=1<<0; //允許更新中斷
TIM1->DIER|=1<<6; //允許觸發中斷
TIM1->CR1|=0x01; //使能定時器
MY_NVIC_Init(1,3,TIM1_UP_IRQChannel,2);
}
/**************************************************************************
函式功能:定時中斷初始化
入口引數:arr:自動重裝值 psc:時鐘預分頻數
回傳 值:無
**************************************************************************/
int TIM1_UP_IRQHandler(void)
{
if(TIM1->SR&0X0001) //5ms定時中斷
{
TIM1->SR&=~(1<<0); //清除定時器1中斷標志位
}
Read_Distane();
return 0;
}
//定時器3中斷服務程式
void TIM2_IRQHandler(void)
{
if(TIM2->SR&0X0001) //溢位中斷
{
TimeOutCounter ++;
timer++;
switch(LeftOrRight)
{
case 0 : //1.5ms
{
if(TimeOutCounter<=6)
{
ControlPort = 1;
}
else
{
ControlPort = 0;
}
}break;
case 1 : //1ms
{
if(TimeOutCounter<=4)
{
ControlPort = 1;
}
else
{
ControlPort = 0;
}
}break;
case 2 : //2ms
{
if(TimeOutCounter<=8)
{
ControlPort = 1;
}
else
{
ControlPort = 0;
}
}break;
default : break;
}
if(TimeOutCounter <= 30)
{
EN1 = 1;
EN2 = 1;
}
else if(TimeOutCounter > 30)
{
EN1 = 0;
EN2 = 0;
}
if(TimeOutCounter==80) //20ms
{
TimeOutCounter = 0;
}
}
TIM2->SR&=~(1<<0); //清除中斷標志位
}
//通用定時器中斷初始化
//這里時鐘選擇為APB1的2倍,而APB1為36M
//arr:自動重裝值,
//psc:時鐘預分頻數
//這里使用的是定時器3
void Timer2_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<0; //TIM2時鐘使能
TIM2->ARR=arr; //設定計數器自動重裝值//剛好1ms
TIM2->PSC=psc; //預分頻器7200,得到10Khz的計數時鐘
//這兩個東東要同時設定才可以使用中斷
TIM2->DIER|=1<<0; //允許更新中斷
TIM2->CR1|=0x01; //使能定時器3
MY_NVIC_Init(1,3,TIM2_IRQChannel,2); //搶占1,子優先級3,組2
}
中斷函式
#include "sys.h"
//設定向量表偏移地址
//NVIC_VectTab:基址
//Offset:偏移量
//CHECK OK
//091207
void MY_NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset)
{
//檢查引數合法性
assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
assert_param(IS_NVIC_OFFSET(Offset));
SCB->VTOR = NVIC_VectTab|(Offset & (u32)0x1FFFFF80); //設定NVIC的向量表偏移暫存器
//用于標識向量表是在CODE區還是在RAM區
}
//設定NVIC分組
//NVIC_Group:NVIC分組 0~4 總共5組
//CHECK OK
//091209
void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)
{
u32 temp,temp1;
temp1=(~NVIC_Group)&0x07; //取后三位
temp1<<=8;
temp=SCB->AIRCR; //讀取先前的設定
temp&=0X0000F8FF; //清空先前分組
temp|=0X05FA0000; //寫入鑰匙
temp|=temp1;
SCB->AIRCR=temp; //設定分組
}
//設定NVIC
//NVIC_PreemptionPriority:搶占優先級
//NVIC_SubPriority :回應優先級
//NVIC_Channel :中斷編號
//NVIC_Group :中斷分組 0~4
//注意優先級不能超過設定的組的范圍!否則會有意想不到的錯誤
//組劃分:
//組0:0位搶占優先級,4位回應優先級
//組1:1位搶占優先級,3位回應優先級
//組2:2位搶占優先級,2位回應優先級
//組3:3位搶占優先級,1位回應優先級
//組4:4位搶占優先級,0位回應優先級
//NVIC_SubPriority和NVIC_PreemptionPriority的原則是,數值越小,越優先
//CHECK OK
//100329
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)
{
u32 temp;
u8 IPRADDR=NVIC_Channel/4; //每組只能存4個,得到組地址
u8 IPROFFSET=NVIC_Channel%4; //在組內的偏移
IPROFFSET=IPROFFSET*8+4; //得到偏移的確切位置
MY_NVIC_PriorityGroupConfig(NVIC_Group); //設定分組
temp=NVIC_PreemptionPriority<<(4-NVIC_Group);
temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
temp&=0xf; //取低四位
if(NVIC_Channel<32)NVIC->ISER[0]|=1<<NVIC_Channel; //使能中斷位(要清除的話,相反操作就OK)
else NVIC->ISER[1]|=1<<(NVIC_Channel-32);
NVIC->IPR[IPRADDR]|=temp<<IPROFFSET; //設定回應優先級和搶斷優先級
}
//外部中斷配置函式
//只針對GPIOA~G;不包括PVD,RTC和USB喚醒這三個
//引數:GPIOx:0~6,代表GPIOA~G;BITx:需要使能的位;TRIM:觸發模式,1,下升沿;2,上降沿;3,任意電平觸發
//該函式一次只能配置1個IO口,多個IO口,需多次呼叫
//該函式會自動開啟對應中斷,以及屏蔽線
//待測驗...
void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM)
{
u8 EXTADDR;
u8 EXTOFFSET;
EXTADDR=BITx/4; //得到中斷暫存器組的編號
EXTOFFSET=(BITx%4)*4;
RCC->APB2ENR|=0x01; //使能io復用時鐘
AFIO->EXTICR[EXTADDR]&=~(0x000F<<EXTOFFSET); //清除原來設定!!!
AFIO->EXTICR[EXTADDR]|=GPIOx<<EXTOFFSET; //EXTI.BITx映射到GPIOx.BITx
//自動設定
EXTI->IMR|=1<<BITx; //開啟line BITx上的中斷
if(TRIM&0x01)EXTI->FTSR|=1<<BITx; //line BITx上事件下降沿觸發
if(TRIM&0x02)EXTI->RTSR|=1<<BITx; //line BITx上事件上升降沿觸發
}
//不能在這里執行所有外設復位!否則至少引起串口不作業.
//把所有時鐘暫存器復位
//CHECK OK
//091209
void MYRCC_DeInit(void)
{
RCC->APB1RSTR = 0x00000000;//復位結束
RCC->APB2RSTR = 0x00000000;
RCC->AHBENR = 0x00000014; //睡眠模式閃存和SRAM時鐘使能.其他關閉.
RCC->APB2ENR = 0x00000000; //外設時鐘關閉.
RCC->APB1ENR = 0x00000000;
RCC->CR |= 0x00000001; //使能內部高速時鐘HSION
RCC->CFGR &= 0xF8FF0000; //復位SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0]
RCC->CR &= 0xFEF6FFFF; //復位HSEON,CSSON,PLLON
RCC->CR &= 0xFFFBFFFF; //復位HSEBYP
RCC->CFGR &= 0xFF80FFFF; //復位PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE
RCC->CIR = 0x00000000; //關閉所有中斷
//配置向量表
#ifdef VECT_TAB_RAM
MY_NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else
MY_NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
}
//THUMB指令不支持匯編行內
//采用如下方法實作執行匯編指令WFI
//CHECK OK
//091209
__asm void WFI_SET(void)
{
WFI;
}
//進入待機模式
//check ok
//091202
void Sys_Standby(void)
{
SCB->SCR|=1<<2; //使能SLEEPDEEP位 (SYS->CTRL)
RCC->APB1ENR|=1<<28; //使能電源時鐘
PWR->CSR|=1<<8; //設定WKUP用于喚醒
PWR->CR|=1<<2; //清除Wake-up 標志
PWR->CR|=1<<1; //PDDS置位
WFI_SET(); //執行WFI指令
}
//系統軟復位
//CHECK OK
//091209
void Sys_Soft_Reset(void)
{
SCB->AIRCR =0X05FA0000|(u32)0x04;
}
//JTAG模式設定,用于設定JTAG的模式
//mode:jtag,swd模式設定;00,全使能;01,使能SWD;10,全關閉;
//CHECK OK
//100818
void JTAG_Set(u8 mode)
{
u32 temp;
temp=mode;
temp<<=25;
RCC->APB2ENR|=1<<0; //開啟輔助時鐘
AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]
AFIO->MAPR|=temp; //設定jtag模式
}
//系統時鐘初始化函式
//pll:選擇的倍頻數,從2開始,最大值為16
//CHECK OK
//091209
void Stm32_Clock_Init(u8 PLL)
{
unsigned char temp=0;
MYRCC_DeInit(); //復位并配置向量表
RCC->CR|=0x00010000; //外部高速時鐘使能HSEON
while(!(RCC->CR>>17)); //等待外部時鐘就緒
RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
PLL-=2;//抵消2個單位
RCC->CFGR|=PLL<<18; //設定PLL值 2~16
RCC->CFGR|=1<<16; //PLLSRC ON
FLASH->ACR|=0x32; //FLASH 2個延時周期
RCC->CR|=0x01000000; //PLLON
while(!(RCC->CR>>25)); //等待PLL鎖定
RCC->CFGR|=0x00000002; //PLL作為系統時鐘
while(temp!=0x02) //等待PLL作為系統時鐘設定成功
{
temp=RCC->CFGR>>2;
temp&=0x03;
}
}
延時函式
#include <stm32f10x_map.h>
#include <stm32f10x_nvic.h>
#include "delay.h"
static u8 fac_us=0; //us延時倍乘數
static u16 fac_ms=0; //ms延時倍乘數
//初始化延遲函式
//SYSTICK的時鐘固定為HCLK時鐘的1/8
//SYSCLK:系統時鐘
void delay_init(u8 SYSCLK)
{
SysTick->CTRL&=0xfffffffb; //bit2清空,選擇外部時鐘 HCLK/8
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
}
//延時nms
//注意nms的范圍,nms<=1864
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms; //時間加載(SysTick->LOAD為24bit)
SysTick->VAL =0x00; //清空計數器
SysTick->CTRL=0x01 ; //開始倒數
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16))); //等待時間到達
SysTick->CTRL=0x00; //關閉計數器
SysTick->VAL =0X00; //清空計數器
}
//延時nus
//nus為要延時的us數.
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //時間加載
SysTick->VAL=0x00; //清空計數器
SysTick->CTRL=0x01 ; //開始倒數
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16))); //等待時間到達
SysTick->CTRL=0x00; //關閉計數器
SysTick->VAL =0X00; //清空計數器
}
接線說明:
電機驅動線:
1、 開發板 PA2 接小車底盤 M6 2、 開發板 PA3 接小車底盤 M5
3、 開發板 PA4 接小車底盤 M4 4、 開發板 PA5 接小車底盤 M3
5、 開發板 PA6 接小車底盤 M2 6、 開發板 PA7 接小車底盤 M1
超聲波模塊接線:
1、超聲波模塊 VCC 接開發板 5V 2、超聲波模塊 GND 接開發板 GND
3、超聲波模塊 Trig 接開發板 PB1 4、超聲波模塊 Echo 接開發板 PB0
舵機接線:
將舵機線接到小車底盤的舵機介面上(注意方向, 舵機棕線是 GND,
紅線是 VCC, 橙線是信號線, 它們分別對應小車底盤舵機介面上的
GND,5V 和 S), 另外, 舵機的信號線需要一條單獨的杜邦線連接到
開發板的 PA0,
電源線:
1、 開發板 5V 接小車底盤 5V 2、 開發板 GND 接小車底盤 GND
紅外避障信號線:
1、 開發板 PA13 接小車底盤 H3 2、 開發板 PA14 接小車底盤 H4

小車底板電路圖:

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/204394.html
標籤:其他
上一篇:網路故障監測終端
下一篇:QT之QUdpSocket學習
