打印

基于MSP430F552912864上显示dht的数据,遇到了些问题

[复制链接]
1314|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
main.c文件
#include <msp430.h> 
#include "Config.h"

typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable      无符号8位整型变量  */
typedef signed   char  S8;       /* defined for signed 8-bits integer variable        有符号8位整型变量  */
typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable     无符号16位整型变量 */
typedef signed   int   S16;      /* defined for signed 16-bits integer variable       有符号16位整型变量 */
typedef unsigned long  U32;      /* defined for unsigned 32-bits integer variable     无符号32位整型变量 */
typedef signed   long  S32;      /* defined for signed 32-bits integer variable       有符号32位整型变量 */
typedef float          F32;      /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
typedef double         F64;      /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */

#define uchar unsigned char
#define uint unsigned int

//***********************************************************************
//  DHT11温湿度数据存储变量定义
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//----湿度高8位== U8RH_data_H-----
//----湿度低8位== U8RH_data_L-----
//----校验 8 位 == U8checkdata-----
//***********************************************************************
U8  U8FLAG,k;
U8  U8count,U8temp;
U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8  U8comdata;

//延时函数
void  Delay_10us(void)
{
  delay_us(10);
}

//响应函数
void COM(void)
{
  U8 i;
  DHT_IN;
  for(i=0;i<8;i++)
  {
    U8FLAG=2;
    while((!DHT_R) && U8FLAG++);
    Delay_10us();
    Delay_10us();
    Delay_10us();
    U8temp=0;
    if(DHT_R)
        U8temp=1;
    U8FLAG=2;
    while((DHT_R) && U8FLAG++);
    //超时则跳出for循环
    if(U8FLAG==1)
        break;
    //判断数据位是0还是1
    // 如果高电平高过预定0高电平值则数据位为 1
    U8comdata<<=1;
    U8comdata|=U8temp;        //0
  }
}

//温湿度读取函数
void RH(void)
{
      //主机拉低18ms
      DHT_OUT;
      DHT_CLR;
      delay_ms(18);
      DHT_SET;
      //总线由上拉电阻拉高 主机延时20us
      Delay_10us();
      Delay_10us();
      //主机设为输入 判断从机响应信号
      DHT_SET;
      //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
      DHT_IN;
      if(!DHT_R)
      {
      U8FLAG=2;
      //判断从机是否发出 80us 的低电平响应信号是否结束
      while((!DHT_R)&&U8FLAG++);
      U8FLAG=2;
      //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
      while((DHT_R)&&U8FLAG++);
      //数据接收状态
      COM();
      U8RH_data_H_temp=U8comdata;
      COM();
      U8RH_data_L_temp=U8comdata;
      COM();
      U8T_data_H_temp=U8comdata;
      COM();
      U8T_data_L_temp=U8comdata;
      COM();
      U8checkdata_temp=U8comdata;
      DHT_OUT;
      DHT_SET;
      //数据校验
      U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
      if(U8temp==U8checkdata_temp)
      {
          U8RH_data_H=U8RH_data_H_temp;
          U8RH_data_L=U8RH_data_L_temp;
          U8T_data_H=U8T_data_H_temp;
          U8T_data_L=U8T_data_L_temp;
          U8checkdata=U8checkdata_temp;
       }
       }

}

//液晶显示温度值,xx.xC格式
void LCD_DisplayTemp(void)
{
  LCD_write_char(0x00,0,0x30+U8T_data_H/10);
  LCD_write_char(0x01,0,0x30+U8T_data_H%10);
  LCD_write_char(0x02,0,'.');
  LCD_write_char(0x03,0,0X30+U8T_data_L);
  LCD_write_char(0x04,0,'C');
}

//液晶显示湿度度值,xx.x%格式
void LCD_DisplayRH(void)
{
  LCD_write_char(0x00,1,0x30+U8RH_data_H/10);
  LCD_write_char(0x01,1,0x30+U8RH_data_H%10);
  LCD_write_char(0x02,1,'.');
  LCD_write_char(0x03,1,0X30+U8RH_data_L);
  LCD_write_char(0x04,1,'%');
}


//初始化IO口子程序
void Port_init()
{

        P3SEL = 0x00;
        P3DIR = 0xFF;                   //数据口输出模式
        P2SEL = 0x00;
        P2DIR|= BIT0 + BIT2 + BIT4;     //控制口设置为输出模式
}

//***********************************************************************
//  显示屏命令写入函数
//***********************************************************************
void LCD_write_com(unsigned char com)
{
    RS_CLR;
    RW_CLR;
    EN_SET;
    DataPort = com;                 //命令写入端口
    delay_ms(5);
    EN_CLR;
}

//***********************************************************************
//  显示屏数据写入函数
//***********************************************************************
void LCD_write_data(unsigned char data)
{
    RS_SET;
    RW_CLR;
    EN_SET;
    DataPort = data;                //数据写入端口
    delay_ms(5);
    EN_CLR;
}

//***********************************************************************
//  显示屏清空显示
//***********************************************************************
void LCD_clear(void)
{
    LCD_write_com(0x01);            //清屏幕显示
    delay_ms(5);
}

//***********************************************************************
//  显示屏字符串写入函数
//***********************************************************************
void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s)
{

    if (y == 0)
    {
        LCD_write_com(0x80 + x);        //第一行显示
    }
    else if(y==1)
    {
        LCD_write_com(0x90 + x);
    }else if(y==2)
    {
        LCD_write_com(0x88 + x);        //第三行显示
    }else if(y==3)
    {
        LCD_write_com(0x98 + x);
    }

    while (*s)
    {
        LCD_write_data( *s);
        s++;
        delay_ms(5);
    }
}

//***********************************************************************
//  显示屏单字符写入函数
//***********************************************************************
void LCD_write_char(unsigned char x,unsigned char y,unsigned char data)
{

    if (y == 0)
    {
        LCD_write_com(0x93 + x);        //第一行显示
    }
    else
    {
        LCD_write_com(0x8B + x);        //第二行显示
    }

    LCD_write_data(data);
}

//***********************************************************************
//  显示屏初始化函数
//***********************************************************************
void LCD_init(void)
{
    LCD_write_com(0x38);        //显示模式设置
    delay_ms(5);
    LCD_write_com(0x08);        //显示关闭
    delay_ms(5);
    LCD_write_com(0x01);        //显示清屏
    delay_ms(5);
    LCD_write_com(0x06);        //显示光标移动设置
    delay_ms(5);
    LCD_write_com(0x0C);        //显示开及光标设置
    delay_ms(5);
}

//***********************************************************************
//      液晶显示界面初始化
//***********************************************************************
void LCD_Desk(void)
{
  LCD_clear();
  LCD_write_str(0,0,"你好哇!");
  LCD_write_str(0,1,"温度:");
  LCD_write_str(0,2,"湿度:");
  LCD_write_str(0,3,"再见啦!");
  delay_ms(50);
}


//***********************************************************************
//      主程序
//***********************************************************************
void main(void)
{
    uchar j;

    WDT_Init();                         //看门狗设置
    Clock_Init();                       //系统时钟设置
    Port_init();                        //系统初始化,设置IO口属性
    delay_ms(100);                      //延时100ms
    LCD_init();                         //液晶参数初始化设置
    LCD_clear();                        //清屏



    while(1)
    {
        RH();//调用温湿度读取函数
        LCD_Desk();
        for(j=0;j<30;j++)
        {
            LCD_DisplayTemp();                 //温度显示到液晶屏
            LCD_DisplayRH();
        }
    }
}

相关帖子

沙发
chenykoo|  楼主 | 2017-3-24 13:00 | 只看该作者
config.h
#define CPU_F   ((double)8000000)       //外部高频晶振8MHZ
//#define CPU_F ((double)32768)         //外部低频晶振32.768KHZ
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

//自定义数据结构,方便使用
#define uchar   unsigned char
#define uint    unsigned int
#define ulong   unsigned long

//12864液晶控制管脚
#define RS_CLR          P2OUT &= ~BIT0           //RS置低
#define RS_SET          P2OUT |=  BIT0           //RS置高
#define RW_CLR          P2OUT &= ~BIT2           //RW置低
#define RW_SET          P2OUT |=  BIT2           //RW置高
#define EN_CLR          P2OUT &= ~BIT4           //E置低
#define EN_SET          P2OUT |=  BIT4           //E置高
#define DataDIR         P3DIR                     //数据口方向
#define DataPort        P3OUT                     //P4口为数据口

//12864应用指令集
#define CLEAR_SCREEN    0x01                    //清屏指令:清屏且AC值为00H
#define AC_INIT         0x02                    //将AC设置为00H。且游标移到原点位置
#define CURSE_ADD       0x06                    //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)
#define FUN_MODE        0x30                    //工作模式:8位基本指令集
#define DISPLAY_ON      0x0c                    //显示开,显示游标,且游标位置反白
#define DISPLAY_OFF     0x08                    //显示关
#define CURSE_DIR       0x14                    //游标向右移动:AC=AC+1
#define SET_CG_AC       0x40                    //设置AC,范围为:00H~3FH
#define SET_DD_AC       0x80                    //设置DDRAM AC
//#define FUN_MODEK       0x36                    //工作模式:8位扩展指令集

//DHT11控制脚,单脚控制
#define DHT_IN          P1DIR &= ~BIT4          //设置输入
#define DHT_OUT         P1DIR |= BIT4           //设置输出
#define DHT_CLR         P1OUT &= ~BIT4          //置低电平
#define DHT_SET         P1OUT |= BIT4           //置高电平
#define DHT_R           (P1IN & BIT4)           //读电平

//***********************************************************************
//                   系统时钟初始化,外部8M晶振
//***********************************************************************

void Clock_Init()
{
      UCSCTL1 = DCORSEL_2;                             //  设置DCO范围
      UCSCTL3 |= SELREF_2;                             //  选择FLL参考源自REFO
      UCSCTL4 = SELM_3 + SELA_2 + SELS_4;              //  配置 MCLK = DCOC,SMCLK =DCODIV,ACLK=REFO
      while (SFRIFG1 & OFIFG)                          //  清除 OFIFG,and  XT1OFFG ,DCOFFG
        {
          UCSCTL7 &= ~(  XT1LFOFFG + DCOFFG);
          SFRIFG1 &= ~OFIFG;
        }
}

/*
//***********************************************************************
//                   系统时钟初始化,内部RC晶振
//***********************************************************************
void Clock_Init_Inc()
{

  DCOCTL = 0x60 + 0x00;                       //DCO约3MHZ,3030KHZ
  BCSCTL1 = DIVA_0 + 0x07;
  BCSCTL2 = SELM_2 + DIVM_0 + SELS + DIVS_0;
}

//***********************************************************************
//                   系统时钟初始化,外部32.768K晶振
//***********************************************************************

void Clock_Init_Ex32768()
{
  uchar i;

  BCSCTL2|=SELM1 + SELM0 + SELS;    //MCLK为32.768KHZ,SMCLK为8MHZ
  do{
    IFG1&=~OFIFG;                   //清楚振荡器错误标志
    for(i=0;i<100;i++)
       _NOP();
  }
  while((IFG1&OFIFG)!=0);           //如果标志位1,则继续循环等待
  IFG1&=~OFIFG;
}
*/

//***********************************************************************
//               MSP430内部看门狗初始化
//***********************************************************************
void WDT_Init()
{
   WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗
}

使用特权

评论回复
板凳
chenykoo|  楼主 | 2017-3-24 13:01 | 只看该作者

使用特权

评论回复
地板
dirtwillfly| | 2017-3-24 14:45 | 只看该作者
楼主有什么问题?

使用特权

评论回复
5
chenykoo|  楼主 | 2017-3-24 21:41 | 只看该作者
dirtwillfly 发表于 2017-3-24 14:45
楼主有什么问题?

DHT11读不到数据,只显示0.液晶屏是正常工作的,帮看看代码哪里出问题了,新手求带

使用特权

评论回复
6
dirtwillfly| | 2017-3-24 21:55 | 只看该作者
估计是读取dht11的时序有问题,建议先观察一下时序

使用特权

评论回复
7
chenci2013| | 2017-3-24 22:13 | 只看该作者

使用特权

评论回复
8
chenykoo|  楼主 | 2017-3-25 10:29 | 只看该作者
dirtwillfly 发表于 2017-3-24 21:55
估计是读取dht11的时序有问题,建议先观察一下时序

好滴,我去看看,谢谢

使用特权

评论回复
9
youtome| | 2017-3-25 22:31 | 只看该作者
你测量过信号怎么样

使用特权

评论回复
10
youtome| | 2017-3-25 22:33 | 只看该作者
11
soodesyt| | 2017-3-26 21:30 | 只看该作者
dht芯片没有问题吗?

使用特权

评论回复
12
soodesyt| | 2017-3-26 21:33 | 只看该作者
看看时序是不是读写存在问题。

使用特权

评论回复
13
summertom| | 2018-4-9 10:22 | 只看该作者
楼主,我也遇到了相似的问题,请问楼主怎么解决的?

使用特权

评论回复
14
dirtwillfly| | 2018-4-9 20:53 | 只看该作者
summertom 发表于 2018-4-9 10:22
楼主,我也遇到了相似的问题,请问楼主怎么解决的?

这类情况大部分是时序问题,建议用逻辑分析仪观察一下时序

使用特权

评论回复
15
summertom| | 2018-4-9 22:49 | 只看该作者
dirtwillfly 发表于 2018-4-9 20:53
这类情况大部分是时序问题,建议用逻辑分析仪观察一下时序

没有逻辑分析仪,怎么办~

使用特权

评论回复
16
dirtwillfly| | 2018-4-10 08:14 | 只看该作者
summertom 发表于 2018-4-9 22:49
没有逻辑分析仪,怎么办~

有带存储的示波器也可以

使用特权

评论回复
17
4399ok| | 2020-10-3 13:06 | 只看该作者
有实物的连接图吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝