数字温度计总结报告Word文档下载推荐.docx
《数字温度计总结报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数字温度计总结报告Word文档下载推荐.docx(20页珍藏版)》请在冰豆网上搜索。
该系统利用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<
reg52.h>
stdio.h>
#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>
y--);
}
voiddelayms(uintxms)//延时
uinti,j;
for(i=xms;
i>
i--)
for(j=10;
j>
j--);
voidwrite_com(ucharcom)//lcd1602写指令
ledrs=0;
P0=com;
delay(5);
leden=1;
leden=0;
voidwrite_date(uchardate)//lcd1602写数据
ledrs=1;
P0=date;
voidinit()//lcd1602初始化
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;
bittempreadbit(void)//ds18b20读字节
bitdat;
i++;
i++;
dat=ds;
i=8;
return(dat);
uchartempread(void)//ds18b20读字
uchari,j,dat;
dat=0;
for(i=1;
i<
=8;
i++)
{
j=tempreadbit();
dat=(j<
<
7)|(dat>
>
1);
}
voidtempwritebyte(uchardat)//ds18b20写字
ucharj;
bittestb;
for(j=1;
j<
j++)
testb=dat&
0x01;
dat=dat>
1;
if(testb)
{
ds=0;
i++;
ds=1;
i=8;
while(i>
}
else
voidtempchange(void)
dsreset();
delay
(1);
tempwritebyte(0xcc);
tempwritebyte(0x44);
//ds18b20温度转换指令
uintget_temp()//ds18b20温度转换
uchara,b;
tempwritebyte(0xbe);
a=tempread();
b=tempread();
temp=b;
temp<
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)|(t<
num2))
warn();
led0=0;
voidkeyscan()//按键扫描
if(key1==0)
delayms
(1);
if(key1==0)
num=num+4;
while(!
key1);
if(key2==0)
num=num-4;
key2);
if(key3==0)
if(key3==0)
num2=num2+4;
key3);
if(key4==0)
num2=num2-4;
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;
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_com(0x89);
write_date(num2/100+0x30);
//温度下限第一位
write_com(0x8a);
write_date(num2%100/10+0x30);
//温度下限第二位
write_com(0x8b);
write_com(0x8c);
write_date(num2%10+0x30);
write_com(0x8d);
write_com(0x8e);
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();
while
(1)
{
tempchange();
keyscan();
deal(get_temp());
display(get_temp());
元器件
个数
STC89C52单片机
1
DS18B20温度传感器
LCD1602液晶显示屏
12MHz晶振
30pF陶瓷电容
2
10μF电解电容
10kΩ电阻
220Ω电阻
轻触开关
4
LED发光二级管
USB电源接口
电源线
导线
若干
2013.12.17
越崎11-1
周梁、向宇、张鹏