DSP288335采用30M晶振的情况下,进行DHT22温湿度传感器数据读取,部分程序如下:
void COM(void)
{
Uint16 i;
comdata=0;
GpioCtrlRegs.GPADIR.bit.GPIO3=0;
for(i=0;i<8;i++)
{
FLAG=0xFF02;
while((!GpioDataRegs.GPADAT.bit.GPIO3)&&FLAG++);
DELAY_US(10);
DELAY_US(10);
DELAY_US(10);
temp=0;
if(GpioDataRegs.GPADAT.bit.GPIO3)
{
temp=1;
FLAG=0xFF02;
}
while((GpioDataRegs.GPADAT.bit.GPIO3)&&FLAG++);
if(FLAG==0x0001)
break; //判断数据位是0还是1
//如果高电平高过预定0高电平值则数据位为1
comdata<<=1;
comdata|=temp;
}
for(i=0;i<8;i++)
{
comdata<<=1;
}
comdata=comdata&0x00FF;
}
void DHT22_RH(void)
{
GpioCtrlRegs.GPAMUX1.bit.GPIO3=0;//将GPIO设置成普通通用口
GpioCtrlRegs.GPADIR.bit.GPIO3=1;
GpioDataRegs.GPADAT.bit.GPIO3=0;
DELAY_US(600);
GpioDataRegs.GPADAT.bit.GPIO3=1;
DELAY_US(40);
GpioDataRegs.GPADAT.bit.GPIO3=1;
GpioCtrlRegs.GPADIR.bit.GPIO3=0;
if(!GpioDataRegs.GPADAT.bit.GPIO3)
{
FLAG=0xFF02;
while((!GpioDataRegs.GPADAT.bit.GPIO3)&&FLAG++);
FLAG=0xFF02;
while((GpioDataRegs.GPADAT.bit.GPIO3)&&FLAG++);
COM();
RH_data_H_temp=comdata;
COM();
RH_data_L_temp=comdata;
COM();
T_data_H_temp=comdata;
COM();
T_data_L_temp=comdata;
COM();
checkdata_temp=comdata;
GpioCtrlRegs.GPADIR.bit.GPIO3=1;
GpioDataRegs.GPADAT.bit.GPIO3=1;
//数据校检
temp=(T_data_H_temp+T_data_L_temp+RH_data_H_temp+RH_data_L_temp);
if(temp==checkdata_temp)
{
RH_data_H=RH_data_H_temp;
RH_data_L=RH_data_L_temp;
T_data_H=T_data_H_temp;
T_data_L=T_data_L_temp;
checkdata=checkdata_temp;
}
}
DHT22DATA[0]=RH_data_H;//将温湿度数据存储在DHT22DATA中
DHT22DATA[1]=RH_data_L;
DHT22DATA[2]=T_data_H;
DHT22DATA[3]=T_data_L;
}
为什么读出来的数据不正确 |