本次实验就是在上次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模块有了更进一步的认识,接下来继续。 
 
 
  |