程序源码如下:
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 timer UCSCTL3 = 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了,求助各位大神!!