stc89c52单片机DH11模块温度检测通过蓝牙发送至手机端的C语言代码
时间: 2024-02-28 14:29:03 浏览: 115
这是一个简单的STC89C52单片机通过DHT11模块检测温度并通过蓝牙模块将数据发送至手机端的C语言代码:
```
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define TH 2
#define TL 1
sbit BT_TX=P1^0; //蓝牙模块TXD引脚连接P1.0
sbit BT_RX=P1^1; //蓝牙模块RXD引脚连接P1.1
uchar temperature=0,humidity=0; //温度和湿度
void delay_10us(uint n) //精确的 10us 延时函数
{
while(n--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void delay_ms(uint n) //ms级延时函数
{
uint i,j;
for(i=0;i<n;i++)
for(j=0;j<110;j++);
}
void start() //DHT11启动函数
{
uchar i;
P2|=0x80; //P2.7拉高
delay_ms(1);
P2&=0x7F; //P2.7拉低
delay_ms(20); //延时20ms
P2|=0x80; //P2.7拉高
delay_10us(30); //延时30us
while(P2&0x80); //等待DHT11响应信号
delay_10us(80); //延时80us
if(P2&0x80) //DHT11发送响应信号失败
{
printf("\nDHT11 no response!");
return;
}
delay_10us(80); //延时80us
for(i=0;i<5;i++)
{
uchar j,k;
k=0;
for(j=0;j<8;j++)
{
while(!(P2&0x80)); //等待高电平结束
delay_10us(30); //延时30us
if(P2&0x80) //判断高电平时长
k=(k<<1)|0x01;
else
k<<=1;
while(P2&0x80); //等待低电平结束
}
switch(i) //根据数据类型存储数据
{
case 0: humidity=k; break;
case 2: temperature=k; break;
default: break;
}
}
}
void InitUART() //初始化串口
{
TMOD=0x20; //定时器1工作在模式2,8位自动重装载
TH1=0xF3; //波特率为9600,定时器初值为F3H
TL1=0xF3;
TR1=1; //启动定时器1
SCON=0x50; //串口工作在模式1,允许接收
ES=1; //开启串口中断
EA=1; //开启总中断
}
void send_data(uchar dat) //发送数据
{
SBUF=dat;
while(!TI); //等待发送完成
TI=0; //清除标志
}
void send_string(uchar *s) //发送字符串
{
while(*s)
{
send_data(*s++);
}
}
void main()
{
InitUART();
while(1)
{
start(); //启动DHT11模块检测温湿度
printf("\nTemperature:%dC",temperature);
printf("\nHumidity:%d%%",humidity);
send_string("Temperature:");
send_data(temperature);
send_string("C Humidity:");
send_data(humidity);
delay_ms(1000); //1s发送一次
}
}
void UART() interrupt 4 //串口中断函数
{
if(RI) //接收中断
{
RI=0; //清除标志
}
if(TI) //发送中断
{
TI=0; //清除标志
}
}
```
注意,该代码中需要使用到定时器和串口中断,需要根据具体的开发板和蓝牙模块进行相应的配置。
阅读全文