找回密码
 立即注册

QQ登录

只需一步,快速开始

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

MAX487+SHT11单片机远程仓库湿度控制系统仿真与源码

[复制链接]
跳转到指定楼层
楼主
单片机C语言实战开发之远程MAX487+SHT11仓库湿度控制系统内有c51源码和proteus仿真图,测试100%通过
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)



单片机源程序如下:
  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. ……………………

  223. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
远程仓库湿度控制系统.rar (67 KB, 下载次数: 47)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:170346 发表于 2018-8-15 11:43 | 只看该作者
压缩文件坏的,无法打开
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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