標(biāo)題: 51單片機(jī)驅(qū)動(dòng)OLED顯示DHT11溫濕度及BH1750亮度程序與資料 [打印本頁(yè)]
作者: curx 時(shí)間: 2021-10-25 19:50
標(biāo)題: 51單片機(jī)驅(qū)動(dòng)OLED顯示DHT11溫濕度及BH1750亮度程序與資料
DHT11
DHT11的供電電壓為 3-5.5V。傳感器上電后,要等待1s 以越過(guò)不穩(wěn)定狀態(tài)在此期間無(wú)需發(fā)送任何指令。電源引腳(VDD,GND)之間可增加一個(gè)100nF 的電容,用以去耦濾波。
DATA 用于微處理器與 DHT11之間的通訊和同步,采用單總線數(shù)據(jù)格式,一次通訊時(shí)間4ms左右,數(shù)據(jù)分小數(shù)部分和整數(shù)部分,具體格式在下面說(shuō)明,當(dāng)前小數(shù)部分用于以后擴(kuò)展,現(xiàn)讀出為零.操作流程如下:
一次完整的數(shù)據(jù)傳輸為40bit,高位先出。
數(shù)據(jù)格式:8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bi溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)+8bit校驗(yàn)和
數(shù)據(jù)傳送正確時(shí)校驗(yàn)和數(shù)據(jù)等于“ 8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bi溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)” 所得結(jié)果的末8位。
用戶MCU發(fā)送一次開始信號(hào)后,DHT11從低功耗模式轉(zhuǎn)換到高速模式,等待主機(jī)開始信號(hào)結(jié)束后,DHT11發(fā)送響應(yīng)信號(hào),送出40bit的數(shù)據(jù),并觸發(fā)一次信號(hào)采集,用戶可選擇讀取部分?jǐn)?shù)據(jù).從模式下,DHT11接收到開始信號(hào)觸發(fā)一次溫濕度采集,如果沒有接收到主機(jī)發(fā)送開始信號(hào),DHT11不會(huì)主動(dòng)進(jìn)行溫濕度采集.采集數(shù)據(jù)后轉(zhuǎn)換到低速模式。
0.96 寸 OLED 模塊
IIC 接口模塊
模塊接口定義:
1. GND 電源地
2. VCC 電源正(3~5.5V)
3. SCL OLED 的 D0 腳,在 IIC 通信中為時(shí)鐘管腳
4. SDA OLED 的 D1 腳,在 IIC 通信中為數(shù)據(jù)管腳
BH1750
BH1750FVI是一種用于兩線式串行總線接口的數(shù)字型光強(qiáng)度傳感器集成電路。這種集成電路可以根據(jù)收集的光線強(qiáng)度數(shù)據(jù)來(lái)調(diào)整液晶或者鍵盤背景燈的亮度。利用它的高分辨率可以探測(cè)較大范圍的光強(qiáng)度變化。
硬件電路見圖
(PS:所有資料都放在附件中,需要可自行下載;程還加入了一些其他功能,大家可以根據(jù)需求自行修改;附OLED取模軟件)
DHT11.jpg (15.6 KB, 下載次數(shù): 85)
下載附件
2021-10-25 19:50 上傳
原理圖.png (165.85 KB, 下載次數(shù): 54)
下載附件
原理圖
2021-10-25 19:50 上傳
BH1750.jpg (9.43 KB, 下載次數(shù): 71)
下載附件
2021-10-25 19:50 上傳
頂層.png (158.04 KB, 下載次數(shù): 61)
下載附件
頂層
2021-10-25 19:50 上傳
底層.png (132.82 KB, 下載次數(shù): 66)
下載附件
2021-10-25 19:50 上傳
單片機(jī)源程序如下:
- // GND 電源地
- // VCC 接5V或3.3v電源
- // D0 P1^0(SCL)
- // D1 P1^1(SDA)
- // RES 接P12
- // DC 接P13
- // CS 接P14
- //******************************************************************************/
- #include "REG52.h"
- #include "oled.h"
- #include "bmp.h"
- #include <math.h>
- #include <stdio.h>
- #include "intrins.h"
- #define uint unsigned int
- #define uchar unsigned char
- sbit SCL=P1^3;
- sbit SDA=P1^4;
- sbit LED1=P2^3;
- sbit LED2=P2^4;
- sbit D1=P2^5;
- sbit D2=P2^6;
- #define SlaveAddress 0x46
- typedef unsigned char BYTE;
- typedef unsigned short WORD;
- static unsigned int time;
- BYTE BUF[8];
- unsigned char ge,shi,bai,qian,wan;
- int dis_data;
- void delay_nms(unsigned int k);
- void Init_BH1750(void);
- void conversion(uint temp_data);
- void Single_Write_BH1750(uchar REG_Address);
- uchar Single_Read_BH1750(uchar REG_Address);
- void Multiple_Read_BH1750();
- void Delay5us();
- void Delay5ms();
- void BH1750_Start();
- void BH1750_Stop();
- void BH1750_SendACK(bit ack);
- bit BH1750_RecvACK();
- void BH1750_SendByte(BYTE dat);
- BYTE BH1750_RecvByte();
- void conversion(uint temp_data)
- {
- qian=temp_data/1000+0x30 ;
- temp_data=temp_data%1000;
- bai=temp_data/100+0x30 ;
- temp_data=temp_data%100;
- shi=temp_data/10+0x30 ;
- temp_data=temp_data%10;
- ge=temp_data+0x30;
- }
- void delay_nms(unsigned int k)
- {
- unsigned int i,j;
- for(i=0;i<k;i++)
- {
- for(j=0;j<121;j++)
- {;}}
- }
- void delay(uint u)
- {
- while(u--);
- }
- void Delay5us()
- {
- _nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();
- }
- void Delay5ms()
- {
- WORD n = 560;
- while (n--);
- }
- void BH1750_Start()
- {
- SDA = 1;
- SCL = 1;
- Delay5us();
- SDA = 0;
- Delay5us();
- SCL = 0;
- }
- void BH1750_Stop()
- {
- SDA = 0;
- SCL = 1;
- Delay5us();
- SDA = 1;
- Delay5us();
- }
- void BH1750_SendACK(bit ack)
- {
- SDA = ack;
- SCL = 1;
- Delay5us();
- SCL = 0;
- Delay5us();
- }
- bit BH1750_RecvACK()
- {
- SCL = 1;
- Delay5us();
- CY = SDA;
- SCL = 0;
- Delay5us();
- return CY;
- }
- void BH1750_SendByte(BYTE dat)
- {
- BYTE i;
- for (i=0; i<8; i++)
- {
- dat <<= 1;
- SDA = CY;
- SCL = 1;
- Delay5us();
- SCL = 0;
- Delay5us();
- }
- BH1750_RecvACK();
- }
- BYTE BH1750_RecvByte()
- {
- BYTE i;
- BYTE dat = 0;
- SDA = 1;
- for (i=0; i<8; i++)
- {
- dat <<= 1;
- SCL = 1;
- Delay5us();
- dat |= SDA;
- SCL = 0;
- Delay5us();
- }
- return dat;
- }
- void Single_Write_BH1750(uchar REG_Address)
- {
- BH1750_Start();
- BH1750_SendByte(SlaveAddress);
- BH1750_SendByte(REG_Address);
- BH1750_Stop();
- }
- void Multiple_read_BH1750(void)
- { uchar i;
- BH1750_Start();
- BH1750_SendByte(SlaveAddress+1);
-
- for (i=0; i<3; i++)
- {
- BUF[i] = BH1750_RecvByte();
- if (i == 3)
- {
- BH1750_SendACK(1);
- }
- else
- {
- BH1750_SendACK(0);
- }
- }
- BH1750_Stop();
- Delay5ms();
- }
- void Init_BH1750()
- {
- Single_Write_BH1750(0x01);
- }
- uchar dat_r[4];
- sbit DATA=P2^2;
- void Delay30us() //@11.0592MHz-40
- {
- unsigned char i;
- i = 11;
- while (--i);
- }
- void Delay20ms() //@11.0592MHz
- {
- unsigned char i, j;
- i = 36;
- j = 217;
- do
- {
- while (--j);
- } while (--i);
- }
- void Delay1s() //@11.0592MHz
- {
- unsigned char i, j, k;
- _nop_();
- i = 8;
- j = 1;
- k = 243;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- void DHT11_start()
- {
- DATA=1;
- _nop_();
- _nop_();
- DATA=0;
- Delay20ms();
- DATA=1;
- Delay30us();
- }
- uchar DHT11_rec_byte()
- {
- uchar i,dat=0;
- for(i=0;i<8;i++)
- {
- while(!DATA);
- Delay30us();
- Delay30us();
- dat<<=1;
- if(DATA==1)
- dat+=1;
- while(DATA);
- }
- return dat;
- }
- void DHT11_receive()
- {
- uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
- DHT11_start();
- if(DATA==0)
- {
- while(DATA==0);
- Delay30us();
- Delay30us();
- Delay30us();
- R_H=DHT11_rec_byte();
- R_L=DHT11_rec_byte();
- T_H=DHT11_rec_byte();
- T_L=DHT11_rec_byte();
- revise=DHT11_rec_byte();
- Delay30us();
- if((R_H+R_L+T_H+T_L)==revise)
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- }
- dat_r[0]='0'+(RH/10);
- dat_r[1]='0'+(RH%10);
- dat_r[2]='0'+(TH/10);
- dat_r[3]='0'+(TH%10);
- }
- }
- int main(void)
- {
- float temp;
- delay_nms(100);
- Init_BH1750();
- OLED_Init();
- OLED_Clear();
-
-
- OLED_Clear();
- OLED_ShowCHinese1(3,0,0);
- OLED_ShowCHinese1(21,0,1);
- OLED_ShowCHinese1(39,0,2);//溫度
- OLED_ShowCHinese2(3,3,0);
- OLED_ShowCHinese2(21,3,1);
- OLED_ShowCHinese2(39,3,2);//濕度
- OLED_ShowCHinese3(3,6,0);
- OLED_ShowCHinese3(21,6,1);
- OLED_ShowCHinese3(39,6,2);//亮度
- while(1)
- {
-
- OLED_DrawBMP(90,0,106,2,BMP1);
- OLED_DrawBMP(90,3,106,5,BMP2);
- DHT11_receive();
- OLED_ShowChar(60,3,dat_r[0],16);
- OLED_ShowChar(70,3,dat_r[1],16);
- OLED_ShowChar(60,0,dat_r[2],16);
- OLED_ShowChar(70,0,dat_r[3],16);
- Single_Write_BH1750(0x01);
- Single_Write_BH1750(0x10);
- delay_nms(180);
- Multiple_Read_BH1750();
- dis_data=BUF[0];
- dis_data=(dis_data<<8)+BUF[1];
- temp=(float)dis_data/1.2;
- conversion(temp);
- OLED_ShowNum(60,6,temp,3,16);
- if(temp>70)
- {
- LED1=1;
- LED2=1;
- D1=0;
- D2=0;
- }
- else
- {
- LED1=1;
- LED2=1;
- D1=1;
- D2=1;
- }
- delay_ms(100);
- }
- }
-
復(fù)制代碼
51hei.png (6.21 KB, 下載次數(shù): 60)
下載附件
2021-10-26 20:28 上傳
程序和傳感器PDF下載:
程序.7z
(2.72 MB, 下載次數(shù): 156)
2021-10-26 20:28 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者: 1754232 時(shí)間: 2024-8-16 21:24
你好我想問(wèn)一下我用的是STC8H8K64U的芯片用不了是有什么問(wèn)題嗎
作者: hp34401a 時(shí)間: 2024-8-17 13:26
樓主的程序是12T的傳統(tǒng)51,STC8H要注意調(diào)整速度,及一定要IO口初始化!!!
作者: bd5fna 時(shí)間: 2024-8-17 16:26
STC8H8K64U要配置IO
歡迎光臨 (http://m.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
欧美在线视频观看
|
亚洲综合激情网
|
亚洲久久久久久
|
中文字幕三区
|
麻豆精品国产
|
午夜视频在线播放
|
国产一级片在线播放
|
性欧美bbw
|
国产欧美一区二区三区视频在线观看
|
国产欧美在线播放
|
国产69精品久久久久久
|
久久精品综合
|
婷婷六月综合
|
中文字幕一区二区三区乱码
|
欧美不卡
|
亚洲狠狠
|
中国少妇xxxxhd做受
|
一级片免费网站
|
91久久久久
|
中文字幕亚洲精品
|
天天躁日日躁bbbbb
|
国产成人午夜高潮毛片
|
日韩视频在线观看免费
|
奇米影视888
|
在线视频黄
|
日本高清中文字幕
|
欧美日韩黄色片
|
蜜桃视频一区
|
欧美视频免费在线观看
|
日韩一区二区视频在线观看
|
簧片在线免费观看
|
婷婷久久久
|
欧美成人精品欧美一级乱黄
|
国产一二三
|
欧美日韩中文
|
国产精品久久
|
日本视频免费
|
av成人在线播放
|
谁有毛片网站
|
a视频在线免费观看
|
天堂av影院
|