本次实验就是在上次HC32L136 demo板LCD的实验基础上增加了AM2302温、湿度检测模块,也算是对LCD模块及其它已学习知识进行的一次巩固学习。
一、实验资源
1、HC32L136 demo板;
2、keil 5.28.0.0;
3、HC32L136 SDK支持包;
4、AM2302温、湿度检测模块;
更多资讯请访问https://www.hdsc.com.cn/mcu.htm
二、相关资源简介
1、LCD模块。关于该模块的学习见:HC32L136 demo板 之四、LCD https://bbs.21ic.com/icview-2843444-1-1.html
2、AM2302温、湿度传感器。AM2302较之前大家广泛使用的DHT11温、湿度传感器而言无论是在精度及准确度上要好很多,当然价格也贵了一些。模块是自制的,比较简陋。
三、本次实验
1、硬件连接
AM2302模块接在了HC32L136 demo板的PB08引脚上,离VCC、GND较近,方便连线;
2、程序实现。实验中LCD程序是在上次实验基础上进行了修改,主要是对显示内容进行了调整,AM2302驱动程序来源于网络,我这只是进行了简单的移植。
主要代码如下:
/*************************************************************************
函数功能: 一次完整的数据传输为40bit,高位先出
输入参数: AM2302
返 回 值: 0:读取出错;1:读取成功
说 明:8bit湿度整数 + 8bit湿度小数 + 8bit温度整数 + 8bit温度小数 + 8bit校验和
**************************************************************************/
uint8_t ReadAM2302(AM2302_TypeDef *AM2302)
{
uint8_t temp;
uint16_t hum_temp,tem_temp;
AM2302_OUT(); //将AM2302端口设置为输出模式
AM2302_Port_L(); //将AM2302端口拉低
delay1ms(18); //延时18ms
AM2302_Port_H(); //将AM2302端口拉高,主机延时30us
delay10us(0); //延时30us
delay10us(0);
AM2302_IPU(); //将AM2302端口设置为输入,判断AM2302响应信号*/
if(AM2302_Read_Pin == FALSE) //判断AM2302是否有低电平响应信号,如不响应则跳出,响应则向下运行*/
{
while(AM2302_Read_Pin == FALSE); //等待AM2302发出的80us低电平响应信号结束*/
while(AM2302_Read_Pin == TRUE); //等待AM2302发出的80us高电平标置信号结束*/
AM2302->humH8bit = AM2302_ReadByte(); //接收AM2302返回的数据
AM2302->humL8bit = AM2302_ReadByte();
AM2302->temH8bit = AM2302_ReadByte();
AM2302->temL8bit = AM2302_ReadByte();
AM2302->check = AM2302_ReadByte();
AM2302_OUT(); //读取AM2302返回的数据后将AM2302端口改为输出模式
AM2302_Port_H(); //将AM2302端口置高
hum_temp = AM2302->humH8bit * 256 + AM2302->humL8bit;//处理湿度数据
AM2302->hum = (float)hum_temp * 10; //数据扩大10倍,方便显示
tem_temp = AM2302->temH8bit * 256 + AM2302->temL8bit;//处理温度数据
AM2302->tem = (float)tem_temp * 10; //数据扩大10倍,方便显示
temp = AM2302->humH8bit + AM2302->humL8bit +
AM2302->temH8bit + AM2302->temL8bit;//校验读取的数据
if(AM2302->check == temp)
{
return TRUE;
}
else
return FALSE;
}
else
return FALSE;
}
int32_t main(void)
{
LCD_Config();
AM2302_Init();
//LCD_Display(3579);
//LCD_FullDisp(); //全屏显示
while(1)
{
if(ReadAM2302(&AM2302_DATA) == TRUE)
{
DispHumi(AM2302_DATA.hum);//湿度
delay1ms(2000);
DispTemp(AM2302_DATA.tem);//温度
delay1ms(2000);
}
else
DispError();//错误
}
}
四、实验结果
1、温度
2、湿度
3、传感器错误
五、总结
通过这次实验对LCD模块有了更进一步的认识,接下来继续。
|