
1 DS18B20简介
1.1 概述
温度
在本设计中,采用缩小了体积。
1.2 硬件连接
DS18B20只有三个引脚:GND(电源地),VDD(工作电源),DQ(数据线)。
其典型应用如图所示。
图1 采用外部电源供电
VDD直接接电源,DQ数据端通过一上拉电阻(一般去10K)与MCU的一个I/O相连,GND接地。
2 硬件设计
硬件设计包括数码管显示电路,温度传感器电路,单片机最小系统。
2.1 数码管驱动显示
用单片机驱动LED数码管有很多方法,按显示方式可可分为静态显示和动态显示(扫描),按译码方式可分为硬件译码和软件译码。本设计采用3片74LS1移位寄存器利用动态扫描的方式驱动3位共阴数码管。因为1没有数据锁存器,在数据传输过程中数码管会有闪动,位数越多闪动越明显。为了消除这种现象,每位数码管加一PNP型三极管来控制数码管的开关。这样在数据传输过程中关闭所有数码管的显示,等数据传输完毕,开启所有数码管显示 ,以此达到减弱闪烁的目的。
图2 多片74LS1移位寄存器级联示意图
第一片寄存器接受单片机发出的数据,以后每级寄存器接受其前一级寄存器的末尾数据作为该级输入,利用单片机的串口作为串行数据DIN和移位时钟CLK。
2.2 总体电路设计
以低成本8051单片机为控制核心,P3.7口作为单片机与DS18B20数据传输口,利用单片机串口TXD/RXD串行输出欲显示的数据,每片移位寄存器驱动一数码管,利用单片机P3.5口作为数码管开关控制口。 设计如下电路,该电路在仿真软件Protues中经过调试通过,并在单片机开发板上实现了温度测量显示 。
DS18B20驱动程序对时序要求严格,因此,采用晶振频率为11.0592Mhz的晶振。
图3 Protues下电路仿真原理简图图
3 软件设计
软件设计主要包括传感器的驱动和数码管的显示输出,程序流程图如下所示。
4 串口显示子程序和传感器驱动子程序
void display123(void)
{load=0;
delay1();
load=1;
loadgnd=0;
SBUF=zimo[d[3]];
while(!TI);
TI=0;
SBUF=zimo[d[2]];
while(!TI);
TI=0;
if(flag==1)
{SBUF=0x40;
while(!TI);
TI=0;}
else
{SBUF=zimo[d[1]];
P1=d[2];while(!TI);
TI=0;}
loadgnd=1;
}
/*------------------------------*/
void Delay_us(int z)
{unsigned int num;
for(num=z;num>0;num--)
_nop_();}
void Init_DS18B20()
{unsigned char x=0;
DQ = 1;
Delay_us(8);
DQ = 0;
Delay_us(40);
DQ = 1;
Delay_us(14);
x=DQ;
Delay_us(20);
}
Write_byte(char dat)
{ unsigned char i=0;
for (i=8; i>0; i--)
{DQ = 0;
DQ = dat&0x01;
Delay_us(5);
DQ = 1;
dat>>=1;}
}
char Read_byte()
{unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{DQ = 0;
dat>>=1;
DQ = 1;
if(DQ)
dat|=0x80;
Delay_us(4);}
return(dat);}
Int DS18B20_Readtemp()
{unsigned char TL=0;
unsigned char TH=0;
unsigned int temp=0;
float temp1=0;
Init_DS18B20();
Write_byte(0xCC);
Write_byte(0x44);
Init_DS18B20();
Write_byte(0xCC);
Write_byte(0xBE);
TL=Read_byte();
TH=Read_byte();
if((TH&0xf8)!=0X00)
{P2=TH|TL;
flag=1;
TH=~TH;T
L=(~TL)+1;}
else
{flag=0;P2=TH|TL;}
TH=TH<<4;
TL=TL>>4;
temp=TH|TL;
return(temp);
}
