stc89c52单片机温度检测通过蓝牙发送至手机端的C语言代码
时间: 2024-02-28 07:27:29 浏览: 76
以下是一个基于STC89C52单片机的温度检测并通过蓝牙发送至手机端的C语言代码,其中使用了HC-06蓝牙模块:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <STC89C5xRC.H>
#define BAUDRATE 9600 // 波特率
#define PRESCALER 12 // 定时器预分频器
#define TIMERS 8000 // 定时器计数器
unsigned char temperature = 0; // 温度值
void initUART() // 初始化串口
{
SCON = 0x50; // 8位数据,可变波特率,允许接收
TMOD &= 0x0F; // 清零波特率发生器
TL1 = TH1 = -(unsigned char)(FOSC / (BAUDRATE * 12UL)); // 设置波特率
PCON |= 0x80; // 确定SMOD位的值
TR1 = 1; // 启动波特率发生器
}
void initTimer() // 初始化定时器
{
TMOD |= 0x10; // 设置为定时器1模式
TH1 = (65536 - TIMERS) / 256; // 定时器初值
TL1 = (65536 - TIMERS) % 256;
ET1 = 1; // 允许定时器1中断
TR1 = 1; // 启动定时器1
EA = 1; // 允许中断
}
void delay(unsigned int t) // 延时函数
{
unsigned int i, j;
for (i = 0; i < t; i++)
for (j = 0; j < 125; j++);
}
void sendChar(unsigned char c) // 发送一个字符
{
SBUF = c;
while (!TI);
TI = 0;
}
void sendString(char *s) // 发送一个字符串
{
while (*s != '\0')
sendChar(*s++);
}
void sendTemperature() // 发送温度值
{
char buffer[10];
sprintf(buffer, "%d", temperature);
sendString("Temperature: ");
sendString(buffer);
sendString(" C\n");
}
void main()
{
unsigned char i;
initUART();
initTimer();
while (1)
{
for (i = 0; i < 8; i++)
{
DQ = 0; // 发送开始信号
delay(1);
DQ = 1; // 读取温度值
delay(1);
if (!DQ) // 判断是否存在温度传感器
{
TR1 = 0; // 暂停定时器
TH0 = TL0 = 0; // 清零定时器
TR0 = 1; // 启动定时器
while (!DQ); // 等待温度传感器输出
TR0 = 0; // 暂停定时器
temperature = TH0; // 读取温度值
break;
}
}
sendTemperature(); // 发送温度值
delay(1000); // 延时1秒
}
}
void timer1() interrupt 3 using 1 // 定时器1中断服务程序
{
static unsigned int counter = 0;
TH1 = (65536 - TIMERS) / 256; // 重置定时器初值
TL1 = (65536 - TIMERS) % 256;
counter++;
if (counter == PRESCALER) // 每隔1秒触发一次
{
counter = 0;
sendString("Ready\n");
}
}
void timer0() interrupt 1 using 1 // 定时器0中断服务程序
{
TH0 = TL0 = 0; // 清零定时器
}
```
该代码中,使用了DS18B20数字温度传感器读取当前温度值,并通过串口发送至蓝牙模块,最终发送至手机端。定时器1中断每隔1秒钟发送一次“Ready”字符串,定时器0计时读取温度值,通过串口发送至蓝牙模块。请注意,不同的蓝牙模块可能需要不同的配置和命令来进行配对和通信。
阅读全文