找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 6756|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

sht71溫濕度控制系統(tǒng)(單片機程序源碼,proteus仿真)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:125469 發(fā)表于 2016-6-6 17:09 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
這是我做的溫濕度控制系統(tǒng)資料。采用sht71溫濕度傳感器作為檢測元件。

包含proteus仿真資料。
源代碼。



程序如下:
  1. /*注意:子函數(shù)多層調(diào)用時,要記�。簩懽雍瘮�(shù)以及子函數(shù)聲明用形參;而調(diào)用子函數(shù)用實參*/
  2. /*頭文件*/
  3. #include<reg52.h>
  4. #include<intrins.h>
  5. #include<math.h>
  6. #include<hc595.h>
  7. #include<delay.h>
  8. #include<actuator.h>
  9. #include<ini.h>
  10. #include<sht71.h>

  11. /*全局變量定義 */                                       
  12. uchar code duan[21]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,                    
  13.                                          0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,
  14.                                          0x40};        //CC碼表:數(shù)字0~9  帶小數(shù)點數(shù)字0~9   負號
  15. uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//從LED0-7
  16. uchar high8=0,low8=0;//傳感器16位數(shù)據(jù)高低8位
  17. uchar temphigh8=0,templow8=0;//溫度高低8位
  18. uchar humihigh8=0,humilow8=0;//濕度高低8位
  19. long SO_RH=0;//濕度10進制數(shù)據(jù)
  20. long SO_T=0;//溫度10進制數(shù)據(jù)
  21. char temp;        //實際溫度值,溫度分正負
  22. char temp_2;//因為濕度值計算時會用到溫度值,防止對temp數(shù)學(xué)處理過程引起的值變化影響濕度的計算,故將temp賦給temp_2保存以用于濕度計算
  23. char humi_relative;//相對濕度值,濕度只有正值
  24. char humi;        //實際濕度值

  25. uchar a1,b1,c1,d1;//正負位、十位、個位、小數(shù)位
  26. uchar a2,b2,c2,d2;//正負位、十位、個位、小數(shù)位
  27. uchar error_command;//通訊檢查信號 0正常 1錯誤
  28. uchar temp_max,temp_min;//溫度上下極限值
  29. uchar p[16];

  30. /**********************溫濕度測量子函數(shù)***********************/
  31. void sht_measurement(uchar measure)
  32. {
  33.   measurement_start();
  34.   command_send(measure);
  35.   measurement_wait();
  36.   mcu_receive_date();
  37. }
  38. /************************啟動測量子函數(shù)***********************/
  39. void measurement_start()
  40. {
  41.    SCK=0;//賦予時鐘線初始電平
  42.    DATE=1;//賦予數(shù)據(jù)線初始電平
  43.    
  44.    SCK=1;
  45.    _nop_();
  46.    _nop_();
  47.    DATE=0;
  48.    _nop_();
  49.    _nop_();
  50.    SCK=0;

  51.    _nop_();
  52.    _nop_();//時鐘線低電平保持

  53.    SCK=1;
  54.    _nop_();
  55.    _nop_();
  56.    DATE=1;
  57.    _nop_();
  58.    _nop_();
  59.    SCK=0;
  60. }
  61. /*********************發(fā)送測量命令子函數(shù)*********************/
  62. char command_send(uchar command)           //寫時序:上升沿-高電平保持-下降沿
  63. {                                                                           //注意:要先給DATE,再給寫時序(SCK)
  64.   uchar value=0x80,i=0;         
  65.   SCK=0;//寫時序初始低電平
  66.   for(i=0;i<8;i++)
  67.   {      
  68.         if(command&value)
  69.           DATE=1;
  70.         else DATE=0;
  71.         SCK=1;
  72.         _nop_();
  73.         SCK=0;        
  74.         value=value>>1;
  75.   }
  76.   SCK=1;
  77.   if(DATE==0)
  78.     error_command=0;
  79.   SCK=0;                                //第9脈沖,即ACK脈沖,同時也是一個讀脈沖

  80.   if(error_command==1)
  81.     sht_reset();//如果通訊錯誤,則傳感器軟件復(fù)位  
  82.          
  83.   return error_command;  //error=1通訊錯誤
  84. }
  85. /***********************測量等待子函數(shù)*********************/
  86. void measurement_wait()
  87. {
  88.   delay(40000);//測量等待390ms(20/80/320ms對應(yīng)8、12、14位)
  89. }
  90. /***********************讀數(shù)據(jù)子函數(shù)**********************/
  91. void mcu_receive_date()
  92. {
  93.   high8=mcu_receive_byte();        
  94.   
  95.   DATE=0;//寫時序:上升沿-高電平保持-下降沿                  
  96.   SCK=1;_nop_();_nop_();
  97.   SCK=0;_nop_();_nop_();//接收完高字節(jié)數(shù)據(jù)后,手動拉低數(shù)據(jù)線(寫0),表示接收結(jié)束
  98.   DATE=1;         
  99.       
  100.   low8=mcu_receive_byte();

  101.   DATE=1;//寫時序:上升沿-高電平保持-下降沿                  
  102.   SCK=1;_nop_();_nop_();
  103.   SCK=0;_nop_();_nop_();//接收完高字節(jié)校數(shù)據(jù)后,手動拉高數(shù)據(jù)線,傳感器不經(jīng)校驗,直接休眠
  104. }
  105. /***********************讀字節(jié)子函數(shù)***********************/
  106. uchar mcu_receive_byte()
  107. {
  108.   uchar value=0x80,dat=0,i=0;
  109.   SCK=0;//讀時序初始低電平
  110.   for(i=0;i<8;i++)        //讀時序:低電平保持-上升沿-高電平保持
  111.   {         
  112.     SCK=1;_nop_();              
  113.         if(DATE)
  114.           dat=dat|value;
  115.         SCK=0;_nop_();         
  116.         value=value>>1;        
  117.   }
  118.   return dat;
  119. }
  120. /******************取實際溫度子函數(shù)********************/
  121. void temperature_calculate()
  122. {
  123.   float d1_5V=-40.1;//定義溫度計算公式參數(shù)
  124.   float d2_14bit=0.01;//定義溫度計算公式參數(shù)
  125.   temphigh8=high8;
  126.   templow8=low8;

  127.   SO_T=temphigh8;//先賦值給低8位
  128.   SO_T=((SO_T<<8)&0xff00)|templow8;//將兩個8位合成一個16位。與0xff00與運算,目的在于清低八位,避免不穩(wěn)定錯誤
  129.   SO_T=SO_T&0x3fff;//sht溫度精度默認為最高14位,即temp16的高2位為0,這里人為將高2位清零,避免不穩(wěn)定錯誤。0011 1111 1111 1111=0x3fff
  130.   temp=d1_5V+d2_14bit*SO_T;

  131.   compensation_temp();//正溫度修正

  132.   temp_2=temp;        
  133. }
  134. /******************分離溫度值子函數(shù)********************/
  135. void temperature_seperate()
  136. {
  137.   uchar i=0;//正負數(shù)標(biāo)志位
  138.   i=0x80&temp;//取符號位,判斷正負
  139.   if(i)
  140.   {
  141.     temp=temp-1; //由補碼取原碼
  142.         temp=~temp;

  143.         a1=20;
  144.         b1=(temp*10)/100;
  145.     c1=((temp*10)%100)/10;
  146.     d1=((temp*10)%100)%10;

  147.         temp=~temp;        //還原補碼,防止下次顯示將負數(shù)掃描成正數(shù)
  148.         temp=temp+1;

  149.         /*負溫度范圍補償代碼  統(tǒng)一上浮1度,使得精度保證在+-1度以內(nèi)
  150.          -12度以內(nèi),顯示誤差為0;-12以下,顯示誤差為-1度*/
  151.         if(c1==9)
  152.         {
  153.           c1=0;
  154.           b1+=1;
  155.         }
  156.         else
  157.         {
  158.           c1+=1;
  159.         }
  160.         c1+=10;        //+10表示附帶小數(shù)點
  161.         p[0]=a1;
  162.         p[1]=b1;
  163.         p[2]=c1;
  164.         p[3]=d1;
  165.   }
  166.   else
  167.   {
  168.     a1=0;
  169.     b1=(temp*10)/100;
  170.     c1=((temp*10)%100)/10;
  171.     d1=((temp*10)%100)%10;        

  172.         c1+=10;        //+10表示附帶小數(shù)點
  173.         p[0]=a1;
  174.         p[1]=b1;
  175.         p[2]=c1;
  176.         p[3]=d1;
  177.   }
  178. }
  179. /*****************溫度極限值分離子函數(shù)*********************/
  180. void temperature_limit_seperate()
  181. {
  182.         uchar min1,min2,max1,max2;//溫度下限十位、溫度下限個位、溫度上限十位、溫度上限個位
  183.         temp_min=10;temp_max=50;
  184.         
  185.         min1=temp_min/10;
  186.         min2=temp_min%10;
  187.         max1=temp_max/10;
  188.         max2=temp_max%10;
  189.         
  190.         p[8]=min1;
  191.         p[9]=min2;
  192.         p[10]=max1;
  193.         p[11]=max2;        

  194.         p[12]=8;
  195.         p[13]=8;
  196.         p[14]=8;
  197.         p[15]=8;
  198. }
  199. /*****************溫濕度顯示子函數(shù)*********************/
  200. void display()
  201. {
  202.    uchar m=0;
  203.    for(m=0;m<16;m++)
  204.         {
  205.                 if(m<8)                           //掃描顯示前8位數(shù)碼管,屏蔽后8位數(shù)碼管(因為數(shù)據(jù)線共用)
  206.                 {
  207.                         InputData(0xff);       //給第三片595送屏蔽位選,LED8~15
  208.                          InputData(wei[m]);     //給第二片595送位選,LED0~7
  209.                         InputData(duan[p[m]]);        
  210.                         OutputData();
  211.                         delay(100);
  212.                 }
  213.                 else                       //掃描顯示后8位數(shù)碼管,屏蔽前8位數(shù)碼管(因為數(shù)據(jù)線共用)
  214.                 {
  215.                         InputData(wei[m-8]);   //給第三片595送位選,LED8~15
  216.                          InputData(0xff);       //給第三片595送屏蔽位選,LED0~7
  217.                         InputData(duan[p[m]]);        
  218.                         OutputData();
  219.                         delay(100);
  220.                 }
  221.         }
  222. }
  223. /****************取實際濕度子函數(shù)**********************/
  224. void humidity_calculate()
  225. {
  226.   float c1_12bit=-2.0468,c2_12bit=0.0367,c3_12bit=-0.0000015955;//定義濕度計算公式參數(shù)
  227.   float t1_12bit=0.01;//定義濕度計算溫補公式參數(shù)
  228.   float t2_12bit=0.00008;//定義濕度計算溫補公式參數(shù)
  229.   humihigh8=high8;
  230.   humilow8=low8;

  231.   SO_RH=humihigh8;        //先賦值給低8位
  232.   SO_RH=((SO_RH<<8)&0xff00)|humilow8;//將兩個8位合成一個16位。
  233.   SO_RH=SO_RH&0x0fff;//濕度精度默認12位。0000 1111 1111 1111=0x0fff
  234.   humi_relative=c1_12bit+c2_12bit*SO_RH+c3_12bit*SO_RH*SO_RH;

  235. //  humi=(temp_2-25)*(t1_12bit+t2_12bit*SO_RH)+humi_relative; //溫度補償
  236.   humi=humi_relative;        
  237.   compensation_humi();//濕度誤差修正
  238. }
  239. /******************分離濕度值子函數(shù)********************/
  240. void humidity_seperate()
  241. {
  242.     a2=0;
  243.     b2=(humi*10)/100;
  244.     c2=((humi*10)%100)/10;
  245.     d2=((humi*10)%100)%10;
  246.         
  247.         c2+=10;        //+10表示附帶小數(shù)點
  248.         p[4]=a2;
  249.         p[5]=b2;
  250.         p[6]=c2;
  251.         p[7]=d2;
  252. }
  253. /*******************濕度補償子函數(shù)******************/
  254. void compensation_humi()
  255. {
  256.         if(humi<=12)  //0~7%
  257.         {        
  258.                 humi-=5;
  259.         }
  260.         else
  261.         {
  262.                 if(humi<=20) //8~16%
  263.                 {
  264.                         humi-=4;
  265.                 }
  266.                 else
  267.                 {
  268.                         if(humi<=33)        //17~30%
  269.                         {
  270.                                 humi-=3;
  271.                         }
  272.                         else
  273.                         {        
  274.                                 if(humi<=93)   //31~91%
  275.                                 {
  276.                                         humi-=2;
  277.                                 }
  278.                                 else
  279.                                 {
  280.                                         if(humi<=103)         //92~100%
  281.                                         {        
  282.                                                 humi-=3;
  283.                                         }
  284.                                 }
  285.                         }
  286.                 }
  287.         }        
  288. }
  289. /************************軟復(fù)位子函數(shù)******************/
  290. void sht_reset()
  291. {
  292.   uchar i;
  293.   while(DATE==1)
  294.   {         
  295.     SCK=0;
  296.     for(i=0;i<12;i++)           //數(shù)據(jù)線高電平的情況下,給時鐘線至少9個脈沖
  297.     {
  298.       SCK=1;
  299.           _nop_ ();
  300.           SCK=0;
  301.           _nop_ ();
  302.     }
  303.   }
  304. }
  305. /************************溫度補償子函數(shù)******************/
  306. void compensation_temp()
  307. {
  308.         if(temp>=20)
  309.         {
  310.                 temp+=1;
  311.         }
  312.         if(temp>=53)
  313.         {
  314.                 temp+=1;        
  315.         }        
  316.         if(temp>=86)
  317.         {
  318.                 temp+=1;
  319.         }        
  320. }
復(fù)制代碼



全部資料請下載附件:

SHT71模塊化最終版本.rar

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

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩1

相關(guān)帖子

回復(fù)

使用道具 舉報

沙發(fā)
ID:121023 發(fā)表于 2016-6-6 19:46 | 只看該作者
C語言的學(xué)習(xí)旅程,稱得上是:路漫漫,其修遠矣!有師者,則數(shù)日可成。
回復(fù)

使用道具 舉報

板凳
ID:170353 發(fā)表于 2017-3-13 16:57 | 只看該作者
請問樓主能不能把52改51,仿真會受影響嗎
回復(fù)

使用道具 舉報

地板
ID:171855 發(fā)表于 2017-5-18 16:43 | 只看該作者
樓主你這個程序編譯有問題但是hex文件又可以,i請問能改一下嗎,
回復(fù)

使用道具 舉報

5#
ID:542441 發(fā)表于 2019-5-19 22:34 | 只看該作者
是不是真的
回復(fù)

使用道具 舉報

6#
ID:542441 發(fā)表于 2019-5-19 22:35 | 只看該作者
怎么下載不了????
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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