单总线温度采集
1、 写出实验设计的主要原理。 DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线(单总线)”接口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。
实验原理介绍图如下:
2、利用DS18B20和LED数码管实现单总线温度测量系统”和普中实验板说明书第24章“24.3 软件设计:使用DS18B20温度传感器、数码管显示检测的温度值”的项目案例,分别在Proteus和普中开发板实物上完成 DS18B20 的环境温度采集。
c文件:
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define out P0
sbit smg1=out^4;
sbit smg2=out^5;
sbit DQ=P3^7;
void delay5(uchar);
void init_ds18b20(void);
uchar readbyte(void);
void writebyte(uchar);
uchar retemp(void);
void main(void)
{
uchar i,temp;
delay5(1000);
while(1)
{
temp=retemp();
for(i=0;i<10;i++)
{
out=(temp/10)&0x0f;
smg1=0;
smg2=1;
delay5(1000);
out=(temp%10)&0x0f;
smg1=1;
smg2=0;
delay5(1000);
}
}
}
void delay5(uchar n)
{
do
{
_nop_();
_nop_();
_nop_();
n--;
}
while(n-1);
}
void init_ds18b20(void)
{
uchar x=0;
DQ =0;
delay5(120);
DQ =1;
delay5(16);
delay5(80);
}
uchar readbyte(void)
{
uchar i=0;
uchar date=0;
for (i=8;i>0;i--)
{
DQ =0;
delay5(1);
DQ =1;
date>>=1;
if(DQ)
date|=0x80;
delay5(11);
}
return(date);
}
void writebyte(uchar dat)
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ =0;
DQ =dat&0x01;
delay5(12);
DQ = 1;
dat>>=1;
delay5(5);
}
}
uchar retemp(void)
{
uchar a,b,tt;
uint t;
init_ds18b20();
writebyte(0xCC);
writebyte(0x44);
init_ds18b20();
writebyte(0xCC);
writebyte(0xBE);
a=readbyte();
b=readbyte();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
return(tt);
}
proteus图:
仿真效果图:
3、将上述实验成功的代码在Keil中进行仿真运行,使用虚拟逻辑分析仪显示单片机与DS18B20的DQ数据线连接引脚的波形,分析其“初始化–>写—>读”总线时序,与原理进行对比分析: 1)判断其是否符合技术要求;2)故意在代码中把时序弄错(改延时delay的延时值),再重新运行之前的实验,看DS18B20是否能正确相应并返回温度。
1).打开keil中的虚拟逻辑分析仪,分析DQ的波形
比较两图时间节点,前者为13.05842s,后者为13.05954s,差值约0.001s,对比c文件里的代码延时1000us(如下图),基本稳和。
下图的时间节点13.0751s有与上面的后者13.0595s差约0.015s,与下面循环延时的主函数内容时间相差不大
可以确定该内容符合技术要求。
2).将c文件中的延时函数多加列空循环,如下图:
再将其生成的hex文件在proteus中仿真,发现仪器无法返回正确的温度,如下图:
4、总结
爱学。