DHT22程序是在百度文庫找的DHT11程序修改過來的,OLED程序為中景園OLED給的參考程序
電路原理圖如下:
0.png (39.14 KB, 下載次數: 48)
下載附件
2019-5-17 04:02 上傳
單片機源程序如下:
- #include "STC12C5a60s2.H"
- #include "oled.h"
- #include "dht11.h"
- #include "intrins.h"
- extern unsigned int F16T,F16RH;
- unsigned long vot = 0;
- unsigned int _125us =0;
- unsigned int _100ms=0;
- unsigned int a;
- bit _1s_flag = 0;
- bit _100ms_flag=0;
- bit flag=0;
- unsigned int temp;
- unsigned int temp1;
- unsigned char AD_cnt=0;
- unsigned int AD_max,AD_sum,AD_data,AD_value=0;
- unsigned int AD_min=0xffff;
- //-------------------------------------------------
- #define SAMPLE_CNT 10
- #define ADC_POWER 0x80 // ADC電源
- #define ADC_FLAG 0x10 // ADC轉換結束標志
- #define ADC_START 0x08 // ADC啟動控制位
- #define ADC_SPEEDLL 0X00 // 540 clocks
- #define ADC_SPEEDL 0X20 // 360 clocks
- #define ADC_SPEEDH 0X40 // 180 clocks
- #define ADC_SPEEDHH 0X60 // 90 clocks
- #define AUXR1_ADRJ 0x04 // 轉換結果數據格式控制
- /*------------------------------------------------
- ADC初始化函數
- ------------------------------------------------*/
- void ADC_Init(void)
- {
- P1ASF=0x07; // P1.0→P1.3為模擬量輸入通道
- ADC_RES=0;
- ADC_RESL=0;
- ADC_CONTR=ADC_CONTR|ADC_POWER|ADC_SPEEDLL; // 開啟AD轉換器電源,設定轉換速度為540 clocks
- AUXR1&=~AUXR1_ADRJ; // 轉換結果高8位放ADC_RES,低2位放ADC_RESL,左對齊
- }
- /*------------------------------------------------
- AD轉換函數
- ------------------------------------------------*/
- unsigned int AD_Read(unsigned char channel)
- {
- ADC_CONTR=ADC_CONTR|ADC_START|channel; // 啟動AD轉換,選擇轉換通道
- _nop_(); _nop_(); _nop_(); _nop_(); // 等待成功設置ADC_CONTR
- while(!(ADC_CONTR&ADC_FLAG)); // 等待轉換結束
- ADC_CONTR=ADC_CONTR&(~ADC_FLAG)&(~ADC_START); // 清轉換結束標志,關閉AD轉換
- //ADC_CONTR&=0xef; // 清除ADC_FLAG位
- return(ADC_RES*4+ADC_RESL); // 轉換結果高8位放ADC_RES,低2位放ADC_RESL,左對齊
- }
- //-------------------------------------------------
- //-------------------------------------------------
- void UsartInit()
- {
- SCON=0X50; //設置為工作方式1
- TMOD=0X20; //設置計數器工作方式2
- PCON=0X80; //波特率加倍
- TH1=0XF3; //計數器初始值設置,注意波特率是4800的
- TL1=0XF3;
- ES=1; //打開接收中斷
- EA=1; //打開總中斷
- TR1=1; //打開計數器
- }
- void InitTimer0(void)
- {
- TMOD = TMOD|0x01;
- TH0 = 0x0FA;
- TL0 = 0x24;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- void timetable()
- {
- if(_100ms>=800)
- {
- _100ms=0;
- _100ms_flag=1;
- }
- if(_125us>=8000)
- {
- _125us=0;
- _1s_flag=1;
- }
- }
- void display ()
- {
- u8 t;
- u8 x;
- u8 y;
- if(flag==0) //溫度正數
- {
- OLED_ShowChar(0,2,32);
- OLED_ShowChar(18,2,32);
- OLED_ShowChar(36,2,32);
- OLED_ShowChar(72,2,32); ////清屏
- t=F16T/100+48;
- if(t<=48) t=' ';
- OLED_ShowChar(18,2,t); //10位
- t=F16T%100/10+48;
- OLED_ShowChar(36,2,t); //個位
- t=F16T%10+48;
- OLED_ShowChar(72,2,t); //小數點后一位
- }
- else //溫度負數
- {
- OLED_ShowChar(0,2,32);
- OLED_ShowChar(18,2,32);
- OLED_ShowChar(36,2,32);
- OLED_ShowChar(72,2,32); ////清屏
- OLED_ShowChar(0,2,'-');
- t=F16T/100+48;
- if(t<=48) t=' ';
- OLED_ShowChar(18,2,t); //10位
- t=F16T%100/10+48;
- OLED_ShowChar(36,2,t); //個位
- t=F16T%10+48;
- OLED_ShowChar(72,2,t); //小數點后一位
-
- }
- //濕度
- OLED_ShowChar(0,4,32);
- OLED_ShowChar(18,4,32);
- OLED_ShowChar(54,4,32); ////清屏
- x=F16RH/100+48;
- if(x<=48) x=' ';
- OLED_ShowChar(0,4,x); //10位
- x=F16RH%100/10+48;
- OLED_ShowChar(18,4,x); //個位
-
- x=F16RH%10+48;
- OLED_ShowChar(54,4,x); //小數點后一位
-
-
- //電壓
- OLED_ShowChar(0,6,32);
- OLED_ShowChar(18,6,32);
- OLED_ShowChar(54,6,32); //清屏
- OLED_ShowChar(72,6,32); //xx.xx
- y=(unsigned char)(temp1/1000+48);
- if(y<=48) y=' ';
- OLED_ShowChar(0,6,y); //10位
- y=(unsigned char)(temp1%1000/100+48);
- OLED_ShowChar(18,6,y); //個位
- y=(unsigned char)(temp1%1000%100/10+48);
- OLED_ShowChar(54,6,y); //小數點后一位
- y=(unsigned char)(temp1%10+48);
- OLED_ShowChar(72,6,y); //小數點后兩位
- }
- void main(void)
- {
- // bitinit ();
- //ADinit();
- AUXR = AUXR|0x80; // T0, 1T Mode
- ADC_Init();
- OLED_Init(); //初始化OLED
- OLED_Clear();
- UsartInit();
- InitTimer0(); //初始化定時器0
-
- OLED_ShowCHinese(0,0,0);//溫 0 18 36 54 72 90 108
- OLED_ShowCHinese(18,0,1);//濕
- OLED_ShowCHinese(36,0,2);//度
- OLED_ShowCHinese(54,0,3);//檢
- OLED_ShowCHinese(72,0,4);//測
- OLED_ShowCHinese(90,0,5);//系
- OLED_ShowCHinese(108,0,6);//統
- OLED_ShowString(90,6,"V"); //V
- OLED_ShowChar(36,6,46); //. 電壓
- OLED_ShowChar(54,2,46); //. 溫度
- OLED_ShowChar(36,4,46); //. 濕度
- OLED_ShowString(72,4,"%RH"); //%RH
- OLED_ShowString(90,2,"C");//C
-
- while(1)
- {
- timetable();
- if(_100ms_flag==1)
- {
- _100ms_flag=0;
- if(AD_cnt<10) // 多次讀AD進行數字濾波
- {
- AD_value=AD_Read(1);
- if(AD_value>AD_max) AD_max=AD_value;
- if(AD_value<AD_min) AD_min=AD_value;
- AD_sum=AD_sum+AD_value;
- AD_cnt++;
- }
- else
- {
- AD_sum=AD_sum-AD_max-AD_min;
- AD_value=AD_sum/8;
- temp=AD_value;
- vot=(unsigned long)(temp)*5*100*2;
- temp1=(unsigned int)(vot/1023);
- AD_max=0;
- AD_min=0xffff;
- AD_value=0;
- AD_cnt=0;
- AD_sum=0;
-
- }
-
- }
- if(_1s_flag==1)
- {
- _1s_flag=0;
- getDHT11();
- if(F16T>0x8000) //用于判斷DHT22溫度是否為負數 1xxx xxxx xxxx xxxx
- {
- flag=1;
- F16T=F16T&0x7fff;
- }
- else {flag=0;}
- display();
- }
- }
- }
- void Timer0Interrupt(void) interrupt 1 //定時中斷
- {
- //125us
- TH0 = 0x0FA;
- TL0 = 0x24;
- _125us++;
- _100ms++;
-
- }
- void Usart() interrupt 4 //串口中斷
- {
- u8 receiveData;
- receiveData=SBUF;//出去接收到的數據
- RI = 0;//清除接收中斷標志位
- if(receiveData=='1') //濕度
- {
- SBUF=' ';
- while(!TI); //等待發送數據完成
- TI=0; //清除發送完成標志位
- SBUF='\n';
- while(!TI); //等待發送數據完成
- TI=0;
-
- SBUF=F16RH/100+'0'; //十位
- while(!TI); //等待發送數據完成
- TI=0;
-
- SBUF=F16RH%100/10+'0'; //個位
- while(!TI); //等待發送數據完成
- TI=0;
- SBUF='.';
- while(!TI); //等待發送數據完成
- TI=0;
- SBUF=F16RH%10+'0';
- while(!TI); //等待發送數據完成
- TI=0;
- SBUF='%';
- while(!TI); //等待發送數據完成
- TI=0;
- }
- if(receiveData=='2') //溫度
- {
- if(flag==0)
- {
- SBUF=' ';
- while(!TI); //等待發送數據完成
- TI=0; //清除發送完成標志位
-
- SBUF='\n';
- while(!TI); //等待發送數據完成
- TI=0;
-
- SBUF=F16T/100+'0'; //十位
- while(!TI); //等待發送數據完成
- TI=0;
-
- SBUF=F16T%100/10+'0'; //個位
- while(!TI); //等待發送數據完成
- TI=0;
-
- SBUF='.';
- while(!TI); //等待發送數據完成
- TI=0;
-
- SBUF=F16T%10+'0';
- while(!TI); //等待發送數據完成
- TI=0;
-
- SBUF='C';
- while(!TI); //等待發送數據完成
- TI=0;
-
- }
- if(flag==1)
- {
- SBUF=' ';
- while(!TI); //等待發送數據完成
- TI=0; //清除發送完成標志位
-
- SBUF='\n';
- while(!TI); //等待發送數據完成
- TI=0;
- SBUF='-';
- while(!TI); //等待發送數據完成
- TI=0; //清除發送完成標志位
-
- SBUF=F16T/100+'0'; //十位
- while(!TI); //等待發送數據完成
- TI=0;
-
- SBUF=F16T%100/10+'0'; //個位
- while(!TI); //等待發送數據完成
- TI=0;
-
- SBUF='.';
- while(!TI); //等待發送數據完成
- TI=0;
-
- SBUF=F16T%10+'0';
- while(!TI); //等待發送數據完成
- TI=0;
-
- SBUF='C';
- while(!TI); //等待發送數據完成
- TI=0;
-
- }
- }
- if(receiveData=='3') //電壓
- {
- SBUF=' ';
- while(!TI); //等待發送數據完成
- TI=0; //清除發送完成標志位
- SBUF='\n';
- while(!TI); //等待發送數據完成
- TI=0;
- a=temp1/1000+48;
- if(a==48)
- {
- SBUF=' ';
- }
- else {SBUF=temp1/1000+48;}
- while(!TI); //等待發送數據完成
- TI=0;
- SBUF=temp1%1000/100+48;
- while(!TI); //等待發送數據完成
- TI=0;
- SBUF='.';
- while(!TI); //等待發送數據完成
- TI=0;
- SBUF=temp1%1000%100/10+48;
- while(!TI); //等待發送數據完成
- TI=0;
- SBUF=temp1%10+48;
- while(!TI); //等待發送數據完成
- TI=0;
- SBUF='V';
- while(!TI); //等待發送數據完成
- TI=0;
-
- }
-
- }
復制代碼
所有資料51hei提供下載:
新建文件夾.rar
(90.04 KB, 下載次數: 73)
2019-5-16 14:34 上傳
點擊文件名下載附件
程序原理圖 下載積分: 黑幣 -5
|