找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8279|回復(fù): 12
收起左側(cè)

51單片機驅(qū)動AHT10溫濕度傳感器 源程序資料

  [復(fù)制鏈接]
ID:808655 發(fā)表于 2020-7-28 00:52 | 顯示全部樓層 |閱讀模式
        在網(wǎng)上找遍了,都沒有找到使用51單片機驅(qū)動AHT10傳感器的程序
        
        耗時一天半,結(jié)合

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

        給的思路和手冊寫完了程序
        
        但是注意這篇博客的程序有點問題,最后處理數(shù)據(jù)的時候會發(fā)生截斷,小則損失精度,大則丟失數(shù)據(jù),                        
        這里要用浮點來處理數(shù)據(jù),然后乘以100或1000來轉(zhuǎn)換為整型,從而保留小數(shù)位。

        (之前沒意識到這個問題,數(shù)據(jù)丟失,我以為沒讀到,就從通信協(xié)議開始一個一個函數(shù)重新梳理了一遍,        

        浪費比較長的時間……)
        如有問題,歡迎指正。

                                                        --2020.7.28 ZIQ

單片機源程序如下:
  1. #include "AHT10.h"
  2. #include "LCD1602.h"
  3. #include "IIC.h"
  4. #include "Delay.h"
  5. //軟復(fù)位
  6. void AHT10_RST()     
  7. {
  8.         IIC_start();
  9.         IIC_write_byte(AHT10_Wr);
  10.         IIC_Get_ack();                                //接收應(yīng)答
  11.         IIC_write_byte(0xba);        //發(fā)送軟復(fù)位指令
  12.         IIC_Get_ack();                                //接收應(yīng)答
  13.         IIC_stop();
  14. }
  15. //觸發(fā)測量
  16. void AHT10_Mea()               
  17. {
  18.         IIC_start();
  19.         IIC_write_byte(AHT10_Wr);
  20.         IIC_Get_ack();                                //接收應(yīng)答
  21.         IIC_write_byte(0xac);        //觸發(fā)測量指令
  22.         IIC_Get_ack();                                //接收應(yīng)答
  23.         IIC_write_byte(0x33);        //指令參數(shù)
  24.         IIC_Get_ack();                                //接收應(yīng)答
  25.         IIC_write_byte(0x00);
  26.         IIC_Get_ack();                                //接收應(yīng)答
  27.         IIC_stop();
  28. }
  29. //讀取AHT10狀態(tài)字
  30. unsigned char AHT10_Status()         
  31. {
  32.         unsigned char byte_first;
  33.         IIC_start();
  34.         IIC_write_byte(AHT10_Rd);
  35.         IIC_Get_ack();                                //接收應(yīng)答
  36.         byte_first = IIC_read_byte();        //接收數(shù)據(jù)
  37.         IIC_NACK();                                                                                //非應(yīng)答,不再接收后續(xù)數(shù)據(jù)
  38.         IIC_stop();
  39.         return byte_first;
  40. }
  41. //判斷AHT10校準(zhǔn)使能        
  42. unsigned char AHT10_CalEN(){
  43.         unsigned char val = 0;
  44.         val = AHT10_Status();
  45.         if((val & 0x08) == 0x08)                //bit[3]為校準(zhǔn)位,1位已校準(zhǔn),0位未校準(zhǔn)
  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();                                //接收應(yīng)答
  55.   IIC_write_byte(0xe1);        //初始化指令
  56.         IIC_Get_ack();                                //接收應(yīng)答
  57.   IIC_write_byte(0x08);        //初始化參數(shù)
  58.         IIC_Get_ack();                                //接收應(yīng)答
  59.   IIC_write_byte(0x00);
  60.         IIC_Get_ack();                                //接收應(yīng)答
  61.         IIC_stop();
  62. }
  63. //初始化并判斷是否校準(zhǔn)
  64. void AHT10_Init()      
  65. {
  66.         Delay_ms(45);        //上電時等待45毫秒
  67.         AHT10Init();                //嘗試初始化
  68.         while(AHT10_CalEN() == 0)//如果未校準(zhǔn),則復(fù)位,再此嘗試初始化,直到校準(zhǔn)完成
  69.         {        //注意,如果初始化未完成會死循環(huán),此時請檢查接線是否存在問題或傳感器是否損壞
  70.                 AHT10_RST();                //復(fù)位
  71.                 Delay_ms(25);        //復(fù)位時間不超過20ms
  72.                 AHT10Init();
  73.         }
  74. }
  75. //讀取數(shù)據(jù)并處理返回
  76. void AHT10_Read_Data(unsigned int *T,unsigned int *S) //濕度和溫度數(shù)據(jù)
  77. {                                                                                                                                                                                                                //例如溫度2251,為22.51攝氏度,濕度30211,為30.211%
  78.         unsigned char Data[6] = {0};//讀入六個字節(jié)數(shù)據(jù),第一個狀態(tài)字,后面兩個半字節(jié)為濕度數(shù)據(jù),最后為溫度數(shù)據(jù)
  79.         unsigned long retudata = 0;        //使用一個long int類型來處理數(shù)據(jù)
  80.         unsigned char n = 0;                                //讀忙計數(shù),防止一直忙碌造成死循環(huán)
  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);                                //寫入讀數(shù)據(jù)指令
  91.         IIC_Get_ack();                                //接收應(yīng)答
  92.         for(n = 0;n < 6;n++){
  93.                 Data[n] = IIC_read_byte();                //狀態(tài)數(shù)據(jù)
  94.                 if(n < 5){
  95.                         IIC_ACK();                //應(yīng)答
  96.                 }        
  97.                 else{
  98.                         IIC_NACK();                //第五次,非應(yīng)答,讀取完畢
  99.                 }               
  100.         }
  101.         IIC_stop();        
  102.         retudata = 0;
  103.         retudata += Data[1];                                //原始濕度數(shù)據(jù)合成
  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;//數(shù)據(jù)精確到三位小數(shù)
  108.         
  109.         retudata = 0;                                //原始溫度數(shù)據(jù)合成
  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);        //數(shù)據(jù)精確到兩位小數(shù)        
  114.         
  115.         }
  116.                         
復(fù)制代碼
51hei.png
所有資料51hei提供下載:
51單片機驅(qū)動AHT10溫濕度傳感器.zip (3.71 MB, 下載次數(shù): 304)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:59363 發(fā)表于 2020-9-1 09:23 | 顯示全部樓層
我也是根據(jù)這個改的,沒讀出數(shù)據(jù),希望你這個能行
回復(fù)

使用道具 舉報

ID:293108 發(fā)表于 2020-9-15 13:29 | 顯示全部樓層
很不錯,后期我也多上傳些程序給大家。
回復(fù)

使用道具 舉報

ID:272119 發(fā)表于 2020-9-20 22:25 | 顯示全部樓層
樓主,請問用你的AHT10驅(qū)動代碼讀數(shù)非正常跳動,溫度在吹口氣數(shù)值升到250+攝氏度緩慢回到10-50一個大致穩(wěn)定數(shù)字,濕度從0到1000%一直非規(guī)則跳變.這是第一個驅(qū)動了芯片的代碼,終于看到了些許希望,謝謝!
回復(fù)

使用道具 舉報

ID:272119 發(fā)表于 2020-9-20 22:30 | 顯示全部樓層
附件是我用STC15W408AS驅(qū)動 0.91寸OLED的全部代碼.目前還是AHT10沒有完整驅(qū)動起來,但芯片是工作了的,因為讀數(shù)隨溫度變化很靈敏變化,只是讀數(shù)不是準(zhǔn)確的.

Keil 5 工程.rar

82.88 KB, 下載次數(shù): 29, 下載積分: 黑幣 -5

STC15W408AS驅(qū)動 0.91寸OLED的全部代碼

回復(fù)

使用道具 舉報

ID:784607 發(fā)表于 2020-12-19 13:33 | 顯示全部樓層
為什么我燒了 也接了線沒反應(yīng)
回復(fù)

使用道具 舉報

ID:138247 發(fā)表于 2021-1-22 18:55 | 顯示全部樓層

謝謝樓主分享,正在搞這個傳感器。。。
回復(fù)

使用道具 舉報

ID:482246 發(fā)表于 2022-4-10 17:19 | 顯示全部樓層
溫度值大概是對的,較穩(wěn)定 ,但濕度總是從60多遞減到0附近又從60多遞減
回復(fù)

使用道具 舉報

ID:218360 發(fā)表于 2022-6-8 16:38 | 顯示全部樓層
下載學(xué)習(xí)下看看,按照這個寫下CHT8305溫濕度
回復(fù)

使用道具 舉報

ID:1070668 發(fā)表于 2023-4-16 10:36 | 顯示全部樓層
做好了
055.jpg
回復(fù)

使用道具 舉報

ID:933399 發(fā)表于 2024-1-12 20:07 | 顯示全部樓層


謝謝樓主分享,正在搞這個傳感器。。。
回復(fù)

使用道具 舉報

ID:160746 發(fā)表于 2024-12-16 16:23 | 顯示全部樓層
希望這個有用
回復(fù)

使用道具 舉報

ID:160746 發(fā)表于 2024-12-16 16:23 | 顯示全部樓層
下載下來測試下,看看有沒有用
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表