主要的功能就是利用DHT11模块来温湿度检测,用LCD1602液晶模块来显示。
还用了个PCF8574 IO扩展模块,用来扩展MSP430G2553的IO口,MSP430G2553与PCF8574之间的IIC通信间接去驱动LCD1602液晶模块,一个8位数据分两次传输,先传高4位再传低4位。(特别注意下LCD1602液晶模块V0的接法,自己去查下资料!)
目录
先放硬件连接图
DHT11驱动子程序
模块功能:检测温湿度信息
DHT11.h
#ifndef DHT11_H_
#define DHT11_H_
#include <msp430g2553.h>
#define delay_us(x) __delay_cycles((long)(((double)8000000)*((double)x)/1000000.0))
#define delay_ms(x) __delay_cycles((long)(((double)8000000)*((double)x)/1000.0))
//输出数据P1.5
#define SET_DATA P1OUT |= BIT5 //拉高数据线
#define CLR_DATA P1OUT &= ~BIT5 //拉低数据线
//输入数据P1.5
#define DHT11_DATA (P1IN&BIT5)
//保存数据数组
unsigned char rec_dat[12];
//DHT状态标志
unsigned int dht_sta;
unsigned char DHT11_Check(void);
unsigned char DHT11_ReadByte(void);
void DHT11_ReadDATA(void);
#endif /* DHT11_H_ */
DHT11.c
#include <DHT11.h>
unsigned char buf[5]={0x00,0x00,0x00,0x00,0x00};
unsigned long sum=0;
//检查DHT11是否存在
unsigned char DHT11_Check(void)
{
unsigned int retry=0;
P1DIR |= BIT5 ; //设为输出端口
CLR_DATA ;
delay_ms(20); //拉低至少18ms
SET_DATA ;
delay_us(30); //拉高20-40us
P1DIR &= ~BIT5 ; //设为输入端口
P1REN |= BIT5 ; //启用上下拉电阻
P1OUT |= BIT5 ; //选择上拉电阻
retry=0;
// while(!(P1IN&BIT5));
while((!(P1IN&BIT5))&&(retry<20 )) //等待低电平响应过去
{
retry++;
delay_us(5);
}
if(retry>=20) return 0;
else retry=0;
// while(P1IN&BIT5);
while((P1IN&BIT5)&&(retry<20)) //等待高电平响应过去
{
retry++;
delay_us(5);
}
if(retry>=20) return 0;
else return 1;
}
//接收1Byte数据
unsigned char DHT11_ReadByte(void)
{
unsigned char dat=0;
unsigned int retry=0, i=0, temp=0;
for(i = 0; i<8; i++)
{
retry=0;
// while(!(P1IN&BIT5));
while((!(P1IN&BIT5))&&(retry<20)) //等待50us低电平过去
{
retry++;
delay_us(5);
}
if(retry>=20) break;
delay_us(45); //延时45us
temp=0;
retry=0;
if(P1IN&BIT5) //26~28us表示bit0,70us表示bit1
{
temp=1;
// while(P1IN&BIT5);
while((P1IN&BIT5)&&(retry<20))
{
retry++;
delay_us(5);
}
}
dat <<= 1;
dat |= temp;
}
return dat ;
}
//接收40位数据
void DHT11_ReadDATA(void )
{
unsigned char humidity=0x00, temprature=0x00;
unsigned int i=0, retry=0;
if(DHT11_Check( ))
{