标题: 基于STC单片机的AHT20温湿度做的oled12864温湿度计 源程序 [打印本页]

作者: smalldi    时间: 2020-10-12 12:02
标题: 基于STC单片机的AHT20温湿度做的oled12864温湿度计 源程序
这个传感器出来有两个多月了,1.9票的很值,提供下仅供大家参考谢谢代码已经校准和小米基本差异。早在快俩月前就弄好了今天闲发一贴
喜欢的请给我加分,谢谢


这是做的彩屏的
代码局部截图

这个IC长这样

下载选项一定不要勾选“允许低压复位”,并将低压检测电压设置成3.0V

单片机源程序如下:
  1. #include "stc8.h"        //STC8头文件
  2. #include "def.h"        //宏定义 常用函数
  3. #include "delay.h"  //延时函数
  4. #include "aht10.h"
  5. #include "timer.h"
  6. #include "oled.h"



  7. u32  read_aht10_Cnt = 0;

  8. u32  CT_data[2];

  9. int  AHT10_Tem,AHT10_Hum;

  10. //本地函数申明

  11. void Read_TempAndHum(void);

  12. //外部扩展变量声明
  13. extern bit B_1ms;

  14. void main(void)
  15. {  
  16.     u8  ret = 0;  
  17.     u8  cnt = 0;
  18.    
  19.     //延时等待电源稳定
  20.     delay_ms(500);
  21.     delay_ms(500);
  22.    
  23.     Timer0_Init();         //定时器0初始化
  24.     Timer1_Init();         //定时器1初始化
  25.    
  26.     EA     = 1;            //开启总中断
  27.    
  28.     OLED_Init();                       //初始化OLED  
  29.     OLED_Clear();          //清屏

  30.     ret = JH_Init();

  31.     while(JH_Read_Cal_Enable()==0)//等到校准输出使能位为1,才读取。
  32.     {
  33.         ret = JH_Init();      //如果为0再使能一次
  34.         delay_ms(30);
  35.         
  36.         if(++cnt>3)
  37.             break;
  38.     }

  39.     while(1)
  40.     {
  41.         Read_TempAndHum();      //获取温湿度
  42.     }
  43. }

  44. void Read_TempAndHum(void)
  45. {
  46.     if(read_aht10_Cnt>=1000)     //1S读取一次温湿度
  47.     {
  48.         JH_Read_CTdata(CT_data);                //读取温度和湿度

  49.         //计算得到湿度值(放大了10倍,如果c1=523,表示现在湿度为52.3%)
  50.         AHT10_Hum = CT_data[0]*1000/1024/780;

  51.         //计算得到温度值(放大了10倍,如果t1=245,表示现在温度为24.5℃)
  52.         AHT10_Tem = CT_data[1] *200*10/1024/1024-512;

  53.         /*************  温湿度计  **********/
  54.         OLED_ShowCHinese(32,0, 1,16);//温
  55.         OLED_ShowCHinese(48,0, 2,16);//湿
  56.         OLED_ShowCHinese(64,0, 3,16);//度
  57.         OLED_ShowCHinese(80,0, 4,16);//计
  58.         
  59.         /*************  显示温度  **********/
  60.         OLED_ShowCHinese(0 ,3, 1,16); //温
  61.         OLED_ShowCHinese(16,3, 3,16); //度
  62.         OLED_ShowString( 32,3,":",16);
  63.         OLED_ShowString( 64,3,".",16);//显示小数点

  64.         OLED_ShowNum(48, 3,AHT10_Tem/100     , 1,16);//环境温度-十位
  65.         OLED_ShowNum(56, 3,(AHT10_Tem%100)/10, 1,16);//环境温度-个位
  66.         OLED_ShowNum(72, 3,AHT10_Tem%10      , 1,16);//环境温度-小数位
  67.         
  68.         OLED_ShowCHinese(96,3,0,16);  //"℃"
  69.         
  70.         /*************  显示湿度  **********/
  71.         OLED_ShowCHinese(0 ,6, 2,16); //湿
  72.         OLED_ShowCHinese(16,6, 3,16); //度
  73.         OLED_ShowString( 32,6,":",16);
  74.         OLED_ShowString( 64,6,".",16);//显示小数点
  75.         
  76.         OLED_ShowNum(48, 6,AHT10_Hum/100     , 1,16);//环境湿度-十位
  77.         OLED_ShowNum(56, 6,(AHT10_Hum%100)/10, 1,16);//环境湿度-个位
  78.         OLED_ShowNum(72, 6,AHT10_Hum%10      , 1,16);//环境湿度-小数位

  79.         OLED_ShowString(96, 6,"%",16);

  80.         read_aht10_Cnt = 0;
  81.     }
  82. }
复制代码

所有资料51hei提供下载:
修改的AHT20温湿度已验证.zip (178.45 KB, 下载次数: 641)






作者: xixinjy    时间: 2021-2-13 05:07
代码可以用666
作者: zxg_751005    时间: 2021-3-23 16:50
实测可用
作者: pyy1980    时间: 2021-6-9 10:01
我的电脑因为缺少"STC8.H"编译不了,求大神分享一个啊
作者: 51hei团团    时间: 2021-6-10 03:52
pyy1980 发表于 2021-6-9 10:01
我的电脑因为缺少"STC8.H"编译不了,求大神分享一个啊

这里下载,和main.c放在一个目录,就可以编译成功了 如图http://www.51hei.com/bbs/dpj-131249-1.html

51hei.png (46.77 KB, 下载次数: 213)

51hei.png

作者: WFX777888    时间: 2021-6-10 05:53

实测可用
作者: qq603599910    时间: 2021-6-10 20:34
去年调试这个没有成功,一直拖着没有继续进行,看来又可以借楼主的代码完成这个案子了,谢谢!
作者: yinlitansuo    时间: 2021-8-22 18:32
移植到辉芒单片机了 实测可用,支持国产
作者: guizaishi    时间: 2021-9-22 16:09
yinlitansuo 发表于 2021-8-22 18:32
移植到辉芒单片机了 实测可用,支持国产

大神,这是用的AHT20嘛,我用的这个怎么读不到,我看程序写的是AHT10,求解
作者: 463854329    时间: 2022-2-10 02:00
这代码有问题,SDA是bit0,代码中SDA定义bit7为高阻输入

  1. /*************************此部分为I2C总线的驱动程序*************************************/

  2. #include "stc8.h"
  3. #include "i2c.h"
  4. #include "delay.h"

  5. sbit     SCL = P1^1;     //I2C  时钟
  6. sbit     SDA = P1^0;     //I2C  数据

  7. //SDA方向控制
  8. void IO_SDA(u8 m)
  9. {
  10.   if(m==1)
  11.   {
  12.     P1M1 = 0x80;//配置SDA为高阻输入
  13.     P1M0 = 0x00;
  14.   }
  15.   else
  16.   {
  17.     P1M1 = 0x00;//恢复SDA双向io
  18.     P1M0 = 0x00;
  19.   }
  20. }
复制代码

作者: lmn2005    时间: 2022-2-10 12:14
近日也刚刚用到AHT20,感觉没到的温度总是比DS18B20高些,大约0.8度吧,估计彼此都有误差,因为DS18B20误差是0.5度,而AHT20误差是0.3度。一个比准确值低0.5度,一个比准确值高0.3度,这样就导致它们相差0.8度了。
作者: GloomyGhost    时间: 2022-3-19 16:53
来看看
作者: yongxue851    时间: 2022-3-29 11:55
最近有用到,感谢楼主分享,
作者: 15592132273    时间: 2022-8-27 23:23
STC15W亲测可用,感谢楼主!!
作者: llench    时间: 2022-10-4 20:58
STC15W亲测可用,感谢楼主!!
作者: 飞鸟无痕    时间: 2023-5-2 13:48
463854329 发表于 2022-2-10 02:00
这代码有问题,SDA是bit0,代码中SDA定义bit7为高阻输入

AHT20和AHT21有不同的地方吗?
作者: 老愚童63    时间: 2023-5-2 15:53
如果能够增加温湿度控制功能就更实用了。
作者: LY_Bear    时间: 2023-9-6 22:55
软件i2c,还是硬件的i2c?
作者: lmn2005    时间: 2023-9-7 07:58
老愚童63 发表于 2023-5-2 15:53
如果能够增加温湿度控制功能就更实用了。

想应用到什么特别场合,才需要用温湿度控制吧
作者: liucan2020    时间: 2023-9-7 10:50
lmn2005 发表于 2023-9-7 07:58
想应用到什么特别场合,才需要用温湿度控制吧

朋友的养殖场 或者对温湿度要求高的场合
作者: 老愚童63    时间: 2023-9-13 13:04
lmn2005 发表于 2023-9-7 07:58
想应用到什么特别场合,才需要用温湿度控制吧

对,孵化箱之类的温湿度控制
作者: 51hei1005    时间: 2024-9-6 17:24

已在STC8H单片机上验证,结论如下
1.能读取和显示。我用的DHT20。2.
AHT10_Hum = CT_data[0]*1000/1024/780;
AHT10_Tem = CT_data[1] *200*10/1024/1024-512;
这两行换算和手册不一样,得改的,不然手指放到传感器上 湿度能大于一百。
4.缺少"STC8.H"需要自己补上,我直接替换成自己手里的"STC8H.H"了。
5.在delay.c里写的是24M主频下…… 实际我用的是11.0592M
6.对于51单片机,IIC管脚方向控制的IO_SDA(u8 m)这个函数并不需要,只会影响移植。OLED的IIC函数里都没有方向控制。STC的升级51直接设为准双向口就OK了。
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;

作者: gpdt3209    时间: 2024-9-30 17:20
AHT10_Hum = CT_data[0]*1000/1024/780;
这里/780什么意思?
作者: wangxing123456    时间: 2025-1-30 20:19
这个负温度怎么改下程序呢?
作者: zhuyifa    时间: 2025-2-6 17:51
我是单片机新手,能把原理图文件一起分享出来吗
作者: hellolicao    时间: 2025-2-11 15:38
感谢楼主分享




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1