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

news2024/9/21 3:23:32

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.coloradmin.cn/o/673836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记录--新的HTML标签 :search

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 本文介绍了一种新的HTML元素搜索方法&#xff0c;并提供了一个实用的工具来帮助开发者快速找到所需的元素。这对于那些需要处理大量HTML元素的开发者来说是非常有用的。文章还通过提供一些常见元素的用…

AutoSAR系列讲解(入门篇)1.1-AutoSAR的发展史

一、AutoSAR成员 大体可以分为核心成员、高级成员和发展成员&#xff0c;可以打开AutoSAR官网的成员的介绍界面 所以有兴趣的小伙伴可以稍微了解一下&#xff0c;仅作了解就行&#xff0c;不是什么重要的知识 还有一张大家经常能看见的成员图&#xff0c;如下 二、AutoSAR历史…

国潮之美丨土家族西兰姑娘续写千年非遗传奇

光脚丫&#xff0c;童年时期的行为艺术 还记得儿时的夏夜&#xff0c;姥爷总说&#xff1a;“娃儿呀&#xff0c;光着脚在地上跑&#xff0c;接地气些”。那时只觉得脱掉鞋袜顿时轻松自在&#xff0c;从坡上冲到坡下&#xff0c;几个伙伴乐此不疲。后来长大了&#xff0c;穿着…

盘点一个Python网络爬虫过验证码的问题(方法一)

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 低眉信手续续弹&#xff0c;说尽心中无限事。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python最强王者群【鶏啊鶏。】问了一个Python网络爬虫的…

SSH连接异常:从迷茫到石破天惊的解决之道

文章目录 零&#xff1a;前言一&#xff1a;SSH1.1 SSH的连接类型、方式和端口1.2 常见端口及其类型 二&#xff1a;解决SSH连接异常第一步&#xff1a;欣赏报错&#xff0c;顺藤摸瓜第二步&#xff1a;异常窥探&#xff0c;摸石过河第三步&#xff1a;问题确定&#xff0c;斩首…

测试技术体系

目录&#xff1a; 软件测试分类分层测试体系 1.软件测试分类 软件测试的分类_安全性测试属于功能测试吗_阿瞒有我良计15的博客-CSDN博客 1.单元测试&#xff08;Unit Testing&#xff09;&#xff1a;单元测试是指对软件的最小可测试单元进行测试&#xff0c;例如一个函数、一…

Cell — 新“出芽”方法为疫苗开发带来优势

在疫苗学中&#xff0c;基于mRNA向体内递送抗原编码基因同基于纳米颗粒向体内递送抗原在应对具有挑战性的病原体方面都显示出巨大的前景。本期的《Cell》中&#xff0c;Hoffmann等人将两种方法相结合&#xff0c;通过调节被许多病毒劫持的相同细胞代谢通路来增强SARS-CoV-2疫苗…

【UCOS-III】自我学习笔记→第27讲→优先级翻转

文章目录 前言实验步骤1.复制二值信号量工程&#xff0c;添加task2和task3&#xff0c;修改任务服务函数名称2.修改开始任务&#xff0c;任务1以及任务2、3的内容3.查看串口现象![在这里插入图片描述](https://img-blog.csdnimg.cn/efa5ee2d92b54fe8be5a419adcf92ead.png) 测试…

STM32速成笔记—DMA

文章目录 一、什么是DMA二、DMA有什么作用三、STM32的DMA3.1 DMA请求3.2 DMA通道3.3 仲裁器 四、DMA配置4.1 DMA配置步骤4.2 DMA结构体成员 五、DMA配置程序5.1 ADC1初始化程序5.2 DMA初始化程序 一、什么是DMA DMA全程Direct Memory Access&#xff0c;即直接存储器访问。简单…

如何保护阿里云服务器免受DDoS攻击和恶意访问?有哪些防护措施?

如何保护阿里云服务器免受DDoS攻击和恶意访问&#xff1f;有哪些防护措施&#xff1f;   [本文由阿里云代理商[聚搜云]撰写]   随着互联网技术的不断发展&#xff0c;网络安全问题日益严峻&#xff0c;保护服务器免受DDoS攻击和恶意访问成为了每个企业和网站建设者的关注重…

W3B x Sui Hacker House|深入了解Sui和Move语言

Web3 Builders&#xff08;W3B&#xff09;作为Hacker House的践行者&#xff0c;将于6月23日&#xff08;周五&#xff09;早上8点&#xff08;GMT8&#xff09;举办首期 W3B x Sui Hacker House 系列活动分享会。本期活动邀请到Sui联合创始人Sam Blackshear&#xff08;Move语…

【机器学习】机器学习的基本概念

机器学习是我们现在接触人工智能领域首先要去掌握的知识&#xff0c;下面是我学习记录的一些关于机器学习的基础、常见的概念和定义。 目录 机器学习定义 机器学习过程 假设关系 训练数据 损失函数&#xff08;正向传播&#xff09; 优化&#xff08;反向传播&#xff0…

PC市场:寒冬敲响警钟,蓄势待发的复兴之路

近年来&#xff0c;PC市场的增长确实放缓&#xff0c;但这并不意味着它已经进入了寒冬。相反&#xff0c;PC市场正在蓄势待发&#xff0c;寻找复兴之路。 首先&#xff0c;PC市场仍然是一个巨大的市场。尽管移动设备的普及使得一些用户更多地使用手机和平板电脑&#xff0c;但…

C++:虚函数

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

RevCol:大模型架构设计新范式,给神经网络架构增加了一个维度!

点击蓝字 关注我们 关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;计算机视觉研究院 学习群&#xff5c;扫码在主页获取加入方式 论文地址&#xff1a;https://arxiv.org/pdf/2212.11696.pdf 项目代码&#xff1a;https://github.com/megvii-research/RevCol 计…

把金融航母开进智能峡湾,总共分几步?

试想一下&#xff0c;有这么一家街头小店。夫妻两个勤奋经营&#xff0c;诚信待客&#xff0c;广受街里街坊的欢迎。他们流水稳定&#xff0c;蒸蒸日上&#xff0c;商业信誉很好&#xff0c;甚至是非物质文化遗产的传承者。这样一家店&#xff0c;在扩大经营&#xff0c;拓展业…

SpringBoot集成WebSocket实现消息实时推送(提供Gitee源码)

前言&#xff1a;在最近的工作当中&#xff0c;客户反应需要实时接收消息提醒&#xff0c;这个功能虽然不大&#xff0c;但不过也用到了一些新的技术&#xff0c;于是我这边写一个关于我如何实现这个功能、编写、测试到部署服务器&#xff0c;归纳到这篇博客中进行总结。 目录 …

C语言代码函数栈帧的创建与销毁(修炼内功)

目录 在前期的学习中我们可能有很多困惑 例如&#xff1a;局部变量是怎么创建的 为什么局部变量的值是随机值 函数是怎么样传参的 传参的顺序是什么 形参和实参的关系是什么 函数调用是怎么做的 函数掉调用结束后怎么返回的 这篇博客我们来修炼自己的内功&#xff0c;掌握好这篇…

【MATLAB第42期】基于MATLAB的贝叶斯优化决策树分类算法与网格搜索、随机搜索对比,含对机器学习模型的评估度量介绍

【MATLAB第42期】基于MATLAB的贝叶斯优化决策树分类算法与网格搜索、随机搜索对比&#xff0c;含对机器学习模型的评估度量介绍 网格搜索、随机搜索和贝叶斯优化是寻找机器学习模型参数最佳组合、交叉验证每个参数并确定哪一个参数具有最佳性能的常用方法。 一、 评估指标 1、…

STM32F103基于HAL工程挂载FatFS驱动SD卡

STM32F103基于HAL工程挂载FatFS驱动SD卡 &#x1f4cc;基于标准库驱动《STM32挂载SD卡基于Fatfs文件系统读取文件信息》 &#x1f3ac;驱动实验效果&#xff1a; &#x1f528;通过STM32cubemx配置SPI1作为访问SD、TF卡通讯方式。 &#x1f527;在STM32cubemx配置中挂载中…