其他分享
首页 > 其他分享> > 51单片机+0.96寸oled屏+激光测距模块实现激光测距

51单片机+0.96寸oled屏+激光测距模块实现激光测距

作者:互联网

1,在实验室里捡到一个激光测距模块,尝试着搭配着0.96寸oled屏和stc89c51rc做一个激光测距仪,用到了一些杜邦线和以下几个模块。

整个流程是:按下微触开关,单片机通过UART发送工作指令给激光测距模块,测距模块通UART发送距离字符串给单片机,单片机通过SPI协议控制屏幕显示。

 上图依次为:

(1)激光测距模块(某宝上找到了近似的模块,接口有差别,如上图我引出了VCC,GND和UART的TX,RX线,详细参数见下图)。

(2)0.96寸oled屏(我这个是SPI接口的,也可以通过焊接背面电阻改成IIC的,参数如下)。

 

(3)STC89C51RC(做实验时把晶振之类的焊接到引脚了,它就等同一个最小工作电路)。

(4)一个微触开关,一个引脚连接单片机的P1^5,在其对角的那个引脚接地。

(5)下载器

2,电路接法见main.c的注释。程序结构见下图,一共四个函数,oled.h为宏定义,oled.c为屏幕显示函数,oledfont.h为6*8和8*16大小的ASCLL码,main.c为测距和显示函数:

 

 

 

(1)mian.c

//              0.96寸oled的GND引脚    电源地
//              0.96寸oled的VCC引脚    接5V或3.3v电源
//              0.96寸oled的D0引脚     接P10
//              0.96寸oled的D1引脚     接P11
//              0.96寸oled的RES引脚    接P12
//              0.96寸oled的DC引脚     接P13
//              0.96寸oled的CS引脚     接P14
//                            按键       一个引脚接P15,处于对角线的引脚接电源地 
//             激光测距模块的TX和RX    接单片机的RX和TX
//             激光测距模块的VCC和GND  接5V或3.3v电源和电源地             
#include "REG51.h"
#include "oled.h"
void UART_Init();
char length=0;//UART接收字符串的长度
char RevBuf[16]="sunhongtong   1";//数据接收缓冲区
int main(void)
{    
    SWITCH=1;//激光测距开关,为0是启动该功能
    OLED_Init();//初始化OLED  
    OLED_Clear();
    UART_Init();
    while(1)
    {
        if(SWITCH==0)//延时消抖
        {
            SWITCH=1;//延时消抖
            delay_ms(10);//延时消抖
            if(SWITCH==0)//延时消抖
            {    
                SBUF = 0x44;//向激光测距模块发送测量指令
                while(!TI);TI=0;
                delay_ms(500);
                //while(RevBuf[length]=='m');
                SWITCH=1;
                length=0;
                OLED_Clear();
                OLED_ShowString(0,2,RevBuf);
                delay_ms(500);
        }         
            }
        }
}    

/*OLED使用案例
    u8 t='$';
    OLED_Init();//初始化OLED  
    OLED_Clear(); 
    while(1)                                                 
    {        
        OLED_Clear();
        OLED_ShowString(0,2,"TRY");                     
         OLED_ShowString(20,4,"2022/06/09");      
        OLED_ShowString(63,6,"CODE:");  
        OLED_ShowChar(48,6,t);//显示ASCII字符           
        delay_ms(3000);
    } 
*/    

//UART初始化
void UART_Init()
{
    SCON=0x50;//等价于 SM0=0; SM1=1; REN=1;串口方式1, 8-n-1, 允许接收.  
    TMOD = 0x20; //定时器1工作模式2,自动重装8位计数器
    TH1 = 0xfd;
    TL1 = 0xfd;//定时器溢出时,会自动将高8位中的值赋值给低8位.比特率9600
    PCON=0x80;//波特率加倍变为19200
    TR1 = 1;
    ES  = 1;//开中断.
    EA  = 1;
                      
}
void ser_int(void) interrupt 4
{
    EA = 0;
    if(RI == 1)//如果收到 
    {    
        RI = 0;//清除标志
        RevBuf[length] = SBUF;//接收
        length++;
    }
    EA = 1;
    /*else//如果送毕 
    { 
        TI = 0;//清除标志
    }*/
}

(2)oledfont.h

#ifndef __OLEDFONT_H
#define __OLEDFONT_H        
/************************************6*8的点阵************************************/
const unsigned char code F6x8[][6] =        
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp  
0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !      
0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// "      
0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #      
0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $      
0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %     
0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &      
0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// '      
0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (      
0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )      
0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *      
0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +      
0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// ,      
0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// -      
0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// .      
0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// /      
0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0      
0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 1      
0x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 2      
0x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 3      
0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 4     
0x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 5      
0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6      
0x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 7      
0x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 8      
0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 9      
0x00, 0x00, 0x36, 0x36, 0x00, 0x00,// :      
0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ;      
0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// <      
0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// =      
0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// >     
0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ?      
0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @      
0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A      
0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B      
0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C      
0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D     
0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E      
0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F      
0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G      
0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H      
0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I      
0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J      
0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K      
0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L      
0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M      
0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N      
0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O      
0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P      
0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q      
0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R      
0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S      
0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T      
0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U      
0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V      
0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W      
0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X      
0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y      
0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z      
0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [      
0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 55  
0x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ]      
0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^      
0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _      
0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// '      
0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a      
0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b      
0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c      
0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d      
0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e      
0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f      
0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g      
0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h      
0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i      
0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j      
0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k      
0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l      
0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m      
0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n      
0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o      
0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p      
0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q      
0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r      
0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s      
0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t      
0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u      
0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v      
0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w      
0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x      
0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y      
0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z      
0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines    
};
/****************************************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
};
#endif

(3)oled.c

#include "oled.h"
#include "oledfont.h"
//11.0592晶振 毫秒级延时函数                       
void delay_ms(unsigned int ms)
{                         
    unsigned int i,j;
    for(j=ms;j>0;j--)
        for(i=112;i>0;i--);
}
//向SSD1306写入一个字节。
//dat:要写入的数据/命令
//cmd:数据/命令标志 0,表示命令;1,表示数据;
void OLED_WR_Byte(u8 dat,u8 cmd)
{    
    u8 i;              
    if(cmd)
        OLED_DC_Set();
    else 
        OLED_DC_Clr();          
    OLED_CS_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_CS_Set();
    OLED_DC_Set();         
} 
//设置显示位置
void OLED_Set_Pos(unsigned char x, unsigned char y) 
{ 
    OLED_WR_Byte(0xb0+y,OLED_CMD);
    OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
    OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD); 
}         
//开启OLED显示    
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
}
//关闭OLED显示     
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++)  
    {  
        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(0,OLED_DATA); 
    } //更新显示
}


//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//SIZE为16时以8*16大小显示,否则以6*8显示,在oled.h中修改SIZE                 
void OLED_ShowChar(u8 x,u8 y,u8 chr)
{          
    unsigned char c=0,i=0;    
        c=chr-' ';//得到偏移后的值            
        if(x>Max_Column-1){x=0;y=y+2;}
        if(SIZE ==16)
            {
            OLED_Set_Pos(x,y);    
            for(i=0;i<8;i++)
            OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
            OLED_Set_Pos(x,y+1);
            for(i=0;i<8;i++)
            OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
            }
            else {    
                OLED_Set_Pos(x,y+1);
                for(i=0;i<6;i++)
                OLED_WR_Byte(F6x8[c][i],OLED_DATA);    
            }
}

//显示一个字符串
void OLED_ShowString(u8 x,u8 y,u8 *chr)
{
    unsigned char j=0;
    while (chr[j]!='\0')
    {        
        OLED_ShowChar(x,y,chr[j]);
        x+=8;
        if(x>120)
        {
            x=0;
            y+=2;
        }
        j++;
    }
}

//初始化SSD1306                        
void OLED_Init(void)
{
    OLED_RST_Set();
    delay_ms(100);
    OLED_RST_Clr();
    delay_ms(100);
    OLED_RST_Set(); 
    OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
    OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
    OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
    OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
    OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
    OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness
    OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
    OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
    OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
    OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
    OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
    OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset    Shift Mapping RAM Counter (0x00~0x3F)
    OLED_WR_Byte(0x00,OLED_CMD);//-not offset
    OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
    OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
    OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
    OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
    OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
    OLED_WR_Byte(0x12,OLED_CMD);
    OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
    OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
    OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
    OLED_WR_Byte(0x02,OLED_CMD);//
    OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
    OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
    OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
    OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7) 
    OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
    OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/ 
    OLED_Clear();
    OLED_Set_Pos(0,0);     
}  

(4)oled.h

#include "REG51.h"
#ifndef __OLED_H
#define __OLED_H                         
#define  u8 unsigned char 
#define  u32 unsigned int 
#define OLED_CMD  0    //写命令
#define OLED_DATA 1    //写数据

sbit OLED_CS=P1^4; //片选
sbit OLED_RST =P1^2;//复位
sbit OLED_DC =P1^3;//数据/命令控制
sbit OLED_SCL=P1^0;//时钟 D0(SCLK)
sbit OLED_SDIN=P1^1;//D1(MOSI) 数据
sbit SWITCH=P1^5;//激光测距开关

#define OLED_CS_Clr()  OLED_CS=0
#define OLED_CS_Set()  OLED_CS=1

#define OLED_RST_Clr() OLED_RST=0
#define OLED_RST_Set() OLED_RST=1

#define OLED_DC_Clr() OLED_DC=0
#define OLED_DC_Set() OLED_DC=1

#define OLED_SCLK_Clr() OLED_SCL=0
#define OLED_SCLK_Set() OLED_SCL=1

#define OLED_SDIN_Clr() OLED_SDIN=0
#define OLED_SDIN_Set() OLED_SDIN=1;

#define SIZE        16
#define XLevelL        0x02
#define XLevelH        0x10
#define Max_Column    128
#define Max_Row        64
#define    Brightness    0xFF 
#define X_WIDTH     128
#define Y_WIDTH     64                                  

void delay_ms(unsigned int ms);
//OLED控制用函数
void OLED_WR_Byte(u8 dat,u8 cmd);        
void OLED_Display_On(void);
void OLED_Display_Off(void);                                                  
void OLED_Init(void);
void OLED_Clear(void);
void OLED_DrawPoint(u8 x,u8 y,u8 t);
void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);
void OLED_ShowChar(u8 x,u8 y,u8 chr);
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2);
void OLED_ShowString(u8 x,u8 y, u8 *p);     
void OLED_Set_Pos(unsigned char x, unsigned char y);

#endif

3,显示结果如下,: 5.990m是测试的距离,0432之类的是测试的质量,可以观察到乱码了,这是因为激光测距模块发送给单片机的是一个16字节的字符串信息,51单片机的SBUF每次只能缓存一个字节(个人理解),经过多次测试,测量数据都能清楚的读到,后面质量信息存在乱码,基本不影响激光测距的功能,之后会考虑加上电池和充电口,把模块集中起来,做出像一个小手电的样子。

4,再补充一个用串口工具读出的数据吧。

 

 

标签:51,0x08,激光测距,0x20,0x00,0x40,单片机,OLED,0x80
来源: https://www.cnblogs.com/128d256/p/16364513.html