实验一 基于 DS18B20 温度测量与显示实验
1
一、基本概念
单总线、DS18B20、温度测量
二、实验目的
1.学习单总线电路的接口工作原理;
2.了解 DS18B20 的工作原理、内部寄存器及接口时序;
与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实
际要求通过简单的编程实现 9~12 位的数字值读数方式。可以分别在
93.75 ms 和 750 ms 内完成 9 位和 12 位的数字量,并且从 DS18B20
读出的信息或写入 DS18B20 的信息仅需要一根口线(单线接口)读写,
温度变换功率来源于数据总线,总线本身也可以向所挂接的 DS18B20
供电,而无需额外电源。因而使用 DS18B20 可使系统结构更趋简单,
可靠性更高。
3.掌握 DS18B20 的温度采集程序编程技术。
三、实验要求
1.掌握单总线电路的接口工作原理;
2.掌握 DS18B20 的编程方法。
四、实验内容
利用 DS18B20 模块电路与单片机连接,构成室温数字采集与数码管显
示。
五、实验电路图及其结果
1
2
六、实验代码
//接 ds18b20 数据端口
#include
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^0;
sbit p20=P2^0;
sbit p21=P2^1;
sbit p22=P2^2;
sbit p23=P2^3;
code uchar tab[]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,
//0~9
code uchar tab1[]={0x40,0x79,0x24,0x30,0x19,0x12,
0x82,0xF8,0x80,0x90};
0x02,0x78,0x00,0x10};
uchar a,b,t;
uchar bai,shi,ge;
2
3
void delay(unsigned int i)
{
while(i--);
}
{
int_DS18B20()//对 ds18b20 初始化
//DQ 复位
//延时
//单片机将 DQ 拉低
//精度延时大于 480us
//拉高总线
//x=0 则初始化成功,x=1 则初始化失败
unsigned char x=0;
DQ=1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(10);
x=DQ;
delay(20);
return x;
}
read()//读温度数值
{
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(4);
}
return(dat);
}
void write(unsigned char dat)
3
4
{
}
unsigned char i=0;
for(i=8;i>0;i--)
{DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
void int_()
{
while(int_DS18B20());
write(0xCC);
write(0x44);
}
void main()
{
uint count=0;
P2=0xFF;
int_();
delay(220);
for(count=0;count<100;count++) //数码管初始化 00
{p20=1;
P0=tab[0];
delay(100);
p20=0;
p21=1;
P0=tab[0];
delay(100);
p21=0;
4
5
p22=1;
delay(100);
p22=0;
p23=1;
P0=0xc6;
delay(100);
p23=0;
}
while(1)
{
delay(10);
while(int_DS18B20());
write(0xCC);
write(0xBE);
a=read(); //读高八位
b=read(); //读低八位
if(b>127)
//判断温度正负 B>127 为负
{
a=~a;
b=~b;
a=a>>4;
t=b<<4;
t=t|a;
t+=1;
shi=t/10;
ge=t%10;
for(count=0;count<123;count++)
{
if(t>=10)
{
p20=1;
P0=0xBF;
delay(30);
5
6
p20=0;
p21=1;
P0=tab[shi];
delay(30);
p21=0;
p22=1;
P0=tab1[ge];
delay(30);
p22=0;
p23=1;
P0=0xc6;
delay(30);
p23=0;
}
p20=0;
p21=1;
P0=0xBF;
delay(30);
p21=0;
p22=1;
P0=tab1[ge];
delay(30);
p22=0;
p23=1;
P0=0xc6;
delay(30);
p23=0;
}
6
else
{
}
}
else
{
7
count=0;
a=a>>4;
t=b<<4;
t=t|a;
bai=t/100;
shi=t%100/10;
ge=t%10;
for(count=0;count<123;count++)
{if(bai)
{p20=1;
P0=tab[bai];
delay(20);
p20=0;
}
else
p20=0;
if(shi)
{p21=1;
P0=tab[shi];
delay(20);
p21=0;
}
p21=0;
p22=1;
P0=tab1[ge];
delay(20);
p22=0;
p23=1;
P0=0xc6;
delay(20);
p23=0;
}
}
7
int_();
8
}
}
七、实验小结
在仿真中因为有没有晶振都一样就没有接,在选择器件时,应该
注意器件的属性,例如数码管的共阴共阳性质,避免在显示上出现问
题。
8