数字温度计的文档格式.docx

上传人:b****2 文档编号:1218267 上传时间:2023-04-30 格式:DOCX 页数:23 大小:259.31KB
下载 相关 举报
数字温度计的文档格式.docx_第1页
第1页 / 共23页
数字温度计的文档格式.docx_第2页
第2页 / 共23页
数字温度计的文档格式.docx_第3页
第3页 / 共23页
数字温度计的文档格式.docx_第4页
第4页 / 共23页
数字温度计的文档格式.docx_第5页
第5页 / 共23页
数字温度计的文档格式.docx_第6页
第6页 / 共23页
数字温度计的文档格式.docx_第7页
第7页 / 共23页
数字温度计的文档格式.docx_第8页
第8页 / 共23页
数字温度计的文档格式.docx_第9页
第9页 / 共23页
数字温度计的文档格式.docx_第10页
第10页 / 共23页
数字温度计的文档格式.docx_第11页
第11页 / 共23页
数字温度计的文档格式.docx_第12页
第12页 / 共23页
数字温度计的文档格式.docx_第13页
第13页 / 共23页
数字温度计的文档格式.docx_第14页
第14页 / 共23页
数字温度计的文档格式.docx_第15页
第15页 / 共23页
数字温度计的文档格式.docx_第16页
第16页 / 共23页
数字温度计的文档格式.docx_第17页
第17页 / 共23页
数字温度计的文档格式.docx_第18页
第18页 / 共23页
数字温度计的文档格式.docx_第19页
第19页 / 共23页
数字温度计的文档格式.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数字温度计的文档格式.docx

《数字温度计的文档格式.docx》由会员分享,可在线阅读,更多相关《数字温度计的文档格式.docx(23页珍藏版)》请在冰点文库上搜索。

数字温度计的文档格式.docx

C范围内,精度为±

0.5°

C。

DS1822的精度较差为±

C。

现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。

适合于恶劣环境的现场温度测量,如:

环境控制、设备或过程控制、测温类消费电子产品等。

与前一代产品不同,新的产品支持3V~5.5V的电压范围,使系统设计更灵活、方便。

而且新一代产品更便宜,体积更小。

DS18B20、DS1822的特性DS18B20可以程序设定9~12位的分辨率,精度为±

可选更小的封装方式,更宽的电压适用范围。

分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。

DS18B20的性能是新一代产品中最好的!

性能价格比也非常出色!

DS1822与DS18B20软件兼容,是DS18B20的简化版本。

省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±

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温度计、蜂鸣器及驱动蜂鸣器

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2