c51 ds18b20温度采集
时间: 2023-07-30 19:09:30 浏览: 204
你好!对于C51单片机和DS18B20温度传感器的温度采集,你可以按照以下步骤进行操作:
首先,连接C51单片机与DS18B20传感器。DS18B20是一种数字温度传感器,它使用1线总线协议进行通信。将DS18B20的VCC引脚连接到C51的正电源,GND引脚连接到C51的地线,将DQ引脚连接到C51的一个IO口。
在C51单片机上编写程序来读取DS18B20传感器的温度值。你可以使用C语言编写程序,在程序中使用1线总线协议来与DS18B20通信。
首先,发送复位信号给DS18B20,然后发送读取温度命令。
等待DS18B20的响应,并读取温度值。DS18B20会将温度值以16位的形式返回给C51单片机。
对于读取到的温度值进行处理,可以将其转换为实际温度值,并进行相关的操作或显示。
请注意,以上只是一个简单的步骤示例,具体的实现可能会因硬件和编程环境的不同而有所差异。如果你需要更具体的代码示例或更详细的解释,请提供更多的信息。
相关问题
c51单片机通过DS18B20采集温度通过三位数码管显示
下面是一个通过DS18B20采集温度并通过三位数码管显示的c51单片机示例代码:
#include <reg52.h>
sbit D1 = P0^0; // 数码管位选端口定义
sbit D2 = P0^1;
sbit D3 = P0^2;
sbit A = P2^0; // 数码管段选端口定义
sbit B = P2^1;
sbit C = P2^2;
sbit D = P2^3;
sbit E = P2^4;
sbit F = P2^5;
sbit G = P2^6;
sbit DQ = P3^7; // DS18B20数据线
void delay(unsigned int x) // 延时函数
{
unsigned int i, j;
for(i = x; i > 0; i--)
for(j = 110; j > 0; j--);
}
unsigned char read_byte() // 读取一个字节
{
unsigned char i, dat = 0;
for(i = 0; i < 8; i++) {
DQ = 0; // 发送读取命令
_nop_();
_nop_();
dat >>= 1; // 读取数据
if(DQ) dat |= 0x80;
_nop_();
_nop_();
DQ = 1;
}
return dat;
}
void write_byte(unsigned char dat) // 写入一个字节
{
unsigned char i;
for(i = 0; i < 8; i++) {
DQ = 0; // 发送写入命令
_nop_();
_nop_();
if(dat & 0x01) DQ = 1; // 写入数据
_nop_();
_nop_();
dat >>= 1;
DQ = 1;
}
}
void start_convert() // 开始转换
{
write_byte(0xCC); // 跳过ROM
write_byte(0x44); // 温度转换命令
}
unsigned int get_temp() // 读取温度
{
unsigned char tl, th;
write_byte(0xCC); // 跳过ROM
write_byte(0xBE); // 读取温度命令
tl = read_byte(); // 读取温度低位
th = read_byte(); // 读取温度高位
return (th << 8) + tl;
}
void display(unsigned char num) // 数码管显示函数
{
switch(num) {
case 0: A = B = C = D = E = F = 1; G = 0; break;
case 1: A = B = 1; C = D = E = F = G = 0; break;
case 2: A = B = G = E = D = 1; C = F = 0; break;
case 3: A = B = C = D = G = 1; E = F = 0; break;
case 4: B = C = F = G = 1; A = D = E = 0; break;
case 5: A = C = D = F = G = 1; B = E = 0; break;
case 6: A = C = D = E = F = G = 1; B = 0; break;
case 7: A = B = C = 1; D = E = F = G = 0; break;
case 8: A = B = C = D = E = F = G = 1; break;
case 9: A = B = C = D = F = G = 1; E = 0; break;
default: A = B = C = D = E = F = G = 0; break;
}
}
void main()
{
unsigned int temp;
unsigned char tempH, tempL;
while(1) {
start_convert(); // 开始温度转换
delay(1000); // 等待转换完成
temp = get_temp(); // 读取温度信号
tempH = temp / 10; // 高位数字
tempL = temp % 10; // 低位数字
D1 = D2 = D3 = 0; // 开始位选
display(tempH); // 显示千位和百位数字
delay(5); // 延时
D1 = 1; D2 = D3 = 0; // 位选变化
display(tempL);
delay(5);
D2 = 1; D1 = D3 = 0;
display(10); // 显示小数点
delay(5);
D3 = 1; D1 = D2 = 0;
display((temp % 1000) / 100); // 显示十位数字
delay(5);
D1 = D2 = D3 = 0; // 位选复位
}
}
这段代码和之前的代码非常类似,只是在数码管显示函数中添加了一个显示小数点的部分。具体来说,我们将温度信号分成三部分:千位和百位数字、小数点、十位数字。然后依次将这三部分数字显示在三个数码管上,其中小数点可以通过显示一个额外的数字10来实现。这样就可以实现从DS18B20采集温度并通过三位数码管显示的功能了。
相关推荐
















