数字显示温度计.docx
《数字显示温度计.docx》由会员分享,可在线阅读,更多相关《数字显示温度计.docx(35页珍藏版)》请在冰豆网上搜索。
数字显示温度计
目录
1系统简介2
1.1系统整体功能说明2
1.2方案论证2
1.3基本设计任务2
1.4发挥设计任务2
1.5电路特点3
2电路设计3
2.1总体方框图3
3各主要电路及部件工作原理3
3.1数字显示电路3
3.2计数器实现电压步进增减4
3.3D/A转化电路设计5
3.4调整输出部分7
4原理总图9
5元器件清单9
6调试过程及测试数据10
6.1通电前检查10
6.2通电检查10
6.2.1按钮开关的检查10
6.2.2数字显示单元电路的调试10
6.2.3计数器的调试10
6.2.4二极管、发光二极管及三极管的调试10
6.3结果分析11
7系统使用说明11
8设计体会及今后的改进意见11
8.1体会11
8.2本方案特点及存在的问题12
8.3改进意见12
参考文献13
1系统简介
温度测量在生产和生活中的作用是显而易见的。
如在一些生产现场,需要实时测量和监控温度;一些石化企业中,根据不同的温度可以分离出汽油、柴油、煤油等产品;日常生活中,需要根据气温加减衣物,如此等等。
为了实现简单方便且实用的目的,本设计采用了最常用的温度传感器DS18B20作为温度采集工具,发光二极管来模拟声光报警器,同时用蜂鸣器报警。
软件是采用C语言编程。
1.1系统整体功能说明
本系统由单片机最小系统作为主控电路,STC89C52芯片作为主控芯片,电路分为MCU单元,数码显示单元,串行口电路,报警电路等等。
系统中,单片机控制两个DS18B20分别采集两点的温度,并送往数码管分时轮流显示,两个显示时间间隔为两秒(间隔时间可做调整),在此过程中,若有某个DS18B20测得温度超出设定的安全温度,则会立即锁定显示这个DS18B20的温度值,同时这个DS18B20指向的发光二极管亮(模拟声光报警器),直到温度正常。
这样设计的目的在于,即使在人到不了的地方,也可以实时监控多点温度,用声音和光同时发出提示信号,且通过不同测量点对应相应的发光二极管来让工作人员知道哪个测量点温度超出既定的温度限。
另外该系统亦适用于其它用于测量和监控温度的场合。
1.2方案论证
方案一:
设计一个测温电路,包括温度传感器,温度变送器,A/D转换电路。
具体流程为温度传感器测量温度信号,经过温度变送器变换为电流信号,再通过A/D转换器转换为数字信号进入单片机进行处理,再在数码管上显示。
采用热电偶温差电路测温,温度检测部分可以使用低温热偶,热电偶由两个焊接在一起的异金属导线所组成(热电偶的构成如图2.1),热电偶产生的热电势由两种金属的接触电势和单一导体的温差电势组成。
通过将参考结点保持在已知温度并测量该电压,便可推断出检测结点的温度。
数据采集部分则使用带有A/D通道的单片机,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来。
热电偶的优点是工作温度范围非常宽,且体积小,但是它们也存在着输出电压小、容易遭受来自导线环路的噪声影响以及漂移较高的缺点,并且这种设计需要用到A/D转换电路,感温电路比较麻烦。
图2.1热电偶电路图
方案二:
温度测量上使用集成芯片DS18B20,由于DS18B20内部已实现模数转换,可实现温度测量并输出数字信号,由单片机接收。
该系统利用AT89S51芯片控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限报警温度。
同时该方案具有很强的扩展性,可以方便地实现多点测量,已得到准确和科学的实验结果。
综上所述,决定采用方案二进行课程设计。
1.3基本设计任务
系统硬件设计:
根据任务要求,完成单片机系统设计;
系统软件设计:
根据温度测量及显示功能要求,完成程序编写及调试;
系统功能要求:
至少利用3位数码管进行测量值的显示;温度测量范围:
-50℃~100℃;测量误差≤0.5℃;
1.4发挥设计任务
根据实际情况自由添加附加功能,如设置温度的上下限报警功能,利用语音或声光报警、多点温度测量等。
1.5电路特点
由单片机最小系统作为主控电路,STC89C52芯片作为主控芯片,电路分为MCU单元,数码显示单元,串行口电路,键盘电路,报警电路,EEPROM电路,DS18B20以及电源电路。
2电路设计
2.1总体方框图
图2-1总体方框图
3各主要电路及部件工作原理
3.1单片机主控电路
图3-1单片机主控电路
图3-1-1SST89E51各引脚
SST89E51各引脚功能:
BI:
4脚是消隐控制端,当BI=0时,不管其他输出状态是怎么样的,七段数码管都会处于消隐也就是不显示的状态。
LE:
锁存控制端,当LE=0时,允许译码输出。
LE=1时译码器是锁存保持状态,译码器输出被保持在LE=0时的数值。
LT:
3脚是测试信号的输入端,当BI=1,LT=0时,译码输出全为1,不管输入DCBA状态如何,七段均发亮全部显示。
它主要用来检测数7段数码管是否有物理损坏。
A1,A2,A3,A4为8421BCD码输入端。
a、b、c、d、e、f、g:
为译码输出端,输出为高电平1有效。
由各个脚的功能便可设计出数码显示电路
3.2数码显示单元电路
图3-2数码显示单元电路
P1口控制四个数码管的段选,P0.0,P0.1,P0.2,P0.3控制四个数码管的位选,采用数码管动态扫描:
动态扫描就是每个数码管逐个的点亮,再熄灭。
循环进行该过程。
一次扫描的周期够短,人眼看起来就像是同时亮起来的。
例如想显示123这个数字:
1,让第一个数码管显示1,其它的熄灭
2,数码管全灭
3,让第二个数码管显示2,其它的熄灭
4,数码管全灭
5,让第三个数码管显示3,其它的熄灭
6,数码管全灭
最后,让这六个步骤循环进行,快速的扫描。
3.3电源电路
图3-3电源电路
图3-3-1max232各引脚
Max232各引脚功能:
1载波检测DCD
2接收数据RXD
3发送数据TXD
4数据终端准备好DTR
5信号地SG
6数据准备好DSR
7请求发送RTS
8清除发送CTS
9振铃提示RI
3.4报警电路
单片机的P0.4口控制蜂鸣器,程序控制P0.4为底时,三极管PN结导通,蜂鸣器响;P0.4为高时,三极管PN结截止,蜂鸣器不再响。
图3-5报警电
3.6EEPROM电路
图3-6EEPROM电路
3.7温度采集电路
图3-7温度采集电路
DS18B20简介:
编程流程为:
初始化
ROM操作命令
存储器操作命令
执行/数据
1,主要特点
1.1、适应电压范围更宽,电压范围:
3.0~5.5V,在寄生电源方式下可由数据线供电
1.2、独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯
1.3、DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温
1.4、DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内
1.5、温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃
1.6、可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温
1.7、在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快
1.8、测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力
1.9、负压特性:
电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
2、DS18B20的外形和内部结构
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
2、DS18B20的外形及管脚排列如下图1:
3、DS18B20引脚定义:
(1)DQ为数字信号输入/输出端;
(2)GND为电源地;
(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
4、DS18B20工作原理
DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。
低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。
高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。
计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
图3中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
4原理总图
图4-1-1多功能数字温度计工作原理图
图4-1-2多功能数字温度计PCB图
5源程序(所有程序经调试)
//==================================================================
//文件名称:
DS18B20
//功能说明:
第一,二个DS18B20测试温度数据并通过LED轮流显示,如有某个超出安//温度范围,则锁定显示且报警,同时,用这个被锁定的温度传感器所指向的发光二极管,//模拟声光报警器——点亮。
DS18B20子程序采用的是12位的转换,获得了11位精度的//温度数据,显示正负温度。
但是在显示中,由于LED位数的限制,考虑数据的有效性,//取了四位温度数据
//硬件描述:
//资源说明:
11.0592M晶体
//创建日期:
2012-03-03
//软件版本:
v1.0
//==================================================================
#include
#defineucharunsignedchar
#defineuintunsignedint
//=======================变量定义==================================
externuchardataLedDispBuff[];
externuchardataIntgerM;
externuchardataIntgerL;
externuchardataDecimalH;
externuchardataDecimalMH;
externuchardataIntgerM02;
externuchardataIntgerL02;
externuchardataDecimalH02;
externuchardataDecimalMH02;
externuchardatam;
externuchardatan;
externbitbdataflag;
//=======================调用函数===================================
voidMnLed(void);
voidMnDS18B20(void);
voidMnDS18B2002(void);
voidMnApp(void);
voidMnApp02(void);
//==================================================================
//函数名:
main()
//功能描述:
LED动态扫描主循环
//输入参数:
无
//输出参数:
无
//设计者:
//创建日期:
//==================================================================
voidmain(void)
{
while
(1)
{
n=10;
m=10;
while(n--)
{
MnLed();
MnDS18B20();
MnApp();
}
while(m--)
{
MnLed();
MnDS18B2002();
MnApp02();
}
}
}
//==================================================================
//函数名:
MnApp()
//功能描述:
LED数码管显示内容修改函数
//输入参数:
i,j,m,n
//输出参数:
无
//设计者:
//创建日期:
//==================================================================
voidMnApp(void)
{
LedDispBuff[0]=IntgerM;
LedDispBuff[1]=IntgerL;
LedDispBuff[2]=DecimalH;
LedDispBuff[3]=DecimalMH;
}
voidMnApp02(void)
{
LedDispBuff[0]=IntgerM02;
LedDispBuff[1]=IntgerL02;
LedDispBuff[2]=DecimalH02;
LedDispBuff[3]=DecimalMH02;
}
//==================================================================
//文件名称:
(FILE7)第一个DS18B20驱动文件
//功能说明:
读出温度数据,并转换为BCD码。
//本驱动只针对单总线上挂一只DS18B20的情况。
//硬件描述:
数据口P3^4,上拉4.7K电阻,未采用寄生电源供电
//使用晶体:
11.0592M晶体
//创建日期:
2012-03-03
//软件版本:
v1.0
//==================================================================
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
//=====================常量=========================================
#defineSkipROM0xcc//跳过ROM指令
#defineTempCvt0x44//温度转化命令
#defineReadTemp0xbe//读温度命令
sbitDQ18B2002=P2^7;//数据口
//=====================变量=========================================
uintdataTempReg02;//温度值
bitbdataNPflag02;//正负标志
uchardataIntgerH02;//BCD码表示
uchardataIntgerM02;
uchardataIntgerL02;
uchardataDecimalH02;
uchardataDecimalMH02;
uchardataDecimalML02;
uchardataDecimalL02;
externbitbdataflag;//小数部分转换表
uintcodeTempTab02[]={0x0000,0x0625,0x1250,0x1875,
0x2500,0x3125,0x3750,0x4375,
0x5000,0x5625,0x6250,0x6875,
0x7500,0x8125,0x8750,0x9375
};
//==================================================================
//函数名:
_nNOP_()
//功能描述:
短延时函数
//输入参数:
i
//输出参数:
无
//设计者:
//创建日期:
2012-03-03
//==================================================================
//==================================================================
//函数名:
_nNOP_()
//功能描述:
短延时函数
//输入参数:
i
//输出参数:
无
//设计者:
//创建日期:
2012-03-03
//==================================================================
void_nNO_(uinti)
{
for(;i>0;i--)
{
_nop_();
}
}
//==================================================================
//函数名:
Init18B20()
//功能描述:
18B20初始化函数
//输入参数:
无
//输出参数:
Init18B20()
//设计者:
//创建日期:
2012-03-03
//==================================================================
bitInit18B2002(void)
{
DQ18B2002=0;//数据线拉低
_nNO_(500);//延时480us
DQ18B2002=1;//数据线拉高
_nNO_(7);//延时25us
if(DQ18B2002==1)
{
DQ18B2002=1;//数据线拉高
return(0);//初始化失败返回0
}
else
{
_nNO_(240);//延时240us
DQ18B2002=1;//数据线拉高
return
(1);//初始化成功返回1
}
}
//==================================================================
//函数名:
Write18B20()
//功能描述:
18B20写数据函数
//输入参数:
Data
//输出参数:
无
//设计者:
//创建日期:
2012-03-03
//==================================================================
voidWrite18B2002(ucharData)
{
uchardatai;
for(i=8;i>0;i--)
{
DQ18B2002=0;
DQ18B2002=Data&0x01;
_nNO_(10);
DQ18B2002=1;
Data>>=1;
}
}
//==================================================================
//函数名:
Read18B20()
//功能描述:
读18B20两字节数据函数
//输入参数:
无
//输出参数:
TempReg[]
//设计者:
//创建日期:
2012-03-03
//==================================================================
ucharRead18B2002(void)
{
uchardatai=0;
uchardataData=0;
for(i=8;i>0;i--)
{
DQ18B2002=0;//给脉冲信号
Data>>=1;
DQ18B2002=1;//给脉冲信号
if(DQ18B2002)
Data|=0x80;
_nNO_(10);
}
return(Data);
}
//==================================================================
//函数名:
GetTemp()
//功能描述:
得到温度数据函数
//输入参数:
无
//输出参数:
//设计者:
//创建日期:
2012-03-03
//==================================================================
voidGetTemp02(void)
{
uchardataTempL02,TempH02;
if(Init18B2002()==0);//初始化不成功则继续初始化
Write18B2002(SkipROM);//发出跳过ROM指令
Write18B2002(TempCvt);//发出温度转化命令
_nNO_(800);//延时800us
if(Init18B2002()==0);//初始化不成功则继续初始化
Write18B2002(SkipROM);//发出跳过ROM指令
Write18B2002(ReadTemp);//发出读温度命令
TempL02=Read18B2002();//调用读程序,读出两字节
TempH02=Read18B2002();
TempReg02=TempH02;
TempReg02=TempReg02<<8;
TempReg02=TempReg02|TempL02;
if((TempReg02&0x800)!
=0x800)
NPflag02=0;