水温测量课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
水温测量
摘要:设计一种基于AT89C51单片机的温度测量及报警电路,该电路采用DS18B20作为温度监测元件,测量范围0℃-~+100℃,使用LED模块显示,能设置温度报警上下限。
关键词:温度测量;DS18B20;AT89C51
1. 引言
1.1 问题的提出
随着人们生活水平的提高,对生活环境的要求也越来越高,家用电器越来越趋向于自动控制控制乃至于智能控制,针对目前家庭的实际需要,自动控制水温报警系统比较方便实用,本文通过51系列单片机来实现一种控制水温报警系统的设计。
1.2 设计目的
1. 巩固、加深和扩大单片机应用的知识面,提高综合及灵活运用所学知识解决工业控制的能力。
2. 培养针对课题需要,选择和查阅有关手册、图表及文献资料的自学能力,提高组成系统、编程、调试的动手能力。
3. 通过对课题设计方案的分析、选择、比较、熟悉单片机用系统开发、研制的过程,软硬件设计的方法、内容及步骤。
2. 系统设计与原理
2.1 结构设计与分析[1]
系统基本方框图
1.主控制器
图1:AT89C51单片机部分
单片机A T89C51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要。
2.温度传感器
图2:数字温度传感器DS18B20
温度传感器采用DS18B20温度传感器。DS18B20输出信号全数字化。便于单片机处理及控制,在0—100 摄氏度时,最大线形偏差小于1 摄氏度,采用单总线的数据传输,可直接与计算机连接。
3.报警电路
图3:上下限报警电路
采用两个LED发光二级管,超出设定范围二极管发光。
4.显示电路
图4:LED显示模块
显示电路采用LED液晶显示数码管,从P3口RXD,TXD串口输出段码。显示电路是使用的串口显示,这种显示最大的优点就是使用口资源比较少,只用p3口的RXD,和TXD,串口的发送和接收,四只数码管采用74LS164右移寄存器驱动,显示比较清晰。
3. 设计结果与数据
3.1 单元电路调试
图5:程序调试、编译
图6:LED测试正常图7:温度报警显示正常
3.2 系统联调
1.当温度在正常范围内时,LED显示温度,二极管不发光
2.当温度低于报警下限(40°C)时,LED显示温度,绿色二极管发光。
3.当温度高于报警上限(90°C)时,LED显示温度,红色二极管发光。
4. 结论与心得
4.1 设计结论
4.2 心得
参考文献
[1] 李群芳,张士军,黄建.单片微型计算机与接口技术[M].第三版,北京:电子工业出版社,
2008.5
[2] 胡键.单片机原理及接口技术实践教程[M].第一版,北京:机械工业出版社,2004.8
[3] 彭伟.单片机C语言程序设计实训100例:基于8051+Proteus仿真[M].第一版,北京:电子工
业出版社,2009.6
附件:
完整电路图
程序:
#include
#define uchar unsigned char
#define uint unsigned int
uchar i;
sbit lcdrs=P3^0;
sbit lcdrw=P3^1;
sbit lcden=P3^2;
sbit d1=P1^0;
sbit d2=P1^1;
uchar code t0[]="the temperature ";
uchar code t1[]=" is ";
uchar code wendu[]="0123456789"; //利用一个温度表解决温度显示乱码sbit DQ = P3^7;//定义ds18B20总线IO
//液晶显示模块
void delay(uint z)
{
uint x,y;
for(x=100;x>1;x--)
for(y=z;y>1;y--);
}
void write_com(uchar com) {
lcdrs=0;
P2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date) {
lcdrs=1;
P2=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init_lcd()
{
lcden=0;
lcdrw=0;
write_com(0x38);
write_com(0x01);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
for(i=0;i<16;i++)
{
write_date(t0[i]);
delay(0);
}
write_com(0x80+0x40);
for(i=0;i<16;i++)
{
write_date(t1[i]);
delay(0);
}
}
//温度采集模块
void tmpDelay(int num)//延时函数
{
while(num--) ;
}
/******************************************************************************/ void Init_DS18B20()//初始化ds1820
{
unsigned char x=0;
DQ = 1; //DQ复位
tmpDelay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
tmpDelay(80); //精确延时大于 480us
DQ = 1; //拉高总线
tmpDelay(14);
x=DQ; //稍做延时后如果x=0则初始化成功 x=1则初始化失败
tmpDelay(20);
}
unsigned char ReadOneChar()//读一个字节
{
unsigned char i=0;