数字温度计的文档格式.docx
《数字温度计的文档格式.docx》由会员分享,可在线阅读,更多相关《数字温度计的文档格式.docx(23页珍藏版)》请在冰点文库上搜索。
C范围内,精度为±
0.5°
C。
DS1822的精度较差为±
2°
C。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,如:
环境控制、设备或过程控制、测温类消费电子产品等。
与前一代产品不同,新的产品支持3V~5.5V的电压范围,使系统设计更灵活、方便。
而且新一代产品更便宜,体积更小。
DS18B20、DS1822的特性DS18B20可以程序设定9~12位的分辨率,精度为±
可选更小的封装方式,更宽的电压适用范围。
分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。
DS18B20的性能是新一代产品中最好的!
性能价格比也非常出色!
DS1822与DS18B20软件兼容,是DS18B20的简化版本。
省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±
2°
C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。
继“一线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。
DS18B20和DS1822使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。
(1)DS18B20的内部结构
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20的管脚排列如下:
(2) DS18B20详细引脚功能描述
序号
名称
引脚功能描述
1
GND
地信号
2
DQ
数据输入/输出引脚。
开漏单总线接口引脚。
当被用在寄生电源下,也可以向器件提供电源。
3
VDD
可选择VDD的引脚。
当工作于寄生电源时,此引脚必须接地。
(3)、DS18B20的使用方法
由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。
该协议定义了几种信号的时序:
初始化时序、读时序、写时序。
所有时序都是将主机作为主设备,单总线器件作为从设备。
而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是低位在先。
a、DS18B20的复位时序
b、DS18B20的读时序
对于DS18B20的读时序分为读0时序和读1时序两个过程。
对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。
DS18B20在完成一个读时序过程,至少需要60us才能完成。
c、DS18B20的写时序
对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。
对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。
3、元件清单
芯片:
AT89C521片、74LS2451片、DS18B201片;
74LS04一片;
电阻:
500R8个、10K5个、4.7K1个、1K1个;
电容:
30pF2个、10uF1个;
发光二极管:
1个;
开关2个;
晶振:
12MHZ1个;
按钮:
5个;
下载口:
四位一体共阳数码管:
2个;
蜂鸣器:
三极管:
S85501个;
排针、排线:
若干
4、系统组成框图如下:
电源
AT89C52
控
制
器
复位电路
时钟电路
显示电路
DS18B20
按键电路
报警电路
5、单元电路框图如下:
(1)、复位电路——手动复位
(2)、晶振电路
6、电路仿真连接图如下:
7、程序流程图如下所示:
调用显示子程序
1s到?
初次上电电
发温度转换开始命令
发DS18B20复位命令
发跳过ROM命令
发读取温度命令
读取操作,CRC校验
9字节完?
CRC校验正?
移入温度暂存器
结束
初始化
读出温度值温度计算处理显示数据刷新
主程序流程图读温度流程图
四、方案实现及测试(或调试)
1、C语言源程序如下所示:
#ifndef__DELAY_H__
#define__DELAY_H__
/*------------------------------------------------
uS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5uS
------------------------------------------------*/
voidDelayUs2x(unsignedchart);
mS延时函数,含有输入参数unsignedchart,无返回值
0~255这里使用晶振12M,精确延时请使用汇编
voidDelayMs(unsignedchart);
#endif
#include<
reg52.h>
//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint;
端口定义
sbitDQ=P2^7;
//ds18b20端口
函数声明
unsignedintReadTemperature(void);
bitInit_DS18B20(void);
unsignedcharReadOneChar(void);
voidWriteOneChar(unsignedchardat);
/*-----------------------------------------------
DS18b20数码管显示超温报警
***********************************************************/
#include<
#include"
18b20.h"
delay.h"
#defineDataPortP0//定义数据端口程序中遇到DataPort则用P0替换
#defineCtrlPortP2//定义位选端口
#defineKeyPortP1//按键
//#defineOVERTEMP29//定义超温报警数值
//#defineLOWTEMP26//定义超温报警数值
sbitbz=P3^7;
bitReadTempFlag;
//定义读时间标志
charOVERTEMP;
charLOWTEMP;
unsignedcharcodeDuanMa[10]={~0x3f,~0x06,~0x5b,~0x4f,~0x66,~0x6d,~0x7d,~0x07,~0x7f,~0x6f};
//显示段码值0~9//显示段码值0~9
unsignedcharcodeWeiMa[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
//分别对应相应的数码管点亮,即位码
unsignedcharTempData[8];
//存储显示值的全局变量
voidDisplay(unsignedcharFirstBit,unsignedcharNum);
//数码管显示函数
voidInit_Timer0(void);
//定时器初始化
unsignedcharKeyScan(void);
主函数
voidmain(void)
{
unsignedintTempH,TempL,temp;
unsignedcharnum;
Init_Timer0();
bz=1;
while
(1)//主循环
{
num=KeyScan();
switch(num)
case1:
if(OVERTEMP<
127)OVERTEMP++;
break;
case2:
if(OVERTEMP>
-55)OVERTEMP--;
case3:
if(LOWTEMP<
127)LOWTEMP++;
case4:
if(LOWTEMP>
-55)LOWTEMP--;
default:
}
if(ReadTempFlag==1)
{
ReadTempFlag=0;
temp=ReadTemperature();
if(temp&
0x8000)
TempData[0]=0x40;
//负号标志
temp=~temp;
//取反加1
temp+=1;
else
TempData[0]=0;
TempH=temp>
>
4;
TempL=temp&
0x0F;
TempL=TempL*6/10;
//小数近似处理
if(TempH>
OVERTEMP)//如果超温则提示
bz=1;
//TempData[0]=0x76;
//显示"
H"
elseif(TempL<
LOWTEMP)
//TempData[0]=0x38;
elsebz=0;
TempData[7]=DuanMa[OVERTEMP/10];
//高
TempData[6]=DuanMa[OVERTEMP%10];
TempData[5]=DuanMa[LOWTEMP/10];
//低
TempData[4]=DuanMa[LOWTEMP%10];
//低
TempData[3]=DuanMa[(TempH%100)/10];
//十位温度
TempData[2]=DuanMa[(TempH%100)%10]|0x80;
//个位温度,带小数点
TempData[1]=DuanMa[TempL];
//TempData[0]=0x39;
////显示C符号
}
}
显示函数
voidDisplay(unsignedcharFirstBit,unsignedcharNum)
staticunsignedchari=0;
DataPort=0;
//清空数据,防止有交替重影
CtrlPort=WeiMa[i+FirstBit];
//取位码
DataPort=TempData[i];
//取显示数据,段码
i++;
if(i==Num)
i=0;
定时器初始化子程序
voidInit_Timer0(void)
TMOD|=0x01;
EA=1;
//总中断打开
ET0=1;
//定时器中断打开
TR0=1;
//定时器开关打开
定时器中断子程序
voidTimer0_isr(void)interrupt1
staticunsignedintnum;
TH0=(65536-2000)/256;
//重新赋值2ms
TL0=(65536-2000)%256;
Display(0,8);
//调用数码管扫描
num++;
if(num==300)//
num=0;
ReadTempFlag=1;
//读标志位置1
按键扫描函数,返回扫描键值
unsignedcharKeyScan(void)
unsignedcharkeyvalue;
if(KeyPort!
=0xff)
DelayMs(10);
keyvalue=KeyPort;
while(KeyPort!
=0xff);
switch(keyvalue)
{
case0xfe:
return1;
case0xfd:
return2;
case0xfb:
return3;
case0xf7:
return4;
return0;
}
return0;
voidDelayUs2x(unsignedchart)
while(--t);
voidDelayMs(unsignedchart)
while(t--)
//大致延时1mS
DelayUs2x(245);
#include"
18b20初始化
bitInit_DS18B20(void)
bitdat=0;
DQ=1;
//DQ复位
DelayUs2x(5);
//稍做延时
DQ=0;
//单片机将DQ拉低
DelayUs2x(200);
//精确延时大于480us小于960us
//拉高总线
DelayUs2x(50);
//15~60us后接收60-240us的存在脉冲
dat=DQ;
//如果x=0则初始化成功,x=1则初始化失败
DelayUs2x(25);
//稍作延时返回
returndat;
读取一个字节
unsignedcharReadOneChar(void)
unsignedchari=0;
unsignedchardat=0;
for(i=8;
i>
0;
i--)
//给脉冲信号
dat>
=1;
if(DQ)
dat|=0x80;
return(dat);
写入一个字节
voidWriteOneChar(unsignedchardat)
unsignedchari=0;
for(i=8;
i>
i--)
DQ=dat&
0x01;
DelayUs2x(25);
读取温度
unsignedintReadTemperature(void)
unsignedchara=0;
unsignedintb=0;
unsignedintt=0;
Init_DS18B20();
WriteOneChar(0xCC);
//跳过读序号列号的操作
WriteOneChar(0x44);
//启动温度转换
DelayMs(10);
//跳过读序号列号的操作
WriteOneChar(0xBE);
//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();
//低位
b=ReadOneChar();
//高位
b<
<
=8;
t=a+b;
return(t);
2、电路调试图如下所示:
(1)温度上下限值:
(2)调节后为:
(3)测得的温度为:
3、调试过程
由于此电路与数字时钟电路共用一个单片机,驱动显示部分也是完全一样的,唯一的区别就是多了一个DS18B20温度计、蜂鸣器及驱动蜂鸣器