如果我想用51单片机采集3个ds18b20的数据用c语言如何编程
时间: 2023-05-31 08:03:33 浏览: 112
以下是基于C语言的51单片机采集3个DS18B20温度传感器数据的程序:
```c
#include <reg52.h>
// DS18B20连接的引脚
sbit DQ = P1^7;
void delay_us(unsigned int us)
{
while(us--)
{
// 1us的延时,循环次数根据实际需要调整
_nop_();
}
}
unsigned char ds18b20_init(void)
{
unsigned char byte;
DQ = 1;
delay_us(5);
DQ = 0;
delay_us(500);
DQ = 1;
delay_us(50);
byte = DQ;
delay_us(10);
return byte;
}
void write_byte(unsigned char byte)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
DQ = 0;
delay_us(5);
DQ = byte & 0x01;
delay_us(60);
DQ = 1;
byte >>= 1;
delay_us(2);
}
}
unsigned char read_byte(void)
{
unsigned char i, byte = 0;
for(i = 0; i < 8; i++)
{
DQ = 0;
delay_us(5);
DQ = 1;
delay_us(5);
byte >>= 1;
if(DQ)
{
byte |= 0x80;
}
delay_us(60);
DQ = 1;
delay_us(2);
}
return byte;
}
void get_temperature(unsigned char* temp)
{
unsigned char i;
ds18b20_init();
write_byte(0xcc);
write_byte(0x44);
delay_us(100);
ds18b20_init();
write_byte(0xcc);
write_byte(0xbe);
for(i = 0; i < 9; i++)
{
temp[i] = read_byte();
}
}
void main()
{
unsigned char temp[9];
float temperature;
while(1)
{
get_temperature(temp);
temperature = (float)(temp[1] << 8 | temp[0]) / 16.0;
printf("Temperature 1: %.1f\n", temperature);
get_temperature(temp);
temperature = (float)(temp[1] << 8 | temp[0]) / 16.0;
printf("Temperature 2: %.1f\n", temperature);
get_temperature(temp);
temperature = (float)(temp[1] << 8 | temp[0]) / 16.0;
printf("Temperature 3: %.1f\n", temperature);
delay_ms(1000);
}
}
```
上述程序中,首先定义了DS18B20连接的引脚,然后实现了初始化、写字节、读字节和获取温度等函数。主函数中使用循环不断获取三个DS18B20传感器的温度数据,并通过串口输出显示。其中,读取到的温度数据需要进行一定的计算才能得到实际的温度值。需要注意的是,本程序中使用了printf函数进行串口输出,需要在程序中添加对应的串口初始化函数。
阅读全文