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

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

代码:
代码头部分:
#include
#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)

不能正常运行有很多种可能。你需要分析原因。先检查硬件是否正常。如果是自己做的板。原理图,pcb,焊接都得检查。结合手册分析。
程序方面,看时序。测波形。和手册的协议对比。逐步排查。
点赞  2018-2-26 13:05
引用: ienglgge 发表于 2018-2-26 13:05
不能正常运行有很多种可能。你需要分析原因。先检查硬件是否正常。如果是自己做的板。原理图,pcb,焊接都 ...

硬件方面应该都没问题,都是用的现成的。
我在单步调试软件的时候,发现只要把系统系统时钟MCLK(sys_clk_init())设置好以后,在跳入OLED(OLED_Display_On();)的时候就会卡死,很不解。
点赞  2018-2-26 14:09
引用: ienglgge 发表于 2018-2-26 13:05
不能正常运行有很多种可能。你需要分析原因。先检查硬件是否正常。如果是自己做的板。原理图,pcb,焊接都 ...

硬件方面应该都没问题,都是用的现成的。
我在单步调试软件的时候,发现只要把系统系统时钟MCLK(sys_clk_init())设置好以后,在跳入OLED(OLED_Display_On();)的时候就会卡死,很不解。
点赞  2018-2-26 14:10
引用: xiao菜鸡 发表于 2018-2-26 14:09
硬件方面应该都没问题,都是用的现成的。
我在单步调试软件的时候,发现只要把系统系统时钟MCLK(sys_cl ...

在跳入OLED(OLED_Display_On();)的时候就会卡死,那你就分析这个函数。看看都执行了什么内容,在哪个地方出了问题。
点赞  2018-2-27 13:23
引用: ienglgge 发表于 2018-2-27 13:23
在跳入OLED(OLED_Display_On();)的时候就会卡死,那你就分析这个函数。看看都执行了什么内容,在哪个地 ...

卡死问题已经解决了,谢谢您的回复
点赞  2018-2-27 17:10
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复