|
51单片机 DHT11 oled显示温湿度 人流量检测 蓝牙串口控制开关
部分代码
- #include "reg52.h"
- #include "oled.h"
- #include<intrins.h>
- #define MAIN_Fosc 24000000L //define main clock
- #define Baudrate 500000L //define the baudrate
- //12T mode: 600~115200 for 22.1184MHZ, 300~57600 for 11.0592MHZ
- //1T mode: 7200~1382400 for 22.1184MHZ, 3600~691200 for 11.0592MHZ
- #define BRT_Reload (256 - MAIN_Fosc / 16 / Baudrate) //Calculate the timer1 reload value ar 1T mode
-
- u8 person=0;
- u8 rec_RH,rec_TH;
- void DHT11_delay_us(u8 n)
- {
- while(--n);
- }
- void DHT11_delay_ms(u8 z)
- {
- u8 i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- void DHT11_start()
- {
- Data=1;
- DHT11_delay_us(2);
- Data=0;
- DHT11_delay_ms(20);
- Data=1;
- DHT11_delay_us(30);
- }
- u8 DHT11_rec_byte()
- {
- u8 i,dat=0;
- for(i=0;i<8;i++)
- {
- while(!Data);
- DHT11_delay_us(8);
- dat<<=1;
- if(Data==1)
- dat+=1;
- while(Data);
- }
- return dat;
- }
- void DHT11_receive()
- {
- u8 R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
- DHT11_start();
- if(Data==0)
- {
- while(Data==0);
- DHT11_delay_us(40);
- R_H=DHT11_rec_byte();
- R_L=DHT11_rec_byte();
- T_H=DHT11_rec_byte();
- T_L=DHT11_rec_byte();
- revise=DHT11_rec_byte();
- DHT11_delay_us(25);
- if((R_H+R_L+T_H+T_L)==revise)
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- }
- rec_RH=RH;
- rec_TH=TH;
- }
- }
- void Person_num()
- {
- while(red1 == 0&&red2 == 1)
- {
- if(red1 == 1&&red2 == 1)
- person++;
- }
- while(red2 == 0&&red1 == 1&&person > 0)
- {
- if(red1 == 1&&red2 == 1)
- person--;
- }
- }
- void uart_init(void)
- {
- EA=1;
- ES=1;
- TMOD=0x20;
- SCON=0x70;
- PCON|=0x00;
- TH1=0xfd;//9600bps;
- TR1=1;
- }
- /*******************************Main*******************************/
- void main(void)
- {
- Initial_M096128x64_ssd1306();
- Delay_1ms(5);
- OLED_Clear();
- OLED_ShowCHinese(0,0,0); //显示"温"
- OLED_ShowCHinese(20,0,2);//显示"度"
- OLED_ShowCHinese(40,0,5);//显示":"
- OLED_ShowNum(60,0,0);
- OLED_ShowCHinese(80,0,6);
- OLED_ShowCHinese(0,2,1); //显示"湿"
- OLED_ShowCHinese(20,2,2);//显示"度"
- OLED_ShowCHinese(40,2,5);//显示":"
- OLED_ShowNum(60,2,0);
- OLED_ShowChar(80,2,10);
- OLED_ShowCHinese(0,4,3); //显示"人"
- OLED_ShowCHinese(20,4,4);//显示"数"
- OLED_ShowCHinese(40,4,5);//显示":"
- OLED_ShowNum(60,4,0);
- Delay_50ms(25);
- while(1)
- {
- uart_init();
- OLED_ShowNum(60,0,rec_TH);
- OLED_ShowNum(60,2,rec_RH);
- DHT11_receive();
- Person_num();
- OLED_ShowNum(60,4,person);
- DHT11_delay_us(100);
- }
- }
- void uart0_interrupt (void) interrupt 4
- {
- if(RI)
- {
- u8 receive = SBUF;
- RI = 0;
- switch(receive)
- {
- case '0': key1 = 0;break;
- case '1': key1 = 1;break;
- case '2': key2 = 0;break;
- case '3': key2 = 1;break;
- }
- }
- }
复制代码
|
|