程序源码如下:
1.main.c
#include <msp430.h> #include <stdio.h> #include "DTH11.h" #include "oled.h" unsigned char tem[10], hum[10]; int main(void) {WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timerUCSCTL3 = SELREF_2; //设置FLL的参考时钟源为REFOCLK 典型值为32768Hz /*配置FLL分频倍频系数*/ __bis_SR_register(SCG0); //禁止FLL UCSCTL1 = DCORSEL_5; //设置DCO频率范围 UCSCTL2 |= 762; //设置DCO频率为25MHz UCSCTL2用于设置FLL分频、倍频系数 //计算公式: (762 + 1) * 32768 = 25MHz UCSCTL2 |= FLLD_0; __bic_SR_register(SCG0); //启动FLL DTH11_Initial(); OLED_Init(); /*Use for debug*/ P8DIR |= BIT1; P8OUT |= BIT1; while(1) { RH(); OLED_ShowString(16,0,"DTH11 TEST"); sprintf (tem, "Tem : %d", U8T_data_H); OLED_ShowString(0,2,tem); sprintf (hum, "Hum : %d", U8RH_data_H); OLED_ShowString(0,4,hum); Delay_100us(10000); } }
2.DTH11.c
#include "DTH11.h" /*GLOBAL VARIBALE*/ unsigned char U8FLAG; unsigned char U8temp; unsigned char U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata; unsigned char U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp; unsigned char U8comdata = 0; void DTH11_Initial() { P2DIR |= BIT0; P2OUT |= BIT0; } void Delay_100us(unsigned int i) { unsigned int j; for (; i > 0; i--) for (j = 0; j < 347; j++); } void Delay_10us() { unsigned char i = 53; for(;i > 0; i--); } void COM(void) { unsigned char i; for(i=0;i<8;i++) { U8FLAG=2; while((!(P2_0IN))&&U8FLAG++); Delay_10us(); Delay_10us(); Delay_10us(); U8temp=0; if(P2_0IN)U8temp=1; U8FLAG=2; while((P2_0IN)&&U8FLAG++); if(U8FLAG==1)break; U8comdata <<= 1; U8comdata |= U8temp; } } void RH(void) { unsigned int i, j; P2_0L; for (i = 180; i > 0; i--) for (j = 0; j < 347; j++); // P2_0H; Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us(); if(!(P2_0IN)) { U8FLAG=2; while((!P2_0IN)&&U8FLAG++); U8FLAG=2; while((P2_0IN)&&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; //P2_0设为输出 P2_0H; 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; }//fi }//fi }
3.DTH11.h
#ifndef SRC_DTH11_H_ #define SRC_DTH11_H_ #include <msp430f5529.h> #define P2_0L (P2OUT &= ~BIT0) #define P2_0H (P2OUT |= BIT0) #define P2_0IN (P2IN & BIT0) void DTH11_Initial(); void Delay_100us(unsigned int i); void Delay_10us(); void COM(void); void RH(void); extern unsigned char U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata; #endif
在查看寄存器的时候,无论经过多少遍循环,打个断点停下来,发现所有的变量的value都是“.”,截图如下:
逻辑分析仪测到的数字波形如下:
对比数据手册后,发现数据是对的,就是单片机对读到的数据不对,变量的值不会改变。
比如我将断点打在
U8FLAG=2;
while((!(P2_0IN))&&U8FLAG++);
上面的那行,执行以后,看变量U8FLAG的变量依然是没有,值也不显示,现在没办法DEBUG了,求助各位大神!!
灰小子:
用的是DHT11吧?
硬件链接有没有问题?或者换一个DHT11试试
Retrdxt:
回复 灰小子:
嗯,是的,不是DTH11硬件的问题吧,我逻辑分析仪都能够采出来序列呀~
大腿你那里有没有5529驱动DTH11的Project呀?或者能不能帮我调试一下呀~
Retrdxt:
回复 灰小子:
还有一段OLED的代码我没加进去,我觉得问题不大,寄存器里读出来的数据都没有,所以我没办法Debug了。
HG:
如果是“.”,右击Value那里的点,重新选择数据格式看看
zefeng Pan:
这个问题真的好难 你解决了吗,我挺想知道怎么回事的,可否说说
灰小子:
回复 zefeng Pan:
这类问题没有太好的办法,建议用逻辑分析仪观察时序,然后和手册里的时序对比
zefeng Pan:
都不能再2.1口采集到波形
zefeng Pan:
回复 灰小子:
用5529LP的板子设置,都不能用示波器在P2.1口子采集到波形,是不是意味着程序设置2.1时就有问题啊?设置成2.2可以吗