ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-06-10 19:38:55  阅读:235  来源: 互联网

标签:51 0x08 激光测距 0x20 0x00 0x40 单片机 OLED 0x80


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有