编写一个stc8g1k08利用ds18b20并通过蓝牙发送
时间: 2023-06-10 10:04:13 浏览: 196
51单片机采集18B20温度经蓝牙发送
4星 · 用户满意度95%
温度数据的程序,你能帮我吗?
当然可以!下面是一个简单的程序示例,可以读取DS18B20温度传感器的数据,并将其通过蓝牙模块发送。
```
#include <REGSTC8.H>
sbit DQ = P1^1; // DS18B20数据线引脚定义
sbit LED = P1^0; // 指示灯引脚定义
void delay_10us(unsigned char t) // 延时函数:最大延时2550us
{
unsigned char i;
while(t--)
{
for(i=0; i<11; i++);
}
}
void ds18b20_write_byte(unsigned char dat) // 写一个字节数据到DS18B20
{
unsigned char i;
for(i=0; i<8; i++)
{
DQ = 0;
DQ = dat & 0x01;
dat >>= 1;
delay_10us(1);
DQ = 1;
}
}
unsigned char ds18b20_read_byte(void) // 从DS18B20读一个字节数据
{
unsigned char i, dat = 0;
for(i=0; i<8; i++)
{
DQ = 0;
DQ = 1;
delay_10us(1);
dat >>= 1;
if(DQ) dat |= 0x80;
}
return dat;
}
void ds18b20_start(void) // DS18B20起始信号
{
DQ = 1;
delay_10us(5);
DQ = 0;
delay_10us(100);
DQ = 1;
delay_10us(5);
}
void ds18b20_convert(void) // 发送DS18B20温度转换命令
{
ds18b20_start();
ds18b20_write_byte(0xcc); // 跳过ROM操作
ds18b20_write_byte(0x44); // 发送温度转换命令
}
signed int ds18b20_read_temp(void) // 读取DS18B20温度数据
{
unsigned char temp_l, temp_h;
signed int temp;
ds18b20_start(); // 发送读温度命令
ds18b20_write_byte(0xcc); // 跳过ROM操作
ds18b20_write_byte(0xbe); // 发送读温度命令
temp_l = ds18b20_read_byte(); // 先读低8位
temp_h = ds18b20_read_byte(); // 再读高8位
temp = temp_h;
temp <<= 8;
temp |= temp_l;
temp >>= 4; // 对读到的原始数据进行处理
if(temp & 0x800) // 如果最高位为1,说明数值为负数
{
temp = ~temp + 1;
temp *= -1;
}
return temp;
}
void init_uart(void) // 初始化串口,波特率为9600
{
SCON = 0x50;
TMOD |= 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
}
void send_byte(unsigned char dat) // 通过串口发送一个字节数据
{
SBUF = dat;
while(!TI);
TI = 0;
}
void send_string(unsigned char *p) // 通过串口发送一个字符串
{
while(*p)
{
send_byte(*p++);
}
}
void main()
{
signed int temp;
init_uart();
while(1)
{
ds18b20_convert(); // 发送温度转换命令
delay_10us(200); // 等待温度转换完成
temp = ds18b20_read_temp(); // 读取温度数据
LED = !LED; // 翻转指示灯状态
send_string("Temperature: "); // 发送字符串
if(temp < 0) // 如果温度为负数,添加负号
{
send_byte('-');
temp *= -1;
}
send_byte(temp/100 + '0'); // 发送百位数值
send_byte(temp%100/10 + '0'); // 发送十位数值
send_byte('.'); // 发送小数点
send_byte(temp%10 + '0'); // 发送个位数值
send_string("C\r\n"); // 发送字符串
delay_10us(1000); // 延时1秒
}
}
```
该程序使用STC8G1K08单片机,连接了一个DS18B20温度传感器和蓝牙模块,并通过蓝牙模块将温度数据发送给其他设备。您可以按照您的需要对程序进行修改,例如更改蓝牙模块的连接方式或修改串口输出格式。
阅读全文