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.085usHAL_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)延时 15mscmd_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.hqwc.cn/news/297.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电商项目10:商品管理、仓库管理

电商项目10&#xff1a;商品管理、仓库管理 1、商品管理1.1、spu检索1.1.1、后端1.1.2、前端 1.2、sku检索1.2.1、后端 2、库存管理2.1、启动ware后端微服务2.2、仓库维护查询2.3、查询商品库存2.4、查询采购需求 1、商品管理 1.1、spu检索 1.1.1、后端 spu检索接口文档 S…

UDP和TCP网络编程

UDP和TCP网络编程 UDP网络编程UDP通信流程&#xff08;回显服务&#xff09;测试扩展《UDP字典查找单词》 TCP网络编程TCP互相通信测试 缓存区和缓存 UDP网络编程 特点&#xff1a; 无连接&#xff1a;发送数据前不需要建立连接。不可靠&#xff1a;没有重发机制&#xff0c;无…

面对Android开发高薪诱惑,如何拿到大厂offer?

前言 出来打工最看重的就是薪资&#xff0c;作为一名5年开发经验的Android人员。在如今的大环境中薪资一降再降&#xff0c;还没人要。技术还还算可以但是面试一直被刷下来&#xff1f;这是为什么&#xff0c;本篇我们来聊聊Android开发面试中的关键。 面试过程 通常面试过程…

VRRP协议是什么?详解它的工作原理

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 前言 本文将讲解VRRP是什么&#xff0c;以及它的工作原理&#xff0c;优点以及基本概念。 目录 一、VRRP协议是什么&#xff1f; 二、VRR…

【FPGA】Verilog:时序电路设计 | 自循环移位寄存器 | 环形计数 | 扭环计数 | 约翰逊计数器

前言&#xff1a;本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例&#xff1a;计数器 ​​ 功能特性&#xff1a; 采用 Xilinx Artix-7 XC7A35T芯片 配置方式&#xff1a;USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度 存储器&#xff1a;2Mb…

将当前conda环境导出为yaml文件

conda环境的转移和复制 conda导出已有环境&#xff0c;环境会被保存在environment.yaml文件中。 conda env export > environment.yaml 当我们想再次创建该环境&#xff0c;或根据别人提供的.yaml文件复现环境时&#xff0c;就可以通过下面的命令来复现安装环境了。 conda …

【Docker】子系统与其相关名词的界定、Control Groups等详细讲解

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…

tcp、udp调试工具

NetAssist(网络调试助手) 下载地址&#xff1a;http://www.cmsoft.cn/resource/102.html tcp-server代码 # codingutf-8 # 多线程TCP服务器import socket import threadingbind_ip "192.168.137.1" # 监听的IP 地址 bind_port 5100 # 监听的端口# 建立一个socke…

用OpenCV进行OCR字符分割

1. 引言 本文重点介绍如何利用传统的图像处理的方法来进行OCR字符切分&#xff0c;进而可以用分割后的单个字符做相应的后续任务&#xff0c;虽然现在计算机视觉依然是卷积神经网络的天下&#xff0c;但是对于一些相对简单的落地场景传统方案还是很有效的。 闲话少说&#xff…

c#学习笔记

目录 1.语句块2.Write和WriteLine的区别&#xff1a;3.params4.托管代码和非托管代码5.DllImport的使用&#xff1a;6.WriteLine、ReadLine和ReadKey&#xff1a;7.C#中访问修饰符8.类型的实例化9.成员可以分为两种&#xff1a;数据成员和函数成员10.枚举enum和结构struct的区别…

Cesium 实战 - 使用 gltf-vscode 查看、预览以及编辑 glTF 和 GLB 模型

Cesium 实战 - 使用 gltf-vscode 查看、预览以及编辑 glTF 和 GLB 模型 VScode&#xff08;Visual Studio Code&#xff09; 安装模型必要插件VScode 预览自定义关节&#xff08;articulations&#xff09;动作VScode 导入 GLB 格式模型VScode 导出 GLB 格式模型Cesium 在线示例…

内网穿透技术

文章目录 前言1. 安装JAVA2. MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7. 配置公网访问地址8.远程联机测试9. 配置固定远程联机端口地址9.1 保留一个固定tcp地址9.2 配置固定公网TCP地址9.3 使用固定公网地址远程联机 转载自内…