• STM32用超声波测距模块实现测距


    STM32用超声波测距模块实现测距

    通过超声波测距模块可以实现超声波反射型距离测试。市面上的超声波测距模块主要有两种。一种是分体式模块(HC-SR04等),由超生波发射头和接收头组成,一种是一体式模块(RCWL-1605等):
    在这里插入图片描述
    需要注意一体式模块的盲区(不能测试的近距离范围)更大些。分体式模块的盲区大约2cm,而一体式模块的盲区达到25cm。最大测试距离达到450cm,增强的模块能达到更远的测试距离。一些模块可以支持1线的控制方式, UART的控制方式或I2C的控制方式。而典型的控制方式是2线连接方式,其中1线发送测试启动波形,另外一线接收测试结果波形。

    超声波测距模块的测距原理

    超声波测距模块通过发送和接收特定的脉冲信号,测量信号从发送到接收回的时间,然后通过超声波在空气中的传播速度,来计算目标的距离。其2线连接方式时序如下所示:
    在这里插入图片描述

    超声波模块支持宽供电范围,可以通过3.3V或者5V进行供电,MCU发出大于10us的高电平Trig信号,并接收Echo回响信号,通过测量回响信号的高电平时长得到目标距离2倍对应的超声波传输时间。MCU再通过计算得到米或者毫米单位的距离。
    超声波在空气里的传播速度受温度影响,一般以常温20摄氏度作为参考进行计算:在这里插入图片描述
    超声波模块支持的测距间隔为50ms(厂家可定制修改),两次测试启动的间隔应大于50ms。另外在没有检测到有效超声波信号时,超声波测距模块也会给Echo管脚输出一个假信号,以使得MCU端的等待过程不会被挂死,如目标在盲区内移动,检测结果也是假结果且变化很小。

    MCU与超声波模块的测距交互

    典型的MCU与超声波模块的测距交互为:

    1. MCU启动微秒计时计数器TIM,采用向上计数
    2. MCU发送测距启动信号Trig(>10us)
    3. MCU检测Echo信号上升沿到来,将计数器值设置为0
    4. MCU检测Echo信号下降沿到来,读取计数值当前值
    5. 选择对应温度的超声波传输速度,计算距离

    STM32超声波测距实例

    这里以STM32G030J6M6搭配0.96寸OLED实现对超声波模块的控制和结果显示。采用STM32CUBEIDE开发平台. 硬件的连接关系如下:
    在这里插入图片描述

    STM32工程配置

    首先建立基本工程并配置时钟:
    在这里插入图片描述
    在这里插入图片描述
    配置PA15, PB7为模拟I2C的Open-Drain输出管脚,用于连接OLED。并将PA12配置为Push-Pull输出作为Trig信号连接管脚,将PA11配置为输入管脚接收Echo信号:
    在这里插入图片描述
    配置TIM1为us计数器,周期为最大值,不采用中断方式,不采用DMA方式,只是单纯的向上计数:
    在这里插入图片描述
    在这里插入图片描述
    保存并产生初始工程代码:
    在这里插入图片描述

    STM32代码实现

    代码中需要用到微秒延时函数,采用 STM32 HAL us delay(微秒延时)的指令延时实现方式及优化 中的微秒延时函数。
    对于OLED的显示控制,采用 STM32 HAL 驱动I2C总线0.91寸OLED模块(基于SSD1306显示驱动芯片) 的驱动代码
    由于STM32G030J6M6的FLASH只有32K,需要采用空间节省的编译方式,参见 STM32 region `FLASH‘ overflowed by xxx bytes 问题解决
    在进行浮点转字符时为节省代码空间,不采用标准库,采用自定义浮点转字符函数,参见 STM32 UART串口printf函数应用及浮点打印代码空间节省 (HAL)

    主要的测距逻辑如下代码所示:

            //Sending trigger signal
    	    TX_H;
    	    PY_Delay_us_t(12-GPIO_EXEC_DELAY_us);
    	    TX_L;
    
            while(RX_IN==0); //Waiting for rising edge
            __HAL_TIM_SetCounter(&htim1, 0);//Set us counter to 0
            while(RX_IN!=0); //Waiting for fall edge
            counter = __HAL_TIM_GetCounter(&htim1);//Get transmission delay in us
    
            OLED_Clear();
            OLED_ShowString(0, 0, "Distance:", 12);
            sprintf(mychar, "%d us", counter);
            OLED_ShowString(0, 1, mychar, 12);
    
    	    fd = counter*342.62/2000; //20 degree Celsius sound speed
    	    py_f2s4printf(fchar, fd, 3);
    	    sprintf(mychar, "%s mm", fchar);
    		OLED_ShowString(0, 2, mychar, 12);
    

    完整的main.h代码如下:

    /* USER CODE BEGIN Header */
    /**
      ******************************************************************************
      * @file           : main.h
      * @brief          : Header for main.c file.
      *                   This file contains the common defines of the application.
      ******************************************************************************
      * @attention
      *
      * Copyright (c) 2022 STMicroelectronics.
      * All rights reserved.
      *
      * This software is licensed under terms that can be found in the LICENSE file
      * in the root directory of this software component.
      * If no LICENSE file comes with this software, it is provided AS-IS.
      *
      ******************************************************************************
      *Written by Pegasus Yu in 2022
      */
    /* USER CODE END Header */
    
    /* Define to prevent recursive inclusion -------------------------------------*/
    #ifndef __MAIN_H
    #define __MAIN_H
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    /* Includes ------------------------------------------------------------------*/
    #include "stm32g0xx_hal.h"
    
    /* Private includes ----------------------------------------------------------*/
    /* USER CODE BEGIN Includes */
    
    /* USER CODE END Includes */
    
    /* Exported types ------------------------------------------------------------*/
    /* USER CODE BEGIN ET */
    
    /* USER CODE END ET */
    
    /* Exported constants --------------------------------------------------------*/
    /* USER CODE BEGIN EC */
    
    /* USER CODE END EC */
    
    /* Exported macro ------------------------------------------------------------*/
    /* USER CODE BEGIN EM */
    
    /* USER CODE END EM */
    
    /* Exported functions prototypes ---------------------------------------------*/
    void Error_Handler(void);
    
    /* USER CODE BEGIN EFP */
    
    /* USER CODE END EFP */
    
    /* Private defines -----------------------------------------------------------*/
    #define Echo_Pin GPIO_PIN_11
    #define Echo_GPIO_Port GPIOA
    #define Trig_Pin GPIO_PIN_12
    #define Trig_GPIO_Port GPIOA
    /* USER CODE BEGIN Private defines */
    
    /* USER CODE END Private defines */
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif /* __MAIN_H */
    
    

    完整的main.c代码如下:

    /* USER CODE BEGIN Header */
    /**
      ******************************************************************************
      * @file           : main.c
      * @brief          : Main program body
      ******************************************************************************
      * @attention
      *
      * Copyright (c) 2022 STMicroelectronics.
      * All rights reserved.
      *
      * This software is licensed under terms that can be found in the LICENSE file
      * in the root directory of this software component.
      * If no LICENSE file comes with this software, it is provided AS-IS.
      *
      ******************************************************************************
      */
    /* USER CODE END Header */
    /* Includes ------------------------------------------------------------------*/
    #include "main.h"
    
    /* Private includes ----------------------------------------------------------*/
    /* USER CODE BEGIN Includes */
    #include "oledfont.h"
    #include "oled_drive.h"
    
    #include 
    #include 
    /* USER CODE END Includes */
    
    /* Private typedef -----------------------------------------------------------*/
    /* USER CODE BEGIN PTD */
    #define us_num 10
    
    #define TX_L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET)
    #define TX_H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET)
    #define RX_IN HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11)
    
    /* USER CODE END PTD */
    
    /* Private define ------------------------------------------------------------*/
    /* USER CODE BEGIN PD */
    uint32_t counter = 0;
    #define GPIO_EXEC_DELAY_us 8
    
    __IO float usDelayBase;
    void PY_usDelayTest(void)
    {
      __IO uint32_t firstms, secondms;
      __IO uint32_t counter = 0;
    
      firstms = HAL_GetTick()+1;
      secondms = firstms+1;
    
      while(uwTick!=firstms) ;
    
      while(uwTick!=secondms) counter++;
    
      usDelayBase = ((float)counter)/1000;
    }
    
    void PY_Delay_us_t(uint32_t Delay)
    {
      __IO uint32_t delayReg;
      __IO uint32_t usNum = (uint32_t)(Delay*usDelayBase);
    
      delayReg = 0;
      while(delayReg!=usNum) delayReg++;
    }
    
    void PY_usDelayOptimize(void)
    {
      __IO uint32_t firstms, secondms;
      __IO float coe = 1.0;
    
      firstms = HAL_GetTick();
      PY_Delay_us_t(1000000) ;
      secondms = HAL_GetTick();
    
      coe = ((float)1000)/(secondms-firstms);
      usDelayBase = coe*usDelayBase;
    }
    
    void PY_Delay_us(uint32_t Delay)
    {
      __IO uint32_t delayReg;
    
      __IO uint32_t msNum = Delay/1000;
      __IO uint32_t usNum = (uint32_t)((Delay%1000)*usDelayBase);
    
      if(msNum>0) HAL_Delay(msNum);
    
      delayReg = 0;
      while(delayReg!=usNum) delayReg++;
    }
    /* USER CODE END PD */
    
    /* Private macro -------------------------------------------------------------*/
    /* USER CODE BEGIN PM */
    /*
    *Convert float to string type
    *Written by Pegasus Yu in 2022
    *stra: string address as mychar from char mychar[];
    *float: float input like 12.345
    *flen: fraction length as 3 for 12.345
    */
    #include 
    #include 
    #include 
    #include 
    void py_f2s4printf(char * stra, float x, uint8_t flen)
    {
    	uint32_t base;
    	int64_t dn;
    	char mc[32];
    
    	base = pow(10,flen);
    	dn = x*base;
    	sprintf(stra, "%d.", (int)(dn/base));
    	dn = abs(dn);
    	if(dn%base==0)
    	{
    		for(uint8_t j=1;j<=flen;j++)
    		{
    			stra = strcat(stra, "0");
    		}
    		return;
    	}
    	else
    	{
    		if(flen==1){
    			sprintf(mc, "%d", (int)(dn%base));
    			stra = strcat(stra, mc);
    			return;
    		}
    
    		for(uint8_t j=1;j<flen;j++)
    		{
    			if((dn%base)<pow(10,j))
    			{
    				for(uint8_t k=1;k<=(flen-j);k++)
    				{
    					stra = strcat(stra, "0");
    				}
    				sprintf(mc, "%d", (int)(dn%base));
    				stra = strcat(stra, mc);
    				return;
    			}
    		}
    		sprintf(mc, "%d", (int)(dn%base));
    		stra = strcat(stra, mc);
    		return;
    	}
    }
    
    /* USER CODE END PM */
    
    /* Private variables ---------------------------------------------------------*/
    TIM_HandleTypeDef htim1;
    
    /* USER CODE BEGIN PV */
    
    /* USER CODE END PV */
    
    /* Private function prototypes -----------------------------------------------*/
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    static void MX_TIM1_Init(void);
    /* USER CODE BEGIN PFP */
    
    /* USER CODE END PFP */
    
    /* Private user code ---------------------------------------------------------*/
    /* USER CODE BEGIN 0 */
    char mychar[256];
    /* USER CODE END 0 */
    
    /**
      * @brief  The application entry point.
      * @retval int
      */
    int main(void)
    {
      /* USER CODE BEGIN 1 */
      float fd= 0.0;
    
      char fchar[32];
      /* USER CODE END 1 */
    
      /* MCU Configuration--------------------------------------------------------*/
    
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
    
      /* USER CODE BEGIN Init */
    
      /* USER CODE END Init */
    
      /* Configure the system clock */
      SystemClock_Config();
    
      /* USER CODE BEGIN SysInit */
    
      /* USER CODE END SysInit */
    
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_TIM1_Init();
      /* USER CODE BEGIN 2 */
      PY_usDelayTest();
      PY_usDelayOptimize();
    
      TX_L;
    
      OLED_Init();
    
      OLED_Clear();
      OLED_ShowString(0,0,"Ultrosound",12);
      OLED_ShowString(0,1,"Distance",12);
      OLED_ShowString(0,2,"Test",12);
      OLED_ShowString(0,3,"Module",12);
    
      HAL_TIM_Base_Start(&htim1);
    
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
            //Sending trigger signal
    	    TX_H;
    	    PY_Delay_us_t(12-GPIO_EXEC_DELAY_us);
    	    TX_L;
    
            while(RX_IN==0); //Waiting for rising edge
            __HAL_TIM_SetCounter(&htim1, 0);//Set us counter to 0
            while(RX_IN!=0); //Waiting for fall edge
            counter = __HAL_TIM_GetCounter(&htim1);//Get transmission delay in us
    
            OLED_Clear();
            OLED_ShowString(0, 0, "Distance:", 12);
            sprintf(mychar, "%d us", counter);
            OLED_ShowString(0, 1, mychar, 12);
    
    	    fd = counter*342.62/2000; //20 degree Celsius sound speed
    	    py_f2s4printf(fchar, fd, 3);
    	    sprintf(mychar, "%s mm", fchar);
    		OLED_ShowString(0, 2, mychar, 12);
    
    	    PY_Delay_us_t(500000);
    
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
      }
      /* USER CODE END 3 */
    }
    
    /**
      * @brief System Clock Configuration
      * @retval None
      */
    void SystemClock_Config(void)
    {
      RCC_OscInitTypeDef RCC_OscInitStruct = {0};
      RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    
      /** Configure the main internal regulator output voltage
      */
      HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
    
      /** Initializes the RCC Oscillators according to the specified parameters
      * in the RCC_OscInitTypeDef structure.
      */
      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
      RCC_OscInitStruct.HSIState = RCC_HSI_ON;
      RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
      RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
      RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
      RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
      RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1;
      RCC_OscInitStruct.PLL.PLLN = 8;
      RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
      RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
      if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
      {
        Error_Handler();
      }
    
      /** Initializes the CPU, AHB and APB buses clocks
      */
      RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                  |RCC_CLOCKTYPE_PCLK1;
      RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
      RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
      RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
    
      if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
      {
        Error_Handler();
      }
    }
    
    /**
      * @brief TIM1 Initialization Function
      * @param None
      * @retval None
      */
    static void MX_TIM1_Init(void)
    {
    
      /* USER CODE BEGIN TIM1_Init 0 */
    
      /* USER CODE END TIM1_Init 0 */
    
      TIM_ClockConfigTypeDef sClockSourceConfig = {0};
      TIM_MasterConfigTypeDef sMasterConfig = {0};
    
      /* USER CODE BEGIN TIM1_Init 1 */
    
      /* USER CODE END TIM1_Init 1 */
      htim1.Instance = TIM1;
      htim1.Init.Prescaler = 63;
      htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
      htim1.Init.Period = 65535;
      htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
      htim1.Init.RepetitionCounter = 0;
      htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
      if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
      {
        Error_Handler();
      }
      sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
      if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
      {
        Error_Handler();
      }
      sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
      sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
      sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
      if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
      {
        Error_Handler();
      }
      /* USER CODE BEGIN TIM1_Init 2 */
    
      /* USER CODE END TIM1_Init 2 */
    
    }
    
    /**
      * @brief GPIO Initialization Function
      * @param None
      * @retval None
      */
    static void MX_GPIO_Init(void)
    {
      GPIO_InitTypeDef GPIO_InitStruct = {0};
    
      /* GPIO Ports Clock Enable */
      __HAL_RCC_GPIOB_CLK_ENABLE();
      __HAL_RCC_GPIOA_CLK_ENABLE();
    
      /*Configure GPIO pin Output Level */
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
    
      /*Configure GPIO pin Output Level */
      HAL_GPIO_WritePin(Trig_GPIO_Port, Trig_Pin, GPIO_PIN_RESET);
    
      /*Configure GPIO pin Output Level */
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
    
      /*Configure GPIO pin : PB7 */
      GPIO_InitStruct.Pin = GPIO_PIN_7;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
      GPIO_InitStruct.Pull = GPIO_PULLUP;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
      HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    
      /*Configure GPIO pin : Echo_Pin */
      GPIO_InitStruct.Pin = Echo_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
      GPIO_InitStruct.Pull = GPIO_PULLDOWN;
      HAL_GPIO_Init(Echo_GPIO_Port, &GPIO_InitStruct);
    
      /*Configure GPIO pin : Trig_Pin */
      GPIO_InitStruct.Pin = Trig_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
      HAL_GPIO_Init(Trig_GPIO_Port, &GPIO_InitStruct);
    
      /*Configure GPIO pin : PA15 */
      GPIO_InitStruct.Pin = GPIO_PIN_15;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
      GPIO_InitStruct.Pull = GPIO_PULLUP;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    }
    
    /* USER CODE BEGIN 4 */
    //OLED ACCESS
    void OLED_SCLK_Clr(void)
    {
    	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
    
    }
    void OLED_SCLK_Set(void)
    {
    	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
    }
    void OLED_SDIN_Clr(void)
    {
    	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
    }
    void OLED_SDIN_Set(void)
    {
    	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
    }
    uint8_t OLED_SDIN_Read(void)
    {
    	return HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7);
    }
    //IIC Start
    void IIC_Start()
    {
    	PY_Delay_us_t(us_num) ;
    	OLED_SCLK_Set() ;
    	OLED_SDIN_Set();
    	PY_Delay_us_t(us_num) ;
    	OLED_SDIN_Clr();
    	PY_Delay_us_t(us_num) ;
    }
    
    //IIC Stop
    void IIC_Stop()
    {
         OLED_SCLK_Set() ;
         PY_Delay_us_t(us_num) ;
    	 OLED_SDIN_Clr();
    	 PY_Delay_us_t(us_num) ;
    	 OLED_SCLK_Set() ;
    	 PY_Delay_us_t(us_num) ;
    	 OLED_SDIN_Set();
    	 PY_Delay_us_t(us_num) ;
    }
    
    uint8_t IIC_Wait_Ack()
    {
    	uint8_t status=0;
    
    	OLED_SDIN_Set();
    	PY_Delay_us_t(us_num) ;
    	status = OLED_SDIN_Read();
    	OLED_SCLK_Set() ;
    	PY_Delay_us_t(us_num) ;
    	OLED_SCLK_Clr();
    	return status;
    }
    
    // IIC Write byte
    void Write_IIC_Byte(unsigned char IIC_Byte)
    {
    	unsigned char i;
    	unsigned char m,da;
    	da=IIC_Byte;
    	OLED_SCLK_Clr();
    	for(i=0;i<8;i++)
    	{
    		m=da;
    		m=m&0x80;
    		if(m==0x80)
    		{OLED_SDIN_Set();}
    		else OLED_SDIN_Clr();
    		da=da<<1;
    		PY_Delay_us_t(us_num) ;
    		OLED_SCLK_Set();
    		PY_Delay_us_t(us_num) ;
    		OLED_SCLK_Clr();
    	}
    
    
    }
    // IIC Write Command
    void Write_IIC_Command(unsigned char IIC_Command)
    {
       IIC_Start();
       Write_IIC_Byte(0x78);            //Slave address,SA0=0
       IIC_Wait_Ack();
       Write_IIC_Byte(0x00);			//write command
       IIC_Wait_Ack();
       Write_IIC_Byte(IIC_Command);
       IIC_Wait_Ack();
       IIC_Stop();
    }
    // IIC Write Data
    void Write_IIC_Data(unsigned char IIC_Data)
    {
       IIC_Start();
       Write_IIC_Byte(0x78);			//D/C#=0; R/W#=0
       IIC_Wait_Ack();
       Write_IIC_Byte(0x40);			//write data
       IIC_Wait_Ack();
       Write_IIC_Byte(IIC_Data);
       IIC_Wait_Ack();
       IIC_Stop();
    }
    void OLED_WR_Byte(unsigned dat,unsigned cmd)
    {
    	if(cmd)
          {
            Write_IIC_Data(dat);
    	  }
    	else
    	  {
            Write_IIC_Command(dat);
          }
    }
    
    // fill_Picture
    void fill_picture(unsigned char fill_Data)
    {
    	unsigned char m,n;
    	for(m=0;m<8;m++)
    	{
    		OLED_WR_Byte(0xb0+m,0);		//page0-page1
    		OLED_WR_Byte(0x00,0);		//low column start address
    		OLED_WR_Byte(0x10,0);		//high column start address
    		for(n=0;n<128;n++)
    			{
    				OLED_WR_Byte(fill_Data,1);
    			}
    	}
    }
    
    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),OLED_CMD);
    }
    
    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)
    {
    	uint8_t i,n;
    	for(i=0;i<8;i++)
    	{
    		OLED_WR_Byte(0xb0+i,OLED_CMD);
    		OLED_WR_Byte(0x00,OLED_CMD);
    		OLED_WR_Byte(0x10,OLED_CMD);
    		for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
    	}
    }
    void OLED_On(void)
    {
    	uint8_t i,n;
    	for(i=0;i<8;i++)
    	{
    		OLED_WR_Byte (0xb0+i,OLED_CMD);
    		OLED_WR_Byte (0x00,OLED_CMD);
    		OLED_WR_Byte (0x10,OLED_CMD);
    		for(n=0;n<128;n++)OLED_WR_Byte(1,OLED_DATA);
    	}
    }
    
    void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size)
    {
    	unsigned char c=0,i=0;
    		c=chr-' ';
    		if(x>Max_Column-1){x=0;y=y+2;}
    		if(Char_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);
    				for(i=0;i<6;i++)
    				OLED_WR_Byte(F6x8[c][i],OLED_DATA);
    
    			}
    }
    
    uint32_t oled_pow(uint8_t m,uint8_t n)
    {
    	uint32_t result=1;
    	while(n--)result*=m;
    	return result;
    }
    
    void OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size2)
    {
    	uint8_t t,temp;
    	uint8_t 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+(size2/2)*t,y,' ',size2);
    				continue;
    			}else enshow=1;
    
    		}
    	 	OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);
    	}
    }
    
    void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size)
    {
    	unsigned char j=0;
    	while (chr[j]!='\0')
    	{		OLED_ShowChar(x,y,chr[j],Char_Size);
    			x+=8;
    		if(x>120){x=0;y+=2;}
    			j++;
    	}
    }
    
    void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no)
    {
    	uint8_t t,adder=0;
    	OLED_Set_Pos(x,y);
        for(t=0;t<16;t++)
    		{
    				OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
    				adder+=1;
         }
    		OLED_Set_Pos(x,y+1);
        for(t=0;t<16;t++)
    			{
    				OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
    				adder+=1;
          }
    }
    
    void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
    {
     unsigned int j=0;
     unsigned char x,y;
    
      if(y1%8==0) y=y1/8;
      else y=y1/8+1;
    	for(y=y0;y<y1;y++)
    	{
    		OLED_Set_Pos(x0,y);
        for(x=x0;x<x1;x++)
    	    {
    	    	OLED_WR_Byte(BMP[j++],OLED_DATA);
    	    }
    	}
    }
    
    void OLED_Init(void)
    {
    
        HAL_Delay(200);
        OLED_WR_Byte(0xAE,OLED_CMD);
    
    	OLED_WR_Byte(0x40,OLED_CMD);//---set low column address
    	OLED_WR_Byte(0xB0,OLED_CMD);//---set high column address
    
    	OLED_WR_Byte(0xC8,OLED_CMD);//-not offset
    
    	OLED_WR_Byte(0x81,OLED_CMD);
    	OLED_WR_Byte(0xff,OLED_CMD);
    
    	OLED_WR_Byte(0xa1,OLED_CMD);
    
    	OLED_WR_Byte(0xa6,OLED_CMD);
    
    	OLED_WR_Byte(0xa8,OLED_CMD);
    	OLED_WR_Byte(0x1f,OLED_CMD);
    
    	OLED_WR_Byte(0xd3,OLED_CMD);
    	OLED_WR_Byte(0x00,OLED_CMD);
    
    	OLED_WR_Byte(0xd5,OLED_CMD);
    	OLED_WR_Byte(0xf0,OLED_CMD);
    
    	OLED_WR_Byte(0xd9,OLED_CMD);
    	OLED_WR_Byte(0x22,OLED_CMD);
    
    	OLED_WR_Byte(0xda,OLED_CMD);
    	OLED_WR_Byte(0x02,OLED_CMD);
    
    	OLED_WR_Byte(0xdb,OLED_CMD);
    	OLED_WR_Byte(0x49,OLED_CMD);
    
    	OLED_WR_Byte(0x8d,OLED_CMD);
    	OLED_WR_Byte(0x14,OLED_CMD);
    
    	OLED_WR_Byte(0xaf,OLED_CMD);
    	OLED_Clear();
    }
    
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
      if(htim==&htim1)
      {
    	  counter++;
    
      }
    
    }
    /* USER CODE END 4 */
    
    /**
      * @brief  This function is executed in case of error occurrence.
      * @retval None
      */
    void Error_Handler(void)
    {
      /* USER CODE BEGIN Error_Handler_Debug */
      /* User can add his own implementation to report the HAL error return state */
      __disable_irq();
      while (1)
      {
      }
      /* USER CODE END Error_Handler_Debug */
    }
    
    #ifdef  USE_FULL_ASSERT
    /**
      * @brief  Reports the name of the source file and the source line number
      *         where the assert_param error has occurred.
      * @param  file: pointer to the source file name
      * @param  line: assert_param error line source number
      * @retval None
      */
    void assert_failed(uint8_t *file, uint32_t line)
    {
      /* USER CODE BEGIN 6 */
      /* User can add his own implementation to report the file name and line number,
         ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
      /* USER CODE END 6 */
    }
    #endif /* USE_FULL_ASSERT */
    
    

    工程里用到的OLED驱动头文件:
    oled_drive.h

    #ifndef __OLED_DRIVE_H
    #define __OLED_DRIVE_H 
    
    #define OLED_MODE 0
    #define SIZE 8
    #define XLevelL		0x00
    #define XLevelH		0x10
    #define Max_Column	128
    #define Max_Row		64
    #define	Brightness	0xFF
    #define X_WIDTH 	128
    #define Y_WIDTH 	64
    
    //SCL
    void OLED_SCLK_Clr(void);
    void OLED_SCLK_Set(void);
    
    //SDA
    void OLED_SDIN_Clr(void);
    void OLED_SDIN_Set(void);
    uint8_t OLED_SDIN_Read(void);
    
    #define OLED_CMD  0
    #define OLED_DATA 1
    
    void OLED_WR_Byte(unsigned dat,unsigned cmd);
    void OLED_Display_On(void);
    void OLED_Display_Off(void);
    void OLED_Init(void);
    void OLED_Clear(void);
    void OLED_DrawPoint(uint8_t x,uint8_t y,uint8_t t);
    void OLED_Fill(uint8_t x1,uint8_t y1,uint8_t x2,uint8_t y2,uint8_t dot);
    void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size);
    void OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size);
    void OLED_ShowString(uint8_t x,uint8_t y, uint8_t *p,uint8_t Char_Size);
    void OLED_Set_Pos(unsigned char x, unsigned char y);
    void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no);
    void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);
    void fill_picture(unsigned char fill_Data);
    void Picture();
    void IIC_Start();
    void IIC_Stop();
    void Write_IIC_Command(unsigned char IIC_Command);
    void Write_IIC_Data(unsigned char IIC_Data);
    void Write_IIC_Byte(unsigned char IIC_Byte);
    
    uint8_t IIC_Wait_Ack();
    
    
    #endif
    
    

    oledfont.h

    #ifndef __OLEDFONT_H
    #define __OLEDFONT_H 	   
    //常用ASCII表
    //偏移量32
    //ASCII字符集
    //偏移量32
    //大小:12*6
    /************************************6*8的点阵************************************/
    const unsigned char 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 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
    };
    
    char Hzk[][32]={
    
    {0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00},
    {0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x0F,0x00,0x00,0x00},/*"中",0*/
    
    {0x40,0x40,0x40,0x5F,0x55,0x55,0x55,0x75,0x55,0x55,0x55,0x5F,0x40,0x40,0x40,0x00},
    {0x00,0x40,0x20,0x0F,0x09,0x49,0x89,0x79,0x09,0x09,0x09,0x0F,0x20,0x40,0x00,0x00},/*"景",1*/
    
    {0x00,0xFE,0x02,0x42,0x4A,0xCA,0x4A,0x4A,0xCA,0x4A,0x4A,0x42,0x02,0xFE,0x00,0x00},
    {0x00,0xFF,0x40,0x50,0x4C,0x43,0x40,0x40,0x4F,0x50,0x50,0x5C,0x40,0xFF,0x00,0x00},/*"园",2*/
    
    {0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00},
    {0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00},/*"电",3*/
    
    {0x80,0x82,0x82,0x82,0x82,0x82,0x82,0xE2,0xA2,0x92,0x8A,0x86,0x82,0x80,0x80,0x00},
    {0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"子",4*/
    
    {0x24,0x24,0xA4,0xFE,0xA3,0x22,0x00,0x22,0xCC,0x00,0x00,0xFF,0x00,0x00,0x00,0x00},
    {0x08,0x06,0x01,0xFF,0x00,0x01,0x04,0x04,0x04,0x04,0x04,0xFF,0x02,0x02,0x02,0x00},/*"科",5*/
    
    {0x10,0x10,0x10,0xFF,0x10,0x90,0x08,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x08,0x00},
    {0x04,0x44,0x82,0x7F,0x01,0x80,0x80,0x40,0x43,0x2C,0x10,0x28,0x46,0x81,0x80,0x00},/*"?",0*/
    
    {0x40,0x40,0x48,0x48,0x48,0xC8,0x78,0x4F,0x48,0x48,0x48,0x48,0x48,0x40,0x40,0x00},
    {0x00,0x00,0x00,0x00,0x03,0x12,0x12,0x22,0x22,0x52,0x8A,0x06,0x00,0x00,0x00,0x00},/*"专",0*/
    
    {0x00,0x10,0x60,0x80,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0xC0,0x30,0x00,0x00},
    {0x40,0x40,0x40,0x43,0x40,0x7F,0x40,0x40,0x40,0x7F,0x42,0x41,0x40,0x40,0x40,0x00},/*"业",1*/
    
    {0x10,0x10,0x10,0xFF,0x10,0x90,0x08,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x08,0x00},
    {0x04,0x44,0x82,0x7F,0x01,0x80,0x80,0x40,0x43,0x2C,0x10,0x28,0x46,0x81,0x80,0x00},/*"技",2*/
    
    {0x00,0x10,0x10,0x10,0x10,0xD0,0x30,0xFF,0x30,0xD0,0x12,0x1C,0x10,0x10,0x00,0x00},
    {0x10,0x08,0x04,0x02,0x01,0x00,0x00,0xFF,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x00},/*"术",3*/
    
    {0x00,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0xFE,0x82,0x82,0x92,0xA2,0x9E,0x00,0x00},
    {0x80,0x60,0x1F,0x02,0x42,0x82,0x7F,0x00,0xFF,0x40,0x2F,0x10,0x2C,0x43,0x80,0x00},/*"服",4*/
    
    {0x00,0x00,0x90,0x88,0x4C,0x57,0xA4,0x24,0x54,0x54,0x8C,0x84,0x00,0x00,0x00,0x00},
    {0x01,0x01,0x80,0x42,0x22,0x1A,0x07,0x02,0x42,0x82,0x42,0x3E,0x01,0x01,0x01,0x00},/*"务",5*/
    
    {0x00,0x04,0xE4,0x24,0x2C,0xB4,0x25,0x26,0x24,0xB4,0x2C,0x24,0xE4,0x04,0x00,0x00},
    {0x00,0x00,0xFF,0x02,0x01,0x1E,0x12,0x12,0x12,0x1E,0x41,0x82,0x7F,0x00,0x00,0x00},/*"商",6*/
    
    };
    
    #endif
    
    

    测试效果展示

    采用HC-SR04分体式模块的测试显示效果:
    在这里插入图片描述

    例程下载

    STM32G030J6M6控制超声波测距模块例程:
    https://download.csdn.net/download/hwytree/86723404

    –End–

  • 相关阅读:
    从SAP ECC升级到SAP S4HANA, 几个Key Points
    栈和队列——有效括号
    asp.net乒乓球场地管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
    k8s快速入门教程-----8 secret and configmap
    电力线载波通信(PLC)简介
    MybatisPlus的Id填充笔记整理
    node.js实现结合 RSA 和 AES 加密算法的消息交换加密传输&深入理解 node 中的 crypto 加密模块
    sudo 权限
    破防了,原来这才是机房运维的正确方法
    初始化安装后 Nacos 动态路由配置不生效
  • 原文地址:https://blog.csdn.net/hwytree/article/details/126873699