最近在用DHT11写一个温湿度检测模块,但是不管怎么调试都不能正常运行,实在想不出解决办法,希望各位大佬帮忙解决一下我的问题
硬件:oeld,msp430f5529,DHT11
代码:
代码头部分:
#include <msp430f5529.h>
#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();
}
此帖出自
小平头技术问答
一周热门 更多>