[活动专区] 8003硬件板+(五)温湿度测试仪PDC401+AM2302

[复制链接]
268|5
 楼主 | 2018-10-5 15:58 | 显示全部楼层 |阅读模式
本帖最后由 lisingch 于 2018-10-5 16:09 编辑

       这个温湿度测试仪以SC92F8003作为主控MCU,对AM2302采集的室内温、湿度数据进行处理,并驱动4位液晶显示模块PDC401分时显示温、湿度数据。温度显示为“XX.X口”;湿度显示为“XX.XH”;AM2302故障时显示为“Erro”。电源采用3节“AAA”电池供电,本打算设置为“IDLE”或者“STOP”工作方式减少电池消耗,便于长时间待机。最后考虑只是短暂室内温、湿度测试,便选用了通过开关控制,需要测试时打开电源开关,测试完成后即可切断电源。下面是整体实验过程:
一、实验环境及资源
1、Keil MDK51 9.59
2、SC-LINK
3、SC92F8003的DEMO硬件板
4、PDC401模块
5、AM2302模块

二、硬件
1、PDC401模块。该模块采用HD44100控制,可显示4位数字,字符高度与0.56数码管相近,模块整体外围尺寸为:35*60。模块与外部通过4位2.54的排针相连,即:Pin1 GND、Pin2 CLK、Pin3 DI、Pin4 VCC。手里没有模块的资料,有两份HD44100的,有兴趣的可以看看;(详附件)


2、AM2302温、湿度传感器。这个也叫DHT22,比之前的DHT11性能要好,体积也大,当然价格也相对贵一些;(资料详附件)


3、PCB。PCB采用Sprint-Layout 6.0 绿色汉化版绘制,尺寸同PDC401;(资料详附件)


4、电源。电源采用带开关三节“AAA”电池盒,其宽尺寸较PDC401稍大一点。成品采用三层结构,PCB与PDC401通过两只15mm铜柱连接;PCB背面用胶与电池合粘结;


三、软件
1、PDC401驱动。程序比较简单,主要是对HD44100的操控。另外为了显示温度、湿度以及错误“Erro”写了三个显示函数,不知有没有更好的处理办法?请朋友们指教!
  1. /******************************************************
  2. 函数功能: 显示温度
  3. 输入参数: temp
  4. 返 回 值: 无
  5. 说    明:最后一位显示温度标志“口”
  6. ******************************************************/
  7. void DispTemp(unsigned int temp)
  8. {
  9.         unsigned char w1,w2,w3;
  10.         w1 = temp / 100;
  11.         w2 = temp % 100 / 10;
  12.         w3 = temp % 10;
  13.         
  14.         WriteBuf();

  15.         DispBuff[0]= tab[w1];
  16.         DispBuff[1]= tab[w2] & 0xfe;  //加显小数点
  17.         DispBuff[2]= tab[w3];
  18.         DispBuff[3]= 0X39;                                                //显示温度标志“口”
  19. }

  20. /******************************************************
  21. 函数功能: 显示错误“Erro”
  22. 输入参数: 无
  23. 返 回 值: 无
  24. 说    明:如果AM2302没有连接显示“Erro”
  25. ******************************************************/
  26. void DispErro(void)
  27. {        
  28.         WriteBuf();

  29.         DispBuff[0]= 0X61;//E
  30.         DispBuff[1]= 0XF5;//r
  31.         DispBuff[2]= 0XF5;//r
  32.         DispBuff[3]= 0XC5;//o                                       
  33. }
复制代码


2、AM2302数据处理。这个采集处理程序移植、修改自硬石YS-F1Pro相关例程,在此表示感谢!
  1. /************************AM2302数据类型定义**********************/
  2. typedef struct
  3. {
  4.         unsigned char  humH8bit;        //湿度高8位
  5.         unsigned char  humL8bit;        //湿度低8位
  6.         unsigned char  temH8bit;        //温度高8位
  7.         unsigned char  temL8bit;        //温度高8位
  8.         unsigned char  check;                   //校验和
  9.   float    hum;                                //实际湿度
  10.   float    tem;                                     //实际温度  
  11. } AM2302_TypeDef;
复制代码
  1. /******************************************************
  2. 函数功能: 从AM2302读取一个字节,MSB先行
  3. 输入参数: 无
  4. 返 回 值: temp从AM2302读取的数据8位数据
  5. 说    明:1、每bit以50us低电平标置开始,轮询直到从机发出的50us低电平结束
  6.                                         2、AM2302 以26~28us的高电平表示“0”,以70us高电平表示“1”
  7. ******************************************************/
  8. static unsigned char AM2302_ReadByte(void)
  9. {
  10.         unsigned char i, temp=0;
  11.        
  12.         for(i=0; i<8; i++)   
  13.         {                        
  14.                 while(AM2302_Port == 0);
  15.                 Delay10us();                                                                                                                //延时40us          
  16.                 Delay10us();
  17.                 Delay10us();
  18.                 Delay10us();
  19.                 if(AM2302_Port == 1)                                                                                //40us后仍为高电平表示数据“1”
  20.                 {                       
  21.                         while(AM2302_Port == 1);                                                        //等待数据1的高电平结束
  22.                         temp |= (unsigned char)(0x01<<(7-i)); //把第7-i位置1,MSB先行
  23.                 }
  24.                 else         
  25.                 {                          
  26.                         temp &= (unsigned char)~(0x01<<(7-i));//把第7-i位置0,MSB先行
  27.                 }
  28.         }
  29.         return temp;
  30. }



  31. /*************************************************************************
  32. 函数功能: 一次完整的数据传输为40bit,高位先出
  33. 输入参数: AM2302
  34. 返 回 值: 0:读取出错;1:读取成功           
  35. 说    明:8bit湿度整数 + 8bit湿度小数 + 8bit温度整数 + 8bit温度小数 + 8bit校验和                                         
  36. **************************************************************************/
  37. unsigned char ReadAM2302(AM2302_TypeDef *AM2302)
  38. {  
  39.   unsigned char temp;
  40.   unsigned int hum_temp,tem_temp;
  41.          
  42.         AM2302_OUT();                        //将AM2302端口设置为输出模式       
  43.         AM2302_Port_L();        //将AM2302端口拉低       
  44.         Delayms(18);                        //延时18ms       
  45.         AM2302_Port_H();         //将AM2302端口拉高,主机延时30us   
  46.         Delay10us();                        //延时30us
  47.         Delay10us();
  48.         Delay10us();
  49.        
  50.         AM2302_IPU();                                                        //将AM2302端口设置为输入,判断AM2302响应信号*/           
  51.         if(AM2302_Port == 0)                         //判断AM2302是否有低电平响应信号,如不响应则跳出,响应则向下运行*/   
  52.         {   
  53.     while(AM2302_Port == 0);//等待AM2302发出的80us低电平响应信号结束*/      
  54.     while(AM2302_Port == 1);//等待AM2302发出的80us高电平标置信号结束*/
  55.       
  56.     AM2302->humH8bit = AM2302_ReadByte();//接收AM2302返回的数据
  57.     AM2302->humL8bit = AM2302_ReadByte();
  58.     AM2302->temH8bit = AM2302_ReadByte();
  59.     AM2302->temL8bit = AM2302_ReadByte();
  60.     AM2302->check    = AM2302_ReadByte();
  61.    
  62.     AM2302_OUT();                                //读取AM2302返回的数据后将AM2302端口改为输出模式   
  63.     AM2302_Port_H();                //将AM2302端口置高
  64.       
  65.     hum_temp = AM2302->humH8bit * 256 + AM2302->humL8bit;//处理湿度数据
  66.     AM2302->hum = (float)hum_temp;
  67.                
  68.     tem_temp = AM2302->temH8bit * 256 + AM2302->temL8bit;//处理温度数据
  69.     AM2302->tem = (float)tem_temp;   
  70.       
  71.     temp = AM2302->humH8bit + AM2302->humL8bit +
  72.            AM2302->temH8bit + AM2302->temL8bit;//校验读取的数据
  73.                                          
  74.     if(AM2302->check == temp)
  75.     {
  76.       return 1;
  77.     }
  78.     else
  79.       return 0;
  80.         }       
  81.         else
  82.                 return 0;
  83. }
复制代码


3、延时。之所以在这里谈到延时程序,首先是因为AM2302对于时序的要求比较严格,再有是因为在keil中测试正确但下载到芯片后误差偏大,最后采用逻辑分析仪在AM2302驱动管脚上测试得到以下数据“。
  1. void Delayms(unsigned int ms)//毫秒延时,16MHz下用逻辑分析仪测试
  2. {
  3.         unsigned int i;
  4.         for(; ms>0; ms--)
  5.                 for(i=1065; i>0; i--);
  6. }


  7. void Delay10us(void)//10微秒延,16MHz下用逻辑分析仪测试
  8. {
  9.         unsigned char i;

  10.         _nop_();
  11.         i = 29;
  12.         while (--i);
  13. }
复制代码


四、实验结果
1、SC92F8003芯片配置


2、硬件整体外观


3、温度显示效果


4、湿度显示效果


5、“错误”显示效果


五、总结
       首先,再次感谢21ic及赛元公司组织的这次活动!
       通过几次如GPIO、UART、ADC、PWM等小实验,对赛元的 SC92F8003这款单片机有了更深入的了解,接下来还要对其它的几个外设进行实验学习,以便更好地掌握这款单片机。
       在之前实验中发现UART与SC LINK有端口冲突的现象,在本案中软件仿真与实际测试中的延时时间不相符的问题,期待能得到各位朋友的指教和帮助。
       最后祝愿赛元公司在“中国芯”的道路上勇往直前、开拓进取!事业发展、如日中天!
       水平有限,请各位朋友指教!
六、附件
       本附件包含了完整的工程文件、所用到的硬件资料及PCB文件。本案实验中PDC401引脚与PCB文件中有所不同。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2018-10-13 19:25 | 显示全部楼层
很好,还发现了小问题,我也打算试用一下,看看有什么小问题需要解决
 楼主 | 2018-10-13 19:52 | 显示全部楼层
纠结的那些年 发表于 2018-10-13 19:25
很好,还发现了小问题,我也打算试用一下,看看有什么小问题需要解决

抓紧时间分享
| 2018-10-17 20:36 | 显示全部楼层
好的呢,最近总是没什么时间上论坛
| 2018-10-17 21:34 | 显示全部楼层
哇塞,分享的真好
| 2018-10-17 21:35 | 显示全部楼层
赛元送的东西也不错
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

快速回复 返回顶部 返回列表