数字温度计实习报告终1.docx
- 文档编号:7184768
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:13
- 大小:148.91KB
数字温度计实习报告终1.docx
《数字温度计实习报告终1.docx》由会员分享,可在线阅读,更多相关《数字温度计实习报告终1.docx(13页珍藏版)》请在冰豆网上搜索。
数字温度计实习报告终1
数字式温度表
摘要:
温度的检测与控制是工业生产过程中比较典型的应用之一,随着传感器在生产和生活中的更加广泛的应用,利用数字温度传感器实现对温度的测试与控制得到更快的开发,随着时代的进步和发展,数字式温度表已经普及到我们生活、工作、科研各个领域。
数显温度表可以准确的判断和测量温度以数字显示,而非指针或水银显示。
故称数字温度计或数字温度表。
此电路是用数字温度传感器DS18B20作感温元件,并利用温度传感器和4位共阳极LED数码管动态扫描来完成温度显示。
关键词数字测温温度传感器数字控制温度计
一实验目的:
1、 掌握电子产品的设计思想及数显温度表的原理和设计方法;
2、 掌握电子产品安装的一般工艺流程;
3、 掌握本电路所用元器件的原理、检测、安装、调试方法及工艺;
4、 掌握各种常用电子安装工具及电子测量仪表、仪器的正确使用;
二系统各模块简介
1.主控制器。
主控制器使用STC89C52RC。
2.显示电路
本设计的显示部分由四位数码管构成,采用的是动态扫描方式。
在多个LED数码管显示时,为了简化电路,通常将所有位的段选线相应地并联在一起,由一个8位的I/O口控制,形成段选线的多路复用。
而各位的共阳极(或共阴极)分别由相应的I/O口线控制,实现各位的分时选通。
3.测温电路(温度传感器)
温度传感器使用DS18B20。
DS18b20温度传感器能直接读出被测温度,并根据实际要求通过简单的编程实现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显示程序延时法等待转换的完成。
(4)计算温度子程序
计算温度子程序将RAM中读取的BCD码转换运算,并进行温度正负值的判定。
(5)显示数据刷新子程序
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高数据显示位为0时,将符号显示位移入下一位。
3.系统调试
系统调试以程序调试为主。
硬件调试比较简单,首先检查短路的焊接是否正确,然后可用万用表测试或通电检测。
软件调试可以先编写程序并进行硬件的正确性检查,然后分别进行主程序,读温度子程序,温度转换命令子程序,计算温度子程序和显示刷新子程序等的编程和测试。
由于DS18B20与STC89C52RC采用串行数据传送,因此对DS18B20进行读或写程序必须严格保证读/写时序;否则将无法读取测量结果。
本程序采用C语言编写,用TKS或KeilC51编译器编程调试。
软件调试到能显示温度值,而且在有温度变化时(例如用手接触)显示温度改变,就基本完成。
本设计重点研究了温度传感器的工作原理和应用。
主要根据数字温度传感器DS18B20的结构特点、工作原理和通信协议设计DS18B20数字温度计,同时结合软件编程实现采集并显示温度的功能。
硬件设计根据STC89C52RC引脚的功能和结构同时结合数字温度传感器DS18B20的引脚结构功能,原理图使用protel99se来绘制。
程序根据数字温度传感器DS18B20的通信协议和时序使用C语言编写。
软件编译用TKS和KeilC51生成程序二进制代码。
电路整体仿真使用proteus软件(加载编译生成的二进制代码)。
本设计要求测温范围-55℃~+125℃,测量误差0.5℃,直读显示。
所以显示电路采用4位共阳LED数码管以动态扫描法实现温度显示,从P1口输出段码,需要上拉,选用8个510Ω电阻。
列扫描用P3.0~P3.3来实现,列驱动用9012三极管。
DS18B20数字温度计的显示电路
4.时钟电路部分
主控制器STC89C52RC工作时需要时钟控制信号。
STC89C52RC内部电路在时钟信号控制下,严格按照时序执行指令工作。
因此,时钟频率直接影响STC89C52RC的速度,时钟电路的质量也直接影响单片机的稳定性。
常用时钟电路有两种方式,一种是内部时钟方式,另一种时外部时钟方式。
本设计采用内部时钟方式。
STC89C52RC内部有一个用于构成振荡器的高增益放大器,该高增益反相放大器的输入端为芯片引脚XTAL1,输出端为引脚XTAL2。
这两个引脚跨接石英晶体和电容,构成自激振荡器。
晶振的频率选择12MHz,因为晶振的频率越高则系统的时钟频率也就越高,STC89C52RC的运行速度就越快。
电容选择30pF左右。
外接内容们有严格的要求,但电容的大小会影响振荡器的频率、稳定性和起振的快慢。
复位引脚RST通过一个施密特触发器与复位电路相连,施密特触发器用来抑制噪声,在每个机器周期的S5P2,施密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。
DS18B20数字温度计的时钟电路
5复位电路
STC8952RC的9引脚是RST复位信号输入端,高电平有效。
当STC8952RC运行时,在此引脚上加持续时间大于2个机器周期(24个时钟振荡周期)的高电平,就可以完成复位操作。
在STC8952RC正常工作时,此引脚应为≦0.5V低电平。
STC8952RC内复位结构如图
复位引脚RST通过一个施密特触发器与复位电路相连,施密特触发器用来抑制噪声,在每个机器周期的S5P2,施密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。
复位电路通常采用上电自动复位和按钮复位两种方式。
本设计采用按钮手动复位方式,电路结构简单,操作方便。
通过RST端经电阻与电源Vcc接通而实现的。
STC89C52RCD的复位电路
主程序的主要功能是负责温度的实时显示,读出并处理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();}
}}
系统调试的目的:
检验设计成果是否成功,是否稳定,是否可靠,能不能达到设计要求。
有关单片机技术的设计不仅要检查硬件电路,而且要实现软件系统仿真,最重要的是软件硬件相结合实现设计功能并稳定可靠。
6硬件调试
首先检查电路的焊接是否正确。
检查单片机各个引脚与显示电路、测温电路、时钟电路和复位电路之间的连接是否正确,连接正确用万用表检测连线是否通路,有没有两条裸线交叉的,检查是否有虚焊的地方。
其次检查各部件是否能正常工作。
(1)判断芯片的好坏:
STC89C52RCD通电后用示波器查看ALE端是否有正脉冲信出。
如果有脉冲信号输出,则STC89C52RCD是好的。
(2)判断数码管是否能正常显示:
用万用表接在数码管的位选端和段码端,一次检查段码a、b、c、d、e、f、g、dp,位选1、2、3、4。
软件调试
由于DS18B20采用串行数据传送,因此对DS18B20进行读或写程序必须严格保证读/写时序;否则将无法读取测量结果。
(1)使用KeilC51建立一个工程文件DS18B20.uv2
(2)为工程选择一个目标芯片(由于KeilC51不包含STC89C52RC而AT89C52和STC89C52RC的指令、管脚及功能通用,所以选择AT89C52,这样并不影响软件仿真。
)
(3)将软件编辑程序加入目标
(4)设置仿真输出,产生.HEX文件
(5)编译程序生成二进制代码文件DS18B20.HEX
仿真
(1)根据硬件设计电路,在Proteus元件库中将所需要的元器件找出。
(2)根据硬件设计电路中各个元件之间的关系,将各个元件连接起来。
(3)检查各个元件的排列、连接和元件的型号、大小
(4)加入“.HEX”文件
(5)启动软件仿真。
四、设计感想
数字式温度表的设计经过了一周的时间,从中我学到了不少的东西,加深了我对专业知识的理解,进一步巩固了所学的知识,理论和实践方面都有了很大的提高,也是对我这学期所学东西的一次肯定。
作品完成的一致性和完整性,是一次非常好的学习机会。
在这次制作过程中,可以说是充满挑战也有惊喜,在充满困惑的同时也多些了解,虽然时间不是很长但过程确实值得回味,每一个细节我都亲历而为,也因此印象深刻。
参考文献
邓元庆贾鹏数字电路与系统设计(第二版)西安电子科技大学出版社
臧春华蒋璇数字系统设计与PLD应用(第三版)电子工业出版社
高吉祥电子技术与课程设计电子科技出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 温度计 实习 告终