找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 349|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机驱动AHT10温湿度传感器 源程序资料

[复制链接]
跳转到指定楼层
楼主
        在网上找遍了,都没有找到使用51单片机驱动AHT10传感器的程序
        
        耗时一天半,结合

        https://blog.csdn.net/Freedom1314520/article/details/104557480

        给的思路和手册写完了程序
        
        但是注意这篇博客的程序有点问题,最后处理数据的时候会发生截断,小则损失精度,大则丢失数据,                        
        这里要用浮点来处理数据,然后乘以100或1000来转换为整型,从而保留小数位。

        (之前没意识到这个问题,数据丢失,我以为没读到,就从通信协议开始一个一个函数重新梳理了一遍,        

        浪费比较长的时间……)
        如有问题,欢迎指正。

                                                        --2020.7.28 ZIQ

单片机源程序如下:
  1. #include "AHT10.h"
  2. #include "LCD1602.h"
  3. #include "IIC.h"
  4. #include "Delay.h"
  5. //软复位
  6. void AHT10_RST()     
  7. {
  8.         IIC_start();
  9.         IIC_write_byte(AHT10_Wr);
  10.         IIC_Get_ack();                                //接收应答
  11.         IIC_write_byte(0xba);        //发送软复位指令
  12.         IIC_Get_ack();                                //接收应答
  13.         IIC_stop();
  14. }
  15. //触发测量
  16. void AHT10_Mea()               
  17. {
  18.         IIC_start();
  19.         IIC_write_byte(AHT10_Wr);
  20.         IIC_Get_ack();                                //接收应答
  21.         IIC_write_byte(0xac);        //触发测量指令
  22.         IIC_Get_ack();                                //接收应答
  23.         IIC_write_byte(0x33);        //指令参数
  24.         IIC_Get_ack();                                //接收应答
  25.         IIC_write_byte(0x00);
  26.         IIC_Get_ack();                                //接收应答
  27.         IIC_stop();
  28. }
  29. //读取AHT10状态字
  30. unsigned char AHT10_Status()         
  31. {
  32.         unsigned char byte_first;
  33.         IIC_start();
  34.         IIC_write_byte(AHT10_Rd);
  35.         IIC_Get_ack();                                //接收应答
  36.         byte_first = IIC_read_byte();        //接收数据
  37.         IIC_NACK();                                                                                //非应答,不再接收后续数据
  38.         IIC_stop();
  39.         return byte_first;
  40. }
  41. //判断AHT10校准使能        
  42. unsigned char AHT10_CalEN(){
  43.         unsigned char val = 0;
  44.         val = AHT10_Status();
  45.         if((val & 0x08) == 0x08)                //bit[3]为校准位,1位已校准,0位未校准
  46.                 return 1;
  47.         else
  48.                 return 0;
  49. }
  50. //初始化
  51. void AHT10Init(){
  52.         IIC_start();
  53.         IIC_write_byte(AHT10_Wr);
  54.         IIC_Get_ack();                                //接收应答
  55.   IIC_write_byte(0xe1);        //初始化指令
  56.         IIC_Get_ack();                                //接收应答
  57.   IIC_write_byte(0x08);        //初始化参数
  58.         IIC_Get_ack();                                //接收应答
  59.   IIC_write_byte(0x00);
  60.         IIC_Get_ack();                                //接收应答
  61.         IIC_stop();
  62. }
  63. //初始化并判断是否校准
  64. void AHT10_Init()      
  65. {
  66.         Delay_ms(45);        //上电时等待45毫秒
  67.         AHT10Init();                //尝试初始化
  68.         while(AHT10_CalEN() == 0)//如果未校准,则复位,再此尝试初始化,直到校准完成
  69.         {        //注意,如果初始化未完成会死循环,此时请检查接线是否存在问题或传感器是否损坏
  70.                 AHT10_RST();                //复位
  71.                 Delay_ms(25);        //复位时间不超过20ms
  72.                 AHT10Init();
  73.         }
  74. }
  75. //读取数据并处理返回
  76. void AHT10_Read_Data(unsigned int *T,unsigned int *S) //湿度和温度数据
  77. {                                                                                                                                                                                                                //例如温度2251,为22.51摄氏度,湿度30211,为30.211%
  78.         unsigned char Data[6] = {0};//读入六个字节数据,第一个状态字,后面两个半字节为湿度数据,最后为温度数据
  79.         unsigned long retudata = 0;        //使用一个long int类型来处理数据
  80.         unsigned char n = 0;                                //读忙计数,防止一直忙碌造成死循环
  81.         AHT10_Mea();                        //开始测量
  82.         Delay_ms(80);                        //延时等待至少75毫秒        
  83.         while(((AHT10_Status() & 0x80) == 0x80))        //读忙,如果忙碌则等待,超过300ms则退出
  84.         {
  85.                 Delay_ms(3);
  86.                 n++;
  87.                 if(n >= 100)break;
  88.         }
  89.   IIC_start();                        
  90.         IIC_write_byte(AHT10_Rd);                                //写入读数据指令
  91.         IIC_Get_ack();                                //接收应答
  92.         for(n = 0;n < 6;n++){
  93.                 Data[n] = IIC_read_byte();                //状态数据
  94.                 if(n < 5){
  95.                         IIC_ACK();                //应答
  96.                 }        
  97.                 else{
  98.                         IIC_NACK();                //第五次,非应答,读取完毕
  99.                 }               
  100.         }
  101.         IIC_stop();        
  102.         retudata = 0;
  103.         retudata += Data[1];                                //原始湿度数据合成
  104.         retudata = (retudata<<8) + Data[2];
  105.         retudata = ((retudata<<8) + Data[3])>>4;
  106.         //retudata = retudata & 0x000fffff;
  107.         *S = (retudata*1000.0/1024.0/1024.0)*1000;//数据精确到三位小数
  108.         
  109.         retudata = 0;                                //原始温度数据合成
  110.         retudata = ((Data[3] & 0x0f)<<8)|Data[4];
  111.         retudata = (retudata<<8)|Data[5];
  112.         //retudata = retudata & 0x000fffff;
  113.         *T = (retudata*100.0*200.0/1024.0/1024.0 - 50.0*100);        //数据精确到两位小数        
  114.         
  115.         }
  116.                         
复制代码

所有资料51hei提供下载:
51单片机驱动AHT10温湿度传感器.zip (3.71 MB, 下载次数: 25)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

沙发
miskel 发表于 2020-9-1 09:23 | 只看该作者
我也是根据这个改的,没读出数据,希望你这个能行
回复

使用道具 举报

无效楼层,该帖已经被删除
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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