DS18B20采集到的温度数据ST89c52单片机
1、封装和引脚定义:DS18B20常见的封装为TO-92,也有其他封装形式可选。其针脚定义包括供电(VCC)、地(GND)以及数据线(DQ)。
2、数字输出:DS18B20采集到的温度数据以数字信号形式输出,可直接连接到微处理器等设备进行数据处理和控制。
3、单线接口方式:DS18B20与微处理器之间仅需要一条通信线,大大简化了连接和使用的复杂性。
4、适应电压范围广:DS18B20可以在3.0~5.5V的电压范围内工作,在寄生电源方式下甚至可以通过数据线供电5、
高精度测温:DS18B20具有高精度的温度测量能力,支持的测量分辨率可通过程序设定为9~12位。
6、抗干扰能力强:DS18B20采用了数字信号传输,具备较好的抗干扰能力,适用于各种非极限温度场合。
应用广泛:DS18B20的外观可以根据应用场合的不同进行调整,例如管道式、螺纹式、磁铁吸附式和不锈钢包裹式等,适用于电缆沟测温、锅炉测温、机房测温、农业大棚测温等领域。
通过网盘分享的文件:ds18b20
链接: https://pan.baidu.com/s/16lDv0IKemd-AoDtIe8oy2g 提取码: ew7v
#iclude <reg52.H>
#include <intrins.H>
#include <math.H>
#define uchar unsigned char
#define uint unsigned int
sbit lcden = P2^2; //定义lcd的E端口
sbit lcdrw = P2^1; //定义lcd的rw端口
sbit lcdrs = P2^0; //定义lcd的rs端口
//IIC延时函数,延时必须精确,否则无法准确传输
void Delay4us()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void DelayMs(uint ms)
{
uint i;
while(ms--)
{
for(i = 110;i > 0;i--)
{
;
}
}
}
//往LCD1602中写命令
void Write_Com(uchar com)
{
lcdrs = 0; //lcdrs为低电平时,选择指令寄存器
P0 = com;
DelayMs(5);
lcden = 1;
DelayMs(5);
lcden = 0;
}
//往LCD1602中写数据
void Write_data(uchar date)
{
lcdrs = 1; //lcdrs为高电平时,选择数据寄存器
P0 = date;
DelayMs(5);
lcden = 1; //当lcden由高电平变为低电平时,LCD1602开始执行命令
DelayMs(5);
lcden = 0;
}
//LCD1602的初始化函数
void init()
{
lcdrw = 0; //lcdrw高电平时为读操作,低电平时为写操作
lcden = 0;
Write_Com(0x38);
Write_Com(0x0c);
Write_Com(0x06);
Write_Com(0x01);
}
void writeString(uchar * str, uchar length)
{
uchar i;
for(i = 0; i < length; i++)
{
Write_data(str[i]);
}
}
/**//*****************************DS18B20*******************************/
sbit ds = P1^1;
void dsInit()
{
unsigned int i;
ds = 0;
i = 100;
while(i>0) i--;
ds = 1;
i = 4;
while(i>0) i--;
}
void dsWait()
{
unsigned int i;
while(ds);
while(~ds);
i = 4;
while(i > 0) i--;
}
bit readBit()
{
unsigned int i;
bit b;
ds = 0;
i++;
ds = 1;
i++; i++;
b = ds;
i = 8;
while(i>0) i--;
return b;
}
unsigned char readByte()
{
unsigned int i;
unsigned char j, dat;
dat = 0;
for(i=0; i<8; i++)
{
j = readBit();
dat = (j << 7) | (dat >> 1);
}
return dat;
}
void writeByte(unsigned char dat)
{
unsigned int i;
unsigned char j;
bit b;
for(j = 0; j < 8; j++)
{
b = dat & 0x01;
dat >>= 1;
if(b)
{
ds = 0; i++; i++;
ds = 1;
i = 8; while(i>0) i--;
}
else
{
ds = 0;
i = 8; while(i>0) i--;
ds = 1;
i++; i++;
}
}
}
void sendChangeCmd()
{
dsInit();
dsWait();
DelayMs(1);
writeByte(0xcc);
writeByte(0x44);
}
void sendReadCmd()
{
dsInit();
dsWait();
DelayMs(1);
writeByte(0xcc);
writeByte(0xbe);
}
int getTmpValue()
{
unsigned int tmpvalue;
int value;
float t;
unsigned char low, high;
sendReadCmd();
low = readByte();
high = readByte();
tmpvalue = high;
tmpvalue <<= 8;
tmpvalue |= low;
value = tmpvalue;
t = value * 0.0625;
value = t * 100 + (value > 0 ? 0.5 : -0.5);
return value;
}
void display(int v)
{
unsigned char count;
unsigned char datas[] = {0, 0, 0, 0, 0};
unsigned int tmp = abs(v);
datas[0] = tmp / 10000;
datas[1] = tmp % 10000 / 1000;
datas[2] = tmp % 1000 / 100;
datas[3] = tmp % 100 / 10;
datas[4] = tmp % 10;
Write_Com(0xc0+3);
if(v < 0)
{
writeString("- ", 2);
}
else
{
writeString("+ ", 2);
}
if(datas[0] != 0)
{
Write_data('0'+datas[0]);
}
for(count = 1; count != 5; count++)
{
Write_data('0'+datas[count]);
if(count == 2)
{
Write_data('.');
}
}
}
//*****************************DS18B20*******************************/
void main()
{
uchar table[] = " xianzaiwendu:";
sendChangeCmd();
init();
Write_Com(0x80);
writeString(table, 16);
while(1)
{
DelayMs(1000); //温度转换时间需要750ms以上
Write_Com(0xc0);
display(getTmpValue());
sendChangeCmd();
}
}








最新发布