ds18b20温度传感器代码51单片机lcd1603显示
时间: 2023-10-07 10:04:22 浏览: 118
以下是 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 显示屏进行显示。
阅读全文