在线时间279 小时
UID3181444
注册时间2015-12-8
NXP金币8
TA的每日心情 | 开心 2017-11-15 10:33 |
---|
签到天数: 79 天 [LV.6]常住居民II
金牌会员
- 积分
- 1779
- 最后登录
- 2020-8-22
|
所属团队:济南大学 1209Lab
继上一篇帖子,这一篇主要介绍使用LPC824lite读取温湿度传感器的过程
首先关于温湿度的选型:市面上大致有两种温湿度模块,一种是数字式单总线的,如笔者使用的DHT11
另一种是模拟型的,我也使用过,如AM1001
两者就读取上有区别,其他差别不大。但是我用LPC824的ADC读取AM1001的湿度的时候显示一个定值2.5V,用其他型号的单片机和电压表测量均正常,一直没找到原因,换了3个模块都是这样。最后还是放弃了,选用单总线数字温湿度传感器DHT11,但在移植DHT11的时候,遇到的问题主要是时序的延时要精准,否则读出的数据不对。在经历了这些问题后,笔者终于将温湿度传感器的数据读出来了。
最后附上源代码和DHT11的资料
#include "include.h"
#define TICKRATE_HZ 1000
/*************************************************************************
* 1 2 0 9 电 机 拖 动 实 验 室
* 函数名称:main
* 功能说明:主函数
* 参数说明:无
* 函数返回:无
* 修改时间:2016年11月10日
* 备 注:无
* 作 者:何昌昕
*************************************************************************/
int main(void)
{
uint8_t hum,tem;
SystemCoreClockUpdate();
//Board_Init();
uart_Init(LPC_USART0,115200);
uart_Init(LPC_USART1,115200);
uart_Init(LPC_USART2,9600);
IIC_Init();
BH1750_Init();
SysTick_Config(SystemCoreClock / TICKRATE_HZ);
DHT11_Init();
//IR_SendCmd(LPC_USART2,0x46);
/*Chip_UART_IntEnable(LPC_USART0, UART_INTEN_RXRDY);
NVIC_EnableIRQ(UART0_IRQn);
Chip_UART_IntEnable(LPC_USART1, UART_INTEN_RXRDY);
NVIC_EnableIRQ(UART1_IRQn);
Chip_UART_IntEnable(LPC_USART2, UART_INTEN_RXRDY);
NVIC_EnableIRQ(UART2_IRQn);*/
while(1)
{
DHT11_Read_Data(&tem,&hum);
printf("temp:%d℃ hum:%d%%\r\n",tem,hum);
delay_ms(100);
//uart_ConfirmData();
//printf("%d\r\n",BH1750_GetData());
//uart_PutStr(LPC_USART2,"test\r\n");
}
}
/*----------------------------end of main.c-------------------------------*/
#include "DHT11.h"
#define DHT11_OUT Chip_GPIO_PinSetDIR(LPC_GPIO_PORT, 0, 22, true)
#define DHT11_IN Chip_GPIO_PinSetDIR(LPC_GPIO_PORT, 0, 22, false)
#define DHT11_State Chip_GPIO_PinGetState(LPC_GPIO_PORT, 0, 22)
#define DHT11_High Chip_GPIO_PinSetState(LPC_GPIO_PORT, 0, 22, true)
#define DHT11_Low Chip_GPIO_PinSetState(LPC_GPIO_PORT, 0, 22, false)
/*************************************************************************
* 1 2 0 9 电 机 拖 动 实 验 室
* 函数名称HT11_Init
* 功能说明:初始化DHT11的IO口 DQ 同时检测DHT11的存在
* 参数说明:无
* 函数返回:返回1:不存在 返回0:存在
* 修改时间:2016年5月30日
* 备 注:无
* 作 者:何昌昕
*************************************************************************/
uint8_t DHT11_Init(void)
{
DHT11_OUT;
DHT11_High;
DHT11_Rst();
return DHT11_Check();
}
/*************************************************************************
* 1 2 0 9 电 机 拖 动 实 验 室
* 函数名称HT11_Rst
* 功能说明HT11复位函数
* 参数说明:无
* 函数返回:无
* 修改时间:2016年5月30日
* 备 注:无
* 作 者:何昌昕
*************************************************************************/
void DHT11_Rst(void)
{
DHT11_OUT; //设置输出
DHT11_Low;
delay_ms(20); //拉低至少18ms
DHT11_High;
delay_us(30); //主机拉高20~40us
}
/*************************************************************************
* 1 2 0 9 电 机 拖 动 实 验 室
* 函数名称HT11_Check
* 功能说明:等待DHT11的回应
* 参数说明:无
* 函数返回:返回1:未检测到DHT11的存在 返回0:存在
* 修改时间:2016年5月30日
* 备 注:无
* 作 者:何昌昕
*************************************************************************/
uint8_t DHT11_Check(void)
{
uint8_t retry=0;
DHT11_IN;//SET INPUT
while (DHT11_State&&retry<100)//DHT11会拉低40~80us
{
retry++;
delay_us(1);
};
if(retry>=100)return 1;
else retry=0;
while (!DHT11_State&&retry<100)//DHT11拉低后会再次拉高40~80us
{
retry++;
delay_us(1);
};
if(retry>=100)return 1;
return 0;
}
/*************************************************************************
* 1 2 0 9 电 机 拖 动 实 验 室
* 函数名称HT11_Read_Bit
* 功能说明:从DHT11读取一个位
* 参数说明:无
* 函数返回:返回1:未检测到DHT11的存在 返回0:存在
* 修改时间:2016年5月30日
* 备 注:无
* 作 者:何昌昕
*************************************************************************/
uint8_t DHT11_Read_Bit(void)
{
uint8_t retry=0;
while(DHT11_State&&retry<100)//等待变为低电平
{
retry++;
delay_us(1);
}
retry=0;
while(!DHT11_State&&retry<100)//等待变高电平
{
retry++;
delay_us(1);
}
delay_us(50);//等待40us
if(DHT11_State)return 1;
else return 0;
}
/*************************************************************************
* 1 2 0 9 电 机 拖 动 实 验 室
* 函数名称HT11_Read_Bit
* 功能说明:从DHT11读取一个位
* 参数说明:无
* 函数返回:返回1:未检测到DHT11的存在 返回0:存在
* 修改时间:2016年5月30日
* 备 注:无
* 作 者:何昌昕
*************************************************************************/
uint8_t DHT11_Read_Byte(void)
{
uint8_t i,dat;
dat=0;
for (i=0;i<8;i++)
{
dat<<=1;
dat|=DHT11_Read_Bit();
}
return dat;
}
/*************************************************************************
* 1 2 0 9 电 机 拖 动 实 验 室
* 函数名称HT11_Read_Data
* 功能说明:从DHT11读取一次数据
* 参数说明:无
* 函数返回:返回值:0,正常;1,读取失败
* 修改时间:2016年5月30日
* 备 注:temp:温度值(范围:0~50°) humi:湿度值(范围:20%~90%)
* 作 者:何昌昕
*************************************************************************/
uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi)
{
uint8_t buf[5];
uint8_t i;
DHT11_Rst();
if(DHT11_Check()==0)
{
for(i=0;i<5;i++)//读取40位数据
{
buf=DHT11_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
*humi=buf[0];
*temp=buf[2];
}
}else return 1;
return 0;
}
/*************************************************************************
* 1 2 0 9 电 机 拖 动 实 验 室
* 函数名称:delay_us
* 功能说明:微秒粗延时函数
* 参数说明:time:延时时间,单位:us
* 函数返回:无
* 修改时间:2016年5月30日
* 备 注:无
* 作 者:何昌昕
*************************************************************************/
void delay_us(uint16_t us)
{
uint16_t i=0;
while(us--)
{
i=2;
while(i--);
}
}
/*************************************************************************
* 1 2 0 9 电 机 拖 动 实 验 室
* 函数名称:delay_ms
* 功能说明:毫秒延时函数
* 参数说明:time:延时时间,单位:ms
* 函数返回:无
* 修改时间:2016年5月30日
* 备 注:无
* 作 者:何昌昕
*************************************************************************/
void delay_ms(uint16_t ms)
{
uint16_t i=0;
while(ms--)
{
i=2000;
while(i--);
}
}
/*----------------------------end of DHT11.c-------------------------------*/
DHT11模块资料.zip
(3.09 MB, 下载次数: 4)
|
|