msp430g2553+pcf8574+dht11+lcd1602

该博客介绍了如何使用MSP430G2553单片机通过PCF8574 IO扩展模块和IIC通信驱动LCD1602液晶显示器,展示DHT11模块检测到的温湿度数据。涉及到的程序包括DHT11驱动、硬软两种IIC通信方式以及LCD1602显示子程序,并提供了相关头文件和源代码。
摘要由CSDN通过智能技术生成

主要的功能就是利用DHT11模块来温湿度检测,用LCD1602液晶模块来显示。

还用了个PCF8574 IO扩展模块,用来扩展MSP430G2553的IO口,MSP430G2553与PCF8574之间的IIC通信间接去驱动LCD1602液晶模块,一个8位数据分两次传输,先传高4位再传低4位。(特别注意下LCD1602液晶模块V0的接法,自己去查下资料!)

目录

先放硬件连接图

DHT11驱动子程序

DHT11.h

DHT11.c

PCF8574 IO扩展模块的IIC通信子程序

HARD_IIC.h

HARD_IIC.c

SOFT_IIC.h

SOFT_IIC.c

LCD1602液晶显示子程序

LCD1602.h

LCD1602.c

主程序

main.c

工程文件


先放硬件连接图

8fa9f888130d43259b50e0e044f3bef9.png

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( ))
    {
   
  • 11
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值