通过msp430f5529LP单片机,,LCD1602 3.3V点阵式LCD液晶显示和DHT11温湿度传感器实现温湿度显示
时间: 2023-08-18 11:03:57 浏览: 113
LCD1602+DHT11显示温湿度
5星 · 资源好评率100%
了解,您的需求是通过msp430f5529LP单片机,LCD1602 3.3V点阵式LCD液晶显示和DHT11温湿度传感器实现温湿度显示。接下来我将为您提供一个简单的实现方式:
1. 硬件连接
将DHT11传感器的VCC引脚连接到msp430f5529LP单片机的VCC引脚,将DHT11传感器的GND引脚连接到msp430f5529LP单片机的GND引脚,将DHT11传感器的Data引脚连接到msp430f5529LP单片机的P1.3引脚。将LCD1602液晶显示器的VCC引脚连接到msp430f5529LP单片机的VCC引脚,将LCD1602液晶显示器的GND引脚连接到msp430f5529LP单片机的GND引脚,将LCD1602液晶显示器的RS引脚连接到msp430f5529LP单片机的P1.4引脚,将LCD1602液晶显示器的EN引脚连接到msp430f5529LP单片机的P1.5引脚,将LCD1602液晶显示器的D4~D7引脚分别连接到msp430f5529LP单片机的P1.0~P1.3引脚。
2. 编写程序
使用msp430f5529LP单片机的MSP430G2553.h库文件,编写一个程序,包括初始化LCD1602液晶显示器、读取DHT11传感器数据和在LCD1602液晶显示器上显示温湿度数据等功能。程序流程如下:
- 初始化LCD1602液晶显示器。
- 通过P1.3引脚读取DHT11传感器的数据。
- 将读取到的温湿度数据进行处理。
- 在LCD1602液晶显示器上显示温湿度数据。
以下是一个简单的msp430f5529LP单片机读取DHT11传感器数据并在LCD1602液晶显示器上显示温湿度数据的程序示例,您可以参考该示例进行修改和优化:
```
#include <msp430.h>
#include "MSP430G2553.h"
#define LCD1602_RS BIT4
#define LCD1602_EN BIT5
#define LCD1602_D4 BIT0
#define LCD1602_D5 BIT1
#define LCD1602_D6 BIT2
#define LCD1602_D7 BIT3
void delay_us(unsigned int us)
{
while(us--)
{
__delay_cycles(1);
}
}
void delay_ms(unsigned int ms)
{
while(ms--)
{
__delay_cycles(1000);
}
}
void LCD1602_WriteCmd(unsigned char cmd)
{
P1OUT &= ~LCD1602_RS;
P1OUT &= ~LCD1602_EN;
P1OUT &= 0xF0;
P1OUT |= (cmd >> 4) & 0x0F;
P1OUT |= LCD1602_EN;
delay_us(1);
P1OUT &= ~LCD1602_EN;
P1OUT &= 0xF0;
P1OUT |= cmd & 0x0F;
P1OUT |= LCD1602_EN;
delay_us(1);
P1OUT &= ~LCD1602_EN;
delay_ms(5);
}
void LCD1602_WriteData(unsigned char dat)
{
P1OUT |= LCD1602_RS;
P1OUT &= ~LCD1602_EN;
P1OUT &= 0xF0;
P1OUT |= (dat >> 4) & 0x0F;
P1OUT |= LCD1602_EN;
delay_us(1);
P1OUT &= ~LCD1602_EN;
P1OUT &= 0xF0;
P1OUT |= dat & 0x0F;
P1OUT |= LCD1602_EN;
delay_us(1);
P1OUT &= ~LCD1602_EN;
delay_us(100);
}
void LCD1602_Init()
{
P1DIR |= 0xFF;
P1OUT &= 0x00;
delay_ms(100);
LCD1602_WriteCmd(0x28);
LCD1602_WriteCmd(0x0C);
LCD1602_WriteCmd(0x06);
LCD1602_WriteCmd(0x01);
delay_ms(2);
}
void DHT11_Start()
{
P1DIR |= BIT3;
P1OUT &= ~BIT3;
delay_ms(18);
P1OUT |= BIT3;
delay_us(1);
P1DIR &= ~BIT3;
delay_us(40);
}
unsigned char DHT11_Check()
{
unsigned char i;
for(i = 0; i < 100; i++)
{
if((P1IN & BIT3) == 0)
{
delay_us(80);
if((P1IN & BIT3) == 1)
{
return 1;
}
else
{
return 0;
}
}
}
return 0;
}
unsigned char DHT11_ReadBit()
{
unsigned char i;
for(i = 0; i < 100; i++)
{
if((P1IN & BIT3) == 0)
{
delay_us(50);
if((P1IN & BIT3) == 1)
{
return 1;
}
else
{
return 0;
}
}
}
return 0;
}
unsigned char DHT11_ReadByte()
{
unsigned char i, dat = 0;
for(i = 0; i < 8; i++)
{
dat <<= 1;
dat |= DHT11_ReadBit();
}
return dat;
}
unsigned char DHT11_ReadData(unsigned char *dat)
{
unsigned char i;
DHT11_Start();
if(DHT11_Check() == 0)
{
return 0;
}
for(i = 0; i < 5; i++)
{
dat[i] = DHT11_ReadByte();
}
if(dat[4] != (dat[0] + dat[1] + dat[2] + dat[3]))
{
return 0;
}
return 1;
}
void main()
{
unsigned char dat[5];
unsigned char temp, humi;
WDTCTL = WDTPW + WDTHOLD;
LCD1602_Init();
while(1)
{
if(DHT11_ReadData(dat) == 1)
{
humi = dat[0];
temp = dat[2];
LCD1602_WriteCmd(0x80);
LCD1602_WriteData('T');
LCD1602_WriteData(':');
LCD1602_WriteData(temp / 10 + '0');
LCD1602_WriteData(temp % 10 + '0');
LCD1602_WriteData('.');
LCD1602_WriteData(dat[3] + '0');
LCD1602_WriteData('C');
LCD1602_WriteCmd(0xC0);
LCD1602_WriteData('H');
LCD1602_WriteData(':');
LCD1602_WriteData(humi / 10 + '0');
LCD1602_WriteData(humi % 10 + '0');
LCD1602_WriteData('.');
LCD1602_WriteData(dat[1] + '0');
LCD1602_WriteData('%');
}
delay_ms(1000);
}
}
```
该程序通过P1.3引脚读取DHT11传感器的数据,并将读取到的温湿度数据显示在LCD1602液晶显示器上。您可以根据具体需求进行修改和优化。
阅读全文