上海羊羽卓进出口贸易有限公司

proteus温度传感器仿真 DS18B20多点温度采集

发布时间:2025-01-22 12:01:20

DS18B20多点温度采集

以前使用DS18B20进行温度采集都是控制一个传感器进行单独的温度采集,DS18B20的单总线是支持多点组网的功能的,可以将多个DS18B20挂在同一个总线上进行温度采集,这样只使用单片机的1个IO就可以完成8个测温点的温度测量。

今天发一个基于51单片机8点温度采集仿真和程序。Proteus仿真图如下。

Proteus仿真图

仿真中将8个DS18B20的数据端口并联接到单片机的P20引脚上。对8个传感器进行编号加以区分。

DS18B20内部具有64-位光刻ROM。64位光刻ROM的前8位是DS18B20的自身代码,接下来的48位为连续的数字代码,最后的8位是对前56位的CRC校验。64-位的光刻ROM又包括5个ROM的功能命令:读ROM,匹配ROM,跳跃ROM,查找ROM和报警查找。

DS18B20ROM数组

DS18B20在进行数据操作时,必须进行相应的ROM操作,在进行多个传感器温度测量时,就需要通过温度传感器内部的ROM数据对各个温度传感器加以区分。如上图所示为该仿真中8个温度传感器DS18B20的ROM数据,在仿真中可以通过对器件右键选择"Edit Properties",在弹出的对话框中对DS18B20器件的ROM数据进行修改,只需要保证仿真中器件的ROM数据与程序中定义的数据相同即可。

修改仿真中DS18B20ROM数据

器件ROM修改对话框

#include <reg52.h>

#include <Intrins.h>

#defineDATAP1 //1602驱动端口

//ROM操作命令

#define READ_ROM 0x33 //读ROM

#define SKIP_ROM 0xCC //跳过ROM

#define MATCH_ROM 0x55 //匹配ROM

#define SEARCH_ROM 0xF0 //搜索ROM

#define ALARM_SEARCH 0xEC //告警搜索

//存储器操作命令

#define ANEW_MOVE 0xB8 //重新调出E^2数据

#define READ_POWER 0xB4 //读电源

#define TEMP_SWITCH 0x44 //启动温度变换

#define READ_MEMORY 0xBE //读暂存存储器

#define COPY_MEMORY 0x48 //复制暂存存储器

#define WRITE_MEMORY 0x4E //写暂存存储器

//数据存储结构

typedef struct tagTempData

{

unsigned char btThird;//百位数据

unsigned char btSecond;//十位数据

unsigned char btFirst;//个位数据

unsigned char btDecimal;//小数点后一位数据

unsigned charbtNegative;//是否为负数

}TEMPDATA;

TEMPDATA m_TempData;

//引脚定义

sbit DQ = P2^0;//数据线端口

sbit RS=P0^2;

sbit RW=P0^1;

sbit E=P0^0;

//DS18B20序列号,通过调用GetROMSequence()函数在P1口读出(读8次)

const unsigned char code ROMData1[8] = {0x28, 0x30, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x8E};//U1

const unsigned char code ROMData2[8] = {0x28, 0x31, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xB9};//U2

const unsigned char code ROMData3[8] = {0x28, 0x32, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xE0};//U3

const unsigned char code ROMData4[8] = {0x28, 0x33, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xD7};//U4

const unsigned char code ROMData5[8] = {0x28, 0x34, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x52};//U5

const unsigned char code ROMData6[8] = {0x28, 0x35, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x65};//U6

const unsigned char code ROMData7[8] = {0x28, 0x36, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x3C};//U7

const unsigned char code ROMData8[8] = {0x28, 0x37, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x0B};//U8

unsigned char ch = 0 ;

//判断忙指令

void Busy()

{

DATA = 0xff;

RS = 0;

RW = 1;

while(DATA & 0x80)

{

E = 0;

E = 1;

}

E = 0;

}

//写指令程序

void WriteCommand(unsigned char btCommand)

{

Busy();

RS = 0;

RW = 0;

E = 1;

DATA = btCommand;

E = 0;

}

//写数据程序

void WriteData(unsigned char btData)

{

Busy();

RS = 1;

RW = 0;

E = 1;

DATA = btData;

E = 0;

}

//清屏显示

void Clear()

{

WriteCommand(1);

}

//初始化

void Init()

{

WriteCommand(0x0c);//开显示,无光标显示

WriteCommand(0x06);//文字不动,光标自动右移

WriteCommand(0x38);//设置显示模式:8位2行5x7点阵

}

//显示单个字符

void DisplayOne(bit bRow, unsigned char btColumn, unsigned char btData, bit bIsNumber)

{

if (bRow) WriteCommand(0xc0 + btColumn);

else WriteCommand(0x80 + btColumn);

if (bIsNumber) WriteData(btData + 0x30);

else WriteData(btData);

}

//显示字符串函数

void DisplayString(bit bRow, unsigned char btColumn, unsigned char *pData)

{

while (*pData != '\0')

{

if (bRow) WriteCommand(0xc0 + btColumn);//显示在第1行

else WriteCommand(0x80 + btColumn);//显示在第0行

WriteData(*(pData++));//要显示的数据

btColumn++;//列数加一

}

}

//延时16us子函数

void Delay16us()

{

unsigned char a;

for (a = 0; a < 4; a++);

}

//延时60us子函数

void Delay60us()

{

unsigned char a;

for (a = 0; a < 18; a++);

}

//延时480us子函数

void Delay480us()

{

unsigned char a;

for (a = 0; a < 158; a++);

}

//延时240us子函数

void Delay240us()

{

unsigned char a;

for (a = 0; a < 78; a++);

}

//延时500ms子函数

void Delay500ms()

{

unsigned char a, b, c;

for (a = 0; a < 250; a++)

for (b = 0; b < 3; b++)

for (c = 0; c < 220; c++);

}

//芯片初始化

void Initialization()

{

while(1)

{

DQ = 0;

Delay480us(); //延时480us

DQ = 1;

Delay60us();//延时60us

if(!DQ) //收到ds18b20的应答信号

{

DQ = 1;

Delay240us();//延时240us

break;

}

}

}

//写一个字节(从低位开始写)

void WriteByte(unsigned char btData)

{

unsigned char i, btBuffer;

for (i = 0; i < 8; i++)

{

btBuffer = btData >> i;

if (btBuffer & 1)

{

DQ = 0;

_nop_();

_nop_();

DQ = 1;

Delay60us();

}

else

{

DQ = 0;

Delay60us();

DQ = 1;

}

}

}

//读一个字节(从低位开始读)

unsigned char ReadByte()

{

unsigned char i, btDest;

for (i = 0; i < 8; i++)

{

btDest >>= 1;

DQ = 0;

_nop_();

_nop_();

DQ = 1;

Delay16us();

if (DQ) btDest |= 0x80;

Delay60us();

}

return btDest;

}

//序列号匹配

void MatchROM(const unsigned char *pMatchData)

{

unsigned char i;

Initialization();

WriteByte(MATCH_ROM);

for (i = 0; i < 8; i++) WriteByte(*(pMatchData + i));

}

//得到64位ROM序列(在P1口显示,必须与Proteus联调且在单步调试下才能得到)

/*void GetROMSequence()

{

unsigned char i;

Initialization();

WriteByte(READ_ROM);

for (i = 0; i < 8; i++)

P1 = ReadByte();

}*/

//读取温度值

TEMPDATA ReadTemperature()

{

TEMPDATA TempData;

unsigned int iTempDataH;

unsigned char btDot, iTempDataL;

static unsigned char i = 0;

TempData.btNegative = 0;//为0温度为正

i++;

if (i == 9) i = 1;

Initialization();

WriteByte(SKIP_ROM);//跳过ROM匹配

WriteByte(TEMP_SWITCH);//启动转换

Delay500ms(); //调用一次就行

Delay500ms();

Initialization();

ch = i ;

//多个芯片的时候用MatchROM(ROMData)换掉WriteByte(SKIP_ROM)

switch (i)

{

case 1 : MatchROM(ROMData1); break;//匹配1

case 2 : MatchROM(ROMData2); break;//匹配2

case 3 : MatchROM(ROMData3); break;//匹配3

case 4 : MatchROM(ROMData4); break;//匹配4

case 5 : MatchROM(ROMData5); break;//匹配5

case 6 : MatchROM(ROMData6); break;//匹配6

case 7 : MatchROM(ROMData7); break;//匹配7

case 8 : MatchROM(ROMData8); break;//匹配8

}

//WriteByte(SKIP_ROM);//跳过ROM匹配(单个芯片时用这句换掉上面的switch)

WriteByte(READ_MEMORY);//读数据

iTempDataL = ReadByte();

iTempDataH = ReadByte();

iTempDataH <<= 8;

iTempDataH |= iTempDataL;

if (iTempDataH & 0x8000)

{

TempData.btNegative = 1;

iTempDataH = ~iTempDataH + 1;//负数求补

}

//为了省去浮点运算带来的开销,而采用整数和小数部分分开处理的方法(没有四舍五入)

btDot = (unsigned char)(iTempDataH & 0x000F);//得到小数部分

iTempDataH >>= 4;//得到整数部分

btDot *= 5; //btDot*10/16得到转换后的小数数据

btDot >>= 3;

//数据处理

TempData.btThird = (unsigned char)iTempDataH / 100;

TempData.btSecond = (unsigned char)iTempDataH % 100 / 10;

TempData.btFirst = (unsigned char)iTempDataH % 10;

TempData.btDecimal = btDot;

return TempData;

}

//数据处理子程序

void DataProcess()

{

m_TempData = ReadTemperature();

if (m_TempData.btNegative) DisplayOne(1, 6, '-', 0);

else DisplayOne(1, 6, m_TempData.btThird, 1);

DisplayOne(1, 4, ch+0x30, 0);

DisplayOne(1, 7, m_TempData.btSecond, 1);

DisplayOne(1, 8, m_TempData.btFirst, 1);

DisplayOne(1, 10, m_TempData.btDecimal, 1);

}

int main(void)

{

//GetROMSequence();

Clear();

Init();

DisplayString(0, 0, " Temperature");

DisplayString(1, 0, " No.");

//DisplayOne(1, 4, ':', 0);

DisplayOne(1, 5, ':', 0);

DisplayOne(1, 9, '.', 0);

DisplayOne(1, 11, 0xdf, 0);

DisplayOne(1, 12, 'C', 0);

while (1)

{

DataProcess();

}

}

仿真效果图

程序的主要功能是循环控制8个温度传感器进行温度采集,并将采集的温度通过液晶显示器进行显示。液晶显示器滚动对各个传感器的测温值进行显示。

一款基于单片机的智能温度预警系统

随着社会的发展特别是工业的发展,人民生活的改善,安全问题变得更加重要。目前,在许多情况下,都需要对环境的温度进行限定,其中包括人的生活工作环境、仪器设备的工作环境以及动植物的生长环境等。

如果环境温度超过或低于限定值,必定对所处环境的人和设备造成影响,甚至给个人和社会造成巨大的损失。随着单片机技术的飞速发展,利用单片机设计温控系统成为控制技术发展的需要。本文提出了一种基于单片机的温度预警系统的设计方案,并采用PROTEUS进行了仿真。该系统不仅可以高精度的测量温度,同时对温度进行实时监控并做到超温报警,有较高的实用价值。

2.系统设计的总体方案

本设计方案总体框图如图1所示,它是由单片机、四路数据采集模块、集成功放模块、人机交互界面和系统电源等组成。

本设计系统以AT89C52单片机作为控制核心,数据采集部分由温度传感器DS18B20组成;人机交互界面为4×4矩阵键盘输入和LCD1602液晶显示,可以方便的输入数据和直观的显示。系统电源为+5V电源供电。软件部分采用C语言进行编程,实现了该设计的全部控制功能。该温度预警系统的测量范围为-55℃~+125℃。当检测的温度高于最高或最低温度设定值时,实现报警功能。

3.电路设计

3.1 单片机

AT89S52单片机是ATMEL公司推出的高档型AT89S系列单片机中的增强型产品。AT89S52是一个低功耗、高性能CMOS8为单片机,片内含8K Bytes ISP的可反复擦写1000次的Flash只读程序存储器。期间采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构。芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S52可为许多嵌入式控制应用系统提供高性价比的解决方案。

3.2 温度采集电路

由单片机获取非电信号的温度信息,必须通过温度传感器。传统的温度测量多以热敏电阻作为温度传感器,但是,热敏电路可靠性较差,测量温度精度低,因此使用DS18B20温度传感器采集温度。DS18B20是美国达拉斯(Dallas)公司的单数字温度传感器芯片,DS18B20具有体积小,功耗低,抗干扰能力强,易于微处理器连接等特点,其测量范围-55℃~+125℃,最大分辨率为0.0625℃,在-25℃~+85℃范围内其测温标准度为±0.5℃。

DS18B20只有三个引脚,一个接地,一个接电源,一个数字输入/输出引脚,由于DS18B20采用单总线结构,本系统的四个温度传感器并联在三线上,数据输入/输出接单片机的P1.7口,电源与数字输入输出脚间需要接一个4.7K的电阻,实现多点组网功能。

3.3 报警电路设计

本系统报警电路使用L M 3 8 6作为报警器的功率放大器。LM386是一种音频集成功放,具有自身功耗低、电压增益可调整、电源电压范围大、外接元件少和总谐波失真小等优点,广泛应用于录音机和收音机之中。

LM386的输入端接单片机的P3.4引脚,输出端接扬声器,电路图如图2所示。当实际温度超过或低于设置的温度值时,单片机相应引脚输出一定频率的信号,信号经过音频功放放大之后,发出报警声。

3.4 显示接口电路设计

系统采用液晶显示模块来显示4路温度采集值及温度设定值。本系统采用LCD12864液晶显示模块。LCD12864是一种具有4位/ 8位并行、2线或三线串行多接口方式,内部含有国际一级、二级简体中文字库的点阵图形液晶显示模块,其显示分辨率为128×64,可以显示8×4行16×16点阵的汉字。同时又具有低电压低功耗等特点。

在本系统,LCD12864的3个控制端RS(数据/命令选择端)、R/W(读/写选择端)、E(使能信号)分别连接单片机的P 3 . 7、P3.0、P3.3,用来对LCD12864进行控制;LCD12864的8个数据端连接单片机的P0口,用来向LCD12864写入数据。液晶的第3引脚为液晶显示偏压信号,用来调节显示的对比度;第1、2引脚为液晶的电源接口;第19、20引脚是显示器背光灯的电源接口。

3.5 键盘接口电路设计

键盘在单片机应用系统中能够实现向单片机输入数据、传送命令等功能,是人干预单片机的主要手段。本系统采用了4×4矩阵键盘实现对温度值和功能键的设定。四条行线接单片机P2口的高4位,四条列线接单片机P2口的低4位。初始化时键盘行线为高电平,列线为低电平。键盘的行线接4输入与门,4输入与门的输出接单片机的外部中断0引脚P3.2口。当有键按下时,将产生中断,在中断程序里对按键进行扫描,得到按键的键值。

3.6 电源电路的设计

电源是整个系统的能量来源,它直接关系到系统能否运行。在本系统中单片机、液晶显示、报警等电路需要5V的电源,因此电路中选用稳压芯片7805,其最大输出电流为1.5A,能够满足系统的要求。

4.软件设计

主程序先对系统资源进行初始化,调用LCD显示子程序,然后进入键盘设置界面。

当设置键按下后,开始设置各点的温度,如果确认键按下,则系统开始工作。首先调用DS18B20初始化子程序,再发送ROM命令,读取DS18B20转换的温度值。当读取的温度大于设置的温度值时,报警器开始报警,LCD显示温度的实际值、设置值、路数、状态。

接下来对第二、三、四路温度进行采集,处理,显示。

5.系统PROTEUS仿真

Proteus 软件是来自用过LabcenterElectronics公司,基于SPICEF5 仿真引擎的很合电路仿真软件,是一款含有大量的系统资源、丰富的硬件接口电路,具有强大的调试功能和软硬件相结合的仿真系统。它很好地解决了硬件设计和软件调试的问题,不仅能够仿真模拟、数字电路以及模数混合电路,还能够仿真基于单片机的电子系统。本系统PROTEUS仿真图如图3所示。

6.结论

本方案以AT89C52为控制核心,DS18B20采集温度、LCD12864显示温度和LM3386驱动报警等设计了一款智能温度预报警系统,并通过PROTEUS仿真,得到了很好的效果,证实了本系统具有结构简单、功耗低、智能调节等优点。本系统可以应用于粮仓、工厂、浴室等场合,具有很强的实用价值。

相关问答

proteus 温度传感器 怎么找啊,代号是什么啊?

在PickDevices的Keyword:输入LDR可以找到光敏电阻模型,但你要找的红外传感器模型没有,可以根据红外传感器的特点用别的元件替代进行电路或程序调试在PickDevi...

proteus 怎么搭建 传感器 ?

要搭建传感器,首先需要选择适当的传感器类型,如温度传感器、湿度传感器或光照传感器。然后确定传感器的位置,确保能够准确地捕捉所需的信息。接着将传感器与P...

proteus 红外 传感器 原理?

proteus红外传感器基本原理:红外传感器由惯性质量块和受压的压电片等组成。(观察实验用压电加速度计结构)工作时传感器感受与试件相同频率的振动,质量块便有...

proteus传感器 使用方法?

使用这个软件,第一步是添加元器件,在元器件选择模式下按键盘“p”,就可以调出器件库了。元器件选择完后,就是连线了,用鼠标左键单击一个元器件后连到另一个...

proteus 测距 传感器 怎么找?

要使用Proteus进行测距传感器的模拟,需要先找到相应的模块或元件。以下是一些可能有用的步骤:1.在Proteus的元件库中搜索“距离传感器”,“超声波传感器”或...

proteus 中水位 传感器 怎么找?

在Proteus中查找水位传感器通常需要进行以下步骤:1.打开Proteus软件,并创建一个新的电路设计。2.在电路设计中添加传感器组件,可以搜索“传感器”或者在工...

proteus 噪声 传感器 怎么找?

要找proteus噪声传感器,您可以通过以下方法进行搜索:1.在线商店:访问像淘宝、京东、亚马逊等知名的在线商店,在搜索栏中输入"proteus噪声传感器"进行搜索,...

professional红外 传感器 怎么找?

要找到专业的红外传感器,可以从多个渠道进行寻找。首先可以在专业的传感器供应商或制造商的官方网站上进行搜索,了解他们的产品种类和规格。其次可以在专业的...

proteus 中srf04是什么?

SRF04是一款超声波测距传感器,常用于测量物体与传感器之间的距离。它通过发射超声波脉冲,并通过接收脉冲的反射来计算物体与传感器之间的距离。在Proteus中,SR...

碰撞 传感器 怎么替代?

一般是不可以替代的。1、先找到一些常用的霍尔电流传感器的型号,然后在Proteus里面查找。没有的话,就根据霍尔电流传感器的原理用可变电阻或电流源等代替,不...

展开全部内容