找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 18677|回复: 20
收起左侧

基于SHT11温湿度传感器的温湿度控制(含代码,原理图)

  [复制链接]
ID:192267 发表于 2017-4-22 10:58 | 显示全部楼层 |阅读模式
我给大家整理了一系列的SHT11单片机测量的实例(包含论文 与完整的源码等,本人已经测试成功)
SHT11温湿度传感器外观图:
0.png

SHT11温湿度传感器原理图:
0.png
可以用ad来打开工程文件,里面的库都包含了.
0.png
0.png
新建位图图像.png 新建位图图像 (2).png
0.png
在51hei附件中都可以下载
SHT11单片机源代码:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <math.h>

  4. #define        uchar unsigned char
  5. #define uint unsigned int

  6. sbit dat=P1^0;   //串行数据
  7. sbit clk0=P1^1;   //串行时钟
  8. sbit lat=P1^2;

  9. sbit key1=P0^0;
  10. sbit key2=P0^1;
  11. sbit key3=P0^2;

  12. sbit led1=P0^6;
  13. sbit led2=P0^7;

  14. sbit  gw=P1^3;   //个位
  15. sbit  sw=P1^4;    //十位
  16. sbit  bw=P3^3;    //百位
  17. sbit  qw=P3^4;

  18. sbit pl=P3^6;         //165锁存
  19. sbit clk1=P3^7;        //165时钟
  20. sbit Do=P3^5;

  21. sbit DQ=P3^1;
  22. code uchar  tab[16]={  
  23.                 0x3F,  
  24.                                 0x06,
  25.                                 0x5B,
  26.                                 0x4F,   
  27.                                   0x66,
  28.                                 0x6D,
  29.                                 0x7D,
  30.                                 0x07,   
  31.                                   0x7F,
  32.                                 0x6F,  
  33.                 0x39,  //"C"
  34.                 0x79,  //"E"
  35.                 0x76,  //"H"
  36.                 0x38,  //"L"
  37.                 0x40  //"-"
  38. };
  39. uchar k1,k2,k3;
  40. uint t;
  41. uchar disbuf[4];
  42. uint wendu_h=456,wendu_l=288;

  43. ///eeprom address
  44. sfr wdtcontr=0xe1;
  45. sfr ispdata=0xe2;
  46. sfr ispaddrh=0xe3;
  47. sfr ispaddrl=0xe4;
  48. sfr ispcmd=0xe5;
  49. sfr isptrig=0xe6;
  50. sfr ispcontr=0xe7;
  51. ////////////////////////
  52. iapdisable()
  53. {
  54.         ispcontr=0;ispcmd=0;isptrig=0;
  55. }
  56. erase(uint addr)
  57. {
  58.         ispcontr=0x83;ispcmd=0x03;
  59.         ispaddrh=addr/256;ispaddrl=addr%256;
  60.         EA=0;isptrig=0x46;isptrig=0xb9;_nop_();EA=1;
  61.         iapdisable();
  62. }
  63. uchar readbyte(uint addr)
  64. {
  65.         uchar ch;
  66.         ispcontr=0x83;ispcmd=0x01;ispaddrh=addr/256;ispaddrl=addr%256;
  67.         isptrig=0x46;isptrig=0xb9;_nop_();ch=ispdata;
  68.         iapdisable();
  69.         return ch;
  70. }
  71. void writebyte(uint addr,uchar ch)
  72. {
  73.         ispcontr=0x83;ispcmd=0x02;
  74.         ispaddrh=addr/256;ispaddrl=addr%256;
  75.         ispdata=ch;
  76.         isptrig=0x46;isptrig=0xb9;_nop_();
  77.         iapdisable();
  78. }
  79. savedata()
  80. {
  81.         uint addr=0x2000;
  82.         erase(addr);
  83.         writebyte(addr,123);
  84.         addr++;writebyte(addr,wendu_h);
  85.         addr++;writebyte(addr,wendu_l);
  86. }
  87. void getdata(void)
  88. {
  89.         uchar label=0;
  90.         uint addr=0x2000;
  91.         label=readbyte(addr);
  92.         if(label==123)
  93.         {
  94.          addr++;wendu_h=readbyte(addr);
  95.          addr++;wendu_l=readbyte(addr);
  96.          }
  97.         else
  98.                 savedata();
  99. }

  100. ReadDat()
  101. {
  102. unsigned char i,t;
  103. clk1=0;
  104. pl=0;
  105. pl=1;      
  106. for(i=0;i<8;i++)
  107.   {
  108.    t<<=1;       //165在PL有一个脉冲后就输出0位数据
  109.    t|=(bit)Do;
  110.    clk1=1;   // 锁存时钟=1时74HC165才允许读数据
  111.    clk1=0;
  112.   }
  113. P0=t;
  114. }
  115. dsout(unsigned char j)
  116. {
  117. unsigned char i;
  118. for(i=0;i<8;i++)
  119.     {
  120.      dat=j&0x80;       //高位在前
  121.      clk0=1;
  122.      clk0=0;
  123.      j<<=1;
  124.     }
  125.   lat=1;
  126.   lat=0;               //锁存
  127. }
  128. void delay(uint z)
  129. {
  130.         uint x;
  131.         for(x=z;x>0;x--);
  132. }
  133. ds1ms()
  134. {
  135. unsigned int d;
  136. for(d=0;d<250;d++); //大约1ms@12M
  137. }
  138. //------送出循环-------------------------

  139. //----74HC595显示程序--------------------
  140. display(unsigned char sjqw,sjbw,sjsw,sjgw)
  141. {

  142.   dsout(tab[sjgw]);gw=0;ds1ms();gw=1;        //查表得到数据段码送显示
  143.   dsout(tab[sjsw]);sw=0;ds1ms();sw=1;
  144.   dsout(tab[sjbw]);bw=0;ds1ms();bw=1;
  145.   dsout(tab[sjqw]);qw=0;ds1ms();qw=1;
  146.   
  147. }
  148. Init_DS18B20(void)
  149. {
  150.          unsigned char x=0;
  151.          DQ = 1;    //DQ复位
  152.          delay(12);  //稍做延时
  153.          DQ = 0;    //单片机将DQ拉低
  154.          delay(150); //精确延时 大于 480us
  155.          DQ = 1;    //拉高总线
  156.          delay(60);
  157.          x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  158.          delay(30);
  159. }
  160. //读一个字节
  161. uchar ReadOneChar(void)
  162. {
  163.         unsigned char i=0;
  164.         unsigned char dat = 0;
  165.         for (i=8;i>0;i--)
  166.          {
  167.                   DQ = 0; // 给脉冲信号
  168.                   dat>>=1;
  169.                   _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  170.                   DQ = 1; // 给脉冲信号
  171.                   _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  172.                   if(DQ)
  173.                   dat|=0x80;
  174.                   delay(12);
  175.          }
  176.          return(dat);
  177. }
  178. //写一个字节
  179. WriteOneChar(unsigned char dat)
  180. {
  181.          unsigned char i=0;
  182.          for (i=8; i>0; i--)
  183.          {
  184.                   DQ = 0;
  185.                   _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  186.                   DQ = dat&0x01;
  187.                   delay(8);
  188.                   DQ = 1;
  189.                   dat>>=1;
  190.                   _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  191.          }
  192. }
  193. adt(uchar x)
  194. {
  195.         Init_DS18B20();
  196.         WriteOneChar(0xCC); // 跳过读序号列号的操作
  197.         WriteOneChar(x); // 启动温度转换
  198.         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  199.         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  200. }
  201. //读取温度
  202. unsigned char a=0;
  203. unsigned char b=0;
  204. zhuand()
  205. {        
  206.         disbuf[0]=0;                    
  207.         disbuf[1]=t/100;
  208.         disbuf[2]=(t%100)/10;
  209.         disbuf[3]=t%10;

  210. }
  211. void zhuan()         //温度转换将单片机里二进制温度转换成十进制
  212. {
  213.         uint tt=0;
  214.          t=b;//将温度高八位传入t
  215.         t<<=8;
  216.         t=t|a;//将温度低八位传入t
  217.         if (b>0x07)
  218.         {
  219.                 t=~t;tt=((t+1)*5)/8;t= tt; //放大10倍输出并四舍五入
  220.                 if(t>=99) t=99;
  221.                 zhuand();
  222.                 disbuf[0]=14;
  223.                
  224.         }
  225.         else{
  226.                     tt=t;tt=(t*5)/8;t= tt; //放大10倍输出并四舍五入
  227.                         if(t>=999) t=999;
  228.                         if(t>=wendu_h) led1=0;
  229.                         if(t<=wendu_l) led2=0;
  230.                         zhuand();
  231.                 }
  232. }
  233. scankey1()
  234. {        
  235.         ReadDat();
  236.         if(key1==0)
  237.         {        
  238.                 delay(5);
  239.                 if(key1==0)
  240.            {
  241.                     k1++;
  242.           while(!key1)
  243.              {        
  244.                      ReadDat();
  245.                 }
  246.                 }
  247.         }
  248. }
  249. adjust()
  250. {        scankey1();
  251.         while(k1!=0)
  252.          { if(k1==1)
  253.        {
  254.                     ReadDat();
  255.                  if(key2==0)
  256.                   {        
  257.                         delay(5);
  258.                         if(key2==0)
  259.                         {         
  260.                             wendu_h++;
  261.                             if(wendu_h>=999) wendu_h=999;
  262.                                 savedata();
  263.                            while(!key2)
  264.                          {        
  265.                                  ReadDat();
  266.                         }
  267.                         }
  268.                   }
  269.                   if(key3==0)
  270.                   {        
  271.                         delay(5);
  272.                         if(key3==0)
  273.                         {         
  274.                             wendu_h--;
  275.                            if(wendu_h<=0) wendu_h=0;
  276.                            savedata();
  277.                            while(!key3)
  278.                          {        
  279.                                  ReadDat();
  280.                         }
  281.                         }
  282.                   }
  283.                 getdata();
  284.                 t=wendu_h;
  285.         zhuand();
  286.                 disbuf[0]=12;
  287.                 …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码



下载:
温控.zip (2.11 MB, 下载次数: 374)
回复

使用道具 举报

ID:145935 发表于 2017-4-22 22:38 | 显示全部楼层
收藏了,慢慢学习。谢谢分享!
回复

使用道具 举报

ID:195201 发表于 2017-5-1 11:25 | 显示全部楼层
慢慢学习。谢谢分享!
回复

使用道具 举报

ID:197968 发表于 2017-5-8 02:34 | 显示全部楼层
收藏,学习了
回复

使用道具 举报

ID:213117 发表于 2017-10-29 21:11 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:253071 发表于 2017-11-26 16:40 | 显示全部楼层
楼主有没有SHT11的封装啊
回复

使用道具 举报

ID:274537 发表于 2018-1-10 21:21 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:274537 发表于 2018-1-10 21:25 | 显示全部楼层
能留个联系方式嘛  有些问题想请教
回复

使用道具 举报

ID:275216 发表于 2018-1-23 10:30 | 显示全部楼层
我的积分竟然连一个都下载不了
回复

使用道具 举报

ID:225105 发表于 2018-2-11 09:07 | 显示全部楼层

慢慢学习。谢谢分享!
回复

使用道具 举报

ID:290391 发表于 2018-3-11 14:46 | 显示全部楼层
先收藏了,积分够了在下载
回复

使用道具 举报

ID:297807 发表于 2018-3-27 16:00 | 显示全部楼层
谢谢分享,很有用,慢慢学习
回复

使用道具 举报

ID:292004 发表于 2018-4-13 20:17 | 显示全部楼层
黑币扣了不能下载
回复

使用道具 举报

ID:305905 发表于 2018-4-21 22:26 | 显示全部楼层
下载了~学习一下~
回复

使用道具 举报

ID:310987 发表于 2018-4-24 15:54 | 显示全部楼层
这个程序能不能控制呢
回复

使用道具 举报

ID:323482 发表于 2018-5-6 15:32 | 显示全部楼层
哇,新手黑币不够……
回复

使用道具 举报

ID:303333 发表于 2018-5-6 20:08 | 显示全部楼层
为什么浪费了我这么多金币还是下载不下来。
回复

使用道具 举报

ID:284755 发表于 2018-5-21 17:35 | 显示全部楼层
控制模块4组需要220V电压,是电机与照明吗
回复

使用道具 举报

ID:458348 发表于 2019-1-23 18:05 | 显示全部楼层
怎么没看到附件呀!剩下的程序怎么办?
回复

使用道具 举报

ID:291815 发表于 2019-5-31 19:29 | 显示全部楼层
学习学习
回复

使用道具 举报

ID:327625 发表于 2020-5-16 20:28 | 显示全部楼层
下载后怎么没有找见程序呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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