可调温度报警器设计.docx
《可调温度报警器设计.docx》由会员分享,可在线阅读,更多相关《可调温度报警器设计.docx(41页珍藏版)》请在冰豆网上搜索。
可调温度报警器设计
XXX大学XXX学院
综合性实验报告
课程名称:
综合电子设计
实验名称:
可调温度报警器
院系:
电子信息学院
专业:
班级:
组员:
指导老师:
日期:
摘要:
在现代化的工业生产中,需要对周围环境的温度进行检测和控制。
本小组针对温控报警问题展开思考,设计一个能根据需求设置低温到高温进行报警并通过液晶显示的系统。
该系统使用89C51单片机,同时运用单线数字温度传感器DS18B20,LCD1602显示模块等模块可实现温度的检测。
课题经过实验验证达到设计要求,具有一定的使用价值和推广价值。
该作品使用液晶显示,可以清晰地显示当前的报警温度,使使用者使用时不会出错,安全可靠,可使用于各种食品储存室,植物养殖所等地方,使用性很高。
关键字:
温度报警器温度上下限AT89C51单片机液晶LCD1602温度传感器DS18B20
一课程设计任务
1.1功能说明
.完成温度进行测量,理论测量范围-55°C~+125°C;
.将温度测量值通过LCD液晶显示模块显示;
.可以通过按键进行对上下限报警温度,自行设定并实现功能;
二整体设计方案
2.1设计思路
根据功能要求,必须有单片机控制模块,LCD1602显示模块以及DS18B20的温度传感模块。
各个模块都有其自己的功能。
上电后,通过DS18B20可以检测到温度,并在显示器上显示。
声光报警
DS18B20
51
单
片
机
键盘&
显示
采用DS18B20的数字温度计结构框图
2.2整体仿真电路图
图1温度报警器总电路图
2.3模块功能说明
本系统共分为三块模块。
单片机模块,这部分主要实现数据的处理,输出执行,报警设置功能
显示模块可以分别显示实时温度值,温度上下限。
温度传感模块的主要功能是通过DS18B20的强大功能实现对温度的采集及发送到计算机。
图2温度报警器流程图
Yes
Yes
No
No
三硬件电路设计
3.1各模块设计
3.1.1DS18B20简介
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
该装置信号线高的时候,内部电容器储存能量通由1线通信线路给片子供电,而且在低电平期间为片子供电直至下一个高电平的到来重新充电。
DS18B20的电源也可以从外部3V-5.5V的电压得到。
DS18B20采用一线通信接口。
因为一线通信接口,必须在先完成ROM设定,否则记忆和控制功能将无法使用。
主要首先提供以下功能命令之一:
1)读ROM,2)ROM匹配,3)搜索ROM,4)跳过ROM,5)报警检查。
这些指令操作作用在没有一个器件的64位光刻ROM序列号,可以在挂在一线上多个器件选定某一个器件,同时,总线也可以知道总线上挂有有多少,什么样的设备。
若指令成功地使DS18B20完成温度测量,数据存储在DS18B20的存储器。
一个控制功能指挥指示DS18B20的演出测温。
测量结果将被放置在DS18B20内存中,并可以让阅读发出记忆功能的指挥,阅读内容的片上存储器。
温度报警触发器TH和TL都有一字节EEPROM的数据。
如果DS18B20不使用报警检查指令,这些寄存器可作为一般的用户记忆用途。
在片上还载有配置字节以理想的解决温度数字转换。
写TH,TL指令以及配置字节利用一个记忆功能的指令完成。
通过缓存器读寄存器。
所有数据的读,写都是从最低位开始。
采用DALLAS最新单线数字温度传感器DS18B20。
DS18B20“一线总线”数字化温度传感器也支持“一线总线”接口,测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,如:
环境控制、设备或过程控制、测温类消费电子产品等。
DS18B20的特性:
DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。
可选更小的封装方式,更宽的电压适用范围。
分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。
3.1.2单片机89C51简介
89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器。
3.1.3LCD1602液晶简介
采用LCD1602液晶显示模块,有体积小、功耗低、显示内容丰富、超薄轻巧等优点,在袖珍式仪表和低功耗应用系统中得到广泛的应用。
目前字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件。
它可以显示两行,每行16个字符,采用单+5V电源供电,外围电路配置简单,价格便宜,具有很高的性价比。
3.2各模块分析
3.2.1单片机89C51管脚图
注:
引脚说明:
①电源引脚
Vcc(40脚):
典型值+5V。
Vss(20脚):
接低电平。
②外部晶振
X1、X2分别与晶体两端相连接。
当采用外部时钟信号时,X2接振荡信号,X1接地
。
③输入输出口引脚:
P0口:
I/O双向口。
作输入口时,应先软件置“1”。
P1口:
I/O双向口。
作输入口时,应先软件置“1”。
P2口:
I/O双向口。
作输入口时,应先软件置“1”。
P3口:
I/O双向口。
作输入口时,应先软件置“1”。
④控制引脚:
RST/Vpd、ALE/-PROG、-PSEN、-EA/Vpp组成了MSC-51的控制总线。
RST/Vpd(9脚):
复位信号输入端(高电平有效)。
第二功能:
加+5V备用电源,可以实现掉电保护RAM信息不丢失。
ALE/-PROG(30脚):
地址锁存信号输出端。
第二功能:
编程脉冲输入。
-PSEN(29脚):
外部程序存储器读选通信号。
-EA/Vpp(31脚):
外部程序存储器使能端。
第二功能:
编程电压输入端(+21V)。
3.2.2DS18B20引脚及管脚功能介绍
注
DQ:
数字信号输入/输出端。
GND:
电源地端。
VDD:
外接供电电源输入端(在寄生电源接线时此脚应接地)。
3.2.3LCD1602液晶显示介绍
管脚功能
1602采用标准的16脚接口
第1脚:
VSS为电源地
第2脚:
VDD接5V电源正极
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高
第4脚:
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器
第5脚:
RW为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作
第6脚:
E(或EN)端为使能(enable)端
第7~14脚:
D0~D7为8位双向数据端
第15~16脚:
空脚或背灯电源。
15脚背光正极,16脚背光负极
四控制软件设计及电路图
4.1单片机模块电路图及分析
图3单片机接线图
P1接液晶数据口,P0接3个二极管,P2接8个按钮,P3.3接蜂鸣器,P3.4接液晶的RS,P3.5接液晶的R/W,P3.6接液晶的EN,P3.7接温度传感器,其他按单片机最小系统连接。
4.2液晶显示模块电路图及分析
图3液晶接线图
液晶显示模块的子程序:
/*************************lcd1602程序**************************/
voiddelay1ms(unsignedintms)//延时1毫秒(不够精确的)
{unsignedinti,j;
for(i=0;ifor(j=0;j<100;j++);
}
voidwr_com(unsignedcharcom)//写指令//
{delay1ms
(1);
RS=0;
RW=0;
EN=0;
P1=com;
delay1ms
(1);
EN=1;
delay1ms
(1);
EN=0;
}
voidwr_dat(unsignedchardat)//写数据//
{delay1ms
(1);;
RS=1;
RW=0;
EN=0;
P1=dat;
delay1ms
(1);
EN=1;
delay1ms
(1);
EN=0;
}
voidlcd_init()//初始化设置//
{delay1ms(15);
wr_com(0x38);delay1ms(5);
wr_com(0x08);delay1ms(5);
wr_com(0x0e);delay1ms(5);
wr_com(0x06);delay1ms(5);
wr_com(0x01);delay1ms(5);
}
voiddisplay(unsignedchar*p)//显示//
{
while(*p!
='\0')
{
wr_dat(*p);
p++;
delay1ms
(1);
}
}
4.3温度传感器模块电路图及分析
图4温度传感器接线图
温度传感器读取温度以及显示温度的子程序:
/******************************ds1820程序***************************************/
voiddelay_18B20(unsignedinti)//延时1微秒
{
while(i--);
}
voidds1820rst()/*ds1820复位*/
{unsignedcharx=0;
DQ=1;//DQ复位
delay_18B20(4);//延时
DQ=0;//DQ拉低
delay_18B20(100);//精确延时大于480us
DQ=1;//拉高
delay_18B20(40);
}
uchards1820rd()/*读数据*/
{unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
voidds1820wr(ucharwdata)/*写数据*/
{unsignedchari=0;
for(i=8;i>0;i--)
{DQ=0;
DQ=wdata&0x01;
delay_18B20(10);
DQ=1;
wdata>>=1;
}
}
read_temp()/*读取温度值并转换*/
{uchara,b;
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/
voidds1820disp()//温度值显示
{ucharflagdat;
disdata[0]=tvalue/1000+0x30;//百位数
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位
if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:
-
if(disdata[0]==0x30)
{disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}
wr_com(0x89);
wr_dat(flagdat);//显示符号位
wr_com(0x8a);
wr_dat(disdata[0]);//显示百位
wr_com(0x8b);
wr_dat(disdata[1]);//显示十位
wr_com(0x8c);
wr_dat(disdata[2]);//显示个位
wr_com(0x8d);
wr_dat(0x2e);//显示小数点
wr_com(0x8e);
wr_dat(disdata[3]);//显示小数位
}
五系统调试及遇到的问题
开始我们只是做温度报警,因为温度传感器选择的是数字式温度传感器,老师觉得过于简单,所以帮我们也想了很多其他功能。
1.开机复位欢迎词的移动显示
unsignedcharcodestr3[]={"Welcome!
"};
unsignedcharcodestr4[]={"================"};
init_play()//初始化显示
{
wr_com(0x80+0x10);//屏幕外等待
display(str3);
wr_com(0xc0+0x10);
display(str4);
for(num=0;num<16;num++)//屏幕左移
{
wr_com(0x18);
delay1ms(200);
}
2.得到键盘值
ucharGetKey()//读取键值
{
ucharK;
if(P2==0xff)return0;//检查是否有键按下
delay1ms(10);
switch(P2)
{
case0xfe:
K=1;break;
case0xfd:
K=2;break;
case0xfb:
K=3;break;
case0xf7:
K=4;break;
case0xef:
K=5;break;
case0xdf:
K=6;break;
case0xbf:
K=7;break;
case0x7f:
K=8;break;
default:
K=0;
}
while(P2!
=0xff);
Beep();
returnK;
}
3.键盘值处理
voidKeyProcess(ucharKey)//键盘处理
{
uchart=0;
switch(Key)
{
case1:
if((h1
case2:
if((h1
case3:
if((h1
case4:
if((h1
case5:
if((h1
case6:
if((h1
case7:
lcd_init();init_play2();delay1ms(10);break;
}
}
4.按键提示音
voidBeep()//蜂鸣器按键提示音
{
uchari,j=70;
for(i=0;i<200;i++)
{
while(--j);baojing=0;
}
delay1ms(300);
baojing=1;
}
5.温度比较以及处理都直接放在主程序中
voidmain()
{
uchark;
ucharKey;
P2=0xff;
lcd_init();
init_play();//初始化显示
delay1ms(1000);
lcd_init();
init_play2();
while
(1)
{
read_temp();//读取温度
ds1820disp();//显示
Key=GetKey();
if(Key!
=0)
{KeyProcess(Key);
if(Key!
=7)
{lcd_init();init_play1();delay1ms(10);}
}
k=tvalue/10;
if((k
l))//温度比较处理
{led1=1;led2=0;led3=0;baojing=1;}
elseif((k>=h1)&&(k<=h2))
{
while((k>=h1)&&(k<=h2))
{
led1=0;led3=0;
led2=1;baojing=1;
while((k>=h1)&&(k<=h2))
{
read_temp();//读取温度
ds1820disp();//显示
Key=GetKey();
if(Key!
=0)
{KeyProcess(Key);
if(Key!
=7)
{lcd_init();init_play1();delay1ms(10);}
}
k=tvalue/10;
delay1ms(600);
led2=~led2;
baojing=~baojing;
}
}
}
elseif(k>h2)
{led1=0;led2=0;led3=1;baojing=0;}
elseif(k<=l)
{led1=0;led2=0;led3=1;baojing=0;}
}
}
一开始老师给我们加的功能让我们很为难,不知道怎么编所以我们都想推辞掉,不过在编写这些子程序的过程中慢慢的感觉很有趣,反而觉得挺简单的还是,但也会碰到很多问题,比如说显示温度上下限的时候一开始无法显示数字出来的是乱码,重新编写后又变成了日文,后来看了参考书后,最后用了一个0到9的数组,要显示的数字从数组中取得,这样就好了,终于能显示出来了,但是发现它无法记时改变数字,要重新按键才会显示新的上下限温度,后来发现时键盘处理中有点问题,这个我们花了好久才解决的,就是把去掉一个按键处理,把它用if语句独立出来,这样后就能记时改变温度,还有一个问题是我们发现在报警时我们无法改变其温度上下限和其他按键,也就是报警时按键无效了,后来知道了我们的报警程序是用while组成,所以报警时一直在while语句中做循环,按键当然无效,这个的解决办法马上就能想到了,就是在while语句中再加入读取键盘值和键盘值处理的子程序就ok了。
其他别的小问题什么的我们组最后都很好的及时的解决了,这次的设计我们组觉得还是比较成功的,做出了比预期更好的设计来。
六个人小结
6.1组长
从本次综合电子设计课程中,设计的结果基本符合设计的要求,我们也加了一些自己的想法。
基本上算是比较满意的。
在这次的设计的过程中我学到了很多,对很多相关的专业知识有了更深一层的理解,特别的对单片机这块。
这次的设计,很好的将我们上学期学过的单片机进行复习并用于了实践之中,使我能更好的掌握其一般原理。
另外,本次课程设计以小组的形式展开,这样一来不但提高了我们的动手能力,增强了团队合作的意识。
在大学期间,从接触硬件的相关课程开始,就已经对硬件产生了恐惧,不论是课程的学习,还是心中的看法。
知道大三这学期开设了单片机课程,对我的人生观产生了巨大的影响。
由于单片机是我们上学期学的,所以过了寒假过来开始以为特别难,因为一些知识有点忘记了。
后来慢慢也就做下来了,虽然做的不是特别好。
通过一个学期的学习发现《单片机》的确是一门很有用的课程,对今后的学习工作有很大的帮助,因为单片机目前在社会中有在和极其广泛的用途,各个地方都离不开它的。
但是我觉得就我们在课堂上学到的这点知识还是极其有限的,更多的东西还靠我们自己去课下学习。
老师只起到一个引导我们学习的作用,关键还是在于我们自己,这就是所谓的“师傅领进门,修行在个人”吧。
冰冻三尺非一日之寒,滴水穿石非一时之功,谨以此自勉!
在我们三人小组里面,我负责的就是硬件这一块,由于我的焊接技术实在不怎么的,所以焊的很难看,因此还被老师批评工艺难看需改进,后来把硬件改进后的确是自己看的舒服别人也看的舒服。
只有做不到,没有想不到,面对问题,我们不逃避。
只有一步一步的去发现去探索才可以解决问题。
在网上看到关于如何学习单片机的文章,里面说到,学习单片机一方面要提高自身的知识水平和编程能力,同是多看多学别人已经写好的模块也是一种好的方法。
同是,小组里成员一起齐心协力分配好工作后一起努力就能把问题解决,所以合作也是很重要的。
为期一周的单片机课程设计终于结束了,这一个星期真的蛮累的,大家都是忙忙碌碌的,我也不例外,这次实训我被安排到了组长,因为寒假里带回家的面包板调试不出来,所以寒假里没怎么做,这礼拜就有点忙了,但还是感谢学校给我这次学习的机会,让我更加了解到单片机的有趣,和它的无穷魅力。
我给我的其他组员分别安排了工作,他们也积极地配合我一起完成这次的单片机设计,一开始我过了一个寒假有点生疏,想到编程就感觉自己这个不会那个不会的,后来慢慢的看点书慢慢的就开始有感觉了,老师觉得我们的设计太简单,不停地给我们组的设计加功能,一开始觉得挺为难的,不过还是会慢慢做出来,完成老师提的要求,并且也对自己的编程能力也得到了提高,几乎每天对我都有新的挑战,每天都要克服新的困难。
我在组中的工作主要是编程和监制吧,帮助和监督他们焊接和调试还有拟论文等工作,大家学习和工作的都很融洽。
总而言之,单片机课程设计对于我们有很大的帮助,我们从中也受益匪浅。
6.2组员1
在大学期间,从接触硬件的相关课程开始,就已经对硬件产生了恐惧,不论是课程的学习,还是心中的看法。
知道大三这学期开设了单片机