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液晶很容易乱码。。只有这样效果稍稍好点。求大神帮忙解答下。
这是完整工程
谢谢 你的硬件电路怎么接的?
..我大一时候用51写的...楼主可以比对下....话说那个DHT11 我用了一次之后就再不用了....准度太差了....
页:
[1]