//为了方便大家调试,另附程序工程共大家下载,下载地址:https://www.90pan.com/b1908750
//************************** //程序说明: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=; //函数声明 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 = ;
while()
{
datas=read_temp();
serial_send_string("温度:");
serial_send_byte(datas%/+'');//十位
serial_send_byte(datas%+'');//个位
serial_send_byte(' ');
datas=read_humi();
serial_send_string("湿度:");
serial_send_byte(datas%/+'');//十位
serial_send_byte(datas%+'');//个位
serial_send_string("\r\n");
Delay1000ms();
} } void read_byte()
{
u8 i;
for(i=;i<;i++)
{
U8FLAG=;
while((!dht11_io)&&U8FLAG++);//超时3毫秒跳出
Delay30us();
U8temp=;
if(dht11_io)U8temp=;
U8FLAG=;
while((dht11_io)&&U8FLAG++);//超时3毫秒跳出
if(U8FLAG==)break;
U8comdata<<=;
U8comdata|=U8temp;
}
} u8 read_temp()
{
dht11_io=;
Delay18ms();
dht11_io=;
Delay40us();
dht11_io=;
if(!dht11_io)
{
U8FLAG=;
while((!dht11_io)&&U8FLAG++);//超时3毫秒跳出
U8FLAG=;
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=; 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=;
Delay18ms();
dht11_io=;
Delay40us();
dht11_io=;
if(!dht11_io)
{
U8FLAG=;
while((!dht11_io)&&U8FLAG++);//超时3毫秒跳出
U8FLAG=;
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=; 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 = ;
AUXR &= ~0x01;//S1 BRT Use Timer1;
TMOD &= ~(<<);//Timer1 set As Timer
TMOD &= ~0x30;//Timer1_16bitAutoReload;2
AUXR |= (<<);//Timer1 set as 1T mode
TH1 = (u8)(Timer1_Reload >> );
TL1 = (u8)Timer1_Reload;
TR1 = ;
PS = ; //高优先级中断
REN = ; //允许接收
ES = ; //允许中断 EA = ; //允许全局中断
} void serial_send_byte(u8 dat)
{
SBUF=dat;
while(!TI);
TI=;
} void serial_send_string(u8 *dat)
{
while(*dat)
{
serial_send_byte(*dat++);
}
} /********************* 串口1中断函数************************/
void UART1_int (void) interrupt UART1_VECTOR
{
if(RI)
{
RI = ;
} if(TI)
{
}
} void Delay30us() //@22.1184MHz精确延时30微秒
{
unsigned char i, j; i = ;
j = ;
do
{
while (--j);
} while (--i);
} void Delay40us() //@22.1184MHz精确延时40微秒
{
unsigned char i, j; _nop_();
i = ;
j = ;
do
{
while (--j);
} while (--i);
} void Delay18ms() //@22.1184MHz精确延时18毫秒
{
unsigned char i, j, k; _nop_();
i = ;
j = ;
k = ;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
} void Delay1000ms() //@22.1184MHz
{
unsigned char i, j, k; _nop_();
_nop_();
i = ;
j = ;
k = ;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}