希望各位大佬能帮忙解决我在温湿度检测程序中始终无法正常运行的问题

2019-03-24 08:14发布

最近在用DHT11写一个温湿度检测模块,但是不管怎么调试都不能正常运行,实在想不出解决办法,希望各位大佬帮忙解决一下我的问题
硬件:oeld,msp430f5529,DHT11

代码:
代码头部分:
#include <msp430f5529.h>
#include "oled.h"
#define CPU_F ((double)24000000)//CPU主频 MCLK=24MHz,请注意修改和系统时钟频率一致
#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)) //毫秒
u8 DHT11T_Data_H,TH;//8位温度整数数据
u8 DHT11T_Data_L,TL;//8位温度小数数据
u8 DHT11H_Data_H,HH;//8位湿度整数数据
u8 DHT11H_Data_L,HL;//8位湿度小数数据
u8 Check_Data;//8位检验和数据
/*引脚定义 */
#define  DHT11_OUTPUT P2DIR|=BIT0 //MCU输出
#define DHT11_INPUT P2DIR&=~BIT0 //MCU输入
#define DHT11_H P2OUT|=BIT0 //端口输出高电平
#define DHT11_L P2OUT&=~BIT0 //端口输出低电平
#define DHT11_IN (P2IN&BIT0) //用于判断MUC输入电平

DHT11部分:
u8 Read_Byte(void)
{
u8 num=0,i,Byte=0;
for(i=0;i<8;i++)
{
  num=0;
  while(!(DHT11_IN));//等待1bit的开始
  delay_us(35);
  if(DHT11_IN)
  {
   num=1;
   while((DHT11_IN));//等待下一位bit开始
  }
  Byte|=num;
  Byte<<=1;//向右移动一位
}
return Byte;
}
void Check(void)
{
u8 temp;
temp=DHT11T_Data_H+DHT11T_Data_L+DHT11H_Data_H+DHT11H_Data_L;//数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据 +8bi温度整数数据+8bit温度小数数据”所得结果的末8位
if(temp==Check_Data)
{
  TH=DHT11T_Data_H;
  TL=DHT11T_Data_L;
  HH=DHT11H_Data_H;
  HL=DHT11H_Data_L;
}
};
void DHT11_Init(void)
{
DHT11_OUTPUT;
DHT11_L;
delay_ms(18);//主机拉低至少20ms
DHT11_H;
delay_us(30);//主机拉高20-40us
DHT11_INPUT;//端口设置为输入
delay_us(10);
if(!(DHT11_INPUT))
{
  while(!(DHT11_INPUT));//等待电平拉高
  while(DHT11_INPUT);//等待电平拉低
  /*数据读取*/
  DHT11H_Data_H=Read_Byte();
  DHT11H_Data_L=Read_Byte();
  DHT11T_Data_H=Read_Byte();
  DHT11T_Data_L=Read_Byte();
  Check_Data=Read_Byte();
}
}

时钟:ACLK部分:24MHZ
void sys_clk_init(void)
{
P5SEL|=BIT2|BIT3;//打开XT2引脚
P5SEL|=BIT4|BIT5;//打开xt1引脚
UCSCTL6&=~XT2OFF;//打开XT2
UCSCTL3|=SELREF_5;//fll参考信号选择xt2
__bis_SR_register(SCG0);//关闭FLL
UCSCTL0=0X0000;
UCSCTL1=DCORSEL_7;//频率范围选择
UCSCTL2=5;//DCO:(5+1)*4=24MHZ;
     //DCOFDIV:24/1=24MHZ
__bic_SR_register(SCG0);//启用fll
__delay_cycles(5000);//延时等待稳定
do
{
  UCSCTL7&=~(XT2OFFG+XT1LFOFFG+DCOFFG);
  SFRIFG1&=~OFIFG;
}while(SFRIFG1&OFIFG);
}

main部分;
OLED_Init();
OLED_Clear();
OLED_Display_On();
OLED_ShowCHinese(10,2,1);
OLED_ShowCHinese(26,2,2);
OLED_ShowCHinese(10,4,3);
OLED_ShowCHinese(26,4,4);
sys_clk_init();//24MHZ
while(1)
{
  DHT11_Init();
  Check();
  oled_show();
}


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
ienglgge
2019-03-24 22:44
 精彩回答 2  元偷偷看……0人看过

一周热门 更多>

相关问题

    相关文章