数字温度计实习报告智能0802第一小组.docx
《数字温度计实习报告智能0802第一小组.docx》由会员分享,可在线阅读,更多相关《数字温度计实习报告智能0802第一小组.docx(17页珍藏版)》请在冰点文库上搜索。
数字温度计实习报告智能0802第一小组
题目名称
基于DS18B20的智能数字温度计的设计
主
要
内
容
一设计要求
本设计主要研究由单片机作为主控制器的DS18B20数字温度计的设计制作。
功能要求:
数字式温度计测温,采用LED数码管直读显示。
主要任务是:
硬件系统的总体分析设计与任务实现;要求电路简单,性能稳定。
系统主要由主控制器、测温电路和显示电路组成。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所。
该设计控制器使用单片机STC89C52,温度传感器使用DS18B20,用4位共阳极LED数码管实现温度显示。
二系统各模块简介
1.主控制器。
主控制器使用单片机STC89C52RC。
单片机全称单片微型计算机,又称微控制器或嵌入式控制器。
它具有嵌入式应用系统所要求的的体系结构、微处理器、指令系统、总线方式、管理模式等。
它是将组成微型计算机机所必须的部件(中央处理器CPU、程序存储器(ROM、EPROM、FlashROM)、数据存储器(RAM)、输入/输出(I/O)接口、定时/计数器、串行口、中断系统、系统总线等)集成在一个超大规模集成电路芯片上。
STC89C52RC是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的只读程序存储器(PEROM)和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,与标准MCS-51指令系统及8052产品引脚兼容,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大STC89C52RC单片机适合于许多较为复杂控制应用场合。
2.显示电路
本设计的显示部分由四位数码管构成,采用的是动态扫描方式。
在多个LED数码管显示时,为了简化电路,通常将所有位的段选线相应地并联在一起,由一个8位的I/O口控制,形成段选线的多路复用。
而各位的共阳极(或共阴
极)分别由相应的I/O口线控制,实现各位的分时选通。
3.测温电路(温度传感器)
温度传感器使用DS18B20。
DS18b20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器。
与传统的热敏电阻等测温元件相比较,它能直接读出被测温度,并根据实际要求通过简单的编程实现9~12位的数字直读方式。
DS18B20的性能特点如下:
●独特的单线接口仅需要一个端口引脚进行通信
●多个DS18B20可以并联在唯一的三线上,实现多点组网功能
●不需要外部器件
●可通过数据线供电,电压范围3.0~5.5V
●零待机功耗
●温度以9~12位数字量读出
●用户可定义的非易失性温度报警装置
●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件
●负电压特性,电源极性接反时,温度计不会因发热而烧毁,只是不能正常工作。
三系统原理与设计
1.硬件设计
按照系统设计功能的要求,确定系统由3个模块组成:
主控制器、测温电路及显示电路。
数字温度计电路设计控制器为单片机STC89C52RC,温度传感器为DS18B20,用四位共阳LED数码管以动态扫描法实现温度显示。
STC89C52RC的P1.0~1.7
口接8个510Ω电阻作为缓冲驱动器控制四位数码管的段选,P3.0~P3.3接9012三极管驱动四为数码管。
P3.7接温度传感器DS18B20的DQ端实现与DS18B20通信。
2.软件设计
软件采用模块化的设计思想来实现。
系统程序主要包括:
主程序,读温度子程序,温度转换命令子程序,计算温度子程序和显示数据刷新子程序。
(1)主程序
主程序的主要功能是负责温度的实时显示,读出并处理DS18B20的测量温度值。
温度测量每1s进行一次。
(2)读温度子程序
读温度子程序的主要功能是读出RAM中的9字节。
在读出时必须进行CRC校验,校验有错是不能进行温度数据的改写。
(3)温度转换子程序
温度转换子程序主要是发温度转换开始命令。
当采用12位分辨率时,转换时间约为750ms。
在本程序设计中,采用1s显示程序延时法等待转换的完成。
(3)计算温度子程序
计算温度子程序将RAM中读取的BCD码转换运算,并进行温度正负值的判定。
(4)显示数据刷新子程序
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高数据显示位为0时,将符号显示位移入下一位。
四系统调试
系统调试以程序调试为主。
硬件调试比较简单,首先检查短路的焊接是否正确,然后可用万用表测试或通电检测。
软件调试可以先编写程序并进行硬件的正确性检查,然后分别进行主程序,读温度子程序,温度转换命令子程序,计算温度子程序和显示刷新子程序等的编程和测试。
由于DS18B20与单片机采用串行数据传送,因此对DS18B20进行读或写程序必须严格保证读/写时序;否则将无法读取测量结果。
本程序采用单片机汇编或C语言编写,用TKS或KeilC51编译器编程调试。
软件调试到能显示温度值,而且在有温度变化时(例如用手接触)显示温度改变,就基本完成。
原理及应用
本设计重点研究了温度传感器的工作原理和应用。
主要在单片机技术的基础上根据数字温度传感器DS18B20的结构特点、工作原理和通信协议设计DS18B20数字温度计,同时结合软件编程实现采集并显示温度的功能。
硬件设计根据单片机引脚的功能和结构同时结合数字温度传感器DS18B20的引脚结构功能,原理图使用protel99se来绘制。
程序根据数字温度传感器DS18B20的通信协议和时序使用C语言编写。
软件编译用TKS和KeilC51生成程序二进制代码。
电路整体仿真使用proteus软件(加载编译生成的二进制代码)。
本设计要求测温范围-55℃~+125℃,测量误差0.5℃,直读显示。
所以显示电路采用4位共阳LED数码管以动态扫描法实现温度显示,从P1口输出段码,需要上拉,选用8个510Ω电阻。
列扫描用P3.0~P3.3来实现,列驱动用9012三极管。
图2-1DS18B20数字温度计的显示电路
3.4时钟电路部分
主控制器STC89C52RC工作时需要时钟控制信号。
单片机STC89C52RC内部电路在时钟信号控制下,严格按照时序执行指令工作。
因此,时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机的稳定性。
常用时钟电路有两种方式,一种是内部时钟方式,另一种时外部时钟方式。
本设计采用内部时钟方式。
STC89C52RC内部有一个用于构成振荡器的高增益放大器,该高增益反相放大器的输入端为芯片引脚XTAL1,输出端为引脚XTAL2。
这两个引脚跨接石英晶体和电容,构成自激振荡器。
晶振的频率选择12MHz,因为晶振的频率越高则系统的时钟频率也就越高,单片机的运行速度就越快。
电容选择30pF左右。
外接内容们有严格的要求,但电容的大小会影响振荡器的频率、稳定性和起振的快慢。
图2-2DS18B20数字温度计的时钟电路
3.5复位电路
STC8952RC单片机的9引脚是RST复位信号输入端,高电平有效。
当单片机运行时,在此引脚上加持续时间大于2个机器周期(24个时钟振荡周期)的高电平,就可以完成复位操作。
在单片机正常工作时,此引脚应为≦0.5V低电平。
STC8952RC单片机片内复位结构如图
图3-1STC8952RC单片机片内复位结构图
复位引脚RST通过一个施密特触发器与复位电路相连,施密特触发器用来抑制噪声,在每个机器周期的S5P2,施密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。
复位电路通常采用上电自动复位和按钮复位两种方式。
本设计采用按钮手动复位方式,电路结构简单,操作方便。
通过RST端经电阻与电源Vcc接通而实现的。
图3-2STC89C52RCD单片机的复位电路
主程序的主要功能是负责温度的实时显示,读出并处理DS18B20的测量温度值,其流程图
如下:
主程序如下:
#include"reg51.h"
#include"intrins.h"
#definedisdataP0
#definediscanP2
#defineucharunsignedchar
#defineuintunsignedint
sbitBEEP=P3^6;
sbitDQ=P3^7;//温度输入口
sbitDIN=P0^7;//led小数点控制
uinth;
uinttt;
ucharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
ucharcodedis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//duanma
ucharcodescan_con[4]={0xf7,0xfB,0xFD,0xFE};//列扫描控制字
uchardatatemp_data[2]={0x00,0x00,};//读出温度暂存
uchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据,1个运算暂存用
/****************************延时***************************************/
voiddelay(uintt)
{for(;t>0;t--);}
/*******************************DS复位函数******************************/
ow_reset(void)
{charpresence=1;
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_();
DQ=0;
delay(50);//延时550毫秒
DQ=1;
delay(6);
presence=DQ;
}
delay(45);
presence=~DQ;
}
DQ=1;}
/*****************************DS写命令函数*********************************/
voidwrite_byte(ucharval)//向1-WIRE总线上写一字节
{uchari;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();
DQ=val&0x01;//最低位移出
delay(6);
val=val/2;//右移1位
}
DQ=1;
delay
(1);
}
/*******************************DS读一字节函数****************/
ucharread_byte(void)
{uchari;
ucharvalue=0;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
value>>=1;
DQ=0;
_nop_();_nop_();_nop_();_nop_();
DQ=1;_nop_();_nop_();_nop_();_nop_();
if(DQ)value|=0x80;
delay(6);
}
DQ=1;
return(value);
}
/******************************显示扫描函数******************************/
scan()
{chark;
for(k=0;k<4;k++)//4位LED扫描控制
{
disdata=dis_7[display[k]];
if(k==1){DIN=0;}//当K=1时,P0^7为低电平显示小数点
discan=scan_con[k];//列扫描
delay(30);
discan=0xFF;}}
/******************************读出温度函数******************************/
read_temp()
{uinttemp;
ow_reset();
write_byte(0xcc);
write_byte(0xbe);
temp_data[0]=read_byte();
temp_data[1]=read_byte();
temp=temp_data[1];
temp<<=8;
temp=temp|temp_data[0];
tt=temp*0.0625;
ow_reset();
write_byte(0xcc);
write_byte(0x44);
returntt;}
/********************************计算温度子函数***********************/
work_temp()
{ucharn=0;
if(temp_data[1]>127)
{temp_data[1]=(255-temp_data[1]);
temp_data[0]=(255-temp_data[0]);
n=1;
}//负温度求补码
display[4]=temp_data[0]&0x0f;
display[0]=ditab[display[4]];
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
display[3]=display[4]/100;
display[1]=display[4]%100;
display[2]=display[1]/10;
display[1]=display[1]%10;
if(!
display[3])
{display[3]=0x0a;}
if(!
display[2])
{display[2]=0x0a;}
//最高位为0时不显示
if(n){display[3]=0x0b;}//负温度是最高为显示“-”}
/**********************蜂鸣器程序********************/
voidBee_con()
{uchari;
for(i=10;i>0;i--)
{BEEP=~BEEP;
delay(100);}}
/********************************温度报警子函数***********************/
voidAlarm()
{BEEP=0;
if(tt>=75||tt<15)
{Bee_con();}
elseBEEP=1;}
/*******************************主函数********************************/
main()
{
disdata=0xff;//初始化端口
discan=0xff;
for(h=0;h<4;h++)//开机显示“8888”scan();
{display[h]=8;}
ow_reset();//开机先转换一次
write_byte(0xcc);//skipROM
write_byte(0x44);//发转换命令
for(h=0;h<500;h++)//开机显示“8888”两秒
{scan();}
while
(1)
{read_temp();//读出温度数据
work_temp();//处理温度数据
Alarm();//报警检测
for(h=0;h<500;h++)//显示温度两秒
{scan();}
}}
系统调试的目的:
检验设计成果是否成功,是否稳定,是否可靠,能不能达到设计要求。
有关单片机技术的设计不仅要检查硬件电路,而且要实现软件系统仿真,最重要的是软件硬件相结合实现设计功能并稳定可靠。
硬件调试
首先检查电路的焊接是否正确。
检查单片机各个引脚与显示电路、测温电路、时钟电路和复位电路之间的连接是否正确,连接正确用万用表检测连线是否通路,有没有两条裸线交叉的,检查是否有虚焊的地方。
其次检查各部件是否能正常工作。
(1)判断单片机芯片的好坏:
单片机通电后用示波器查看ALE端是否有正脉冲信号输出。
如果有脉冲信号输出,则单片机是好的。
(2)判断数码管是否能正常显示:
用万用表接在数码管的位选端和段码端,一次检查段码a、b、c、d、e、f、g、dp,位选1、2、3、4。
软件调试由于DS18B20与单片机采用串行数据传送,因此对DS18B20进行读或写程序必须严格保证读/写时序;否则将无法读取测量结果。
本程序采用C语言编写,用KeilC51编译器编程调试。
(1)使用KeilC51建立一个工程文件DS18B20.uv2
(2)为工程选择一个目标芯片(由于KeilC51不包含STC89C52RC而AT89C52和STC89C52RC的指令、管脚及功能通用,所以选择AT89C52,这样并不影响软件仿真。
)
(3)将软件编辑程序加入目标
(4)设置仿真输出,产生.HEX文件
(5)编译程序生成二进制代码文件DS18B20.HEX
仿真
(1)根据硬件设计电路,在Proteus元件库中将所需要的元器件找出。
(2)根据硬件设计电路中各个元件之间的关系,将各个元件连接起来。
(3)检查各个元件的排列、连接和元件的型号、大小
(4)加入“.HEX”文件
(5)启动软件仿真。
仿真效果:
(1)启动仿真后瞬间显示85℃如图5-5