找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机驱动OLED显示DHT11温湿度及BH1750亮度程序与资料

[复制链接]
跳转到指定楼层
楼主
   DHT11
  DHT11的供电电压为 3-5.5V。传感器上电后,要等待1s 以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。
   DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:
一次完整的数据传输为40bit,高位先出。
数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和
数据传送正确时校验和数据等于“ 8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据” 所得结果的末8位。
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。
0.96 OLED 模块
IIC 接口模块
模块接口定义:
1. GND 电源地
2. VCC 电源正(3~5.5V)
3. SCL OLED 的 D0 脚,在 IIC 通信中为时钟管脚
4. SDA OLED 的 D1 脚,在 IIC 通信中为数据管脚
BH1750
BH1750FVI是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化。
硬件电路见图
(PS:所有资料都放在附件中,需要可自行下载;程还加入了一些其他功能,大家可以根据需求自行修改;附OLED取模软件)

单片机源程序如下:
  1. //              GND    电源地
  2. //              VCC  接5V或3.3v电源
  3. //              D0   P1^0(SCL)
  4. //              D1   P1^1(SDA)
  5. //              RES  接P12
  6. //              DC   接P13
  7. //              CS   接P14               
  8. //******************************************************************************/
  9. #include "REG52.h"
  10. #include "oled.h"
  11. #include "bmp.h"
  12. #include  <math.h>     
  13. #include  <stdio.h>  
  14. #include "intrins.h"

  15. #define uint unsigned int
  16. #define uchar unsigned char

  17. sbit SCL=P1^3;     
  18. sbit SDA=P1^4;  
  19. sbit LED1=P2^3;
  20. sbit LED2=P2^4;
  21. sbit D1=P2^5;
  22. sbit D2=P2^6;

  23. #define SlaveAddress   0x46

  24. typedef unsigned char BYTE;
  25. typedef unsigned short WORD;
  26. static unsigned int time;


  27. BYTE BUF[8];                                 
  28. unsigned char ge,shi,bai,qian,wan;            
  29. int dis_data;   

  30. void delay_nms(unsigned int k);

  31. void Init_BH1750(void);

  32. void conversion(uint temp_data);
  33. void  Single_Write_BH1750(uchar REG_Address);              
  34. uchar Single_Read_BH1750(uchar REG_Address);               
  35. void  Multiple_Read_BH1750();                             

  36. void Delay5us();
  37. void Delay5ms();
  38. void BH1750_Start();                  
  39. void BH1750_Stop();                    
  40. void BH1750_SendACK(bit ack);         
  41. bit  BH1750_RecvACK();                 
  42. void BH1750_SendByte(BYTE dat);      
  43. BYTE BH1750_RecvByte();  

  44. void conversion(uint temp_data)  
  45. {  
  46.         qian=temp_data/1000+0x30 ;
  47.     temp_data=temp_data%1000;   
  48.     bai=temp_data/100+0x30   ;
  49.     temp_data=temp_data%100;     
  50.     shi=temp_data/10+0x30    ;
  51.     temp_data=temp_data%10;     
  52.     ge=temp_data+0x30;         
  53. }

  54. void delay_nms(unsigned int k)        
  55. {                                                
  56.         unsigned int i,j;                                
  57.         for(i=0;i<k;i++)
  58.         {                        
  59.         for(j=0;j<121;j++)                        
  60.         {;}}                                                
  61.         }

  62. void delay(uint u)
  63. {
  64.         while(u--);
  65. }

  66. void Delay5us()
  67. {
  68.     _nop_();_nop_();_nop_();_nop_();
  69.     _nop_();_nop_();_nop_();_nop_();
  70.         _nop_();_nop_();_nop_();_nop_();
  71.         _nop_();_nop_();_nop_();_nop_();
  72. }

  73. void Delay5ms()
  74. {
  75.     WORD n = 560;

  76.     while (n--);
  77. }

  78. void BH1750_Start()
  79. {
  80.     SDA = 1;                  
  81.     SCL = 1;                 
  82.     Delay5us();               
  83.     SDA = 0;                  
  84.     Delay5us();               
  85.     SCL = 0;                  
  86. }

  87. void BH1750_Stop()
  88. {
  89.     SDA = 0;                    
  90.     SCL = 1;                  
  91.     Delay5us();              
  92.     SDA = 1;                    
  93.     Delay5us();                 
  94. }

  95. void BH1750_SendACK(bit ack)
  96. {
  97.     SDA = ack;                 
  98.     SCL = 1;                  
  99.     Delay5us();               
  100.     SCL = 0;               
  101.     Delay5us();              
  102. }

  103. bit BH1750_RecvACK()
  104. {
  105.     SCL = 1;                  
  106.     Delay5us();              
  107.     CY = SDA;              
  108.     SCL = 0;              
  109.     Delay5us();            

  110.     return CY;
  111. }

  112. void BH1750_SendByte(BYTE dat)
  113. {
  114.     BYTE i;

  115.     for (i=0; i<8; i++)        
  116.     {
  117.         dat <<= 1;            
  118.         SDA = CY;              
  119.         SCL = 1;              
  120.         Delay5us();            
  121.         SCL = 0;            
  122.         Delay5us();            
  123.     }
  124.     BH1750_RecvACK();
  125. }

  126. BYTE BH1750_RecvByte()
  127. {
  128.     BYTE i;
  129.     BYTE dat = 0;

  130.     SDA = 1;                  
  131.     for (i=0; i<8; i++)         
  132.     {
  133.         dat <<= 1;
  134.         SCL = 1;               
  135.         Delay5us();           
  136.         dat |= SDA;                     
  137.         SCL = 0;               
  138.         Delay5us();            
  139.     }
  140.     return dat;
  141. }

  142. void Single_Write_BH1750(uchar REG_Address)
  143. {
  144.     BH1750_Start();                 
  145.     BH1750_SendByte(SlaveAddress);  
  146.     BH1750_SendByte(REG_Address);   
  147.     BH1750_Stop();                  
  148. }

  149. void Multiple_read_BH1750(void)
  150. {   uchar i;        
  151.     BH1750_Start();                          
  152.     BH1750_SendByte(SlaveAddress+1);        
  153.         
  154.          for (i=0; i<3; i++)                     
  155.     {
  156.         BUF[i] = BH1750_RecvByte();         
  157.         if (i == 3)
  158.         {

  159.            BH1750_SendACK(1);               
  160.         }
  161.         else
  162.         {               
  163.           BH1750_SendACK(0);               
  164.        }
  165.    }

  166.     BH1750_Stop();                        
  167.     Delay5ms();
  168. }

  169. void Init_BH1750()
  170. {
  171.    Single_Write_BH1750(0x01);  

  172. }



  173. uchar dat_r[4];   

  174. sbit DATA=P2^2;  

  175. void Delay30us()                //@11.0592MHz-40
  176. {
  177.         unsigned char i;

  178.         i = 11;
  179.         while (--i);
  180. }


  181. void Delay20ms()                //@11.0592MHz
  182. {
  183.         unsigned char i, j;

  184.         i = 36;
  185.         j = 217;
  186.         do
  187.         {
  188.                 while (--j);
  189.         } while (--i);
  190. }

  191. void Delay1s()                //@11.0592MHz
  192. {
  193.         unsigned char i, j, k;

  194.         _nop_();
  195.         i = 8;
  196.         j = 1;
  197.         k = 243;
  198.         do
  199.         {
  200.                 do
  201.                 {
  202.                         while (--k);
  203.                 } while (--j);
  204.         } while (--i);
  205. }

  206. void DHT11_start()              
  207. {
  208.    DATA=1;                              
  209.    _nop_();
  210.    _nop_();
  211.    DATA=0;                              
  212.    Delay20ms();  
  213.    DATA=1;                                
  214.    Delay30us();
  215. }

  216. uchar DHT11_rec_byte()      
  217. {
  218.    uchar i,dat=0;
  219.   for(i=0;i<8;i++)   
  220.    {         
  221.       while(!DATA);
  222.       Delay30us();
  223.           Delay30us();   
  224.       dat<<=1;         
  225.       if(DATA==1)   
  226.          dat+=1;
  227.       while(DATA);     
  228.     }  
  229.     return dat;
  230. }

  231. void DHT11_receive()      
  232. {
  233.     uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
  234.     DHT11_start();                 
  235.     if(DATA==0)
  236.     {
  237.         while(DATA==0);   
  238.         Delay30us();
  239.                 Delay30us();
  240.                 Delay30us();  
  241.         R_H=DHT11_rec_byte();   
  242.         R_L=DHT11_rec_byte();     
  243.         T_H=DHT11_rec_byte();   
  244.         T_L=DHT11_rec_byte();   
  245.         revise=DHT11_rec_byte();

  246.         Delay30us();   

  247.         if((R_H+R_L+T_H+T_L)==revise)   
  248.         {
  249.             RH=R_H;
  250.             RL=R_L;
  251.             TH=T_H;
  252.             TL=T_L;
  253.         }
  254.         dat_r[0]='0'+(RH/10);
  255.         dat_r[1]='0'+(RH%10);
  256.         dat_r[2]='0'+(TH/10);
  257.         dat_r[3]='0'+(TH%10);
  258.     }
  259. }

  260. int main(void)
  261. {        
  262.                  float temp;
  263.                 delay_nms(100);            
  264.                 Init_BH1750();        
  265.                 OLED_Init();                        
  266.                 OLED_Clear();
  267.                
  268.                         
  269.                         OLED_Clear();               
  270.                         OLED_ShowCHinese1(3,0,0);
  271.                                         OLED_ShowCHinese1(21,0,1);
  272.                         OLED_ShowCHinese1(39,0,2);//温度               
  273.                         OLED_ShowCHinese2(3,3,0);
  274.                                         OLED_ShowCHinese2(21,3,1);
  275.                         OLED_ShowCHinese2(39,3,2);//湿度
  276.                         OLED_ShowCHinese3(3,6,0);
  277.                                         OLED_ShowCHinese3(21,6,1);
  278.                         OLED_ShowCHinese3(39,6,2);//亮度
  279.                 while(1)
  280.                 {            
  281.                                        
  282.                         OLED_DrawBMP(90,0,106,2,BMP1);
  283.                         OLED_DrawBMP(90,3,106,5,BMP2);
  284.                         DHT11_receive();
  285.                         OLED_ShowChar(60,3,dat_r[0],16);
  286.                         OLED_ShowChar(70,3,dat_r[1],16);
  287.                         OLED_ShowChar(60,0,dat_r[2],16);
  288.                         OLED_ShowChar(70,0,dat_r[3],16);

  289.                         Single_Write_BH1750(0x01);   
  290.                         Single_Write_BH1750(0x10);   
  291.                         delay_nms(180);              
  292.                         Multiple_Read_BH1750();      
  293.                         dis_data=BUF[0];
  294.                         dis_data=(dis_data<<8)+BUF[1];
  295.                         temp=(float)dis_data/1.2;
  296.                         conversion(temp);
  297.                         OLED_ShowNum(60,6,temp,3,16);               

  298.                          if(temp>70)
  299.                         {
  300.                                 LED1=1;
  301.                                 LED2=1;
  302.                                 D1=0;
  303.                                 D2=0;
  304.                         }
  305.                         else
  306.                         {
  307.                                 LED1=1;
  308.                                 LED2=1;
  309.                                 D1=1;
  310.                                 D2=1;
  311.                         }
  312.                         delay_ms(100);
  313.         }         
  314. }
  315.         
复制代码

程序和传感器PDF下载:
程序.7z (2.72 MB, 下载次数: 135)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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