51单片机AT89S52与DS18B20接口电路

时间:2026-01-20

51单片机AT89S52与DS18B20接口电路

51单片机AT89S52与DS18B20接口电路

硬件电路原理图

图 AT89S52与DS18B20组成的测温系统原理图

51单片机AT89S52与DS18B20接口C语言源程序:

#include<reg52.h>

code unsigned char seg7code[11]={0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //显示段码 void Delay(unsigned int tc) //显示延时程序

{while( tc != 0 )

{unsigned int i;

for(i=0; i<100; i++);

tc--;}

}

sbit TMDAT =P3^1; //DS18B20的数据输入/输出脚DQ,根据情况设定

unsigned int sdata;//测量到的温度的整数部分

unsigned char xiaoshu1;//小数第一位

unsigned char xiaoshu2;//小数第二位

unsigned char xiaoshu;//两位小数

51单片机AT89S52与DS18B20接口电路

bit fg=1; //温度正负标志

void dmsec (unsigned int count) //延时部分

{

unsigned char i;

while(count--)

{for(i=0;i<115;i++);}

}

void tmreset (void) //发送复位

{

unsigned char i;

TMDAT=0; for(i=0;i<103;i++);

TMDAT = 1; for(i=0;i<4;i++);

}

bit tmrbit (void) //读一位//

{

unsigned int i;

bit dat;

TMDAT = 0;

i++;

TMDAT = 1;

i++; i++; //微量延时 //

dat = TMDAT;

for(i=0;i<8;i++);

return (dat);

}

unsigned char tmrbyte (void) //读一个字节

{

unsigned char i,j,dat;

dat = 0;

for (i=1;i<=8;i++)

{ j = tmrbit(); dat = (j << 7) | (dat >> 1); }

return (dat);

}

void tmwbyte (unsigned char dat) //写一个字节

{

51单片机AT89S52与DS18B20接口电路

unsigned char j,i;

bit testb;

for (j=1;j<=8;j++)

{ testb = dat & 0x01;

dat = dat >> 1;

if (testb)

{ TMDAT = 0; //写0

i++; i++;

TMDAT = 1;

for(i=0;i<8;i++); }

else

{ TMDAT = 0; //写0

for(i=0;i<8;i++);

TMDAT = 1;

i++; i++;}

}

}

void tmstart (void) //发送ds1820 开始转换

{ tmreset(); //复位

dmsec(1); //延时

tmwbyte(0xcc); //跳过序列号命令

tmwbyte(0x44); //发转换命令 44H,

}

void tmrtemp (void) //读取温度

{

unsigned char a,b;

tmreset (); //复位

dmsec (1); //延时

tmwbyte (0xcc); //跳过序列号命令

tmwbyte (0xbe); //发送读取命令

a = tmrbyte (); //读取低位温度

b = tmrbyte (); //读取高位温度

if(b>0x7f) //最高位为1时温度是负

{a=~a; b=~b+1; //补码转换,取反加一

51单片机AT89S52与DS18B20接口电路

fg=0; //读取温度为负时fg=0

}

sdata = a/16+b*16; //整数部分

xiaoshu1 = (a&0x0f)*10/16; //小数第一位

xiaoshu2 = (a&0x0f)*100/16%10;//小数第二位

xiaoshu=xiaoshu1*10+xiaoshu2; //小数两位

}

void DS18B20PRO(void)

{ tmstart();

//dmsec(5); //如果是不断地读取的话可以不延时 //

tmrtemp(); //读取温度,执行完毕温度将存于TMP中 //

}

void Led()

{

if(fg==1) //温度为正时显示的数据

{ P2=P2&0xef;

P0=seg7code[sdata/10]; //输出十位数

Delay(8); P2=P2|0xf0; P2=P2&0xdf;

P0=seg7code[sdata%10]|0x80; //输出个位和小数点

Delay(8); P2=P2|0xf0; P2=P2&0xbf;

P0=seg7code[xiaoshu1]; //输出小数点后第一位

Delay(8); P2=P2|0xf0; P2=P2&0x7f;

P0=seg7code[xiaoshu2]; //输出小数点后第二位

Delay(4); P2=P2|0xf0;

}

if(fg==0) //温度为负时显示的数据

{ P2=P2&0xef;

P0=seg7code[11]; //负号

Delay(8); P2=P2|0xf0; P2=P2&0xdf;

P0=seg7code[sdata/10]|0x80; //输出十位数

Delay(8); P2=P2|0xf0; P2=P2&0xbf;

P0=seg7code[sdata%10]; //输出个位和小数点

Delay(8); P2=P2|0xf0; P2=P2&0x7f;

P0=seg7code[xiaoshu1]; //输出小数点后第一位

Delay(4); P2=P2|0xf0;

51单片机AT89S52与DS18B20接口电路

}

}

main()

{fg=1;

while(1)

{

DS18B20PRO();

Led();

}

}

RS232串口原理图

2.1 DS18B20的内外结构

51单片机AT89S52与DS18B20接口电路

DS18B20的外部结构如图1所示。其中,VDD为电源输入端,DQ为数字信号输入/输出端,GND为电源地。

DS18B20内部结构主要包括4部分:64位光刻ROM、温度传感器、非易失的温度报警触发器TH和TL、配置寄存器,如图2所示。

64位ROM中,在产品出厂前就被厂家通过光刻刻录好了64位序列号。该序列号可以看作是DS18B20的地址序列码,用来区分每一个DS18B20,从而更好地实现对现场温度的多点测量。

图2中的暂存器是DS18B20中最重要的寄存器。暂存器由9个字节组成,各字节定义如表1所列。

51单片机AT89S52与DS18B20接口电路

配置寄存器用于用户设置温度传感器的转换精度,其各位定义如下:

TM位是测试模式位,用于设置DS18B20是工作模式(0)还是测试模式(1),其出厂值为0。R1、R0用于设置温度传感器的转换精度:00,分辨率为9位,转换时间为93.75ms;01,分辨率为10位,转换时间为187.5 ms;10,分辨率为11位,转换时间为375 ms;11,分辨为12位,转换时间为750 ms。R1、R0的出厂值为11。其余5位值始终为1。

第0和第1字节为16位转换后的温度二进制值, …… 此处隐藏:2287字,全部文档内容请下载后查看。喜欢就下载吧 ……

51单片机AT89S52与DS18B20接口电路.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:4.9 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:19元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219