前言
下面将介绍如何利用STC89C52单片机和DHT11温湿度模块以及HC-08蓝牙模块实现测量温湿度。以及各模块的使用方法。
一、项目要求
利用DHT11温湿度模块测量温湿度,利用HC-08蓝牙模块将数据传到手机上。
二、各模块简介
1.DHT11温湿度模块简介
1.1DHT11温湿度模块外观
1.2DHT11温湿度模块使用方法简介
1.2.1DHT11温湿度模块工作的过程
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主
机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集, 用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集, 如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。
1.2.2DHT11模块DATA引脚上40bit数据说明
8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据
+8bit校验
1.2.3DHT11模块工作的时序图
说明:
1.DATA引脚拉高
2.DATA引脚拉低(至少18ms)
3.DATA引脚拉高(20~40us)
4.如果在后面的80us内检测到DATA引脚被拉低,则说明模块存在
5.再检测DATA引脚是否被拉高
6.再检测DATA引脚,看其是否被拉低,如果拉低,则准备开始传输数据
1.2.4DHT11模块传输数据的时序图
模块给单片机传输的数据只能是0和1。我们可以通过0,1时序图的不同从而判断模块给单片机传输的数据是0还是1.
0的时序图
说明·:
1.不断检测DATA引脚是否被拉高
2.检测到被拉高后,进行延时35us
3.检测DATA引脚是否为低电平,如果是,则传输的数据为0,否则,为1。如果为1,则需要进行等待至引脚为低电平
1的时序图
2.HC-08蓝牙模块简介
2.1HC-08蓝牙模块外观
2.2HC-08蓝牙模块使用方法简介
1.使用相关的AT指令,更改模块的波特率等指标.
2.将蓝牙模块RXD与单片机的TXD相连,TXD与单片机的RXD相连.
2.3HC-08蓝牙模块的AT指令表及部分说明
说明:
1.在模块未连线状态下可以进行AT指令状态操作,连线后进入串口透传模式
2.模块启动大约需要150ms,所以最好在模块上电200ms后进行AT指令操作
3。AT指令操作成功会一律返回OK(有些指令此外)
三、项目实现的代码
1.HC-08蓝牙模块传输数据部分代码
1.1串口初始化代码
void Uart_Init()//串口中断初始化函数
{
AUXR = 0X01;//隔离电离辐射
SCON = 0X50;//串口工作方式1,允许接收
TMOD &= 0X0F;
TMOD |= 0X20;//定时器1工作方式2
TH1 = 0XFD;
TL1 = 0XFD;//波特率为9600
TR1 = 1;//定时器1开始计时
}
1.1数据传输代码
void Send_Byte(char cmdata)//发送一个Byte函数
{
SBUF = cmdata;
while(!TI);//一个Byte发送完成
TI = 0;
}
void Send_Data(char* p)
{
while(*p != '\0'){
Send_Byte(*p);
p++;
}
}
2.DHT11温湿度模块部分代码
2.1DHT11模块激活代码
void Dht11_Start() //使DHT11模块工作函数
{
//>1.DATA引脚拉高
DATA = 1;
//>2.DATA引脚拉低(至少18ms)
DATA = 0;
Delay20ms();
//>3.DATA引脚拉高(20~40us)
DATA = 1;
//>4.如果在后面的80us内检测到DATA引脚被拉低,则说明模块存在
while(DATA);
//>5.再检测DATA引脚是否被拉高
while(!DATA);
//>6.再检测DATA引脚,看其是否被拉低,如果拉低,则准备开始传输数据
while(DATA);
}
2.2从DHT11模块得到数据代码
void Get_Data_From_Dht11() //从DHT11模块得到数据
{
int i,j;
char flag;
char temp;
Dht11_Start();//每传输完一次数据都要重新激活模块
for(i=0;i<5;i++){
for(j=0;j<8;j++){
//>1.不断检测DATA引脚是否被拉高
while(!DATA);
//>2.检测到被拉高后,进行延时35us
Delay35us();
//>3.检测DATA引脚是否为低电平,如果是,则传输的数据为0,否则,为1.当为1时要等待至引脚为低电平
if(DATA == 1){
flag = 1;
while(DATA);
}else{
flag = 0;
}
temp = temp << 1;
temp |= flag;
}
dhtdata[i] = temp;
}
}
void Build_Data()
{
hum[0] = ':';
hum[1] = dhtdata[0]/10 + 0x30;
hum[2] = dhtdata[0]%10 + 0x30;//湿度整数部分
hum[3] = '.';
hum[4] = dhtdata[1]/10 + 0x30;
hum[5] = dhtdata[1]%10 + 0x30;//湿度小数部分
hum[6] = '%';
hum[7] = '\0';
tem[0] = ':';
tem[1] = dhtdata[2]/10 + 0x30;
tem[2] = dhtdata[2]%10 + 0x30;//温度整数部分
tem[3] = '.';
tem[4] = dhtdata[3]/10 + 0x30;
tem[5] = dhtdata[3]%10 + 0x30;//温度小数部分
tem[6] = 'C';
tem[7] = '\0';
}
3.main函数部分代码
void main()
{
Uart_Init();//串口中断初始化函数
Delay1000ms();
Delay1000ms();//给模块上电时间
while(1){
Get_Data_From_Dht11();
Build_Data();
Send_Data("湿度");
Send_Data(hum);
Send_Data("\r\n");//换行
Send_Data("温度");
Send_Data(tem);
Send_Data("\r\n");//换行
Delay1000ms();
}
}
四、结果
文章来源:https://www.toymoban.com/news/detail-434678.html
五、总结
1.看时序图时要注意
2.DHT11模块需要上电时间文章来源地址https://www.toymoban.com/news/detail-434678.html
到了这里,关于STC89C52单片机利用DHT11温湿度模块以及HC-08蓝牙模块实现测量温湿度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!