基于单片机的数字温度计的设计课程设计报告
基于单片机的数字温度计的设计课程设计报告本文简介:单片机原理及系统课程设计报告单片机原理及系统课程设计评语:考勤(10)守纪(10)过程(40)设计报告(30)答辩(10)总成绩(100)专业:xxxxxxx班级:xxxxxx姓名:xxxxx学号:xxxxxxx指导教师:xxxxxxxXxxxxxxxxxxxxxxxxxxxxxxx2013年3月7
基于单片机的数字温度计的设计课程设计报告本文内容:
单片机原理及系统课程设计报告
单片机原理及系统课程设计
评语:
考勤(10)
守纪(10)
过程(40)
设计报告(30)
答辩(10)
总成绩(100)
专
业:xxxxxxx
班
级:
xxxxxx
姓
名:
xxxxx
学
号:
xxxxxxx
指导教师:
xxxxxxx
Xxxxxxxxxxxxxxxxxxxxxxxx
2013
年
3
月
7
日
基于单片机的数字温度计的设计
摘
要
本课程设计主要介绍基于AT89C51单片机和DS18B20数字温度传感器的温度测量系统。该系统以AT89C51单片机为主控制芯片,采用数字温度传感器DS18B20实现温度的检测;采用LED数码管,显示被测的温度值;采用发光二极管可以直观的显示温度的大致范围。
关键字:数字温度计;单片机;DS18B20
Abstract
This
course
is
designed
to
introduce
a
temperature
measurement
system
based
on
the
AT89C51
and
the
digital
temperature
sensor.It
takes
AT89C51
SCM(Single
Chip
Microcomputer)
as
main
control
chip,using
the
digital
temperature
sensor
DS18B20
to
realize
temperature,and
using
the
LED(Light-emitting
Diode)
digital
tube
to
display
the
measured
temperature
value,the
light-emitting
diodes
can
intuitively
display
the
temperature
range.
Key
Words:
Digital
thermometer,SCM,DS18B20
1
引言
传统的温度计大多以热敏电阻作为温度传感器,但热敏电阻的可靠性差,测量温度准确率低,且传统的温度计存在反应速度慢,读数麻烦,测量精度不高,误差大等缺点而且必须经过专门的接口电路转换成数字信号才能由单片机进行处理。所以本次设计选用DS18B20数字温度传感器来实现基于51单片机的数字温度计的设计,以改善传统温度计的不足。
该数字温度计利用DS18B20温度传感器及其接口电路完成温度的测量并转换成单片机能够处理的数字信号后送到单片机进行处理变换,最后显示在共阳极数码管上。
2
设计方案及原理
根据系统的设计要求,选择DS18B20作为本系统的温度传感器,选择单片机AT89C51为测控系统的核心来完成数据采集、处理、显示、报警等功能。
该系统的总体设计思路如下:温度传感器DS18B20把所测得的温度发送到AT89C51单片机上,经过51单片机处理,将把温度在显示电路上显示,本系统显示器用4位共阳极LED数码管以动态扫描法实现。检测范围20摄氏度到35摄氏度,超过上下限范围报警并且指示灯闪烁。总体设计方框图如图2.1所示。
图2.1
总体设计方框图
3
硬件设计
3.1
温度采集电路
DS18B20温度传感器是一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。它具有独特的单线接口方式,仅需要一个端口引脚就能够进行通信,多个DS18B20可以并联在唯一的三线上,实现多点组网功能,无需外部器件等特点。因此用它来组成一个测温系统十分方便,不需要外部任何元器件即可实现测温,只要求一个端口即可实现通信。
另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作必须严格按照协议进行。具体的操作协议为:初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。DS18B20只有三个引脚:VCC、DQ、GND。本设计将温度传感器的数字输入输出引脚DQ与单片机的I/O口P3.7相连结,而另外的两个引脚分别是GND接地,VCC接电源。单片机与温度传感器的连接图如图3.2所示。
图3.2
单片机与温度传感器的连接图
3.2
报警电路
报警电路连接图如图3.3所示。
图3.3
报警电路图
系统中的报警电路是由三极管,蜂鸣器,发光二极管和限流电阻组成。其中P1.7接蜂鸣器,P2.0接温度上限指示灯(红灯),P2.6接温度下限指示灯(黄灯)。
报警电路的具体实现的功能:当所测温度值在20℃到35℃之间时,蜂鸣器不响,指示灯不亮;当超过35℃时红灯闪烁,蜂鸣器响;当低于20℃时黄灯闪烁,蜂鸣器响。
3.3
显示电路
图3.4
数码管显示电路
显示电路采用4位共阳极LED数码管显示,P0口作为段码输出,P3口的低四位经反相器驱动作为数码管的位选端。采用动态扫描的方式显示。
数码管显示25℃时的电路如图3.4所示。
4
软件设计
系统程序主要包括主程序、DS18B20读1个字节子程序、DS18B20写1个字节子程序、读出温度子程序、报警指示灯实现子程序等。
4.1
主程序流程图
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,并显示出来。其程序流程见下图4.1。
图4.1
主程序流程图
4.2
DS18B20读1个字节子程序
DS18B20读1个字节子程序的主要功能是从总线上读取一个字节,程序流程图如图4.2所示。
图4.2
DS18B20读1个字节子程序
4.3
DS18B20写1个字节子程序
DS18B20写1个字节子程序的主要功能是向总线上写入一个字节,程序流程图如图4.3所示。
4.4
读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
程序流程图见下图4.4。
图4.3
DS18B20写1个字节子程序
图4.4
读出温度子程序流程图
4.5
报警指示灯实现子程序
报警指示灯显示子程序主要功能是大概的显示温度的范围。当温度在设定的最大值与最小值之间时,蜂鸣器指示灯不工作;当温度值大于设定的最大值时,蜂鸣器响,指示灯红灯闪烁;当温度值小于设定的最小值时,蜂鸣器响,指示灯黄灯闪烁。
报警指示灯实现子程序如图4.5。
图4.5
报警指示灯实现子程序
5
系统仿真及实际调试
本设计中DS18B20数字温度传感器通过人为输入的不同温度值来模拟环境温度的变化。当DS18B20接收到温度值时,会通过数据总线传入AT89C51单片机。单片机再通过转换,一方面将转换后的温度通过LED数码管输出;另一方面,将转换后的温度送入报警电路,通过判断,报警电路得以正常工作。
当温度超过设定的上限温度时,蜂鸣器开始报警且指示灯(红灯)开始闪烁;当温度超过设定的下限温度时,蜂鸣器开始报警且指示灯(黄灯)开始闪烁。当温度在设定的范围内时,蜂鸣器指示灯都不工作。
利用Keil
C51软件将程序源代码导入,通过编译链接生成.Hex文件。利用Proteus软件将设计好的电路进行仿真,再将.Hex文件导入单片机。
温度值为36℃时的系统仿真图如图5.1所示。
图5.1
温度值为36℃时的系统仿真图
6
总结
由于DS18B20芯片以前没有接触过,所以这次设计首先查阅了有关DS18B20温度传感器的资料,然后根据设计思路,模拟仿真直到成功。模拟仿真以及电路的连接时很顺利,但是在C程序代码的编写时遇到了一些困难。由于单片机无法直接识别正负,所以当测到负温度时必须进行转换。通过查阅相关资料,在一次次的调试后,负温度值才得以正确显示。还有在数码管扫描驱动电路的连接时遇到了一点问题。由于系统所选的是4位共阳极LED数码管,所以在驱动时,本想用三极管是完全可以的,可是连接上以后,还是不显示。最后用74HC04六位反相器进行驱动,数码管才得以正确显示。还有一点问题就是DS18B20的理论测量范围是-55~125℃,但是实际仿真的温度范围是-55~128℃。
此次课程设计通过选题,查资料,答疑,模拟仿真到最后的成功遇到了很多问题同时也学到了很多。
参考文献
[1]
王思明,张金敏,张鑫等.单片机原理及应用系统设计[M].北京:科学出版社,2012年9月:90-291.
[2]
邵发森.单片机原理与应用及其实验指导书[M].北京:北京大学出版社,2012年8月:171-226
[3]
李华,王思明,张金敏.单片机原理及应用[M].兰州:兰州大学出版社,2001年5月:8-67.
[4]
张立.基于单片机的数字温度计设计[J].吉林:华章,2011年11月(31):347.
附录
源程序代码
#include
“reg51.h“#include
“intrins.h“//调用intrins函数中的_nop_()做延时用
#define
Disdata
P0
//段码输出口
#define
discan
P3
//扫描口
#define
uchar
unsigned
char
#define
uint
unsigned
int
sbit
DQ=P3^7;
//温度输入口
sbit
DIN=P0^7;
//LED小数点控制
sbit
beep=P1^7;//蜂鸣器
sbit
red=P2^0;//红灯
sbit
yellw=P2^6;//黄灯
uint
h;
uint
temp;
uchar
v;
uchar
high=35,low=20;//
设置初始上下限报警温度值
//*******温度小数部分用查表法**********//
uchar
code
ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
uchar
coded
is_7[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};
/*
共阳LED段码表
“0““1““2““3““4““5““6““7““8““9““不亮““-“*/
uchar
code
scan_con[4]={0xfe,0xfd,0xfb,0xf7};
//
列扫描控制字
uchar
data
temp_data[2]={0x00,0x00};
//
读出温度暂放
uchar
data
display[5]={0x00,0x00,0x00,0x00,0x00};
//显示单元数据,共4个数据,一个运算暂存用
/***********延时函数**********/
void
delay(uint
t)
{
for(;t>0;t--);
}
/***********显示扫描函数**********/
void
scan()
{
char
k;
for(k=0;k0;
i--)
//
{
DQ=1;_nop_();_nop_();
DQ
=
0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
DQ
=
val
//最低位移出
delay(6);
//66us
val=val/2;
//右移一位
}
DQ
=
1;
delay(1);
}
/*********DS18B20读1个字节函数********/
//从总线上读取一个字节
uchar
read_byte(void)
{
uchar
i;
uchar
value
=
0;
for
(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
value>>=1;
DQ
=
0;
//
_nop_();_nop_();_nop_();_nop_();
//4us
DQ
=
1;_nop_();_nop_();_nop_();_nop_();
//4us
if(DQ)value|=0x80;
delay(6);
//66us
}
DQ=1;
return(value);
}
/***********读出温度函数**********/
void
read_temp()
{
ow_reset();
//总线复位
write_byte(0xCC);
//
发Skip
ROM命令
write_byte(0xBE);
//
发读命令
temp_data[0]=read_byte();
//温度低8位
temp_data[1]=read_byte();
//温度高8位
ow_reset();
write_byte(0xCC);
//
Skip
ROM
write_byte(0x44);
//
发转换命令
}
/***********温度数据处理函数**********/
void
work_temp()
{
uchar
n=0;
//
if(temp_data[1]>127)
{temp_data[1]=(256-temp_data[1]);temp_data[0]=(256-temp_data[0]);n=1;}
//负温度求补码
display[4]=temp_data[0]display[0]=ditab[display[4]];
display[4]=((temp_data[0]
yellw=!yellw;
}
else
{
beep=0;
yellw=0;
}
}
/**************主函数****************/
main()
{
Disdata=0xff;
//初始化端口
discan=0xff;
for(h=0;h<4;h++){display[h]=0;}//开机显示0000
ow_reset();
//
开机先转换一次
write_byte(0xCC);
//
Skip
ROM
write_byte(0x44);
//
发转换命令
for(h=0;h<500;h++)
{scan();}
//开机显示“0000“2秒
while(1)
{
read_temp();
//读出18B20温度数据
work_temp();
//处理温度数据
BEEP();
for(h=0;h<500;h++)
{scan();}
//显示温度值2秒
}
}
//*********************结束**************************//
12