STC15F2K60S2讀取DHT11溫溼度串列埠顯示
阿新 • • 發佈:2018-12-31
為了方便大家除錯,另附程式工程共大家下載
STC15F2K60S2讀取DHT11溫溼度下載地址
//**************************
//程式說明:stc15f2k60s2採集dht11溫溼度感測器資料,並從串列埠輸出
//採用的是22.1184M晶振
//**************************
#include<stc15fxxxx.h> //呼叫stc15f系列標頭檔案,下載地址: http://pan.baidu.com/s/1eRUbjLS
//IO口宣告
#define dht11_io P20 //P2.0口作為資料讀取介面
//常量宣告
#define MAIN_Fosc 22118400L //主時鐘
#define baud_rate 115200L //波特率
#define Timer1_Reload (65536UL -(MAIN_Fosc / 4 / baud_rate)) //Timer1重灌值
//變數定義
u16 U8FLAG;
u8 U8temp;
u8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
u8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
u8 U8comdata;
u8 datas=0 ;
//函式宣告
void Delay30us(); //22.1184M晶振精確延時30微秒
void Delay40us(); //22.1184M晶振精確延時40微秒
void Delay18ms(); //22.1184M晶振精確延時30毫秒
void Delay1000ms(); //22.1184M晶振精確延時1000毫秒
void read_byte(); //讀取一位元組的資料,並賦值給U8comdata
u8 read_temp(); //讀取溫度,返回溫度值
u8 read_humi(); //讀取溼度,返回溼度值
void serial_init(); //串列埠初始化
void serial_send_byte(u8 dat); //串列埠傳送一個位元組的資料
void serial_send_string(u8 *dat);//串列埠傳送字串
//主函式
void main()
{
Delay1000ms();
serial_init();//串列埠初始化
dht11_io = 1;
while(1)
{
datas=read_temp();
serial_send_string("溫度:");
serial_send_byte(datas%100/10+'0');//十位
serial_send_byte(datas%10+'0'); //個位
serial_send_byte(' ');
datas=read_humi();
serial_send_string("溼度:");
serial_send_byte(datas%100/10+'0');//十位
serial_send_byte(datas%10+'0'); //個位
serial_send_string("\r\n");
Delay1000ms();
}
}
//讀取一個位元組資料
void read_byte()
{
u8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!dht11_io)&&U8FLAG++);//超時3毫秒跳出
Delay30us();
U8temp=0;
if(dht11_io)U8temp=1;
U8FLAG=2;
while((dht11_io)&&U8FLAG++);//超時3毫秒跳出
if(U8FLAG==1)break;
U8comdata<<=1;
U8comdata|=U8temp;
}
}
//讀取溫度,返回溫度值
u8 read_temp()
{
dht11_io=0;
Delay18ms();
dht11_io=1;
Delay40us();
dht11_io=1;
if(!dht11_io)
{
U8FLAG=2;
while((!dht11_io)&&U8FLAG++);//超時3毫秒跳出
U8FLAG=2;
while((dht11_io)&&U8FLAG++);//超時3毫秒跳出
read_byte();
U8RH_data_H_temp=U8comdata;
read_byte();
U8RH_data_L_temp=U8comdata;
read_byte();
U8T_data_H_temp=U8comdata;
read_byte();
U8T_data_L_temp=U8comdata;
read_byte();
U8checkdata_temp=U8comdata;
dht11_io=1;
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
}
}
return U8T_data_H;
}
//讀取溼度,返回溼度值
u8 read_humi()
{
dht11_io=0;
Delay18ms();
dht11_io=1;
Delay40us();
dht11_io=1;
if(!dht11_io)
{
U8FLAG=2;
while((!dht11_io)&&U8FLAG++);//超時3毫秒跳出
U8FLAG=2;
while((dht11_io)&&U8FLAG++);//超時3毫秒跳出
read_byte();
U8RH_data_H_temp=U8comdata;
read_byte();
U8RH_data_L_temp=U8comdata;
read_byte();
U8T_data_H_temp=U8comdata;
read_byte();
U8T_data_L_temp=U8comdata;
read_byte();
U8checkdata_temp=U8comdata;
dht11_io=1;
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
}
}
return U8RH_data_H;
}
//串列埠初始化
void serial_init()
{
S1_8bit(); //8位資料
S1_USE_P30P31(); //UART1 使用P30 P31口 預設
TR1 = 0;
AUXR &= ~0x01; //S1 BRT Use Timer1;
TMOD &= ~(1<<6); //Timer1 set As Timer
TMOD &= ~0x30; //Timer1_16bitAutoReload;2
AUXR |= (1<<6); //Timer1 set as 1T mode
TH1 = (u8)(Timer1_Reload >> 8);
TL1 = (u8)Timer1_Reload;
TR1 = 1;
PS = 1; //高優先順序中斷
REN = 1; //允許接收
ES = 1; //允許中斷
EA = 1; //允許全域性中斷
}
//串列埠傳送一個位元組資料
void serial_send_byte(u8 dat)
{
SBUF=dat;
while(!TI);
TI=0;
}
//串列埠傳送字串
void serial_send_string(u8 *dat)
{
while(*dat)
{
serial_send_byte(*dat++);
}
}
/********************* 串列埠1中斷函式************************/
void UART1_int (void) interrupt UART1_VECTOR
{
if(RI)
{
RI = 0;
}
if(TI)
{
}
}
void Delay30us() //@22.1184MHz精確延時30微秒
{
unsigned char i, j;
i = 1;
j = 162;
do
{
while (--j);
} while (--i);
}
void Delay40us() //@22.1184MHz精確延時40微秒
{
unsigned char i, j;
_nop_();
i = 1;
j = 217;
do
{
while (--j);
} while (--i);
}
void Delay18ms() //@22.1184MHz精確延時18毫秒
{
unsigned char i, j, k;
_nop_();
i = 2;
j = 132;
k = 67;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay1000ms() //@22.1184MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 85;
j = 12;
k = 155;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}