主頁 > 移動端開發 > 基于STM32小車超聲波避障實驗(有代碼)

基于STM32小車超聲波避障實驗(有代碼)

2020-11-06 12:45:39 移動端開發

超聲波避障代碼

#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學習

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more