DHT11在msp430f5529的驱动程序
时间: 2023-07-30 11:10:44 浏览: 46
以下DHT11在MSP430F5529上的简单驱动程序:
```c
#include <msp430.h>
#define DHT11_DIR P1DIR
#define DHT11_OUT P1OUT
#define DHT11_IN P1IN
#define DHT11_PIN BIT0
void delay_us(unsigned int us)
{
__delay_cycles(us * (F_CPU/1000000));
}
void DHT11_init(void)
{
DHT11_DIR |= DHT11_PIN;
DHT11_OUT |= DHT11_PIN;
delay_us(1000);
}
void DHT11_start(void)
{
DHT11_DIR |= DHT11_PIN;
DHT11_OUT &= ~DHT11_PIN;
delay_us(18000);
DHT11_OUT |= DHT11_PIN;
delay_us(40);
DHT11_DIR &= ~DHT11_PIN;
}
unsigned char DHT11_read_bit(void)
{
unsigned char i=0;
while((DHT11_IN & DHT11_PIN) && i<100) { i++; delay_us(1); }
delay_us(40);
if(DHT11_IN & DHT11_PIN) return 1;
else return 0;
}
unsigned char DHT11_read_byte(void)
{
unsigned char i, data=0;
for(i=0; i<8; i++)
{
data <<= 1;
data |= DHT11_read_bit();
}
return data;
}
void DHT11_read(unsigned char *temp, unsigned char *hum)
{
unsigned char buf[5];
unsigned char i, checksum;
DHT11_start();
if(DHT11_IN & DHT11_PIN) return; // 没有应答信号
for(i=0; i<5; i++) buf[i] = DHT11_read_byte();
checksum = buf[0] + buf[1] + buf[2] + buf[3];
if(checksum != buf[4]) return; // 校验错误
*hum = buf[0];
*temp = buf[2];
}
int main(void)
{
unsigned char temp, hum;
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
DHT11_init();
while(1)
{
DHT11_read(&temp, &hum);
// 处理温湿度数据
__delay_cycles(1000000); // 延时1秒
}
}
```
此驱动程序中,我们使用P1.0口连接了DHT11传感器的数据线。在初始化时,将P1.0口设置为输出状态,输出高电平1ms,然后将其设置为输入状态。在读取数据时,先发送起始信号,再接收40位数据,最后校验数据。读取到的温度和湿度数据存储在temp和hum变量中,可进行相应的处理。