49-基于单片机的湿度和光照监测

打印 上一主题 下一主题

主题 985|帖子 985|积分 2955

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x


目次
一、主要功能
二、硬件资源
三、程序编程
四、实现现象

一、主要功能

基于AT89C52单片机,接纳DHT11温湿度传感器检测土壤湿度,光敏电阻毗连ADC0832数模转换器作为光敏传感器,然后通过LCD1602表现湿度和光照值,假如湿度低于阈值,则继电器驱动电机转动模拟浇花。
二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

三、程序编程

  1. #include <REGX52.H>
  2. #include<intrins.h>
  3. #include<stdio.h>
  4. #include "Delay.h"
  5. #include "LCD1602.h"
  6. #define uchar unsigned char
  7. #define uint unsigned  int
  8. typedef unsigned char u8;
  9. typedef unsigned int  u16;
  10. sbit CS=P1^0;                 //adc0832引脚
  11. sbit CLK=P1^1;
  12. sbit DIO=P1^2;
  13. sbit beep=P3^4;
  14. sbit Temp_data=P2^6;                                  //DHT11
  15. sbit ssmotor = P3^0;
  16. unsigned char rec_dat_lcd0[6];
  17. unsigned char rec_dat_lcd1[6];
  18. unsigned char rec_dat_lcd2[6];
  19. unsigned char rec_dat_lcd3[6];
  20. unsigned int rec_dat[4];
  21. static uchar u,U,R;      //定义变量
  22. static uchar sd;
  23. static int sdyz=80,gzyz=90;
  24. void DHT11_delay_us(unsigned char n);
  25. void DHT11_delay_ms(unsigned int z);
  26. void DHT11_start();
  27. unsigned char DHT11_rec_byte();
  28. void DHT11_receive();
  29. void beep_warning();
  30. void cshq();
  31. void xxpxs();
  32. //延时ms
  33. void DHT11_delay_ms(unsigned int z)
  34. {
  35.     unsigned int i,j;
  36.     for(i=z; i>0; i--)
  37.         for(j=110; j>0; j--);
  38. }
  39. //延时us   --2*n+5us
  40. void DHT11_delay_us(unsigned char n)
  41. {
  42.     while(--n);
  43. }
  44. //DHT11起始信号
  45. void DHT11_start()
  46. {
  47.     Temp_data=1;
  48.     DHT11_delay_us(10);
  49.     Temp_data=0;
  50.     DHT11_delay_ms(50);//这个延时不能过短,18ms以上,实际在仿真当中要想读到数据延时要在延时参数要在40以上才能出数据
  51.     Temp_data=1;
  52.     DHT11_delay_us(30);//这个延时不能过短
  53. }
  54. //接收一个字节
  55. unsigned char DHT11_rec_byte()
  56. {
  57.     unsigned char i,dat=0;
  58.     for(i=0; i<8; i++)
  59.     {
  60.         while(!Temp_data);
  61.         DHT11_delay_us(8);
  62.         dat <<=1;
  63.         if(Temp_data==1)
  64.         {
  65.             dat +=1;
  66.         }
  67.         while(Temp_data);
  68.     }
  69.     return dat;
  70. }
  71. //接收温湿度数据
  72. void DHT11_receive()
  73. {
  74.     unsigned int R_H,R_L,T_H,T_L;
  75.     unsigned char RH,RL,TH,TL,revise;
  76.     DHT11_start();
  77.     Temp_data=1;
  78.     if(Temp_data==0)
  79.     {
  80.         while(Temp_data==0);   //等待拉高
  81.         DHT11_delay_us(40);  //拉高后延时80us
  82.         R_H=DHT11_rec_byte();    //接收湿度高八位
  83.         R_L=DHT11_rec_byte();    //接收湿度低八位
  84.         T_H=DHT11_rec_byte();    //接收温度高八位
  85.         T_L=DHT11_rec_byte();    //接收温度低八位
  86.         revise=DHT11_rec_byte(); //接收校正位
  87.         DHT11_delay_us(25);    //结束
  88.         if((R_H+R_L+T_H+T_L)==revise)      //校正
  89.         {
  90.             RH=R_H;
  91.             RL=R_L;
  92.             TH=T_H;
  93.             TL=T_L;
  94.         }
  95.         /*数据处理,方便显示*/
  96.         rec_dat[0]=RH;
  97.         rec_dat[1]=RL;
  98.         rec_dat[2]=TH;
  99.         rec_dat[3]=TL;
  100.     }
  101. }
  102. void dht11()
  103. {
  104.               DHT11_delay_ms(150);
  105.         DHT11_receive();
  106.               sprintf(rec_dat_lcd0,"%d",rec_dat[0]);
  107.         sprintf(rec_dat_lcd1,"%d",rec_dat[1]);
  108.         sprintf(rec_dat_lcd2,"%d",rec_dat[2]);
  109.         sprintf(rec_dat_lcd3,"%d",rec_dat[3]);
  110.         DHT11_delay_ms(100);         
  111.                                 sd = rec_dat[1]*10 + rec_dat[0];
  112. }
  113. uchar get_AD_Res()            //ADC0832启动读取函数
  114. {
  115.         uchar i, data1=0, data2=0;
  116.         CS=0;
  117.        
  118.         CLK=0;DIO=1;_nop_();
  119.         CLK=1;_nop_();
  120.        
  121.         CLK=0;DIO=1;_nop_();
  122.         CLK=1;_nop_();
  123.        
  124.         CLK=0;DIO=0;_nop_();
  125.         CLK=1;_nop_();
  126.        
  127.         CLK=0;DIO=1;_nop_();
  128.        
  129.         for(i=0; i<8; i++)
  130.         {
  131.                 CLK=1;_nop_();
  132.                 CLK=0;_nop_();
  133.                 data1=(data1<<1)|(uchar)DIO;
  134.         }
  135.        
  136.         for(i=0; i<8; i++)
  137.         {
  138.                 data2=data2|(uchar)DIO<<i;
  139.                 CLK=1;_nop_();
  140.                 CLK=0;_nop_();
  141.         }
  142.         CS=1;
  143.        
  144.         return(data1 == data2)?data1:0;
  145. }
  146. void beep_warning()//蜂鸣器警报并且电机转动
  147. {
  148.        
  149.         if(sd<sdyz)
  150.         {
  151.                 beep = 1;
  152.                 ssmotor = 0;
  153.         }
  154.         else
  155.         {
  156.                 ssmotor = 1;
  157.                 beep = 0;
  158.         }
  159.   
  160. }
  161. void main()                                          //主函数
  162. {       
  163.         LCD_Init();         //显示屏初始化
  164.         ssmotor = 1;
  165.         beep = 0;
  166.         do
  167.         {
  168.                 cshq();  //参数获取
  169.                 dht11(); //温湿度获取
  170.                 xxpxs();  //显示屏显示
  171.                 beep_warning(); //状态判断
  172.         }  while(1);
  173. }
  174. void xxpxs()  //显示屏显示
  175. {
  176.                 LCD_ShowString(1,1,"gz:");       
  177.           LCD_ShowNum(1,4,R,3); //CO
  178.                         LCD_ShowString(2,1,"sd:");       
  179.                         LCD_ShowNum(2,4,sd,3);//PM2.5
  180.        
  181. }
  182. void cshq()  //参数获取
  183. {
  184.           u=get_AD_Res();
  185.                 U=(250*u)/128;     //此处将数字信号转化为模拟信号,要根据上拉电阻阻值来确定
  186.                 R=200*U/250;           //CO的值
  187.        
  188.        
  189. }
复制代码
四、实现现象

具体动态效果看B站演示视频:
49-基于单片机的湿度和光照监测_哔哩哔哩_bilibili
全部资料(源程序、仿真文件、安装包、演示视频):
点击下载百度网盘源资料


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

渣渣兔

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表