用ds18b20温度传感器在51单片机写
时间: 2023-09-22 07:08:38 浏览: 55
要使用ds18b20温度传感器在51单片机上进行读取温度,需要进行以下步骤:
1. 初始化ds18b20传感器
首先需要将单片机的IO口与ds18b20传感器相连,然后进行初始化。具体方法如下:
发送复位脉冲,即将IO口拉低500us左右,然后拉高。接着发送读取ROM指令,读取ds18b20传感器的唯一序列号。最后发送写保护寄存器指令,将ds18b20传感器设置为温度采集模式。
2. 读取温度数据
读取温度数据需要发送读取温度指令,并等待一段时间,然后读取数据。具体方法如下:
发送读取温度指令,即将IO口拉低500us左右,然后拉高,接着等待750us左右,然后进行数据读取。读取数据时需要将IO口设为输入模式,读取完数据后再设为输出模式。
3. 计算温度值
读取到的数据需要进行计算才能得到温度值。具体计算公式如下:
温度值 = 数据值 * 0.0625
其中数据值是读取到的16位数据,温度值单位为摄氏度。
以上就是在51单片机上使用ds18b20温度传感器进行温度读取的整个流程。
相关问题
51单片机ds18b20温度传感器在1602显示
将51单片机与ds18b20温度传感器和1602液晶显示屏连接起来,实现温度的监测并显示在屏幕上。
首先,我们需要将ds18b20温度传感器与51单片机进行连接。ds18b20温度传感器是一种数字温度传感器,使用单总线协议与单片机进行通信。我们将ds18b20温度传感器的VCC引脚连接到5V电源,GND引脚连接到地,而DQ(数据引脚)连接到51单片机的任意IO口。
然后,我们需要将1602液晶显示屏与51单片机进行连接。连接时,VCC引脚连接到5V电源,GND引脚连接到地,而RS、RW、E、D4、D5、D6、D7分别连接到51单片机的相应IO口。此外,还需要将1602液晶显示屏的V0引脚通过一个可调电位器连接到地,以调节显示屏的对比度。
接下来,我们需要编写51单片机的程序来读取ds18b20温度传感器的数据并将其显示在1602液晶显示屏上。通过使用相应的单总线协议来读取ds18b20温度传感器的数据,然后使用LCD1602液晶显示屏的驱动程序来将数据显示在屏幕上。
具体步骤包括初始化液晶显示屏、初始化ds18b20温度传感器、进行温度读取并保存在变量中,最后将温度数据转化为ASCII码并利用液晶显示屏驱动程序将其显示在1602液晶显示屏上。
通过以上的连接和程序编写,我们可以实现51单片机ds18b20温度传感器在1602显示的功能。这样,我们就可以通过屏幕上的数字来实时监测环境的温度了。
ds18b20温度传感器代码51单片机lcd1603显示
以下是 DS18B20 温度传感器的代码,使用 51 单片机和 LCD1602 显示屏进行温度显示:
```c
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define DQ P2_3
uchar code table[]={"Temperature:"};
sbit RS=P0^0; //LCD1602显示屏控制端口
sbit RW=P0^1;
sbit EN=P0^2;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init() //LCD1602初始化程序
{
RS=0;
RW=0;
EN=0;
delay(15);
P2=0x38;
EN=1;
delay(5);
EN=0;
P2=0x0c;
EN=1;
delay(5);
EN=0;
P2=0x06;
EN=1;
delay(5);
EN=0;
P2=0x01;
EN=1;
delay(5);
EN=0;
}
void write(uchar p) //LCD1602字符写入程序
{
RS=1;
RW=0;
EN=0;
_nop_();
_nop_();
P2=p;
EN=1;
_nop_();
_nop_();
EN=0;
}
void display(uchar x,uchar y,uchar *s) //LCD1602显示函数
{
uchar i;
if(x==0)
y|=0x80;
else
y|=0xc0;
write(y);
for(i=0;s[i]!='\0';i++)
write(s[i]);
}
uchar init_ds18b20() //DS18B20初始化程序
{
uchar result;
EA=0;
DQ=1;
delay(1);
DQ=0;
delay(500);
DQ=1;
delay(60);
result=DQ;
delay(400);
EA=1;
return result;
}
void write_byte(uchar dat) //DS18B20写入一个字节程序
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
_nop_();
_nop_();
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
}
uchar read_byte() //DS18B20读取一个字节程序
{
uchar i,dat;
for(i=0;i<8;i++)
{
DQ=0;
_nop_();
_nop_();
DQ=1;
_nop_();
_nop_();
dat|=(DQ<<i);
delay(5);
}
return dat;
}
int get_temperature() //获取温度函数
{
uchar temp_l,temp_h;
int temp;
init_ds18b20();
write_byte(0xcc);
write_byte(0x44);
init_ds18b20();
write_byte(0xcc);
write_byte(0xbe);
temp_l=read_byte();
temp_h=read_byte();
temp=(temp_h<<8)|temp_l;
return temp;
}
void main()
{
int temperature;
uchar temp_char[5];
init();
display(0,0,table);
while(1)
{
temperature=get_temperature();
temperature=(temperature*0.0625*10+0.5);
temp_char[0]=temperature/1000+'0';
temp_char[1]=temperature%1000/100+'0';
temp_char[2]='.';
temp_char[3]=temperature%100/10+'0';
temp_char[4]=temperature%10+'0';
display(1,0,temp_char);
delay(1000);
}
}
```
该代码使用了 DS18B20 温度传感器,使用 1-wire 协议进行数据传输。在主函数中,不断获取温度并将温度值转换为字符数组,最后使用 LCD1602 显示屏进行显示。