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

