568581185 发表于 2013-5-10 18:40:22

430驱动DHT11 失败,求指点

搞了一天了,下面是程序,麻烦各位大神帮忙看看#include "msp430x14x.h"
#include "Dht11.h"
typedef unsigned charU8;       /* defined for unsigned 8-bits integer variable           无符号8位整型变量*/
typedef signed   charS8;       /* 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 longU32;      /* defined for unsigned 32-bits integer variable           无符号32位整型变量 */
typedef signed   longS32;      /* 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位长度) */
//

//===============================================================================
U8U8temp;
U8U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;


char receive(void)               //接受函数
{
char tem,cnt=0;                      //临时变量用于存储接受数据
while(cnt<8)
{
while(!(P3IN&BIT0));            //等待50us的低电平结束
DelayNus(45);
if(P3IN&BIT0)                     //长于30us定义为1
{
    tem++;                     
    tem<<=1;
    while(P3IN&BIT0);             //结束高电平
}
else
{
    tem<<=1;
}
if(cnt!=7)
    while(!(P3IN&BIT0));            //最后一次给函数返回留下时间
cnt++;
}
return tem;
}
void RH(void)
{
LOW;
DelayNus(18000);
HIGH;
DelayNus(30);
P3DIR&=~BIT0;
while(P3IN&BIT0);

while(!(P3IN&BIT0));
while(P3IN&BIT0);
//Data comes
U8RH_data_H=receive();
U8RH_data_L=receive();
U8T_data_H=receive();
U8T_data_L=receive();
U8checkdata_temp=receive();
U8checkdata=U8RH_data_H+U8RH_data_L+U8T_data_H+U8T_data_L;
if(U8checkdata_temp==U8checkdata)
{
    //LPM0;
}
}
#include <msp430x14x.h>
#include "ds1302.h"
#include "DS18B20.h"
#include "Cry12864.h"
#include "Keypad.h"
#include "Dht11.h"

#define uchar unsigned char
#define uint unsigned int

//要显示的6位温度数字
//顺序:秒,分,时,日,月,星期,年;格式:BCD
uchar times={00,00,20,9,5,4,13};
uchar time_buf;
uchar num=0;
uchar Rh_num=0;
uchar temp_flag=0;

void ShowTime(void);

void main(void)
{
    uchar i;
    uchar tmp;
    WDTCTL = WDTPW + WDTHOLD;    //关狗
   /*------选择系统主时钟为8MHz-------*/
    BCSCTL1 &= ~XT2OFF;               //打开XT2高频晶体振荡器
    do
    {
      IFG1 &= ~OFIFG;               //清除晶振失败标志
      for (i = 0xFF; i > 0; i--);   //等待8MHz晶体起振
    }
    while ((IFG1 & OFIFG));             //晶振失效标志仍然存在?
    BCSCTL2 |= SELM_2 + SELS;         //MCLK和SMCLK选择高频晶振
   
    //设置DS18B20的IO状态
    P6DIR |= BIT5;
    P6OUT |= BIT5;
    //计数时钟选择SMLK=8MHz,1/8分频后为1MHz
    TACTL |= TASSEL_2 + ID_3;
    TBCCTL0 = CCIE;                           // TBCCR0 interrupt enabled
    TBCCR0 = 65000-1;
    TBCTL = TBSSEL_2 + MC_1;                  // SMCLK, upmode
   
    //打开全局中断
    _EINT();

    Ini_Lcd();                  //初始化液晶
    Reset_DS1302();
   
    for(i=0;i<7;i++)
    {         //BCD处理
      tmp=times/10;
      time_buf=times%10;
      time_buf=time_buf+tmp*16;
    }
    Set_DS1302(time_buf);
    while(1)
    {
       Get_DS1302(times);
       if(Rh_num==221)   RH();
    }
   
}

/*******************************************
函数名称:ShowTime
功    能:将DS1302的时间转换成10进制显示
参    数:无
返回值:无
********************************************/   
void ShowTime(void)
{
   
   
    Write_Cmd(0x80);
    Write_Data((times>>4)+0x30);//时
    Write_Data((times&0x0f)+0x30);
    Write_Data(0x3a);
    Write_Data((times>>4)+0x30);//分
    Write_Data((times&0x0f)+0x30);
    Write_Data(0x3a);
    Write_Data((times>>4)+0x30);//秒
    Write_Data((times&0x0f)+0x30);

}


#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B (void)
{
   num++;
   Rh_num++;
   if(num==100)
   {
      Disp_Numb(Do1Convert());
      num=0;
      
      
   }
   if(Rh_num==221)
   {
   
      Rh_num=0;
   }
if((Rh_num==1)||(Rh_num==200)||(Rh_num==100))
   {
      Write_Cmd(0x90);
      Write_Data((uchar)(U8RH_data_H/10)+0x30);
      Write_Data((uchar)(U8RH_data_H%10)+0x30);
   
   }
   if(num==40)
   {
   
   ShowTime();//显示时间
   }
   
   if(num==54)//显示温度
   {
      
      Write_Cmd(0x88);
      Write_Data(dN+0x30);
      Write_Data(dN+0x30);
      Write_Data(0x2e);//0x2e是小数点对应的ASCII码值
      Write_Data(dN+0x30);
      Write_Data(dN+0x30);
      Write_Data(dN+0x30);
      Write_Data(dN+0x30);
      Write_Data(' ');
      Disp_HZ(0x8c,"度",1);
   }

}
在定时器里对时间和温度进行显示的,同时放在主程序的话,12864液晶很容易乱码。。只有这样效果稍稍好点。求大神帮忙解答下。
这是完整工程

谢谢

守望者2012 发表于 2013-5-24 00:35:12

你的硬件电路怎么接的?

sxliujin 发表于 2013-5-25 23:26:27

..我大一时候用51写的...楼主可以比对下....话说那个DHT11 我用了一次之后就再不用了....准度太差了....
页: [1]
查看完整版本: 430驱动DHT11 失败,求指点