久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6711|回復: 5
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
這是我做的溫濕度控制系統資料。采用sht71溫濕度傳感器作為檢測元件。

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



程序如下:
  1. /*注意:子函數多層調用時,要記住:寫子函數以及子函數聲明用形參;而調用子函數用實參*/
  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碼表:數字0~9  帶小數點數字0~9   負號
  15. uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//從LED0-7
  16. uchar high8=0,low8=0;//傳感器16位數據高低8位
  17. uchar temphigh8=0,templow8=0;//溫度高低8位
  18. uchar humihigh8=0,humilow8=0;//濕度高低8位
  19. long SO_RH=0;//濕度10進制數據
  20. long SO_T=0;//溫度10進制數據
  21. char temp;        //實際溫度值,溫度分正負
  22. char temp_2;//因為濕度值計算時會用到溫度值,防止對temp數學處理過程引起的值變化影響濕度的計算,故將temp賦給temp_2保存以用于濕度計算
  23. char humi_relative;//相對濕度值,濕度只有正值
  24. char humi;        //實際濕度值

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

  30. /**********************溫濕度測量子函數***********************/
  31. void sht_measurement(uchar measure)
  32. {
  33.   measurement_start();
  34.   command_send(measure);
  35.   measurement_wait();
  36.   mcu_receive_date();
  37. }
  38. /************************啟動測量子函數***********************/
  39. void measurement_start()
  40. {
  41.    SCK=0;//賦予時鐘線初始電平
  42.    DATE=1;//賦予數據線初始電平
  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. /*********************發送測量命令子函數*********************/
  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();//如果通訊錯誤,則傳感器軟件復位  
  82.          
  83.   return error_command;  //error=1通訊錯誤
  84. }
  85. /***********************測量等待子函數*********************/
  86. void measurement_wait()
  87. {
  88.   delay(40000);//測量等待390ms(20/80/320ms對應8、12、14位)
  89. }
  90. /***********************讀數據子函數**********************/
  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_();//接收完高字節數據后,手動拉低數據線(寫0),表示接收結束
  98.   DATE=1;         
  99.       
  100.   low8=mcu_receive_byte();

  101.   DATE=1;//寫時序:上升沿-高電平保持-下降沿                  
  102.   SCK=1;_nop_();_nop_();
  103.   SCK=0;_nop_();_nop_();//接收完高字節校數據后,手動拉高數據線,傳感器不經校驗,直接休眠
  104. }
  105. /***********************讀字節子函數***********************/
  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. /******************取實際溫度子函數********************/
  121. void temperature_calculate()
  122. {
  123.   float d1_5V=-40.1;//定義溫度計算公式參數
  124.   float d2_14bit=0.01;//定義溫度計算公式參數
  125.   temphigh8=high8;
  126.   templow8=low8;

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

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

  132.   temp_2=temp;        
  133. }
  134. /******************分離溫度值子函數********************/
  135. void temperature_seperate()
  136. {
  137.   uchar i=0;//正負數標志位
  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;        //還原補碼,防止下次顯示將負數掃描成正數
  148.         temp=temp+1;

  149.         /*負溫度范圍補償代碼  統一上浮1度,使得精度保證在+-1度以內
  150.          -12度以內,顯示誤差為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表示附帶小數點
  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表示附帶小數點
  173.         p[0]=a1;
  174.         p[1]=b1;
  175.         p[2]=c1;
  176.         p[3]=d1;
  177.   }
  178. }
  179. /*****************溫度極限值分離子函數*********************/
  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. /*****************溫濕度顯示子函數*********************/
  200. void display()
  201. {
  202.    uchar m=0;
  203.    for(m=0;m<16;m++)
  204.         {
  205.                 if(m<8)                           //掃描顯示前8位數碼管,屏蔽后8位數碼管(因為數據線共用)
  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位數碼管,屏蔽前8位數碼管(因為數據線共用)
  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. /****************取實際濕度子函數**********************/
  224. void humidity_calculate()
  225. {
  226.   float c1_12bit=-2.0468,c2_12bit=0.0367,c3_12bit=-0.0000015955;//定義濕度計算公式參數
  227.   float t1_12bit=0.01;//定義濕度計算溫補公式參數
  228.   float t2_12bit=0.00008;//定義濕度計算溫補公式參數
  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. /******************分離濕度值子函數********************/
  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表示附帶小數點
  248.         p[4]=a2;
  249.         p[5]=b2;
  250.         p[6]=c2;
  251.         p[7]=d2;
  252. }
  253. /*******************濕度補償子函數******************/
  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. /************************軟復位子函數******************/
  290. void sht_reset()
  291. {
  292.   uchar i;
  293.   while(DATE==1)
  294.   {         
  295.     SCK=0;
  296.     for(i=0;i<12;i++)           //數據線高電平的情況下,給時鐘線至少9個脈沖
  297.     {
  298.       SCK=1;
  299.           _nop_ ();
  300.           SCK=0;
  301.           _nop_ ();
  302.     }
  303.   }
  304. }
  305. /************************溫度補償子函數******************/
  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. }
復制代碼



全部資料請下載附件:

SHT71模塊化最終版本.rar

113.2 KB, 下載次數: 146, 下載積分: 黑幣 -5

評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久中文字幕 | 精品亚洲一区二区三区 | 免费h在线 | 一级a性色生活片久久毛片波多野 | 国产一区二区在线播放 | 欧美激情一区二区三区 | 免费精品视频在线观看 | 亚洲国产福利视频 | 99爱在线免费观看 | 国产精品区二区三区日本 | 热re99久久精品国99热观看 | 中文字幕一区在线观看视频 | 国产成人在线一区二区 | 久久国产精品久久久久久 | 天天想天天干 | 日韩视频精品在线 | 激情av免费看 | 欧美区在线 | 国产精品爱久久久久久久 | 在线日韩视频 | 国产精品成人一区二区三区夜夜夜 | 男女视频在线观看免费 | 国产亚洲精品久久久久久豆腐 | 在线观看国产视频 | 日韩欧美成人一区二区三区 | 国产资源在线观看 | 精品视频一区二区三区 | 国产视频二区 | 国产激情视频在线免费观看 | 久久久久久亚洲 | 欧美一区二区三区在线视频 | 日本三级全黄三级三级三级口周 | 亚洲免费视频在线观看 | 亚洲影视在线 | 日韩黄| 一区二区在线看 | 国产成人精品视频在线观看 | 一区二区三区国产好 | 精品免费视频一区二区 | 中文字幕动漫成人 | 中文字幕国产日韩 |