This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP430FR5969:DHT22温度和 HMIDITY 传感器不能准确给出值、但根据 datasheet..please、接收到40个脉冲会报告任何变化

Guru**** 2540720 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/586320/ccs-msp430fr5969-dht22-temperature-and-hmidity-sensor-is-not-giving-values-accurately-but-40-pulses-are-acheiving-as-per-datasheet-please-report-any-changes

器件型号:MSP430FR5969

工具/软件:Code Composer Studio

#include "driverlib.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

void dht22_trigger();
void dht22_input();
void dht22_read();
void clockinit();
void timerinit();

uint32_t clock、count=0、timer_count=0、count_1、count_0;
uint32_t pulsewidth;
uint16_t k=0;
bool high (bool 高);

#define DHT22PORT GPIO_PORT_P1
#define DHT22PIN GPIO_PIN4
#define DHT22_OUTPUT P1DIR |= BIT4//输出方向。
#define DHT22_input P1DIR &=~BIT4//输入方向
#define DHT22_HIGHOUTPUT P1OUT |= BIT4//输出高电平
#define DHT22_LOWOUTPUT P1OUT &=~BIT4//输出低电平
#define INDHT ((P1IN&BIT4)=BIT4)//input =BIT4

无符号 int 温度、湿度;
uint16_t arr[50]={0};
静态 uint16_t i=0;
uint32_t lowtohightransition = 0、count_1;
uint32_t hightolowtransition = 0;

#define TIMER_PERIOD 80

int main (空)

WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
PM5CTL0 &=~LOCKLPM5;
clockinit();
Clock=CS_getSMCLK();
timerinit();
bis_SR_register (GIE);

while (1)

dht22_trigger();
dht22_input();
_delay_cycles (80000);



void clockinit()

//时钟系统设置
CSCTL0_H = CSKEY >> 8;//解锁 CS 寄存器
CSCTL1 = DCOFSEL_6;//将 DCO 设置为8MHz
CSCTL2 = SELA_VLOCLK | SELESS__DCOCLK | SELM_DCOCLK;//设置 SMCLK = MCLK = DCO
// ACLK = VLOCLK
CSCTL3 = DIVA__1 | DIVM_1 | DIVM__1;//将所有分频器设置为1
CSCTL0_H = 0;//锁定 CS 寄存器

空 timerinit()

//以 SMCLK 为源的连续模式中的启动定时器
Timer_B_clearTimerInterrupt (timer_B0_BASE);

Timer_B_initUpModeParam ={0};
param.clockSource = timer_B_CLOCKSOURCE_SMCLK;
param.clockSourceDivider = timer_B_CLOCKSOURCE_divider;
param.timerPeriod = timer_period;
param.timerInterruptEnable_TBIE = Timer_B_TBIE_INTERRUPT_DISABLE;
param.captureCompareInterruptEnable_CCR0_CCIE =
Timer_B_CAPTURECOMPARE 中断_ENABLE;
param.timerClear = timer_B_do_clear;
param.startTimer = false;
Timer_B_initUpMode (timer_B0_BASE、&param);


void dht22_trigger (void)

memset (arr、0、sizeof (arr));
I = 0;
K = 0;
高= false;

DHT22_OUTPUT;
DHT22_HIHOUTPUT;
DHT22_LOWOUTPUT;
_DELAY_CYCLES (8000);//1ms
DHT22_HIHOUTPUT;
_DELAY_CYCLES (240);//30us
DHT22_input;
if (!GPIO_getInputPinValue (GPIO_PORT_P1、GPIO_PIN4))

_delay_cycles (640);//80us


其他

Clock=CS_getSMCLK();

if (GPIO_getInputPinValue (GPIO_PORT_P1、GPIO_PIN4))

_delay_cycles (640);//80us

其他

Clock=CS_getSMCLK();


void dht22_input()

//GPIO_setAsInputPinWithPullDownResistor (DHT22PORT、DHT22PIN);
GPIO_enableInterrupt (DHT22PORT、DHT22PIN);
GPIO_clearInterrupt (DHT22PORT、DHT22PIN);
GPIO_selectInterruptEdge (DHT22PORT、DHT22PIN、GPIO_LOW_TO_HIGH_TRANSITION);

#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=TIMERB0_vector
_interrupt
#Elif defined (_GNU_)
__attribute__((interrupt (TIMERB0_vector))
#endif
空 TIMERB0_ISR (空)

Timer_count++;
pulsewidth++;

#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=Port1_vector
_interrupt
#Elif defined (_GNU_)
__attribute__((interrupt (Port1_vector)))
#endif
空 Port_1 (空)

if (GPIO_getInputPinValue (GPIO_PORT_P1、GPIO_PIN4))

if (HIGH == false)

高=真;
K++;

COUNT_1++;
GPIO_clearInterrupt (GPIO_PORT_P1、GPIO_PIN4);

GPIO_selectInterruptEdge (GPIO_PORT_P1、GPIO_PIN4、GPIO_HIGH_TO_LOW_TRANSITION);
Timer_count = 0;
脉宽= 0;
Timer_B_startCounter (timer_B0_BASE、timer_B_UP_MODE);


其他

if (HIGH == true)

高= false;

Timer_B_STOP (timer_B0_BASE);
Timer_B_CLEAR (TIMER_B0_BASE);

if (脉宽<=3)

arr[i++]=0;

其他

arr[i++]=1;

pulsewidth=0;

//P1.4 IFG 被清零
GPIO_clearInterrupt (GPIO_PORT_P1、GPIO_PIN4);

GPIO_selectInterruptEdge (GPIO_PORT_P1、GPIO_PIN4、GPIO_LOW_TO_HIGH_TRANSITION);


如果(k = 43)

K = 0;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果在确定问题时需要任何帮助、您必须添加调试工作和示波器/逻辑分析仪屏幕截图。 从可用的代码资源看来、P1 ISR 中需要的逻辑比最初提供的值更多: github.com/.../DHT22-MSP430FR5969

    在富格式下使用 SyntaxHighlighter 插入代码也有利于代码可读性。

    此致、
    Ryan