900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 温湿度(DHT11)+雨滴检测——LCD显示(TFT液晶)

温湿度(DHT11)+雨滴检测——LCD显示(TFT液晶)

时间:2023-07-15 22:37:31

相关推荐

温湿度(DHT11)+雨滴检测——LCD显示(TFT液晶)

温湿度(DHT11)+雨滴检测——LCD显示(TFT液晶)

效果展示:一、硬件连接二、代码1、DHT112、雨滴传感器3、LCD4、main.c三、完整工程链接:

效果展示:

视频:

温湿度采集(DHT11)+雨滴检测——LCD显示(TFT液晶)

一、硬件连接

温湿度传感器:

3.3V 供电DATA ——> PB12

雨滴传感器:

3.3V 供电DATA ——> PA0

二、代码

1、DHT11

/* dht11.c */#include "stm32f10x.h"#include "dht11.h"#include "delay.h"uint8_t dat[5]={0x00,0x00,0x00,0x00,0x00}; //存储读取的温湿度信息uint32_t sum=0; //存放校验时的求和/****************************************设置PB12端口为输出*****************************************/void STM_Out_DHT11_In(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;//推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//输出50MHzGPIO_Init(GPIOB,&GPIO_InitStructure);}/****************************************设置PB12端口为输入*****************************************/void STM_In_DHT11_Out(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//输出50MHzGPIO_Init(GPIOB,&GPIO_InitStructure);}/****************************************函数名称:void DHT_Read_Byte()函数功能:对DHT的数据中的一个字节读取函数输入参数:无返回值:无*****************************************/uint8_t DHT_Read_Byte(void){uint8_t temp;//存放读取到的位数据uint8_t ReadDat = 0;uint8_t i;uint8_t retry = 0; //防止死机for(i=0; i<8; i++){while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==0 && retry<100){//等待DHT11输出高电平delay_us(1);retry++;}retry = 0; //防止死机,清零delay_us(40);//延时30us,由于‘0’代码高电平时间26~28us,'1'代码高电平时间70us,延时30us可判断出是1,还是0temp = 0; //先将寄存器清零if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 1) //延时30us之后如果还是高电平,证明为1代码temp = 1; //将1存储while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==1 && retry<100){//等待信号被拉低,跳出delay_us(1);retry++;}retry = 0;ReadDat <<= 1; //数据左移1位,存放新得到的数据ReadDat |= temp; //新得到的数据放到最后1位}return ReadDat;}/*********************************************函数名称:unsigned char DHT_Read()函数功能:读取DHT11的温湿度输入参数:无返回值: flag--数据读取、校验成功标志GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)*********************************************/uint8_t DHT_Read(void){uint8_t i;uint8_t retry = 0;STM_Out_DHT11_In(); //端口方向设置为输出GPIO_ResetBits(GPIOB, GPIO_Pin_12); //输出低电平delay_ms(18);//延时18ms,时序要求GPIO_SetBits(GPIOB, GPIO_Pin_12); //端口数据拉高delay_us(40);//延时40usSTM_In_DHT11_Out(); //方向设置为输入delay_us(20);//延时20usif(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 0){//如果读取到低电平,证明DHT11响应while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==0 && retry<100){//等待变高电平delay_us(1);retry++;}retry = 0;while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==1 && retry<100){//等待变低电平delay_us(1);retry++;}retry = 0;for(i=0; i<5; i++){//循环5次将40位读出dat[i] = DHT_Read_Byte(); //读出1个字节}delay_us(50); //最后延时等待50us}sum = dat[0]+dat[1]+dat[2]+dat[3];//前4个字节数据的和if(dat[4] == (u8)(sum))//前4个数据和的末8位要和第5个数据相等,才算读取正确return 1; //校验正确,返回1elsereturn 0; //校验错误,返回0}

2、雨滴传感器

/*water.c*//*1 有水0 没水*/#include "water.h"void WATER_Check_Init(void){//设为输入GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //输入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);}

3、LCD

完整工程:温湿度+雨滴检测——TFT液晶显示.zip

4、main.c

#include "led.h"#include "delay.h"#include "sys.h"#include "usart.h"#include "lcd.h"#include "dht11.h"#include "water.h"extern uint8_t dat[5];int main(void){delay_init(); //延时函数初始化 uart_init(9600);//串口初始化为9600LED_Init(); //初始化与LED连接的硬件接口LCD_Init();POINT_COLOR = RED; //画笔颜色,可更改颜色while(1){if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0){// 0:没水 1:有水LCD_ShowString(30, 100, 200, 20, 16, "water security"); //没水,安全 }else{LCD_ShowString(30, 100, 200, 20, 16, "water warning"); //有水,警告}if( DHT_Read() ){//有温度数据LCD_ShowString(30,60,200,10,16,"shidu:");LCD_ShowxNum(90,60,dat[0],2,16,0x80);LCD_ShowString(30,80,200,10,16,"wendu:");LCD_ShowxNum(90,80,dat[2],2,16,0x80);}}}

三、完整工程

文件都写好,使用时可以直接移植

链接:

温湿度+雨滴检测——TFT液晶显示.zip

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。