jjzjj

STM32使用DHT11传感器读取温湿度,显示在LCD屏上

黑心小红帽 2024-03-20 原文

文章目录

1. 温湿度传感器 DHT11/12

传感器中有一个高性能的8位单片机,会采集并完成数据转换。

1.1 DHT1x应用电路图

1.2 温湿度模块引脚

1.3 连接到STM32上的引脚

1.4 STM32CubeMX属性配置

这里给PA8重新给了名字,叫DHT,代码中也做相应修改。

1.5 调用函数

dht.c放在最后,主函数中需要开启tim6定时器,调用dht_read()函数即可实现温湿度的读取。

传输的数据格式(40位):8bit湿度整数数据 + 8bit湿度小数数据 + 8bit温度证书数据 + 8bit湿度小数数据 + 8bit校验和。
8位校验和 = 8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据 所得结果的末8位。

2. I2C和SPI的工作原理

I2C和SPI都是芯片和芯片之间通信总线,都有时钟线,都是同步的。

2.1 I2C

I2C用2根双向信号线(时钟线SCL,数据线SDA)来传输数据。
半双工的通信方式,同步

1对n的模式,一个主机,n个从机,每一个从机都有一个7位的地址,主机通过地址找到从机。

传输开始:时钟线高电平,数据线由高变低

传输结束:时钟线高电平,数据线由低变高

2.2 SPI

串行外围设备接口,全双工的通信总线,高速,同步。

接口有四根线:

  • 串行时钟线SCK
    
  • 主机输入/从机输出数据线MISO
    
  • 主机输出/从机输入数据线MOSI
    
  • 低电平有效的从机选择线SS ,也叫片选线(有的SPI接口芯片带有中断信号线INT或INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)
    

片选线拉低表示主机选中某个从机。

SPI的工作模式有两种:主模式、从模式,无论那种模式,都支持3Mbit/s的速率

2.3 UART、I2C、SPI比较

UART:3条线(接收数据线RXD,发送数据线TXD,地线GND),串行,半双工,异步
I2C:2条线(时钟线SCL,数据线SDA),半双工,同步
SPI:4条线(串行时钟线SCK,主发从收MOSI,主收从发MISO,片选线SS),全双工,同步

3. 驱动LCD屏

3.1 STM32控制LCD方式

3.2 LCD屏引脚

3.3 连接到STM32上对应的引脚

3.4 STM32CubeMX中设置对应引脚模式

3.5 设置SPI属性

3.6 调用函数

显示在LCD屏上的字符是需要通过文字取模软件转换成16进制的,控制LCD的部分代码在最后。
主函数中需要对LCD屏进行初始化、设置显示区域、清屏。

函数用法举例说明:
lcd_drawcharWen(0, 15, (uint16_t)0x00FF00, (uint16_t)0x000000);
函数作用:在LCD上显示“温”字,温字对应的16进制已经通过取模软件保存在了.c文件的最后,直接调用即可。
参数1:横坐标,从左向右
参数2:纵坐标,从上到下
参数3:前景色
参数4:背景色

附 dht.c代码

#include "gpio.h"
#include <stdio.h>
extern uint8_t data_total[4];

void delay_us(uint16_t wait)
{
	//TIM6的一个时钟周期是1us
	
	//设置TIM6的计数器的值为1
	TIM6->CNT = 0;
	//LL_TIM_SetCounter(TIM6, 0);
	//LL_TIM_GetCounter(TIM6);
	
	//计数1次是1us,计数wait次就是waitus
  //printf("%d\n", TIM6->CNT);
	while(TIM6->CNT < wait);	
  //printf("%d\n", TIM6->CNT);
}

//等待高、低电平结束
//level:高/低电平
//timeout:超时时间(us)
//返回值:等待的时间(us)
uint32_t wait_level(GPIO_PinState level, uint32_t timeout)
{
  uint32_t wait = 0;
  while (HAL_GPIO_ReadPin(DHT_GPIO_Port, DHT_Pin) == level)
  {
    delay_us(1);
    wait++;
    if (wait >= timeout)
    {
      break; //超时退出
    }
  }
  
  return wait;
}

//读取温湿度
void dht_read(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  
  //将数据引脚设置为输出模式
  GPIO_InitStruct.Pin = DHT_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(DHT_GPIO_Port, &GPIO_InitStruct);
  
  //发送起始信号(输出低电平并持续18ms以上)
  HAL_GPIO_WritePin(DHT_GPIO_Port, DHT_Pin, GPIO_PIN_RESET);
  HAL_Delay(19);
  
  //将数据引脚设置为输入模式,电平由外部上拉电阻拉高
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  HAL_GPIO_Init(DHT_GPIO_Port, &GPIO_InitStruct);
  
  //主机发送开始信号结束后,延时等待20-40us后,读取DHT1X的响应信号
  delay_us(40);
  
  //判断DHT传感器是否发出响应信号(低电平)
  if (HAL_GPIO_ReadPin(DHT_GPIO_Port, DHT_Pin) == GPIO_PIN_SET)
  {
    //如果传感器没有响应,打印错误信息并终止读取
    printf("DHT sensor no response\r\n");
    return;
  }
  
  //如果传感器响应,等待响应信号结束
  //等待低电平结束
  wait_level(GPIO_PIN_RESET, 80);
  //等待高电平结束
  wait_level(GPIO_PIN_SET, 100);
  
  //保存收到的40bit数据
  uint8_t data[5];
  
  uint8_t j;
  for (j = 0; j < 5; j++)
  {
    //读取一个字节
    uint8_t i;
    for (i = 0; i < 8; i++)
    {
      //开始接收数据
      //统计低电平持续时间
      uint32_t low_time = wait_level(GPIO_PIN_RESET, 70);
      //统计高电平持续时间
      uint32_t high_time = wait_level(GPIO_PIN_SET, 100);
      if (low_time > high_time)
      {
        //收到bit0
        data[j] &= (~(0x80 >> i)); //将第i个有效位清0
      }
      else
      {
        //收到bit1
        data[j] |= (0x80 >> i); //将第i个有效位置1
      }
    }
  }
  
  //当最后一bit数据传送完毕后,DHT1X拉低总线50us
  wait_level(GPIO_PIN_RESET, 50);
  
  //计算校验和
  //数据传送正确时校验和数据等于
  //“8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据”
  //所得结果的末8位。
  uint8_t chksum = data[0] + data[1] + data[2] + data[3];
  if (chksum != data[4])
  {
    //校验和错误打印出错信息
    printf("checksum error\r\n");
    return;
  }
  
  //打印温湿度信息
  //printf("Humidity: %d.%d, ", data[0], data[1]);
  //printf("Temprature: %d.%d\r\n", data[2], data[3]);
	printf("ht,%d.%d,%d.%d",data[0],data[1],data[2], data[3]);
	data_total[0] = data[0];
	data_total[1]= data[1];
	data_total[2] = data[2];
	data_total[3] = data[3];
}

附 lcd.h和lcd.c代码

//lcd.h
#ifndef LCD_H
#define LCD_H

#include <stdint.h>

extern uint8_t ni1[4][32];
void lcd_init(void);
void lcd_clear(uint16_t color);
uint16_t lcd_color(uint8_t red, uint8_t green, uint8_t blue);
void lcd_drawimage(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint16_t* image);
void lcd_drawtext8x16(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc, uint8_t* font);
void lcd_drawstringlower(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc, char* s);
void lcd_drawname(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc);
void lcd_drawni(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc);
void lcd_drawfu(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc);
void lcd_drawwendu(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc);
void lcd_drawnum(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc, uint8_t num);
void lcd_drawmid(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc);
void lcd_drawtext16x16(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc, uint8_t* font);
void lcd_region(uint8_t xbegin, uint8_t xend, uint8_t ybegin, uint8_t yend);
void lcd_drawtext32x32(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc, uint8_t* font);
void lcd_drawpoint(uint8_t x, uint8_t y, uint16_t color);

void lcd_drawcharWen(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc);
void lcd_drawcharDu(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc);
void lcd_drawcharShi(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc);
void lcd_drawcharKai(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc);
void lcd_drawcharGuan(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc);
void lcd_drawcharDeng(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc);
#endif

//lcd.c
#include "spi.h"
#include "gpio.h"
#include "lcd.h"

#include "string.h"

//发送命令到ST7735S显示控制芯片
void lcd_sendcmd(uint8_t cmd)
{
  //拉低RS引脚,发送的字节作为命令执行
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET);
  //发送一个字节的命令码
  HAL_SPI_Transmit(&hspi1, &cmd, 1, HAL_MAX_DELAY);
}

//发送数据到ST7735S显示控制芯片
void lcd_senddata(uint8_t data)
{
  //拉高RS引脚,发送的字节作为数据
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4,GPIO_PIN_SET);
  //发送一个字节的数据
  HAL_SPI_Transmit(&hspi1, &data, 1, HAL_MAX_DELAY);
}

//LCD初始化
void lcd_init(void)
{
  //发送复位命令
  lcd_sendcmd(0x01);
  //等待复位完成120ms
  HAL_Delay(120);
  //关闭睡眠模式
  lcd_sendcmd(0x11);
  //等待自检完成
  HAL_Delay(120);
  //配置显存访问方式
  lcd_sendcmd(0x36);
  //Row Address Order:1
  //Column Address Order:1
  //Row/Column Exchange:0
  //Vertical Refresh Order: Top to Bottom(0)
  //RGB-BGR ORDER: BGR(1)
  //Horizontal Refresh Order:Left to right(0)
  lcd_senddata(0xc8);
  //设置像素颜色格式
  lcd_sendcmd(0x3a);
  //使用16bit颜色
  lcd_senddata(0x05);
  //显示显存中的内容
  lcd_sendcmd(0x29);
}

//设置显示区域
void lcd_region(uint8_t xbegin, uint8_t xend, uint8_t ybegin, uint8_t yend)
{
  //设置起始列和结束列
  lcd_sendcmd(0x2a);
  //起始列高字节
  lcd_senddata(0);
  //起始列低字节
  lcd_senddata(xbegin + 2);
  //结束列高字节
  lcd_senddata(0);
  //结束列低字节
  lcd_senddata(xend + 2);
  
  //设置起始行和结束行
  lcd_sendcmd(0x2b);
  //起始行高字节
  lcd_senddata(0);
  //起始行低字节
  lcd_senddata(ybegin + 3);
  //结束行高字节
  lcd_senddata(0);
  //结束行低字节
  lcd_senddata(yend + 3);
  
  //写显存
  lcd_sendcmd(0x2c);
}

//发送一个像素的颜色
void lcd_sendpixel(uint16_t color)
{
  //高字节先发送
  lcd_senddata(color >> 8);
  lcd_senddata(color & 0xff);
}

//将RGB888转为RGB565
uint16_t lcd_color(uint8_t red, uint8_t green, uint8_t blue)
{
  return ((red & 0xf8) << 11)|((green & 0xfc) << 5)|((blue & 0xf8) >> 3);
}

//清屏函数
void lcd_clear(uint16_t color)
{
  int i;
  //定位显存写入位置
  lcd_region(0, 127, 0, 127);
  for (i = 0; i < 128 * 128; i++)
  {
    lcd_sendpixel(color);
  }
}



//显示图片
//x: 起始列
//y: 起始行
//w: 图像宽度(像素)
//h: 图像高度(像素)
//image: 保存图像数据的数组
void lcd_drawimage(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint16_t* image)
{
  int i;
  //定位显存写入位置
  lcd_region(x, x + w - 1, y, y + h - 1);
  for (i = 0; i < w * h; i++)
  {
    lcd_sendpixel(image[i]);
  }
}


//取模配置:
//1. 前景色用bit1表示,背景色用bit0表示(阴码)
//2. 低位在前
//显示字符
//x: 起始列
//y: 起始行
//fc: 前景色
//bc: 背景色
//font: 字模数组
void lcd_drawtext8x16(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc, uint8_t* font)
{
  lcd_region(x, x + 8 - 1, y, y + 16 -1);
  
  //填充16行
  uint8_t j;
  for (j = 0; j < 16; j++)
  {
    //填充一行
    uint8_t i;
    for (i = 0; i < 8; i++)
    {
      if ((font[j] & (1 << i)) != 0)
      {
        //填充前景色
        lcd_sendpixel(fc);
      }
      else
      {
        //填充背景色
        lcd_sendpixel(bc);
      }
    }
  }
}

uint8_t lower[][16] = {
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x22,0x30,0x2C,0x22,0x32,0x6C,0x00,0x00},/*"a",0*/
  {0x00,0x00,0x00,0x00,0x03,0x02,0x02,0x1A,0x26,0x42,0x42,0x42,0x26,0x1A,0x00,0x00},/*"b",1*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x02,0x02,0x02,0x44,0x38,0x00,0x00},/*"c",2*/
  {0x00,0x00,0x00,0x00,0x60,0x40,0x40,0x7C,0x42,0x42,0x42,0x42,0x62,0xDC,0x00,0x00},/*"d",3*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x7E,0x02,0x42,0x3C,0x00,0x00},/*"e",4*/
  {0x00,0x00,0x00,0x00,0x30,0x48,0x08,0x3E,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"f",5*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x22,0x22,0x1C,0x02,0x3C,0x42,0x42,0x3C},/*"g",6*/
  {0x00,0x00,0x00,0x00,0x03,0x02,0x02,0x3A,0x46,0x42,0x42,0x42,0x42,0xE7,0x00,0x00},/*"h",7*/
  {0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x0E,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"i",8*/
  {0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x1E},/*"j",9*/
  {0x00,0x00,0x00,0x00,0x03,0x02,0x02,0x72,0x12,0x0A,0x0E,0x12,0x22,0x77,0x00,0x00},/*"k",10*/
  {0x00,0x00,0x00,0x08,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"l",11*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x92,0x92,0x92,0x92,0x92,0xB7,0x00,0x00},/*"m",12*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,0x46,0x42,0x42,0x42,0x42,0xE7,0x00,0x00},/*"n",13*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00},/*"o",14*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1B,0x26,0x42,0x42,0x42,0x26,0x1A,0x02,0x07},/*"p",15*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x64,0x42,0x42,0x42,0x64,0x58,0x40,0xE0},/*"q",16*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x4C,0x04,0x04,0x04,0x04,0x1F,0x00,0x00},/*"r",17*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x42,0x02,0x3C,0x40,0x42,0x3E,0x00,0x00},/*"s",18*/
  {0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x3E,0x08,0x08,0x08,0x08,0x48,0x30,0x00,0x00},/*"t",19*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x42,0x42,0x42,0x42,0x62,0xDC,0x00,0x00},/*"u",20*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x22,0x22,0x14,0x14,0x08,0x08,0x00,0x00},/*"v",21*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDB,0x91,0x52,0x5A,0x2A,0x24,0x24,0x00,0x00},/*"w",22*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x24,0x18,0x18,0x18,0x24,0x76,0x00,0x00},/*"x",23*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x18,0x18,0x08,0x08,0x06},/*"y",24*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x22,0x10,0x08,0x08,0x44,0x7E,0x00,0x00},/*"z",25*/
};


void lcd_drawtextlower(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc, char ch)
{
  if (ch < 'a' || ch > 'z')
  {
    return;
  }
  
  lcd_drawtext8x16(x, y, fc, bc, lower[ch - 'a']);
}

void lcd_drawstringlower(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc, char* s)
{
  //判断字符串是否结束
  while(*s != 0)
  {
    lcd_drawtext8x16(x, y, fc, bc, lower[*s - 'a']);
    s++;    //字符指针加1
    x += 8; //横坐标右移8个像素
  }
}

uint8_t name[][32] = {
  {0x00,0x00,0xFE,0x3F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFC,0x1F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFF,0x7F,0x00,0x00},/*"王",0*/
  {0x08,0x00,0x88,0x1F,0x08,0x08,0x08,0x04,0x3F,0x02,0x08,0x01,0x8C,0x7F,0x1C,0x49,0x2A,0x49,0x2A,0x49,0x89,0x48,0x88,0x44,0x48,0x44,0x28,0x42,0x08,0x29,0x88,0x10}};/*"杨",1*/


    
 uint8_t huo[32] = {0x80,0x00,0x80,0x00,0x80,0x00,0x88,0x10,0x88,0x10,0x88,0x08,0x84,0x04,0x84,0x00,0x42,0x01,0x40,0x01,0x20,0x02,0x20,0x02,0x10,0x04,0x08,0x08,0x04,0x10,0x03,0x60};/*"火",0*/

//显示中文字符
//x: 起始列
//y: 起始行
//fc: 前景色
//bc: 背景色
//font: 字模数组
void lcd_drawtext16x16(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc, uint8_t* font)
{
  lcd_region(x, x + 16 - 1, y, y + 16 -1);

  uint8_t j;
  for (j = 0; j < 16*2; j++)
  {
    uint8_t i;
    for (i = 0; i < 8; i++)
    {
      if ((font[j] & (1 << i)) != 0)
      {
        //填充前景色
        lcd_sendpixel(fc);
      }
      else
      {
        //填充背景色
        lcd_sendpixel(bc);
      }
    }
  }
}


uint8_t ni1[4][32] = 
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x0E,0x06,0x00,0x00,0x06,0x07,0x00,0x00,0x07,0x03,0x00,0x00,0x03,0x03,0x00,0x00,0x83,0x01,0x00},
{0x80,0x81,0x01,0x18,0x80,0xC0,0xFF,0x3F,0xC0,0xC0,0x00,0x18,0xC0,0x61,0x08,0x0C,0xE0,0x21,0x30,0x04,0xB0,0x31,0x10,0x02,0x90,0x11,0x10,0x00,0x88,0x09,0x10,0x00},
{0x88,0x81,0x11,0x00,0x84,0xC1,0x11,0x01,0x80,0xC1,0x10,0x02,0x80,0xC1,0x10,0x04,0x80,0x61,0x10,0x0C,0x80,0x61,0x10,0x18,0x80,0x31,0x10,0x38,0x80,0x11,0x10,0x30},
{0x80,0x09,0x10,0x30,0x80,0x09,0x10,0x30,0x80,0x05,0x10,0x00,0x80,0x01,0x10,0x00,0x80,0x01,0x1F,0x00,0x80,0x01,0x1C,0x00,0x80,0x00,0x08,0x00,0x00,0x00,0x00,0x00}};/*"你",0*/



void lcd_drawtext32x32(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc, uint8_t* font)
{
  lcd_region(x, x + 32 - 1, y, y + 32 -1);

  uint8_t j;
  for (j = 0; j < 32*4; j++)
  {
    uint8_t i;
    for (i = 0; i < 8; i++)
    {
      if ((font[j] & (1 << i)) != 0)
      {
        //填充前景色
        lcd_sendpixel(fc);
      }
      else
      {
        //填充背景色
        lcd_sendpixel(bc);
      }
    }
  }
}


void lcd_drawname(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc)
{
  lcd_drawtext16x16(x, y, fc, bc, name[0]);
  lcd_drawtext16x16(x + 16, y, fc, bc, name[1]);
}

uint8_t ni[] = {0x10,0x01,0x10,0x01,0x10,0x01,0x88,0x7F,0x88,0x40,0x4C,0x20,0x2C,0x04,0x0A,0x04,0x89,0x14,0x88,0x24,0x48,0x24,0x48,0x44,0x28,0x44,0x08,0x04,0x08,0x05,0x08,0x02};/*"你",0*/


uint8_t fu[][32] = {
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00},
  {0x00,0xF0,0x07,0x80,0xFF,0xFF,0x1F,0x00,0x00,0xF8,0x7F,0xC0,0xFF,0xFF,0xFF,0x07,0x00,0xF8,0xFF,0xE3,0xFF,0xFF,0xFF,0x07,0x00,0xF8,0xFF,0xF3,0xFF,0xFF,0xFF,0x07},
  {0x00,0x00,0xFC,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x10,0x0C,0x00,0x00,0x00,0x80,0x00,0xFF,0xFF,0x1F,0x00},
  {0x00,0x38,0xE0,0x03,0xFF,0xFF,0x3F,0x00,0x00,0xFC,0xFF,0x07,0x7F,0x80,0x3F,0x00,0x00,0xFE,0xFF,0x07,0x1F,0x00,0x1F,0x00,0x00,0xFF,0xFF,0x07,0x1E,0x00,0x1E,0x00},
  {0x00,0x0F,0xE0,0x03,0x1E,0x00,0x1F,0x00,0x00,0x00,0xF0,0x03,0xBE,0xFF,0x1F,0x00,0x00,0x00,0xF8,0x01,0xFE,0xFF,0x1F,0x00,0x00,0x00,0xFC,0x01,0xFE,0xFF,0x1F,0x00},
  {0x00,0x00,0xFE,0x01,0x3C,0x80,0x0F,0x00,0x00,0x00,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xC7,0xE1,0x07,0xC0,0x00,0x00,0xE0,0xFF,0xCF,0xFF,0xFF,0xFF,0x01},
  {0x00,0xF8,0xFF,0xDF,0xFF,0xFF,0xFF,0x07,0x00,0xFC,0x7F,0xFE,0x07,0xFF,0xFF,0x07,0x80,0xFF,0x7D,0xC0,0x03,0x3E,0xF0,0x07,0xF0,0xFF,0x7C,0xC0,0x03,0x1E,0xE0,0x07},
  {0xFE,0x3F,0x7C,0xC0,0x03,0x1E,0xE0,0x03,0xFC,0x1F,0x7C,0xC0,0x87,0x3F,0xF0,0x03,0xF8,0x0F,0x7C,0xC0,0xFF,0xFF,0xFF,0x03,0xF0,0x03,0x7C,0xC0,0xFF,0xFF,0xFF,0x03},
  {0x00,0x00,0x7C,0xC0,0x0F,0x3F,0xE0,0x03,0x00,0x00,0x7C,0xC0,0x07,0x1E,0xE0,0x01,0x00,0x00,0xFC,0xC0,0x07,0x1E,0xE0,0x01,0x00,0x00,0xFC,0xC0,0x07,0x1E,0xE0,0x01},
  {0x00,0x00,0xFC,0xC0,0xC7,0xFF,0xFF,0x01,0x00,0x00,0xFC,0xC0,0xFF,0xFF,0xFF,0x01,0x00,0x00,0xFC,0xC0,0xFF,0xFF,0xFF,0x03,0x00,0x00,0xFC,0xC0,0xFF,0xFF,0xFF,0x01},
  {0x00,0x00,0x78,0x80,0x07,0x00,0xFC,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"福",0*/
};

void lcd_draw64x64(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc, uint8_t* font)
{
  lcd_region(x, x + 64 - 1, y, y + 64 -1);

  //注意循环变量取值范围
  uint16_t j;
  for (j = 0; j < 64*8; j++)
  {
    uint8_t i;
    for (i = 0; i < 8; i++)
    {
      if ((font[j] & (1 << i)) != 0)
      {
        //填充前景色
        lcd_sendpixel(fc);
      }
      else
      {
        //填充背景色
        lcd_sendpixel(bc);
      }
    }
  }
}

void lcd_drawfu(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc)
{
  lcd_draw64x64(x, y, fc, bc, (uint8_t*)fu);
}

uint8_t wen[][32] = {
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x10,0x00,0x01,0x60,0xF0,0xFF,0x03,0xC0,0x30,0x00,0x01,0xC0,0x30,0x00,0x01,0x00,0x34,0x00,0x01},
  {0x00,0x32,0x00,0x01,0x00,0xF2,0xFF,0x01,0x00,0x32,0x00,0x01,0x0C,0x32,0x00,0x01,0x18,0x31,0x00,0x01,0x30,0x31,0x00,0x01,0x10,0xF1,0xFF,0x01,0x80,0x30,0x00,0x01},
  {0x80,0x10,0x00,0x00,0x80,0x00,0x00,0x00,0xC0,0x04,0x00,0x04,0x40,0xFC,0xFF,0x0F,0x40,0x8C,0x31,0x06,0x60,0x8C,0x31,0x06,0x7C,0x8C,0x31,0x06,0x70,0x8C,0x31,0x06},
  {0x30,0x8C,0x31,0x06,0x30,0x8C,0x31,0x06,0x30,0x8C,0x31,0x06,0x30,0x8C,0x31,0x06,0x30,0x8C,0x31,0x36,0xB0,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"温",0*/
};

uint8_t shi[][32] = {
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x60,0xF0,0xFF,0x07,0xE0,0x30,0x00,0x06,0xC0,0x30,0x00,0x06,0xC0,0x30,0x00,0x06},
  {0x00,0x34,0x00,0x06,0x00,0xF2,0xFF,0x07,0x06,0x32,0x00,0x06,0x0C,0x32,0x00,0x06,0x38,0x31,0x00,0x06,0x30,0x31,0x00,0x06,0x30,0xF1,0xFF,0x07,0x80,0x30,0x21,0x06},
  {0x80,0x10,0x63,0x00,0xC0,0x00,0x63,0x00,0x40,0x00,0x63,0x18,0x60,0x04,0x63,0x38,0x60,0x08,0x63,0x0C,0x3E,0x18,0x63,0x06,0x30,0x30,0x63,0x02,0x30,0x30,0x63,0x01},
  {0x30,0x30,0xE3,0x00,0x30,0x20,0x63,0x00,0x38,0x00,0x63,0x00,0x38,0x00,0x63,0x00,0x38,0x00,0x63,0x10,0x30,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"湿",1*/
};

uint8_t du[][32] = {
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x08,0x20,0x00,0x02,0x1C,0xE0,0xFF,0xFF,0x3F,0x60,0x20,0x20,0x00},
  {0x60,0xE0,0xE0,0x00,0x60,0x60,0x60,0x00,0x60,0x60,0x60,0x0C,0xE0,0xFF,0xFF,0x1F,0x60,0x60,0x60,0x00,0x60,0x60,0x60,0x00,0x60,0x60,0x60,0x00,0x60,0x60,0x60,0x00},
  {0x60,0xE0,0x7F,0x00,0x60,0x60,0x60,0x00,0x20,0x00,0x80,0x00,0x20,0xFC,0xFF,0x01,0x30,0x20,0xC0,0x01,0x30,0x40,0xE0,0x00,0x30,0xC0,0x60,0x00,0x10,0x80,0x30,0x00},
  {0x10,0x00,0x1B,0x00,0x18,0x00,0x0E,0x00,0x08,0x00,0x1F,0x00,0x08,0xC0,0x79,0x00,0x04,0x70,0xE0,0x1F,0x04,0x0E,0x00,0x1F,0xE2,0x01,0x00,0x08,0x00,0x00,0x00,0x00},/*"度",2*/
};

void lcd_drawni(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc)
{
  lcd_drawtext16x16(x, y, fc, bc, wen[0]);
}


//显示字符
//x: 起始列
//y: 起始行
//w: 字符宽度
//h: 字符高度
//fc: 前景色
//bc: 背景色
//font: 字模数组
void lcd_drawtext(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint16_t fc, uint16_t bc, uint8_t* font)
{
  lcd_region(x, x + w - 1, y, y + h -1);

  //注意循环变量取值范围
  uint16_t j;
  for (j = 0; j < w*h/8; j++)
  {
    uint8_t i;
    for (i = 0; i < 8; i++)
    {
      if ((font[j] & (1 << i)) != 0)
      {
        //填充前景色
        lcd_sendpixel(fc);
      }
      else
      {
        //填充背景色
        lcd_sendpixel(bc);
      }
    }
  }
}


uint8_t mid[] = {0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFC,0x1F,0x84,0x10,0x84,0x10,0x84,0x10,0x84,0x10,0x84,0x10,0xFC,0x1F,0x84,0x10,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00};/*"中",0*/


/*"温",0*/

void lcd_drawmid(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc)
{
	lcd_drawtext(50, 50, 32, 32,fc, bc, mid);
}

void lcd_drawup(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc)
{
}


void lcd_drawdown(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc)
{
}

void lcd_drawleft(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc)
{
}


void lcd_drawright(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc)
{
}


uint8_t wen1[][32] = {
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x0E,0x06,0x00,0x00,0x06,0x07,0x00,0x00,0x07,0x03,0x00,0x00,0x03,0x03,0x00,0x00,0x83,0x01,0x00},
{0x80,0x81,0x01,0x18,0x80,0xC0,0xFF,0x3F,0xC0,0xC0,0x00,0x18,0xC0,0x61,0x08,0x0C,0xE0,0x21,0x30,0x04,0xB0,0x31,0x10,0x02,0x90,0x11,0x10,0x00,0x88,0x09,0x10,0x00},
{0x88,0x81,0x11,0x00,0x84,0xC1,0x11,0x01,0x80,0xC1,0x10,0x02,0x80,0xC1,0x10,0x04,0x80,0x61,0x10,0x0C,0x80,0x61,0x10,0x18,0x80,0x31,0x10,0x38,0x80,0x11,0x10,0x30},
{0x80,0x09,0x10,0x30,0x80,0x09,0x10,0x30,0x80,0x05,0x10,0x00,0x80,0x01,0x10,0x00,0x80,0x01,0x1F,0x00,0x80,0x01,0x1C,0x00,0x80,0x00,0x08,0x00,0x00,0x00,0x00,0x00}};/*"你",0*/

	
	

void lcd_drawwendu(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc)
{
  lcd_drawtext(x, y, 32, 32, fc, bc, (uint8_t*)wen1);
  //lcd_drawtext(x + 32, y, 32, 32, fc, bc, (uint8_t*)du);
}

uint8_t num16x32[][64] = {
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x60,0x04,0x30,0x0C,0x18,0x18,0x18,0x18,0x18,0x10,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x18,0x10,0x18,0x18,0x18,0x18,0x30,0x0C,0x60,0x04,0xC0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"0",0*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xC0,0x03,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"1",1*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x10,0x1C,0x08,0x18,0x04,0x30,0x04,0x30,0x0C,0x30,0x0C,0x30,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x03,0x80,0x01,0xC0,0x00,0x40,0x00,0x20,0x20,0x10,0x20,0x08,0x20,0x04,0x30,0xFC,0x1F,0xFC,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"2",2*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x18,0x06,0x0C,0x0C,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x06,0xC0,0x03,0x00,0x0E,0x00,0x18,0x00,0x10,0x00,0x30,0x00,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x10,0x0C,0x18,0x18,0x0C,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"3",3*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x07,0x00,0x07,0x80,0x06,0x80,0x06,0x40,0x06,0x20,0x06,0x20,0x06,0x10,0x06,0x10,0x06,0x08,0x06,0x0C,0x06,0x04,0x06,0x02,0x06,0xFE,0x3F,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0xC0,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"4",4*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x3F,0xF0,0x3F,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0xC8,0x07,0x28,0x0C,0x18,0x18,0x08,0x10,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x0C,0x30,0x0C,0x30,0x04,0x18,0x04,0x18,0x18,0x0C,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"5",5*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x60,0x18,0x30,0x18,0x10,0x18,0x18,0x00,0x08,0x00,0x08,0x00,0x0C,0x00,0xCC,0x07,0x6C,0x0C,0x1C,0x18,0x1C,0x10,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x18,0x30,0x18,0x10,0x30,0x18,0x70,0x0C,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"6",6*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0xF8,0x3F,0x08,0x10,0x0C,0x08,0x04,0x08,0x04,0x04,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x01,0x00,0x01,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"7",7*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x30,0x0C,0x18,0x18,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x1C,0x30,0x1C,0x10,0x78,0x18,0xF0,0x04,0xE0,0x03,0x18,0x0F,0x0C,0x1E,0x0C,0x1C,0x06,0x38,0x06,0x30,0x06,0x30,0x06,0x30,0x06,0x30,0x0C,0x18,0x18,0x0C,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"8",8*/
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x18,0x04,0x0C,0x08,0x0C,0x18,0x06,0x10,0x06,0x30,0x06,0x30,0x06,0x30,0x06,0x30,0x06,0x30,0x0E,0x38,0x0C,0x34,0x18,0x36,0xF0,0x31,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x08,0x0C,0x0C,0x0C,0x06,0x0C,0x03,0xF0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"9",9*/
};

void lcd_drawnum(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc, uint8_t num)
{
  if (num > 9)
  {
    return;
  }
  
  lcd_drawtext(x, y, 16, 32, fc, bc, num16x32[num]);
}

//画点
void lcd_drawpoint(uint8_t x, uint8_t y, uint16_t color)
{
  lcd_region(x, x + 1, y, y + 1);
  lcd_sendpixel(color);
}


uint8_t charWen[]={0x00,0x00,0x00,0x00,0x00,0x08,0xD8,0x17,0x90,0x18,0x80,0x0F,0x84,0x0E,0x80,0x01,0x00,0x10,0xD8,0x3F,0x48,0x15,0x48,0x15,0x44,0x33,0xF4,0x0C,0x00,0x00,0x00,0x00};
void lcd_drawcharWen(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc)
{
	lcd_drawtext(x, y, 16, 16, fc, bc, (uint8_t*)charWen);
}

uint8_t charDu[] = {0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x0E,0xF0,0x03,0xD0,0x04,0x90,0x0B,0xF0,0x02,0x90,0x01,0x10,0x07,0x88,0x02,0x88,0x02,0x04,0x03,0x82,0x0C,0x70,0x78,0x00,0x00};
void lcd_drawcharDu(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc)
{
	lcd_drawtext(x, y, 16, 16, fc, bc, (uint8_t*)charDu);
}
uint8_t charShi[]={0x00,0x00,0x00,0x00,0x00,0x08,0xF8,0x1F,0x40,0x0A,0xC0,0x09,0x44,0x0E,0xC0,0x01,0x80,0x17,0x08,0x15,0xC8,0x0C,0xC4,0x04,0x84,0x04,0xF4,0x7F,0x00,0x00,0x00,0x00};
void lcd_drawcharShi(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc)
{
	lcd_drawtext(x, y, 16, 16, fc, bc, (uint8_t*)charShi);
}

uint8_t charkai[]={0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x0F,0x60,0x02,0x40,0x02,0x40,0x32,0xFE,0x0F,0x20,0x02,0x20,0x02,0x20,0x02,0x10,0x02,0x10,0x02,0x08,0x02,0x00,0x00,0x00,0x00};/*"开",0*/
void lcd_drawcharKai(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc)
{
	lcd_drawtext(x, y, 16, 16, fc, bc, (uint8_t*)charkai);
}
uint8_t charGuan[] = {0x00,0x00,0x00,0x04,0x00,0x04,0x60,0x02,0x40,0x02,0x00,0x07,0xE0,0x00,0x80,0x00,0xC0,0x3F,0xB8,0x00,0x40,0x01,0x40,0x02,0x20,0x04,0x10,0x1C,0x08,0x78,0x00,0x00};/*"关",0*/
void lcd_drawcharGuan(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc)
{
	lcd_drawtext(x, y, 16, 16, fc, bc, (uint8_t*)charGuan);
}

uint8_t charDeng[] = {0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0xD0,0x00,0x30,0x3F,0x14,0x0C,0x14,0x08,0x10,0x08,0x10,0x08,0x68,0x08,0x48,0x08,0x04,0x08,0x02,0x0E,0x00,0x04,0x00,0x00};/*"灯",0*/
void lcd_drawcharDeng(uint8_t x, uint8_t y, uint16_t fc, uint16_t bc)
{
	lcd_drawtext(x, y, 16, 16, fc, bc, (uint8_t*)charDeng);
}

有关STM32使用DHT11传感器读取温湿度,显示在LCD屏上的更多相关文章

  1. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  2. STM32的HAL和LL库区别和性能对比 - 2

    LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L

  3. ESP32学习入门:WiFi连接网络 - 2

    目录一、ESP32简单介绍二、ESP32Wi-Fi模块介绍三、ESP32Wi-Fi编程模型四、ESP32Wi-Fi事件处理流程 五、ESP32Wi-Fi开发环境六、ESP32Wi-Fi具体代码七、ESP32Wi-Fi代码解读6.1主程序app_main7.2自定义代码wifi_init_sta()八、ESP32Wi-Fi连接验证8.1测试方法8.2服务器模拟工具sscom58.3测试代码8.4测试结果前言为了开发一款亚马逊物联网产品,开始入手ESP32模块。为了能够记录自己的学习过程,特记录如下操作过程。一、ESP32简单介绍ESP32是一套Wi-Fi(2.4GHz)和蓝牙(4.2)双模解决方

  4. Spring Security 6.0系列【32】授权服务器篇之默认过滤器 - 2

    有道无术,术尚可求,有术无道,止于术。本系列SpringBoot版本3.0.4本系列SpringSecurity版本6.0.2本系列SpringAuthorizationServer版本1.0.2源码地址:https://gitee.com/pearl-organization/study-spring-security-demo文章目录前言1.OAuth2AuthorizationServerMetadataEndpointFilter2.OAuth2AuthorizationEndpointFilter3.OidcProviderConfigurationEndpointFilter4.N

  5. ruby - 摘要::CRC32 与 Zlib - 2

    在我的代码中,我需要使用各种算法(包括CRC32)对文件进行哈希处理。因为我还在Digest系列中使用其他加密哈希函数,所以我认为为它们维护一个一致的接口(interface)会很好。为了记录,我确实找到了digest-crc,一颗完全符合我要求的gem。问题是,Zlib是标准库的一部分,并且有一个我想重用的CRC32工作实现。此外,它是用C编写的,因此它应该提供与digest-crc相关的卓越性能,后者是纯ruby​​实现。实现Digest::CRC32一开始看起来非常简单:%w(digestzlib).each{|f|requiref}classDigest::CRC32一切正常:

  6. ruby - 安装gem : Couldn't reserve space for cygwin's heap, Win32错误487错误 - 2

    我正在尝试在我的机器上安装win32-apigem,但在构建native扩展时我遇到了一些问题:$geminstallwin32-api--no-ri--rdocTemporarilyenhancingPATHtoincludeDevKit...Buildingnativeextensions.Thiscouldtakeawhile...C:\Programs\dev_kit\bin\make.exe:***Couldn'treservespaceforcygwin'sheap,Win32error0ERROR:Errorinstallingwin32-api:ERROR:Failed

  7. Ruby 1.9 - 没有这样的文件可以加载 'win32/open3' - 2

    我在Windows上运行ruby​​1.9.2并试图移植在Ruby1.8中工作的代码。该代码使用以前运行良好的Open4.popen4。对于1.9.2,我做了以下事情:通过geminstallPOpen4安装了POpen4需要POpen4通过require'popen4'尝试像这样使用POpen4:Open4.popen4("cmd"){|io_in,io_out,io_er|...}当我这样做时,我得到了错误:nosuchfiletoload--win32/open3如果我尝试安装win32-open3(geminstallwin32-open3),我会收到错误消息:win32-op

  8. Dell Inspiron 5488加内存32G - 2

    DellInspiron5488加内存32G 原装内置内存仅仅8G,目前看,真的太小了! 1.内存型号Dell5488内存型号:DDR42666。笔记本有两个内存插槽,原装占了一个,还能扩展一个。 2.买内存如果买Dell原装笔记本内存,8G就得500块左右。 我咨询了一下,三星的笔记本内存,可以兼容。16G,299块(2023年2月23日,京东价) Dell5488内存组合,最多只能插两根16G内存。 我于是买了两根三星16G内存。装上,很爽😄 跑国产系统统信UOS,再也看不到用交换区了,32G内存,爽!  

  9. 蓝桥杯 stm32 MCP4017 - 2

    本文代码使用HAL库。文章目录前言一、MCP4017的重要特性二、MCP4017计算RBW阻值三、MCP4017地址四、MCP4017读写函数五、CubeMX创建工程(利用ADC测量MCP4017电压)、对应代码:总结前言一、MCP4017的重要特性蓝桥杯板子上的是MCP4017T-104ELT,如图1。MCP4017是一个可编程电阻,通过写入的数值可以改变电阻的大小。重点在于6引脚(W),5引脚(B&#

  10. STM32 OTA应用开发——通过USB实现OTA升级 - 2

    STM32OTA应用开发——通过USB实现OTA升级目录STM32OTA应用开发——通过USB实现OTA升级前言1环境搭建2功能描述3BootLoader的制作4APP的制作5烧录下载配置6运行测试结束语前言什么是OTA?百度百科:空中下载技术(Over-the-AirTechnology;OTA),是通过移动通信的空中接口实现对移动终端设备及SIM卡数据进行远程管理的技术。经过公网多年的应用与发展,已十分成熟,网络运营商通过OTA技术实现SIM卡远程管理,还能提供移动化的新业务下载功能。实际上,现在我们所说的OTA比百度百科的定义还要更广泛,OTA的形式已经不再局限于手机和SIM卡,只要涉及

随机推荐