欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機溫濕度檢測系統設計DHT22,HC-06,OLED(SPI)
[打印本頁]
作者:
cokesu
時間:
2019-5-16 14:34
標題:
單片機溫濕度檢測系統設計DHT22,HC-06,OLED(SPI)
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
作者:
jemery1030
時間:
2019-7-26 15:14
感謝無私分享
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1