proteus温度传感器仿真 DS18B20多点温度采集
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里面查找。没有的话,就根据霍尔电流传感器的原理用可变电阻或电流源等代替,不...