单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 212|回复: 0
打印 上一主题 下一主题
收起左侧

单片机仓库监控系统湿度检测电路+程序

[复制链接]
跳转到指定楼层
楼主
内含仿真图,程序源码


单片机源程序如下:
  1. //****************************************************
  2. //SHT11温度+湿度传感器,测量结果用LCD1602显示
  3. //操作的关键部分是1.对照SHT11的时序图操作
  4. //                                  2.数值的转换
  5. //                                  3.对SHT11的误差进行线性补偿
  6. //****************************************************
  7. #include <AT89X52.h>
  8. #include <intrins.h>
  9. #include <stdio.h>

  10. sbit SCK=P2^4;
  11. sbit DATA=P2^5;
  12. sbit LCD_RS=P2^0;
  13. sbit LCD_EN=P2^2;


  14. unsigned char RH_H,RH_L;                        //接收的湿度的高位数据和低位数据
  15. unsigned int i,j;
  16. unsigned char dispbuf[4];


  17. void delay(unsigned int z)
  18. {
  19.         unsigned int x,y;
  20.         for(x=z;x>0;x--)
  21.                 for(y=110;y>0;y--);
  22. }
  23. void write_GETRH(unsigned char GETRH)
  24. {
  25.         LCD_RS=0;
  26.         P0=GETRH;
  27.         delay(1);
  28.         LCD_EN=1;
  29.         delay(1);
  30.         LCD_EN=0;
  31. }

  32. void write_DATA(unsigned char *date)
  33. {
  34.         unsigned char n;
  35.         for(n=0;n<0x40;n++)
  36.         {
  37.                 if(date[n]=='*')break;                //检测,如果字符输入"*",就终止
  38.                 LCD_RS=1;
  39.                 P0=date[n];
  40.                 delay(5);
  41.                 LCD_EN=1;
  42.                 delay(5);
  43.                 LCD_EN=0;
  44.         }
  45. }

  46. void init()
  47. {
  48.         LCD_EN=0;
  49.         write_GETRH(0x38);
  50.         write_GETRH(0x0c);
  51.         write_GETRH(0x06);
  52.         write_GETRH(0x01);
  53. }

  54. //在SCK上发送n个脉冲信号
  55. void nSCKPulse(unsigned int n)                        
  56. {
  57.         for(i=n;i>0;i--)
  58.         {
  59.                 SCK=0;
  60.                 SCK=1;
  61.         }
  62. }
  63. //启动SHT11
  64. void STARTSHT11()                                       
  65. {
  66.         SCK=1;
  67.         DATA=0;
  68.         SCK=0;
  69.         SCK=1;
  70.         DATA=1;
  71.         SCK=0;
  72. }
  73. //获得湿度数据
  74. void GETRH(unsigned char GETRH)                                //测量湿度
  75. {
  76.         unsigned char bei=0x80;
  77.         DATA=1;
  78.         SCK=0;        //下面可以开始
  79.         for(i=8;i>0;i--)
  80.         {
  81.                 if(GETRH&bei)
  82.                 {
  83.                         DATA=1;
  84.                         SCK=1;
  85.                         SCK=0;
  86.                 }
  87.                 else
  88.                 {
  89.                         DATA=0;
  90.                         SCK=1;
  91.                         SCK=0;
  92.                 }
  93.                 bei=bei/2;
  94.         }
  95. }
  96. //对SHT11进行读操作
  97. void READSHT11()                                                
  98. {
  99.         unsigned char temp;
  100.         RH_H=0;
  101.         RH_L=0;
  102.         for(i=0;i<4;i++)        //4个脉冲没数据
  103.         {
  104.                 SCK=1;
  105.                 SCK=0;
  106.         }
  107.         for(i=4;i>0;i--)        //接收RH高4位数据
  108.         {
  109.                 SCK=1;
  110.                 temp=0x01;
  111.                 if(DATA==1)
  112.                 {
  113.                         temp=(temp<<(i-1));        //右移动
  114.                         RH_H=RH_H+temp;        
  115.                 }
  116.                 SCK=0;
  117.         }
  118.         DATA=0;                                //拉低
  119.         SCK=1;
  120.         SCK=0;
  121.         DATA=1;                                //释放
  122.         for(i=8;i>0;i--)        //接收RH低4位数据
  123.         {
  124.                 SCK=1;
  125.                 temp=0x01;
  126.                 if(DATA==1)
  127.                 {
  128.                         temp=(temp<<(i-1));        //右移动
  129.                         RH_L=RH_L+temp;        
  130.                 }
  131.                 SCK=0;
  132.         }
  133.         P1=RH_H;
  134.         P3=RH_L;
  135.         DATA=0;                                //拉低
  136.         SCK=1;
  137.         SCK=0;
  138.         DATA=1;                                //释放(不做CRC校验,就此结束)
  139. }
  140. //阶乘函数
  141. long FACTORIAL(int n)
  142. {        
  143.         long nn=1;
  144.         for(;n>0;n--)
  145.         {
  146.                 nn=10*nn;
  147.         }
  148.         return(nn);
  149. }
  150. //SHT11的补偿算法
  151. void COMPENSATIONSHT()                                       
  152. {
  153.         unsigned long ii;
  154.         char m;
  155.         ii=((((RH_H*256+RH_L)-221)*318878)/100000);

  156.         if(ii>5000)
  157.         {
  158.                 ii=ii+((10000-ii)*620/5000);
  159.         }
  160.         else
  161.         {
  162.                 ii=ii+ii*620/5000;
  163.         }
  164. //  printf("%f\n",ii);
  165.         for(m=4;m>=0;m--)
  166.         {
  167.                 if(m==1)
  168.                 {
  169.                         write_DATA(".*");
  170.                 }
  171.                 LCD_RS=1;
  172.                 P0=(int)(ii/FACTORIAL(m))+0x30;
  173.                 if(m==4&P0==0x30)
  174.                 {
  175.                         P0=0x20;
  176.                 }
  177.                 if(m==4&P0==0x31)
  178.                 {
  179.                         write_DATA("100.00*");
  180.                         break;
  181.                 }
  182.                 if(m==3&P0==0x30)
  183.                 {
  184.                         P0=0x20;
  185.                 }
  186.                 delay(5);
  187.                 LCD_EN=1;
  188.                 delay(5);
  189.                 LCD_EN=0;
  190.                 ii=ii-((int)(ii/FACTORIAL(m)))*FACTORIAL(m);
  191.         }
  192.         write_DATA("%*");
  193. }

  194. void InitUart(void)
  195. {
  196.         SCON = 0x50;                                  //工作方式1
  197.         TMOD = 0x21;
  198.         PCON = 0x00;
  199.         TH1 = 0xfd;                                   //使用T1作为波特率发生器
  200.         TL1 = 0xfd;
  201.         TI = 1;
  202.         TR1 = 1;                                      //启动T1                                                //启动T1  
  203. }
  204. void main()
  205. {                  
  206.         init();
  207.   InitUart();
  208.         write_GETRH(0x80+0x03);                        //放第一行字符的位置
  209.         write_DATA("Humidity*");
  210.         write_GETRH(0x80+0x42);                        //放第二行字符的位置
  211.         write_DATA("%RH*");
  212.         while(1)
  213.         {
  214.                 nSCKPulse(10);                                //复位
  215.                 STARTSHT11();                                //启动
  216.                 GETRH(0x05);                                //测湿度命令
  217.                 SCK=1;
  218.                 while(DATA);                        //ack为低成功,继续
  219.                 SCK=0;                                        //一直都为低
  220.                 DATA=1;
  221.                 while(DATA);                        //等待300毫秒
  222.                 READSHT11();
  223.                 write_GETRH(0x80+0x47);        //放第二行字符的位置
  224.                 COMPENSATIONSHT();                                //数值转换+显示
  225.     putchar(0x02);
  226.         }
  227. }
复制代码

所有资料51hei提供下载:
湿度.zip (67.69 KB, 下载次数: 6)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机 联系QQ:125739409;技术交流QQ群582644647

Powered by 单片机教程网

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