数字温度计总结报告.docx
《数字温度计总结报告.docx》由会员分享,可在线阅读,更多相关《数字温度计总结报告.docx(20页珍藏版)》请在冰豆网上搜索。
![数字温度计总结报告.docx](https://file1.bdocx.com/fileroot1/2023-1/24/3cc9e954-ffb4-4a63-bfaa-d3b97af9b1eb/3cc9e954-ffb4-4a63-bfaa-d3b97af9b1eb1.gif)
数字温度计总结报告
电子技术综合设计
选题名称:
数字温度计的设计
组员:
周梁学号:
09114043
向宇学号:
09113839
张鹏学号:
02110545
班级:
孙越崎学院11级1班
指导老师:
许燕青
成绩:
课题名称:
数字温度计
一、设计内容及性能指标
●测量环境温度,采用接触式温度传感器测量,用数码管显示温度值
●利用温度传感器(DS18B20)测量某一点环境温度
●测量范围为0℃~101℃,精度为±0.4℃
●用数码显示屏进行实际温度值显示
●能够根据需要方便设定上下限报警温度
二、方案设计梗概
(一)方案选择
由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到
A/D转换电路,感温电路比较麻烦。
进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。
采用数字温度芯片DS18B20测量温度,输出信号全数字化。
便于单片机处理及控制,省去传统的测温方法的很多外围电路。
且该芯片的物理化学性很稳定,它能用做工业测温元件,此元件线形较好。
在0—100摄氏度时,最大线形偏差小于1摄氏度。
DS18B20的最大特点之一采用了单总线的数据传输,由数字温度计DS18B20和微控制器AT89S51构成的温度测量装置,它直接输出温度的数字信号,可直接与计算机连接。
这样,测温系统的结构就比较简单,体积也不大。
采用51单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便。
既可以单独对多DS18B20控制工作,还可以与PC机通信上传数据,另外AT89S51在工业控制上也有着广泛的应用,编程技术及外围功能电路的配合使用都很成熟。
该系统利用AT89S51芯片控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限报警温度。
工作原理框图如下:
(二)系统框图
该系统可分为以下七个模块:
1、控制器:
采用单片机AT89S51对采集的温度数据进行处理;
2、温度采集:
采用DS18B20直接向控制器传输12位二进制数据;
3、温度显示:
采用了lcd显示屏显示实际温度值;
4、门限设置:
主要实现模式切换及上下门限温度的调节;
5、报警装置:
采用发光二极管进行报警,低于低门限或高于高门限均使其发光;
6、复位电路:
对整个系统进行复位;
7、时钟振荡模块:
为整个系统提供统一的时钟周期。
(三)系统程序设计
系统程序的设计主要包括C程序主函数,DS18B20复位函数,DS18B20写字节函数,DS18B20读字节函数,温度计算转换函数和显示函数等。
具体程序将在实验中编译调试。
三、实验具体设计
(1)主控模块:
STC89C52中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。
这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器,振荡电路参见下图。
而且EA需要接高电平以使CPU访问单片机内部程序。
电路图如图所示:
(2)温度传感器电路:
VCC接高电平,DQ端接单片机的P2.4口,单片机从DS18B20读取温度和报警温度,此时作为输入口,当设置报警温度时单片机向DS18B20内部存储器写入数据,此时作为数据输出端口。
DQ与VCC之间需要一个电阻值约为5KΩ的上拉电阻。
电路图如图所示:
(3)报警与控制电路:
报警电路中使用P1.0-P1.3作为控制按键输入端口,P1.0和P1.1对应的按键作为最高温度的上升和下降设置,P1.2和P1.3对应的按键作为最低温度的上升和下降设置。
P2.3作为报警指示灯端口,当指示灯对应的端口为高电平时就会报警。
电路图如图所示:
(4)显示电路:
在液晶显示电路的设计中选择具有单向输出数据功能的P0端口向液晶显示模块提供数据,P2.0、P2.1、P2.2口作为控制液晶显示模块的端口,在PO口上需要外加上拉电阻,才可以使液晶显示模块正常显示。
上拉电阻我们用的是10K的排阻,由于程序中没有涉及到RW,所以将RW端接地。
电路图如图所示:
最终设计图:
程序设计方面
程序设计分为四部分:
分别为主程序,液晶显示子程序,温度检测程序,报警设置程序。
(1)主程序设计:
主程序的作用是调用3个子程序,分别为温度测试及处理子程序,报警子程序,液晶显示子程序。
主程序流程图如下图所示:
(2)温度检测子程序设计:
DS18B20在单片机控制下分三个阶段:
DS18B20初始化、读DS18B20时序、写DS18B20时序。
其中读DS18B20时序(左)、写DS18B20时序(右)的流程图如下图所示:
(3)液晶显示子程序设计:
液晶显示程序分为显示字符子程序和指定LCD位置写入子程序,液晶显示程序的作用是向液晶显示送数,控制系统的显示部分。
LCD显示有两种:
显示字符(左)和指定LCD位置显示(右)。
程序流程图分别如下图:
(4)报警设置子程序设计:
通过按键设置上限报警温度和下限报警温度,当实际温度超过设置温度范围时,进行报警。
报警设置流程图如下:
系统调试方面
调试目的:
使单片机程序C语言源代码能够正常运行。
当程序无错误时,如下图,就可以将程序下载到单片机进行实物调试。
调试的结果:
经调试液晶显示的结果与预设相同,显示出了精确到十分位的实时温度。
系统功能方面
系统能够通过DS18B20测量温度,并将实时温度显示到液晶屏,精确到十分位。
且能动态响应,当温度改变时数码管温度示值能立即改变,显示相应的温度值。
通过四个按键能分别设置测量温度的最高值和最低值,并且每次上升或下降0.4℃,达到要求。
当温度超过测温范围时,LED灯闪光,达到报警要求。
四、实验成果实物展示
五、实验小结
经过一个月的电子综合设计,我们终于将数字温度计做好了,虽然我们的温度计功能简单,但我们还是花了好大的劲才将实物完完全全做好,这其中的酸甜苦辣值得我们回味。
由于是初次尝试电子设计,起初我们没有任何头绪,不知道应该干啥,于是上网查了查关于数字温度计的设计报告,了解了DS18B20温度传感器的工作原理,以及关于温度计设计的总体硬件电路,然后就迫不及待的去整理元件清单,想去万虹桥电子市场买电子元器件,但去了好几次每次都没买全回来,因为我们并没有自己事先设计好我们的温度计电路,只是根据网上找的几份资料综合一下就草率的定好了清单。
不过所幸,期间过程挺快乐的。
设计电路的时候,我们打算用protues软件,我在网上找到教学视频,学会了软件的使用方法,最后终于画好了雏形,于是开始进行艰难的程序设计。
刚开始我们打算用汇编的,因为单片机刚学完,学的就是汇编,上网找了几个程序,还好大部分还是能看懂的,不过找的几个都不完全符合要求,后来我们从视频里学会了使用Keil软件编写程序。
根据网上找的几个程序编写,不懂得就看书,上网查,请教朋友。
慢慢的感觉上来了,感觉程序变得越来越来简单了,电路跟着程序的改变也在改变,起初我们用四位数码管来显示温度,后来发现LCD1602的显示更方便,更有效,再后来又加了按键控制温度上下限程序。
就这样改来改去,最后程序正确,仿真成功。
我们想着仿真成功,焊接要小心谨慎一定能做出来的。
焊接时,起初也是没有经验,我们试过几次都没有成功,总结一下原因发现首先是元件的放置不合理,导致导线连接很乱,很难检查电路。
在大概十四周的一个周末我们又花时间做了一下硬件方面的,尽管线路依然没有整理好,但欣喜的是实验结果出来了。
但在交实验成果的前一周,可能是导线的某处连接出现了问题,介于时间问题,我们只能把一个不成功的作品提交上去。
经过这次电子设计综合实验,我们真的学到了好多书本之外的知识,以及动手实践的能力,这是以后必须培养的,还有大家在一起学习的团结协作能力。
关于单片机的使用应用方面有了更深的认识,虽然现在技术科技在发展,我们有更先进的生产技术,但有些基础的一定要扎实掌握。
这次经历很深刻,让人进步,受益良多。
六、附录程序及元器件清单
C语言:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitleden=P2^2;
sbitledrs=P2^0;
sbitds=P2^4;
sbitkey1=P1^0;//按一下,温度上限加1
sbitkey2=P1^1;//按一下,温度上限减1
sbitkey3=P1^2;//按一下,温度下限加1
sbitkey4=P1^3;//按一下,温度下限减1
sbitled0=P2^3;
uinttemp;
floatf_temp;
ucharTFLAG;
uintnum=520;//温度上限
uintnum2=255;//温度下限
unsignedchardisdata[4];
voiddelay(uintz)//延时
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddelayms(uintxms)//延时
{
uinti,j;
for(i=xms;i>0;i--)
for(j=10;j>0;j--);
}
voidwrite_com(ucharcom)//lcd1602写指令
{
ledrs=0;
P0=com;
delay(5);
leden=1;
delay(5);
leden=0;
}
voidwrite_date(uchardate)//lcd1602写数据
{
ledrs=1;
P0=date;
delay(5);
leden=1;
delay(5);
leden=0;
}
voidinit()//lcd1602初始化
{
leden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
voiddsreset(void)//ds18b20初始化
{
uinti;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bittempreadbit(void)//ds18b20读字节
{
uinti;
bitdat;
ds=0;i++;
ds=1;i++;
i++;
dat=ds;
i=8;
while(i>0)i--;
return(dat);
}
uchartempread(void)//ds18b20读字
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
voidtempwritebyte(uchardat)//ds18b20写字
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0;
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
voidtempchange(void)
{
dsreset();
delay
(1);
tempwritebyte(0xcc);
tempwritebyte(0x44);//ds18b20温度转换指令
}
uintget_temp()//ds18b20温度转换
{
uchara,b;
dsreset();
delay
(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread();
b=tempread();
temp=b;
temp<<=8;
temp=temp|a;
if(temp<0x0800)
{
f_temp=temp*0.0625;
TFLAG=0;
}
else
{
f_temp=(~temp)+1;
f_temp=f_temp*0.0625;
TFLAG=1;
}
temp=f_temp*10;
returntemp;
}
voidwarn()//闪烁报警
{
led0=1;delay(100);led0=0;
}
voiddeal(uintt)//数据处理
{
if((t>num)|(twarn();
else
led0=0;
}
voidkeyscan()//按键扫描
{
if(key1==0)
{
delayms
(1);
if(key1==0)
{
num=num+4;
while(!
key1);
}
}
if(key2==0)
{
delayms
(1);
if(key2==0)
{
num=num-4;
while(!
key2);
}
}
if(key3==0)
{
delayms
(1);
if(key3==0)
{
num2=num2+4;
while(!
key3);
}
}
if(key4==0)
{
delayms
(1);
if(key4==0)
{
num2=num2-4;
while(!
key4);
}
}
}
voiddisplay(uintj)//显示
{
ucharFLAGDAT;
disdata[0]=j/1000+0x30;
disdata[1]=j%1000/100+0x30;
disdata[2]=j%100/10+0x30;
disdata[3]=j%10+0x30;
if(TFLAG==0)
FLAGDAT=0x20;
else
FLAGDAT=0x2d;
if(disdata[0]==0x30)
{
disdata[0]=0x20;
if(disdata[1]==0x30)
{disdata[1]=0x20;}
}
write_com(0x80);
write_date(num/100+0x30);//温度上限第一位
write_com(0x81);
write_date(num%100/10+0x30);//温度上限第二位
write_com(0x82);
write_date(0x2e);//小数点
write_com(0x83);
write_date(num%10+0x30);//小数位
write_com(0x84);
write_date(0xdf);
write_com(0x85);
write_date(0x43);
write_com(0x86);
write_date(0x3e);//<
write_com(0x87);
write_date(0x54);//t
write_com(0x88);
write_date(0x3e);//<
write_com(0x89);
write_date(num2/100+0x30);//温度下限第一位
write_com(0x8a);
write_date(num2%100/10+0x30);//温度下限第二位
write_com(0x8b);
write_date(0x2e);
write_com(0x8c);
write_date(num2%10+0x30);
write_com(0x8d);
write_date(0xdf);
write_com(0x8e);
write_date(0x43);
write_com(0x40+0x80);
write_date(0x54);//T
write_com(0x40+0x81);
write_date(0x45);//E
write_com(0x40+0x82);
write_date(0x4d);//M
write_com(0x40+0x83);
write_date(0x50);//P
write_com(0x40+0x84);
write_date(0x3a);//:
write_com(0x40+0x85);
write_date(FLAGDAT);//温度大于零不显示,温度小于零显示负号-
write_com(0x40+0x86);
write_date(disdata[0]);//温度第一位
write_com(0x40+0x87);
write_date(disdata[1]);//温度第二位
write_com(0x40+0x88);
write_date(disdata[2]);//温度第三位
write_com(0x40+0x89);
write_date(0x2E);//小数点
write_com(0x40+0x8a);
write_date(disdata[3]);//温度第四位
write_com(0x40+0x8b);
write_date(0xdf);//摄氏度
write_com(0x40+0x8c);
write_date(0x43);//
}
voidmain()//主程序
{
init();
dsreset();
while
(1)
{
tempchange();
keyscan();
deal(get_temp());
display(get_temp());
}
}
元器件
个数
STC89C52单片机
1
DS18B20温度传感器
1
LCD1602液晶显示屏
1
12MHz晶振
1
30pF陶瓷电容
2
10μF电解电容
1
10kΩ电阻
1
220Ω电阻
2
轻触开关
4
LED发光二级管
2
USB电源接口
1
电源线
1
导线
若干
2013.12.17
越崎11-1
周梁、向宇、张鹏