多路温度测量系统设计.docx
《多路温度测量系统设计.docx》由会员分享,可在线阅读,更多相关《多路温度测量系统设计.docx(31页珍藏版)》请在冰豆网上搜索。
多路温度测量系统设计
微型计算机原理与接口技术
————设计性实验报告
实验题目:
多路温度测量系统设计
院(系):
电子工程系
班级:
姓名:
学号:
指导教师:
报告页数:
28页
成绩
设计性实验任务及评语
院(系):
电子工程系教研室:
电子信息工程教研室
学号
学生姓名
专业班级
设计(论文)题目
多路温度测量系统设计
设计(论文)任务
设计任务:
设计一个温度测量控制系统,以美国MAXIM/DALLAS半导体公司的单总线温度传感器DS18B20为核心,设计一个结构简单、测温准确、具有一定控制功能的智能温度控制器。
设计要求:
1)单个温度传感器,采用液晶屏幕LCD1602输出测量的温度值,温度显示精度为0.1度。
2)增加温度报警功能,可以通过按键设置一个报警温度,当用DS18B20测得的温度超过预设值,用一个红色的LED灯闪烁报警。
3)增加1个温度传感器,使得1条总线上可以同时读取到2个温度传感器的温度值并将其同时显示在液晶屏幕上,液晶屏幕可以清楚地区分2个温度传感器的温度值。
指导教师评语及成绩
成绩:
指导教师签字:
2011年6月
目录
摘要
一、绪论
1、课题研究的背景和意义
2、设计性实验的主要要求及任务
二、系统方案实现
三、主要硬件介绍
1、DS18B20
2、AT89C51
3、LCD1602
四、软件介绍
1、MedWinV3.0
2、Proteus
五、硬件设置
六、软件设置
1、功能概述
2、系统软件流程图
3、具体程序
七、实验结果
1、电路仿真图
2、功能结果图
八、总结
参考文献
摘要
本文基于DS18B20设计了一种温度数据采集系统,系统主要由单片机电路和一个DS18B20数字传感器构成。
软件方面,我们采用keil软件对程序进行编写以及调试,硬件方面,我们通过Proteus软件对硬件电路进行仿真以及测试,该系统结构简单,功耗较低,测温范围为-55℃~+125℃,通过LCD1602显示所测温度。
同时,可以实现高低温报警,若所测温度超出设定范围,相关器件就会自动报警。
我们也可以通过对按键的处理来调节上下线报警温度。
该系统硬件分为3部分:
DS18B20温度测量模块、单片机模块、PC机与单片机通讯接口电路。
系统的测温精度可以达到±0.5℃,并且能稳定的与单片机和PC机通讯。
Abstract
BasedonDS18B20designedatemperaturedataacquisitionsystem,thesystemmainlybythemicrocontrollercircuitandadigitalsensorDS18B20composition.Software,weusekeilsoftwareprogramwriting,anddebugging,hardware,oursoftwarethroughtheProteushardwaresimulationandtesting,thesystemissimple,lowpowerconsumption,temperaturerange-55℃~125℃,showsthemeasuredtemperaturethroughtheLCD1602.Atthesametime,canachievehighandlowtemperaturealarm,ifthemeasuredtemperatureexceedsthesettingrange,thedevicewillautomaticallyalertrelevant.Wecanalsohandleonthebuttontoadjustthetemperatureonthealarmofftheassemblyline.Thesystemhardwareisdividedintothreeparts:
DS18B20temperaturemeasurementmodule,themicrocontrollermodule,PCmachineswithMCUinterfacecircuit.System,temperaturemeasurementaccuracycanreach±0.5℃,andcanbestablewiththemicrocontrollerandPC-machinecommunication.
关键词:
DS18B20、LCD1602、高低温报警
一、绪论
1、课题研究的背景和意义
在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数。
其中,温度控制也越来越重要。
在工业生产的很多领域中,人们都需要对各类加热炉、热处理炉、反应炉和锅炉中的温度进行检测和控制。
采用单片机对温度进行控制不仅具有控制方便、简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而大大提高产品的质量和数量。
因此,单片机对温度的控制问题是工业生产中经常会遇到的控制问题。
目前应用的温度检测系统大多采用由模拟温度传感器、多路模拟开关、A/D转换器及单片机等组成的传输系统。
这种温度采集系统需要大量的测温电缆,才能把现场传感器的信号送到采集卡上.安装和拆卸繁杂,成本也高。
同时线路上传送的是模拟信号,易受干扰和损耗,测量误差也比较大,不利于控制者根据温度变化及时做出决定。
针对这种情况,本文提出一种采用数字化单总线技术的温度采集系统,并利用Proteus和medwinv3.0软件对设计电路进行综合虚拟仿真,实现了温度实时测量和显示。
2、本设计的主要要求
1.测量温度范围:
-55℃~+125℃;
2.精度:
±0.1℃;
3.超限报警功能;
4.高低温报警温度设定
二、系统方案实现
系统主要由硬件和软件两大部分构成,当接收到系统发出的温度转换命令后,DS18B20开始进行温度转换操作并把转化后的结果放到16位暂存寄存器中的温度寄存器内,然后与系统进行数据通信,系统将温度读出并驱动LED数码管显示。
如果温度值低于设定下限值或高于设定上限值,则自动启动报警装置。
由于DS18B20单总线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。
该系统结构图
图1
三、主要硬件介绍
1、DS18B20
DSl820数字温度计是美国Dallas公司生产的数字温度计,它提供9位(二进制)温度读数,指示器件的温度。
信息经过单线接口送入DSl8B20或从DSl8B20送出,因此从主机CPU到DSl8B20仅需一条线。
DSl820的电源可以由数据线本身提供而不需要外部电源。
因为每一个DSl820在出厂时已经给定了唯一的序号,因此任意多DSl820可以存放在同一条单线总线上。
这允许在许多不同的地方放置温度敏感器件。
DSl820的测量范围从-55到+125,增量值为0.5,可在ls(典型值)内把温度变换成数字。
每一个DSl820包括一个唯一的64位长的序号,该序号值存放在DSl820内部的ROM(只读存贮器)中。
开始8位是产品类型编码(DSl820编码均为10H)。
接着的48位是每个器件唯一的序号,最后8位是前面56位的CRC(循环冗余校验)码。
图2为DS18B20的实物图。
图2
温度/数据关系(表1)
2、AT89C51
AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4kbytes的可反复擦写的只读程序存储器(PEROM)和128bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89C51单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。
ATC9C51实物图如图3。
主要参数如下:
·与MCS-51产品指令系统完全兼容
·4k字节可重擦写Flash闪速存储器
·1000次擦写周期
·全静态操作:
0Hz-24MHz
·三级加密程序存储器
·128×8字节内部RAM
·32个可编程I/O口线
·2个16位定时/计数器
·6个中断源
·可编程串行UART通道
·低功耗空闲和掉电模式
图3
3、LCD1602
由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。
因此,液晶显示器画质高且不会闪烁。
数字式接口液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。
体积小、重量轻液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。
功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。
LCD1602的实物图如图4,主要参数如下:
·显示容量:
16×2个字符
·芯片工作电压:
4.5—5.5V
·工作电流:
2.0mA(5.0V)
·模块最佳工作电压:
5.0V
·字符尺寸:
2.95×4.35(W×H)mm
图4
四、软件介绍
1、medwinv3.0
MedWin是万利电子有限公司Insight®系列仿真开发系统的高性能集成开发环境。
集编辑、编译/汇编、在线及模拟调试为一体,VC风格的用户界面,内嵌自主版权的宏汇编器和连接器,并完全支持Franklin/KeilC扩展OMF格式文件,支持所有变量类型及表达式,配合Insight®系列仿真器,是开发80C51系列单片机的理想开发工具。
2、Proteus
Proteus是英国Labeenterelectronics公司研发的EDA工具软件。
Proteus不仅是模拟电路、数字电路、模/数混合电路的设计与仿真平台,
更是目前世界最先进、最完整的多种型号微控制器系统的设计与仿真平台。
它真正实现了在计算机上完成从原理图设计、电路分析与仿真、单片机代码级调试与仿真、系统测试与功能验证到形成PCB的完整电子设计与研发过程。
Proteus产品系列也包含了革命性的VSM技术,可以对基于微控制器的设计连同所有的外围电子器件一起仿真。
五、硬件设计
系统硬件设计包括温度采集设计、控制电路设计、通信接口电路设计。
采用数字温度芯片DS18B20测量温度,输出信号全数字化。
便于单片机处理及控制,省去传统的测温方法的很多外围电路。
且该芯片的物理化学性很稳定,它能用做工业测温元件,此元件线形较好。
DS18B20的最大特点之一采用了单总线的数据传输,由数字温度计DS18B20和单片机构成的温度测量装置,它直接输出温度的数字信号,可直接与计算机连接。
这样,测温系统的结构就比较简单,体积也不大。
采用51单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便。
该系统利用单片机控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限报警温度。
DS18B20温度传感器的1脚接地,2脚作为信号线,与单片机的P3.3管脚相接;3脚接电源,显示电路采用LCD屏。
六、软件设计
1功能概述
本系统的软件由C语言编写,程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值。
2系统软件流程图
七、实验结果:
1、电路仿真图
2、功能结果图
1、正常显示,LCD显示温度的阈值,同时显示DS18B20所测温度,如下:
DS18B20温度:
LCD显示温度:
LED报警灯不亮:
2、低温报警,LED报警灯亮,如下:
DS18B20温度:
LCD显示温度:
LED报警灯亮:
3、高温报警,高温LED报警灯亮,如下:
DS18B20温度:
LCD显示温度:
LED报警灯亮:
八、总结
经过一周多的设计以及调试,实现实验的部分设计要求,能读出并显示DS18B20采集的温度,并且能够实现高低温报警,能通过对按键的处理来调节高低温报警温度,使得1条总线上可以同时读取到2个温度传感器的温度值并将其同时显示在液晶屏幕上,液晶屏幕可以清楚地区分2个温度传感器的温度值。
我在这为期一周多的设计性实验中,我们在老师的指导下,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和独立思考的能力。
我希望自己能在今后的深入学习中设计出更好的,力求创新,努力地提升自己,寻求更大的进步!
最后用一句话来结束吧。
“实践是检验真理的唯一标准”。
参考文献
1、马建国、孟宪元.电子设计自动化技术基础.清华大学出版,2004
2、姜威.实用电子系统设计基础,2008
3、姜威.单片机系统的PROTEUS设计与仿真,2007
4、张毅坤、陈善久.单片微型计算机原理及应用.西安电子科技大学
出版社,2003
5、李华.MCS—51系列单片机实用接口技术.北京航空航天大学出版
社,2001
6、潭浩强.C语言程序设计.清华大学出版社,2001
附录:
程序
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#definedata1000
sbitLEDCLK=P3^4;
sbitLEDDIN=P2^3;
sbitlcd_en=P2^2;
sbitlcd_rw=P2^3;
sbitlcd_rs=P2^4;
sbitkey0=P1^0;
sbitkey1=P1^1;
sbitled=P1^7;
#definelcd_dateP0
ucharcodelcdtable[]={"0123456789-"};
ucharcodeerror[12]={"nofacility"};
ucharrom_id[3][8]={{0x28,0x56,0x04,0x00,0x00,0x00,0x0,0x9d}
{0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e}};
uchardispbuf[8];
uchardispbuf1[8];
uintdata1=50000;
uchartem1,tem2,temt1,temt2;
uinttemper1;//温度寄存器
uinttemper11;
uinttemper22;
uinttemper2;
uinttempert1;//温度阀值R-min
uinttempert2;//温度阀值R-max
uinttempert11;
uinttempert22;
#defineNOP3()_nop_();_nop_();_nop_()
sbitDQ=P3^2;
bitflag_init;//DS18B20是否存在标志
/**************************************************************
延时函数
*功能:
可随意设置延时时间,延时时间为(tt*9+16)us.晶振为12MHz
***************************************************************/
voiddelay_us(unsignedinttt)
{
while(tt--)
{
;
}
}
/*****************************************************
延时函数
*功能:
可随意设置延时时间,延时时间为ttms.晶振为12MHz
*****************************************************/
voiddelay_ms(unsignedinttms)
{
unsignedchari;
while(tms--)
for(i=123;i>0;i--)
;
}
voidclose_led()
{
uchari;
for(i=8;i>0;i--)
{
LEDCLK=0;
LEDDIN=1;
_nop_();
LEDCLK=1;
_nop_();
}
}
voidWrite_com(ucharcom)
{
lcd_rs=0;
lcd_date=com;
delay_ms
(2);
lcd_en=1;
delay_ms
(2);
lcd_en=0;
}
voidWrite_dat(uchardat)
{
lcd_rs=1;
lcd_date=dat;
delay_ms
(2);
lcd_en=1;
delay_ms
(2);
lcd_en=0;
}
voidlcd_init()
{
lcd_rw=0;
lcd_en=0;
delay_ms(15);
Write_com(0x38);
delay_ms(5);
Write_com(0x38);
delay_ms(5);
Write_com(0x38);//显示模式设置
Write_com(0x08);//显示关闭
Write_com(0X01);//清屏
Write_com(0x06);//显示光标移动设置
Write_com(0X0c);//显示开及光标设置
}
/****DS18B20初始化**************************************/
voidreset()
{
flag_init=1;
EA=0;
DQ=1;
NOP3();
DQ=0;
delay_us(60);//480~960us556
DQ=1;
delay_us(5);//60us
flag_init=DQ;
delay_us(25);//241us
EA=1;
}
/****写一个字节函数*************************************/
voidWrite_Byte(uchardat)
{
uchari;
DQ=1;
EA=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=(bit)(dat&0x01);
delay_us(5);//61us
DQ=1;
dat>>=1;
}
EA=1;
}
/*****读数据函数*****************************/
ucharRead_Byte()
{
uchari,date;
date=0;
DQ=1;
EA=0;//关中断
for(i=8;i>0;i--)
{
DQ=0;
date>>=1;
DQ=1;
NOP3();
if(DQ)
{
date|=0x80;
}
delay_us(5);//61us
}
EA=1;//开中断
return(date);
}
voidmatch_rom(ucharx)
{
uchari;
EA=0;
reset();
Write_Byte(0x55);
for(i=0;i<8;i++)
Write_Byte(rom_id[x][i]);
EA=1;
}
voidget_tem()
{
ucharteml,temh;
reset();
Write_Byte(0xcc);
Write_Byte(0x44);//启动温度转换
delay_ms(800);//750ms
match_rom(0);
Write_Byte(0xbe);//读取温度转换结果
teml=Read_Byte();
temh=Read_Byte();
temper11=(temh*256+teml);
if(temper11&0x8000)
{
temper1=(~temper11+1)*0.625;
tem1=1;
}
else
{
temper1=(temh*256+teml)*0.625;
tem1=0;
}
match_rom
(1);
Write_Byte(0xbe);//读取温度转换结果
teml=Read_Byte();
temh=Read_Byte();
temper22=(temh*256+teml);
if(temper22&0x8000)
{
temper2=(~temper22+1)*0.625;
tem2=1;
}
else
{
temper2=(temh*256+teml)*0.625;
tem2=0;
}
}
update()
{
if(tem1)
{
dispbuf[0]=10;
if(temper1/100)
dispbuf[1]=temper1/100;
else
dispbuf[1]=11;
dispbuf[2]=temper1%100/10;
dispbuf[3]=temper1%10;
}
else
{
if(temper1/1000)
{
dispbuf[0]=temper1/1000;
dispbuf[1]=temper1%1000/100;
}
else
{
dispbuf[0]=11;
if(temper1/100)
dispbuf[1]=temper1/100;
else
dispbuf[1]=11;
}
dispbuf[2]=temper1%100/10;
dispbuf[3]=temper1%10;
}
if(tem2)
{
dispbuf[4]=10;
if(temper2/100)
dispbuf[5]=temper2/100;
else
dispbuf[5]=11;
dispbuf[6]=temper2%100/10;
dispbuf[7]=temper2%10;
}
else
{
if(temper2/1000)
{
dispbuf[4]=temper2/1000;
dispbuf[5]=temper2%1000/100;
}
else
{