STM32开发——非标协议(DH11+LCD1602)

1.STM32分文件实现代码

 编译的总文件夹dh11andlcd,C文件不能跨文件夹查找,新增的分文件,需要都放调用的文件夹下

C文件和H文件理解:H文件是门脸,放在前面给别人的,别人一看就知道有什么东西。C是给内部人用的,不用放在门脸上。

2.CubeMX设置

stm32GPIO口不能直接作为输入和输出引脚——是需要初始化的

 基本上没有什么需要设置的

PA0——PA7接LCD1602的D0——D7
//电源
VSS -- GND
VDD -- 5V
//对比度
VO  -- GND
//控制线
RS  -- P1.0
RW  -- P1.1
E  -- P1.4
//背光灯
A  -- 5V
K  -- GDN

DH11的数据线接PB6(在程序里设置其为输入IO还是输出IO)

3.函数代码

DH11.h

只用 void DH11_to_data1(uint8_t data1[]);但是需要注意格式

#ifndef __DH11_H__
#define __DH11_H__
#include "gpio.h"

void DH11_to_data1(uint8_t data1[]);

#endif

DH11.c

#include "gpio.h"
#define tp_data_low    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET)
#define tp_data_high   HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET)

void delay_us(uint16_t cnt)
{
	uint8_t i;
	while(cnt)
	{
		for (i = 0; i < 10; i++)
		{
		}
		cnt--;
	}
}

void MX_GPIO_pin_pp(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */

  __HAL_RCC_GPIOB_CLK_ENABLE();


  /*Configure GPIO pins : PB0 PB1 PB2 PB7 */
  GPIO_InitStruct.Pin = GPIO_PIN_6;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void MX_GPIO_pin_input(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */

  __HAL_RCC_GPIOB_CLK_ENABLE();


  /*Configure GPIO pins : PB0 PB1 PB2 PB7 */
  GPIO_InitStruct.Pin = GPIO_PIN_6;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

void init_DHT(void)
{
	MX_GPIO_pin_pp();   //需要写东西
	tp_data_high;
	tp_data_low;
	HAL_Delay(25);	  //µÍµÄ½×¶Î
	tp_data_high;
	//Delay30us();
	delay_us(30);
	//Delay30us();   //¿ªÊ¼ÏìÓ¦½×¶Î  µã¿¨
	delay_us(30);
 
	
	MX_GPIO_pin_input();//需要读东西
	while(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_6));	//¿¨DHTΪµÍ	  ×ßÍê
	while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_6));		//¿¨DHTÀ­¸ß	  ×ßÍê	 ºóÃæÊÇÊý¾Ý½ÓÊÜ
	   			
}
 
void DH11_to_data1(uint8_t data1[])
{
	int i,j;	//i±íʾ8bitµÄÊý¾Ý   j±íʾÿ¸öbitµÄÖµ
	char tmp,flag;
 
	init_DHT();	   //³õʼ»¯ºó½ÓÊÜ8λÊý¾Ý+8λ  +8λ+8λ	  +8λ
		for(i=0;i<5;i++){			
			for(j=0;j<8;j++){
				MX_GPIO_pin_input();//需要读东西
				while(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_6));  //À­µÍ×ßÍê
				//HAL_Delay()35us();
				delay_us(35);
				if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_6)==1){
					flag=1;
					while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_6));		//×ßÍê¸ßµçƽ
				}else{
					flag=0;
				}
				tmp=tmp<<1;		//tmp±íʾ½ÓÊܵÄÒ»¸ö8λÊý¾Ý
				tmp |=flag;	
			}
			data1[i]=tmp;
		}
 
}


LCD1602.h

#ifndef __LCD1602_H__
#define __LCD1602_H__

void lcd_line_show(char row,char line,char *string);
#endif

LCD1602.c

#include "gpio.h"

#define RS_low    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET)
#define RS_high    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET)
#define RW_low    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET)
#define RW_high    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET)
#define EN_low    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET)
#define EN_high    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET)
int site[2][16]={{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F},
				 {0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F}};



void cmd_write(char a)
{
	
	RS_low;
	RW_low;  //RS 和 R/W 共同为低电平时可以写入指令(地址)
	EN_low; 
	GPIOA->ODR = a;
	//_nop_();  //延迟1.085us
	HAL_Delay(5);
	EN_high;
	//_nop_();
	HAL_Delay(5);
	EN_low;

}
 
void data_write(char a)
{

	RS_high;RW_low;  // RS 为高电平 R/W 为低电平时可以写入数据
	EN_low;  

	GPIOA->ODR = a;
	HAL_Delay(5);
	EN_high;
	HAL_Delay(5);
	EN_low;

}

void lcd_line_show(char row,char line,char *string)
{
	switch (row){
		case 1:
			cmd_write(0x80+line);
			while(*string){
				data_write(*string);
				string++;
			}
			break;	
		case 2:
			cmd_write(0x80+0x40+line);
			while(*string){
				data_write(*string);
				string++;
			}
			break;
	}
}
 
 
void init_lcd(void)
{
	HAL_Delay(15);	//(1)延时 15ms
	cmd_write(0x38);  //(2)写指令 38H(不检测忙信号)
	HAL_Delay(5);		  // (3)延时 5ms
                     	// (4)以后每次写指令,读/写数据操作均需要检测忙信号
	cmd_write(0x38);	 //(5)写指令 38H:显示模式设置
	cmd_write(0x08);	 //	   (6)写指令 08H:显示关闭
	cmd_write(0x01);	 //(7)写指令 01H:显示清屏
	cmd_write(0x06);	 //	(8)写指令 06H:显示光标移动设置
	cmd_write(0x0C);	 //	 (9)写指令 0CH:显示开及光标设置
}

32里面微秒的延时函数

void delay_us(uint16_t cnt)
{
	uint8_t i;
	while(cnt)
	{
		for (i = 0; i < 10; i++)
		{
		}
		cnt--;
	}
}

main函数代码

#include "lcd1602.h"
#include "dh11.h"
#include "stdio.h"

int fputc(int ch, FILE *f)
{
	unsigned char temp[1]={ch};
	HAL_UART_Transmit(&huart1,temp,1,0xffff);
	return ch;
}

//main中代码
	uint8_t data1[4]={'0'};
	char meseege1[16];
	char meseege2[16];
	init_lcd();	   //(1) 在对液晶模块的初始化中要先设置其显示模式
				   //(2) 在液晶模块显示字符时光标是自动右移的,无霿人工干预
				   //(3) 每次输入指令前都要判断液晶模块是否处于忙的状怿
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		DH11_to_data1(data1);
		printf("humidity:");
		printf("%d.%d\r",data1[0],data1[1]);
		printf("tempreture:");
		printf("%d.%d\r",data1[2],data1[3]);
		sprintf(meseege1,"humidity:%d.%d",data1[0],data1[1]);
		lcd_line_show(1,0,meseege1);
		sprintf(meseege2,"tempreture:%d.%d",data1[2],data1[3]);
		lcd_line_show(2,0,meseege2);
		
		HAL_Delay(2000);
  }

4.实现效果

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/30843.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

总结899

目标规划&#xff1a; 月目标&#xff1a;6月&#xff08;线性代数强化9讲&#xff0c;背诵15篇短文&#xff0c;考研核心词过三遍&#xff09; 周目标&#xff1a;线性代数强化3讲&#xff0c;英语背3篇文章并回诵&#xff0c;检测 今日已做&#xff1a; 1.读了两篇文章&a…

python使用pyinstaller打包运行过程中莫名的被阻塞

问题描述 使用pyinstaller打包python代码命令 python -m PyInstaller -i logo.ico -F -p ./console -n scl_runner ./main.py运行之后会有一个终端&#xff0c;可以看到终端日志输出正常&#xff0c;多次远程调用也没有问题&#xff0c;死循环测试调用10万次也没有卡死 然…

【Flume】高级组件之Sink Processors及项目实践(Sink负载均衡和故障转移)

文章目录 1. 组件简介2. 项目实践2.1 负载均衡2.1.1 需求2.1.2 配置2.1.3 运行 2.2 故障转移2.2.1 需求2.2.2 配置2.2.3 运行 1. 组件简介 Sink Processors类型包括这三种&#xff1a;Default Sink Processor、Load balancing Sink Processor和Failover Sink Processor。 Defa…

kotlin学习(二)泛型、函数、lambda、扩展、运算符重载

文章目录 泛型&#xff1a;in、out、where型变&#xff08;variance&#xff09;不变&#xff08;Invariant&#xff09;协变&#xff08;Covariant&#xff09;Java上界通配符<? extends T>Kotlin的关键词 outUnsafeVariance 逆变&#xff08;Contravariant&#xff09…

GBASE金融信创优秀解决方案鉴赏 · 核心业务系统数据库解决方案

为此&#xff0c;实验室特别开设金融信创优秀解决方案专栏&#xff0c;集中展示优秀成果。现在&#xff0c;让我们一起来领略下GBASE的优秀解决方案吧~可点击阅读原文 →《金融信创优秀解决方案--核心业务系统数据库解决方案》。 核心业务系统数据库解决方案 方案简介 随着技…

C++:虚函数

C面向对象的三个特性&#xff0c;封装继承多态。在继承的关系中&#xff0c;所有的东西都可以被继承下来&#xff0c;如数据可以被继承下来在内存&#xff0c;而函数的继承则是继承调用权。 虚函数主要是通过虚函数表来实现&#xff0c;每个类都有自己的虚表&#xff0c;当你创…

A fight among three “三国”混战 | 经济学人20230520版社论双语精翻

《经济学人》2023年5月20日封面&#xff08;社论&#xff09;文章精翻&#xff1a;《全球支付系统的“三国”混战》&#xff08;A fight among three&#xff09; A fight among three “三国”混战 The fight over the future of global payments 全球支付的未来之争 Digital …

【STM32】软件I2C(支持多字节)

I2C简介 I2C总线是一种串行、半双工的总线&#xff0c;主要用于近距离、低速的芯片之间的通信。I2C总线有两根双向的信号线&#xff0c;一根数据线SDA用于收发数据&#xff0c;一根时钟线SCL用于通信双方时钟的同步。 在一个i2c通讯总线中&#xff0c;可连接多个i2c通讯设备&a…

Go-unsafe详解

Go语言unsafe包 Go语言的unsafe包提供了一些底层操作的函数&#xff0c;这些函数可以绕过Go语言的类型系统&#xff0c;直接操作内存。虽然这些函数很强大&#xff0c;但是使用不当可能会导致程序崩溃或者产生不可预料的行为。因此&#xff0c;使用unsafe包时必须小心谨慎。 …

吴恩达ChatGPT《Prompt Engineering》笔记

ChatGPT 提示词工程师教程 1. 课程介绍 1.1 ChatGPT 相关术语 LLM&#xff1a;Large Language Model&#xff0c;大语言模型 Instruction Tuned LLM&#xff1a;经过指令微调的大语言模型 Prompt&#xff1a;提示词 RLHF&#xff1a;Reinforcement Learning from Human F…

机器视觉初步6:图像分割专题

图像分割是一种图像处理技术&#xff0c;它将图像划分为具有相似特征的区域。常见的图像分割方法包括阈值分割、边缘分割、区域分割、基于阈值的方法、基于边缘的方法、基于区域的方法、聚类分割、基于图论的方法、基于深度学习的方法。 文章目录 1.阈值分割2.边缘分割3.区域分…

CloFormer实战:使用CloFormer实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整算法设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试热力图可视化展示…

kali常用ping命令探测

ping 判断目标主机网络是否畅通 ping $ip -c 1其中&#xff0c;-c 1 表示发送一个数据包 traceroute 跟踪路由 traceroute $domain ARPING 探测局域网IP ARP&#xff08;地址解析协议&#xff09;&#xff0c;将IP地址转换成MAC地址arping $ip -c 1 #!/bin/ bash######…

基于matlab使用先导校准来补偿阵列不确定性(附源码)

一、前言 此示例说明如何使用先导校准来提高天线阵列在存在未知扰动时的性能。 原则上&#xff0c;可以轻松设计理想的均匀线性阵列&#xff08;ULA&#xff09;来执行阵列处理任务&#xff0c;例如波束成形或到达方向估计。在实践中&#xff0c;没有理想的阵列。例如&#xff…

初识轻量级分布式任务调度平台 xxl-job

文章目录 前言xxl-job的目录结构项目依赖 (父 pom.xml)xxl-job-admin 启动xxl-job-executor-sample (项目使用示例)xxl-job-executor-sample-frameless : 不使用框架的接入方式案例xxl-job-executor-sample-springboot : springboot接入方案案例 xxl-job执行器器启动流程分析调…

linux_centos7.9/ubuntu20.04_下载镜像及百度网盘分享链接

1、镜像下载站点 网易开源镜像&#xff1a;http://mirrors.163.com/ 搜狐开源镜像&#xff1a;http://mirrors.sohu.com/ 阿里开源镜像&#xff1a;https://developer.aliyun.com/mirror/ 首都在线科技股份有限公司&#xff1a;http://mirrors.yun-idc.com/ 常州贝特康姆软件技…

C++【红黑树】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f383;操作环境&#xff1a; Visual Studio 2019 版本 16.11.17 文章目录 &#x1f307;前言&#x1f3d9;️正文1、认识红黑树1.1、红黑树的定义1.2、红黑树的性质1.3、红黑树的特点 2、红黑…

三分钟学习一个python小知识1-----------我的对python的基本语法的理解

文章目录 一、变量定义二、数据类型三、条件语句四、循环语句五、函数定义总结 一、变量定义 在Python中&#xff0c;使用等号&#xff08;&#xff09;进行变量的定义&#xff0c;并不需要声明变量的类型&#xff0c;Python会自动根据赋值的数据类型来判断变量的类型&#xf…

chatgpt赋能python:Python构造和析构:介绍和实例

Python 构造和析构&#xff1a;介绍和实例 当你编写 Python 程序时&#xff0c;你可能会注意到一个名为构造函数和析构函数的概念。这些函数可以在创建和删除一个对象时自动执行一些操作。本文将深入介绍 Python 中的构造和析构概念。 构造函数 Python 使用一种名为 __init_…

戴尔U盘重装系统Win10步骤和详细教程

戴尔电脑深受用户们的喜欢&#xff0c;那么如何使用U盘给戴尔电脑重装Win10系统呢&#xff0c;这让很多用户都犯难了&#xff0c;以下就是小编给大家分享的戴尔U盘重装系统Win10步骤和详细教程&#xff0c;按照这个教程操作&#xff0c;就能顺利完成戴尔U盘重装Win10系统的操作…
最新文章