89C52RC单片机学习-避障小车(OLED显示,测速,4G模块控制)

避障小车
避障小车
这个小车用到2个定时器中断,1个串口中断,1个外部中断。
这个程序中如果加入舵机的PWM调制,测速度用的外部中断和舵机的中断有一些冲突,频繁的外部中断会是舵机PWM占空比不稳定,这个程序中为使用PWM调制。

#include "reg52.h"
#include "stdio.h"
#include "delay.h"//延时函数
#include "intrins.h"
#include "string.h"
#include "motor.h"//
#include "interruptInit.h"//
#include "UltraSound.h"//
#include "Usart_Init.h"//初始化函数
#include "I2C.h"
#include "OLED.h"
//管脚配置
#define bufferlen 12
char buffer[12];
char Time3cnt=0;
double SpeedCount=0;//计算码盘的孔数
unsigned long SpeedCount1=0;//用来设1S的变量
char speedMes[24];  //发送数据的字符串缓存
char OLED_speedMes[15];

void send_character(char datacharacter)//发送一个字符
{
SBUF=datacharacter;
}

void send_tring(char *datatring)//发送字符串
{
  while (*datatring!= '\0')//对是否发送完毕进行判断
	{
    send_character(*datatring);//发送当前地址的字符
    while (TI==0);//死等TI==1,需要加分号
    datatring++;//发送完毕之后地址才能加一
    TI=0;//软件复位}
  }
}

//超声动作有三个角度,中间一直走且测距,遇到障碍摇头测距判断方向。
void main ()
{
    //开启总中断
	  EA=1; 
	  EX2_init();
	  Timer2Init();
	  uart_Init();//串口的初始化设置
	 //1.led初始化
      OLED_init();
     // 2.设置页模式
	  I2C_Pagemode();
	 //模式设置好了可以进行清屏,清理上次的数据缓存
	  Oled_Clear();
	  Delay500ms();
 		while(1);
	}
	//计时器3,舵机PWM函数
void MS9g() interrupt 5 
{
	TF2=0;//需要手动复位TF2
	SpeedCount1++;
	//重新赋初值
  if(SpeedCount1==2000)//60S
	{
   //达到一秒就发送数据
		sprintf(speedMes,"%0.2f cm/S\r\n",SpeedCount);//对要发生的字符串进行缓存
	    sprintf(OLED_speedMes,"%0.2f cm/S",SpeedCount);//对要发生的字符串进行缓存
		send_tring(speedMes);
	    Oled_Show_Str(1,1,OLED_speedMes);
		SpeedCount=0;
		SpeedCount1=0;
		
  }
}
void SpeedCnt() interrupt 6       //使用外部中断3,用于小车码盘孔数计算
{
SpeedCount++;
}

//由模块Tx发出的有两种指令,1,AT功能设置指令的反馈 2,服务器串口发送的数据传到WiFi模块,再由模块发给单片机
void uart_Interrupt () interrupt 4   //中段函数。每次接收到WiFi模块发过来的数据进入中断
{
  static int i=0; //只在开始的时候执行一次
  if (RI)//当串口中断事件为接收到数据
		{
	  RI=0;
	  if(i==12)//不超过十二个字符
		{
			i=0;
		}
		buffer[i++]=SBUF;//全局变量接收WiFi模块Tx发送过来的数据
		
		if(buffer[i-1]=='M')//第一个数据M
		{
			buffer[0] =buffer[i-1];//buffer[i-1]才是刚才接收的数据
			i=1;
		}
		if (buffer[1]=='F')	//当接受的数据为“MF”
		{
		    ForWard();
			Delay500ms()	;
			memset(buffer, '\0', bufferlen);
		}
		if (buffer[1]=='B')//当接受的数据为“MB”
		{
			BackWard();
		    Delay500ms()	;
			memset(buffer, '\0', bufferlen);
		}
		if (buffer[1]=='L')//当接受的数据为“ML”
		{
	  	    LeftWard();
			Delay200ms();;
			memset(buffer, '\0', bufferlen);
		}
		if (buffer[1]=='R')//当接受的数据为“MR”
		{
	  	    RightWard();
		    Delay200ms();;
			memset(buffer, '\0', bufferlen);
		}	
		}	
}

interruptInit.c

#include "reg52.h"
sfr T2MOD  = 0xC9;//定时器2的模式寄存器
sfr P4  = 0xE8;
sfr XICON      = 0xC0;//拓展外部中断寄存器,外部中断2
sbit Leftsensor =P3^2;//左传感器外部中断0
sbit Rightsensor =P3^3;//右传感器外部中断1
sbit SpeedSlice = P4^3;
sbit EX2   = XICON^2;
sbit IT2       = XICON^0;
//定时器0的初始化函数,用于超声计时
//前进
void EX0_init()//外部中断0的初始化
{
	IT0=0;
	EX0=1;
}

void EX1_init()//外部中断1的初始化
{
	IT1=0;
	EX1=1;
}

void EX2_init()//外部中断1的初始化
{
	IT2=1;
	EX2=1;
}


void Timer0Init()//定时器0用于超声测距
{
	TMOD &= 0xF0;		//定时器0设定重置
  TMOD |= 0x01;       //设置16位计时器
	TH0 = 0;
  TL0 = 0;

}


void Timer2Init()		//定时器2用于舵机PWM控制
{
	T2MOD = 0;		//初始化模式寄存器
	T2CON = 0;		//初始化控制寄存器
	TH2 = 0xFE;
  TL2 = 0x33;
	RCAP2H= 0xFE;		//设置定时重载值
	RCAP2L = 0x33;		//设置定时重载值
	ET2=1;
	TF2=0;
  TR2 = 1;		//定时器2开始计时
}
 

void Timer1Init()		
{
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x10;		
	TL1 = 0x33;		//设置定时初值
	TH1 = 0xFE;		//设置定时初值
	ET1 = 1;//定时器0支路开关连接
	TF1 = 0;		//清除TF1标志
	TR1=1;
}

void uart_Init()//串口初始化
{
SCON=0X50;//设置串口的寄存器工作模式

TMOD &=0X0F;//定时器1的工作模式
TMOD |=0X2F;
TH1=0XFD;//设置波特率9600
TL1=TH1;
TR1=1;//定时器开始计时
ES=1;
}

motor.c

#include "reg52.h"
#include "delay.h"
//右轮
sbit RightA=P3^5;
sbit RightB=P3^4;
//左轮
sbit LeftA=P3^6;
sbit LeftB=P3^7;
void ForWard()
{

RightA=1;
RightB=0;
LeftA=1;
LeftB=0;

}
//后退
void BackWard()
{
RightA=0;
RightB=1;
LeftA=0;
LeftB=1;
}

//左转
void LeftWard()
{
RightA=1;
RightB=0;
LeftA=0;
LeftB=0;
}

//右转
void RightWard()
{
RightA=0;
RightB=0;
LeftA=1;
LeftB=0;

}

void Stop()
{
RightA=0;
RightB=0;
LeftA=0;
LeftB=0;
}

I2C.c

#include "reg52.h"
#include  "intrins.h"

sbit SCL=P0^1;
sbit SDA=P0^2;

//启动函数
void I2C_start ()
{   
	SCL =0;
	SCL =1;
	SDA=1;
	_nop_();
	SDA=0;
	_nop_();
	SCL=0;
}

//结束函数
void I2C_stop()
{
	SDA=0;
	SCL =0;
	SCL =1;
	_nop_();
	SDA=1;
	_nop_();
	
}
//应答函数
char  I2C_ack()
{
  char  num=0;
	SCL=0;
  SDA=1;

  SCL=1;
  _nop_();
  while (SDA)
  {
	if (++num>250)
    {
	     I2C_stop();
	     return 1;
	  } 
  }
   return 0;
}
//发送数据
void  I2C_sendbyte(char databyte)
{
	char i;
	for (i=0;i<8;i++)
	{
		SCL=0;
		SDA=databyte&0X80;
		_nop_();
		SCL=1;
		_nop_();
		SCL=0;
		_nop_();
		databyte=databyte << 1;
	}
}

OLED.c

#include "reg52.h"
#include "I2C.h"
#include "Oledfont.h"

//写入一个指令
void Oled_Write_Cmd(char CMD_data)
{
//1,start
	I2C_start ();
//2,oled子地址和选择读写
	I2C_sendbyte(0x78);
//3,ack
	I2C_ack();
//4,指令还是数据,指令00000000数据01000000
	I2C_sendbyte(0x00);
//5,ack
	I2C_ack();
//6,写入指令
	I2C_sendbyte(CMD_data);
//7,ack
	I2C_ack();
//8,stop
	I2C_stop();
}
//star 和stop 不需要ACK。


//写入一个数据
void Oled_Write_Data(char DATA_data)
{
//1,start
	I2C_start ();
//2,oled子地址和选择读写
	I2C_sendbyte(0x78);
//3,ack
	I2C_ack();
//4,指令还是数据,指令00000000数据01000000
	I2C_sendbyte(0x40);
//5,ack
	I2C_ack();
//6,写入数据
	I2C_sendbyte(DATA_data);
//7,ack
	I2C_ack();
//8,stop
	I2C_stop();
}

//OLED初始化
void OLED_Init()
{
Oled_Write_Cmd(0xAE);//--display off
Oled_Write_Cmd(0x00);//---set low column address
Oled_Write_Cmd(0x10);//---set high column address
Oled_Write_Cmd(0x40);//--set start line address
Oled_Write_Cmd(0xB0);//--set page address
Oled_Write_Cmd(0x81); // contract control
Oled_Write_Cmd(0xFF);//--128
Oled_Write_Cmd(0xA1);//set segment remap
Oled_Write_Cmd(0xA6);//--normal / reverse
Oled_Write_Cmd(0xA8);//--set multiplex ratio(1 to 64)
Oled_Write_Cmd(0x3F);//--1/32 duty
Oled_Write_Cmd(0xC8);//Com scan direction
Oled_Write_Cmd(0xD3);//-set display offset
Oled_Write_Cmd(0x00);//
Oled_Write_Cmd(0xD5);//set osc division
Oled_Write_Cmd(0x80);//
Oled_Write_Cmd(0xD8);//set area color mode off
Oled_Write_Cmd(0x05);//
Oled_Write_Cmd(0xD9);//Set Pre-Charge Period
Oled_Write_Cmd(0xF1);//
Oled_Write_Cmd(0xDA);//set com pin configuartion
Oled_Write_Cmd(0x12);//
Oled_Write_Cmd(0xDB);//set Vcomh
Oled_Write_Cmd(0x30);//
Oled_Write_Cmd(0x8D);//set charge pump enable
Oled_Write_Cmd(0x14);//
Oled_Write_Cmd(0xAF);//--turn on oled panel
}

//oled设置为页模式
void I2C_Pagemode()
{
  Oled_Write_Cmd(0x20); 
	Oled_Write_Cmd(0x02); 
}
//OLED清屏
void Oled_Clear()
{
		unsigned char i;
		unsigned char j;
		for (i=0;i<8;i++)
		{
			  Oled_Write_Cmd(0xB0+i); 
				Oled_Write_Cmd(0x00); 
				Oled_Write_Cmd(0x10); 
      //写页
			//写列
				for(j=0;j<128;j++)
				{
				Oled_Write_Data(0);
				}
			

		}
}


//转换显示函数   宽*长=8*16(two page)
void Oled_Show_Char(char row,char col,char oledChar){ //row*2-2
	unsigned int  i;
	Oled_Write_Cmd(0xb0+(row*2-2));                           //page 0
	Oled_Write_Cmd(0x00+(col&0x0f));                          //low
	Oled_Write_Cmd(0x10+(col>>4));                            //high	
	for(i=((oledChar-32)*16);i<((oledChar-32)*16+8);i++){
		Oled_Write_Data(F8X16[i]);                            //???oledTable1
	}

	Oled_Write_Cmd(0xb0+(row*2-1));                           //page 1
	Oled_Write_Cmd(0x00+(col&0x0f));                          //low
	Oled_Write_Cmd(0x10+(col>>4));                            //high
	for(i=((oledChar-32)*16+8);i<((oledChar-32)*16+8+8);i++){
		Oled_Write_Data(F8X16[i]);                            //???oledTable1
	}		
}


/******************************************************************************/
// 函数名称:Oled_Show_Char 
// 功能:以8*16的像素在OLED显示
/******************************************************************************/
void Oled_Show_Str(char row,char col,char *str){
	while(*str!=0){
		Oled_Show_Char(row,col,*str);
		str++;
		col += 8;	
	}		
}

delay.c

# include "intrins.h"
void Delay50ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 90;
	j = 163;
	do
	{
		while (--j);
	} while (--i);
}

void Delay500ms()	//500ms延时
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void Delay100ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 180;
	j = 73;
	do
	{
		while (--j);
	} while (--i);
}


void Delay200ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 2;
	j = 103;
	k = 147;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

下面是头文件,其中Oledfont.h是新知识点,数据是厂家给出,接受到的数据转化为OLED显示的图案的作用
Oledfont.h

//这是一个宽高8*16的页模式字符库
const unsigned char code F8X16[]=	  
{
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0
  0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 1
  0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 2
  0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3
  0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 4
  0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 5
  0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 6
  0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 7
  0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 8
  0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 9
  0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 10
  0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 11
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 12
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 13
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 14
  0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 15
  0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 16
  0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 17
  0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 18
  0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 19
  0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 20
  0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 21
  0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 22
  0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 23
  0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 24
  0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 25
  0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 26
  0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 27
  0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 28
  0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 29
  0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 30
  0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 31
  0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 32
  0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 33
  0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 34
  0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 35
  0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 36
  0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 37
  0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 38
  0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 39
  0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 40
  0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 41
  0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 42
  0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 43
  0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 44
  0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 45
  0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 46
  0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 47
  0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 48
  0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 49
  0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 50
  0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 51
  0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 52
  0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 53
  0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 54
  0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 55
  0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 56
  0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 57
  0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 58
  0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 59
  0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 60
  0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 61
  0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 62
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 63
  0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 64
  0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 65
  0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 66
  0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 67
  0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 68
  0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 69
  0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 70
  0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 71
  0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 72
  0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 73
  0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 74
  0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 75
  0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 76
  0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 77
  0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 78
  0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 79
  0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 80
  0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 81
  0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 82
  0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 83
  0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 84
  0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 85
  0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 86
  0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 87
  0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 88
  0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 89
  0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 90
  0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 91
  0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 92
  0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 93
  0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94
};

motor.h

void ForWard();
void BackWard();
void LeftWard();
void RightWard();
void Stop();

interruptInit.h


void EX0_init();//外部中断0初始化
void EX1_init();//外部中断1初始化
void EX2_init();//外部中断2初始化
void Timer0Init();//定时器1中断初始化
void Timer1Init();//定时器2中断初始化
void Timer2Init();//定时器3中断初始化
void uart_Init();//串口初始化

I2C.h

void I2C_start ();
void I2C_stop();
char  I2C_ack();
void  I2C_sendbyte(char databyte);

OLED.h

void Oled_Write_Cmd(char CMD_data);
void Oled_Write_Data(char DATA_data);
void Oled_Clear();
void OLED_Init();
void I2C_Pagemode();
void Oled_Show_Char(char row,char col,char oledChar);
void Oled_Show_Str(char row,char col,char *str);
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STC89C52单片机+L298N 智能循迹小车-毕业论文 摘 要:利用红外对管检测黑线与碍物,并以STC89C52单片机控制芯片控制电动小汽车的速度及转向,从而实现自动循迹的功能。其中小车驱动由L298N驱动电路完成,速度由单片机输出的PWM波控制。 关键词:智能小车;STC89C52单片机; L298N;红外对管 Intelligent tracking and obstacle-avoid car Xiao Wei School of Physics and Electronic Information,Grade 2006 Class 9 ,Instructor:Liu Hankui Abstract:Based infrared detection of black lines and the road obstacles, and use a STC89C52 MCU as the controlling core for the speed and direction, A electronic drived, which can automatic track and avoid the obstacle, was designed and fabricated. In which, the car is drived by the L298N circuit, its speed is controlled by the output PWM signal from the STC89C52. Keywords: Smart Car; STC89C52 MCU; L298N; Infrared Emitting Diode 第一章 绪论 1.1智能小车的意义和作用 自第一台工业机器人诞生以来,机器人的发展已经遍及机械、电子、冶金、交通、宇航、国防等领域。近年来机器人的智能水平不断提高,并且迅速地改变着人们的生活方式。人们在不断探讨、改造、认识自然的过程中,制造能替代人劳动的机器一直是人类的梦想。 随着科学技术的发展,机器人的感觉传感器种类越来越多,其中视觉传感器成为自动行走和驾驶的重要部件。视觉的典型应用领域为自主式智能导航系统,对于视觉的各种技术而言图像处理技术已相当发达,而基于图像的理解技术还很落后,机器视觉需要通过大量的运算也只能识别一些结构化环境简单的目标。视觉传感器的核心器件是摄像管或CCD,目前的CCD已能做到自动聚焦。但CCD传感器的价格、体积和使用方式上并不占优势,因此在不要求清晰图像只需要粗略感觉的系统中考虑使用接近觉传感器是一种实用有效的方法。 机器人要实现自动导引功能和功能就必须要感知导引线和碍物,感知导引线相当给机器人一个视觉功能。控制系统是基于自动导引小车(AVG—auto-guide vehicle)系统,基于它的智能小车实现自动识别路线,判断并自动碍,选择正确的行进路线。使用传感器感知路线和碍并作出判断和相应的执行动作。 该智能小车可以作为机器人的典型代表。它可以分为三大组成部分:传感器检测部分、执行部分、CPU。机器人要实现自动功能,还可以扩展循迹等功能,感知导引线和碍物。可以实现小车自动识别路线,选择正确的行进路线,并检测到碍物自动躲。基于上述要求,传感检测部分考虑到小车一般不需要感知清晰的图像,只要求粗略感知即可,所以可以舍弃昂贵的CCD传感器而考虑使用价廉物美的红外反射式传感器来充当。智能小车的执行部分,是由直流电机来充当的,主要控制小车的行进方向和速度。单片机驱动直流电机一般有两种方案:第一,勿需占用单片机资源,直接选择有PWM功能的单片机,这样可以实现精确调速;第二,可以由软件模拟PWM输出调制,需要占用单片机资源,难以精确调速,但单片机型号的选择余地较大。考虑到实际情况,本文选择第二种方案。CPU使用STC89C52单片机,配合软件编程实现。 1.2智能小车的现状 现智能小车发展很快,从智能玩具到其它各行业都有实质成果。其基本可实现循迹、、检测贴片、寻光入库、崖等基本功能,这几节的电子设计大赛智能小车又在向声控系统发展。比较出名的飞思卡尔智能小车更是走在前列。我此次的设计主要实现循迹这两个功能。 第二章 方案设计与论证 根据要求,确定如下方案:在现有玩具电动车的基础上,加装光电检测器,实现对电动车的速度、位置、运行状况的实时测量,并将测量数据传送至单片机进行处理,然后由单片机

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值