1绪论
1.1研究的背景和意义
温度是一个和人们生活环境有着密切关系的物理量,也是一种在生产、科研、生活中需要测量和控制的重要物理量,同时它也是一种最基本的环境参数。人民的生活与环境温度息息相关,很多方面都离不开温度。例如,发电厂锅炉的温度必须控制在一定的范围之内 。没有合适的温度环境,许多电子设备不能正常工作。可见,研究温度的测量具有重要的理论意义和推广价值。
随着现代计算机和自动化技术的发展,作为各种信息的感知、采集、转换、传输相处理的功能器件,温度传感器的作用日益突出,成为自动检测、自动控制系统和计量测试中不可缺少的重要技术工具,其应用已遍及工农业生产和日常生活的各个领域。本设计就是为了满足人们在生活生产中对温度测量系统方面的需求。
1.2电路的工作原理
温度的测量通常可以用两种方式来实现:一种是用热敏电阻之类的器件,于感温效应,热敏电阻的阻值能够随温度发生变化 。将随温度变化的电压或电流采集过来,进行A\D转换后,发送到单片机进行数据处理,通过显示电路就可以将温度显示出来。这种设计需要用到A\D转换电路,其测温电路比较麻烦。第二种方法就是我们所设计的用温度传感器芯片,温度传感器芯片能把温度信号转换成数字信号,直接发送给单片机,转换后通过显示电路显示即可。这种方法电路结构简单,设计方便。
系统的框架图如图1-1:
图1-1 系统框图(见附件)
2设计方案
2.1测温系统的功能要求
温度系统的功能要求如下:
1.精度为0.1℃。
2.能够通过显示器显示测量的温度值。
2. 2显示器的选择
显示器可以目前可采用LED显示器和LCD液晶显示器两种。但是采用传统的七段数码LED显示器。LED虽然价格便宜,但使用起来不方便显示效果不好。采用LCD液晶屏进行显示。LCD液晶显示器是一种低压、微功耗的显示器件,只要2~3伏就可以工作,工作电流仅为几微安,是任何显示器无法比拟的,同时可以显示大量信息,除数字外,还可以显示文字、曲线,比传统的数码LED显示器显示的界面有了质的提高。在仪表和低功耗应用系统中得到了广泛的应用。优点为:
1 显示质量高,由于液晶显示器的每一个点收到信号后就一直保持那种色彩和亮度恒定发光 。
2 数字式接口,液晶显示器都是数字式的,和单片机的接口简单操作也很方便。
虽然LCD显示器的价格比数码管要贵,但它的显示效果好,是当今显示器的主流,所以采用LCD 作为显示器。 本系统采用较为常用的液晶显示器LCD1602来显示测温系统所测得的温度。
2.3温度传感器的选择
本系统采用数字化温度传感器DS18B20,是 “一线总线”接口的温度传感器。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。现在,新一代的“DS1820”体积更小、更经济、更灵活。使您可以充分发挥“一线总线”的长处。
由于DS18B20将温度传感器、信号放大调理、A/D转换、接口全部集成于一芯片,与单片机连接简单、方便,所以温度传感器采用DS18B20。
3硬件电路设计
3.1测温系统硬件电路的总体设计
硬件电路主要分为 C51控制电路、复位电路、时钟电路、显示电路和测温电路五大部分。
图3-1-1为 C51控制电路

图3-1-1 C51电路
图3-1-2时钟电路

图3-1-2 时钟电路
图3-1-3复位电路

图3-1-3 复位电路
图3-1-4显示电路

图3-1-4 显示电路
图3-1-5温度传感器电路

图3-1-5 温度传感器电路
总体的电路图如图3-1-6

图3-1-6 总体图
3.2LCD1602显示器的简介和电路设计
1602液晶显示是一种专门用来显示字母、数字、符号等的点阵型液晶模块。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
1602采用的16脚接口,第1脚:GND为电源地。第2脚:VCC接5V电源正极。第3脚:V0为液晶显示器对比度调整端。第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。第6脚:E端为使能端,高电平时读取信息,负跳变时执行指令。第7~14脚:D0~D7为8位双向数据端。第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。
在本系统设计中采用7~14脚接51单片机的P2口,1脚和3脚接地,2脚接电源VCC,4、5、6脚分别接单片机的P1.5、P1.6、P1.7端口。
3.3 DS18B20的简介和电路的设计
DS18B20是一种支持“一线总线”接口的温度传感器,它具有微型化,低功耗,高性能,抗干扰能力强,易配微处理器等优点,可直接将温度转化成数字信号处理器处理。测量的温度范围是—55~125℃,测温误差0.5℃。可编程分辨率9~12位,对应的可分辨温度分别为0.5℃,0.25℃,0.125℃和0.0625℃。其工作电源即可在远端引入,也可采用寄生电源方式产生。DS18B20引脚定义:
(1)DQ为数字信号输入/输出端;
(2)GND为电源地;
(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。DS18B20与单片机的连接方式比较简单,只需要把DS18B20的数据线DQ与51单片机的一根并口连接即可。本设计采用DQ连接单片机的P1.0,GND端口接地,VCC接电源。
4软件设计及程序编写
4.1总体的程序设计思路
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示温度程序,序初始化程序等。
主程序的流程如图4-1所示。
图4-1 主程序流程图
4.2 LCD1602显示器的编程
LCD1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
指令1:清显示,指令码01H,光标复位到地址00H位置。 指令2:光标复位,光标返回到地址00H。 指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效低电平则无效。指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。 指令7:字符发生器RAM地址设置。 指令8:DDRAM地址设置。指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,-如果为低电平表示不忙。 指令10:写数据。指令11:读数据。
LCD1602的读写时序图如图4-2-1和4-2-2。

图4-2-1读操作时序

图4-2-2 写操作时序
由以上的数据我们可以对LCD1602进行写程序如下:
初始化程序:
void init()
{
wc51r(0x01) ; //清屏
wc51r(0x38) ; //使用8位数据,显示两行,使用5x7的字形 wc51r(0x0c) ; //显示器开,光标关,字符不闪
wc51r(0x06) ; //字符不动,光标右移一格
}
查忙函数
void fbusy()
{
P2 = 0xff ;
RS = 0 ;
RW = 1 ;
E = 0 ;
E = 1 ;
while(P2 & 0x80) //查忙
{
E = 0 ;
E = 1 ;
}
}
写数据函数
void wc51r(uchar i)
{
fbusy() ;
E = 0 ;
RS = 0 ;
RW = 0 ; //写入指令
E = 1 ;
P2 = i ;
E = 0 ;
}
读数据函数
void wc51ddr(uchar i)
{
fbusy() ;
E = 0 ;
RS = 1 ;
RW = 0 ;
E = 1 ; //写数据
P2 = i ;
E = 0 ;
}
4.3DS18B20温度传感器的编程
DS18B20的温度检测与数字数据输出全集成于一个芯片之上 。其一个工作周期可分为两个部分,即温度检测和数据处理。在讲解其工作流程之前我们有必要了解DS18B20的内部存储器资源。DS18B20共有三种形态的存储器资源,它们分别是:ROM 只读存储器,用于存放DS18B20的ID编码,其前8位是单线系列编码 ,后面48位是芯片唯一的序列号,最后8位是以上56的位的CRC码 。数据在出产时设置不由用户更改。DS18B20共64位ROM。RAM 数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,DS18B20共9个字节RAM,每个字节为8位。第1、2个字节是温度转换后的数据值信息,第3、4个字节是用户EEPROM 的镜像。在上电复位时其值将被刷新。第5个字节则是用户第3个EEPROM的镜像。第6、7、8个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。第9个字节为前8个字节的CRC码。EEPROM 非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警值和校验数据,DS18B20共3位EEPROM,并在RAM都存在镜像,以方便用户操作。单片机对DS18B20的操作流程有:
1.初始化。初始化时序如图4-3-1

图4-3-1
2.控制器发送ROM指令:双方打完了招呼之后最要将进行交流了,ROM指令共有条,每一个工作周期只能发一条,ROM指令分别是读ROM数据、指定匹配芯片、跳跃ROM、芯片搜索、报警芯片搜索。ROM指令为8位长度,功能是对片内的64位光刻ROM进行操作。其主要目的是为了分辨一条总线上挂接的多个器件并作处理。单总线上可以同时挂接多个器件,并通过每个器件上所独有的ID号来区别,一般只挂接单个DS18B20芯片时可以跳过ROM指令。
3.控制器发送存储器操作指令:在ROM指令发送给DS18B20之后,紧接着就是发送存储器操作指令了。操作指令同样为8位,共6条,存储器操作指令分别是写RAM数据、读RAM数据、将RAM数据复制到EEPROM、温度转换、将EEPROM中的报警值复制到RAM、工作方式切换。存储器操作指令的功能是命令DS18B20作什么样的工作,是芯片控制的关键。
4.执行数据的或者写,时序如图4-3-2


图4-3-2
由以上数据我们可以对DS18B20进行编程如下;
//初始化函数
uchar res (void)
{
uchar presence ;
DQ = 0 ;
delay(50) ; //CPU将数据下拉500us
DQ = 1 ; //释放数据线等待
delay (3) ;
presence = DQ ; //DS18B20发出信号
delay (25) ;
return (presence) ;
}
//从单总线上读一个字节函数
uchar read_byte (void)
{ //读数据时,数据以字节的最低有效位先从总线移出
uchar i ;
uchar dat = 0 ;
for (i=8 ; i > 0 ; i--) //一位一位的读数据
{
dat>>=1 ; //让从总线上的数据从高位移到地位
DQ = 0 ;
DQ = 1 ;
delay (1) ;
if(DQ) dat |=0x80 ; //把数据最高位置1
delay (6) ;
}
return (dat) ;
}
//向单总线上写一字节函数
void write_byte(uchar dat)
{
uchar i ;
for (i = 8 ; i > 0 ; i-- )
{
DQ = 0 ;
DQ = dat&0x01 ; //数据从字节自最低位开始传输
delay(5) ; //15us后DS18B20在总线上采样
DQ = 1 ;
dat >>=1 ; //写完后释放总线
}
delay (5) ;
}
//读取温度函数
void read_temperature(void)
{
res () ; //初始化
write_byte(0xCC) ; //跳过ROM
write_byte(0xBE) ; //读暂存器指令
temp.c[1] = read_byte() ; //读取到的第一个字节为温度
temp.c[0] = read_byte() ; //读取到的第一个字节为温度
res () ; //复位
write_byte(0xCC) ; //跳过ROM
write_byte(0x44) ; //温度转换指令
return ;
}
4.4主程序的编写
主程序主要是让DS18B20上测量的温度在LCD1602上显示出来程序如下:
#include <reg52.h> //头文件
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P1^0 ;
sbit RS = P1^7 ; //端口定义
sbit RW = P1^6 ;
sbit E = P1^5 ;
union
{
uchar c[2] ;
uint x ;
} temp ;
uchar flag ; //温度正负的标志1为正,0为负
uint cc , cc2 ; //保存温度值
float cc1 ;
uchar buff1[13] = {"temperature :"} ; //LCD初始化显示
uchar buff2[6] = {"+00.0"} ;
延时函数
void delay (uint j)
{
While(j--) ;
}
主函数
void main()
{
uchar k ;
delay (10) ;
E = 0 ; //LCD1602执行写操作
flag = 0 ;
init() ;
wc51r(0x80) ; //写入显示起始地址
for (k = 0 ; k < 13 ; k++)
{
wc51ddr(buff1[k]) ; //写入提示信息
}
while (1)
{
delay (10000) ;
read temperature () ; //读取温度
cc = tamp.c[0]*256.0 + tamp.c[1] ;
if(temp.c[0] > 0xf8)
{
flag = 1 ;
cc =~cc + 1 ;
}
else flag = 0 ;
cc1 = cc*0.0625 ; //计算出数值
cc2 = cc1*100 ; //放大便于读取
buff2[1] = cc2/1000 + 0x30 ;
if (buff2[1] == 0x30)
buff2[1] = 0x20 ; //取出十位
buff2[2] = cc2/100 - (cc2/1000)*10 + 0x30 ;//取出个位
buff2[4] = cc2/10 -(cc2/100)*10 + 0x30 ;//取出小数位
if (flag == 1)
buff2[0] = '-' ;
else
buff2[0] = '+' ;
wc51r(0xc5) ; //写入缓冲区的起始地址为第2行第6列
for (k = 0 ; k<6 ; k++)
{
wc51ddr(buff2[k]) ; //显示温度
}
}
}
5软件仿真及性能分析
将写好的程序在KEIL中进行调试载入程序后在protues中仿真后得到如图5-1所示的结果

图5-1
进过仿真后我们可以看到可以很容易的测得温度值并且显示出来,测温的速度比较快。在日常使用的时候可以及时的测量温度为人们的日常生产和生活带来方便。
6总结
经过几个周的不断学习和努力,基与C51单片机的温度测量系统的设计基本完成了。本次设计的基C51单片机的温度测量系统是一种比较简单的温度测量系统,它可以 对温度实现测量 。系统采用单总线技术,按照DS18B20的通信协议,由主机向DS18B20发送命令,读取DS18B20转换的温度,从而实现对多个环境的温度的测量。本文介绍了用C51单片机控制DS18B20,着重分析各单元电路的设计,以及各电路与单片机的接口技术。最后还给出系统的软件的设计过程,使用了C语言进行程序设计。本文是采用模块化的方式进行叙述,对各模块的设计进行了比较详细地阐述。经过这一次设计,我学了不少的知识,学会了怎样查阅资料和利用工具书,和在设计一个东西之前要做好哪些准备和要考虑的东西。通过这次设计,我更加深刻地认识到只有将书本与具体的实践相结合,才会有真正的收获,才能巩固自已的所学,认识到自己的不足。
参考文献:
[1]谢维成、杨家国.单片机原理与应用及C51程序设计(第3版)[M].北京:清华大学出版社,2014
[2]张越、张炎、赵延军.基于单总线器件DS18B20温度传感器的数字温度计微电子学[J].2007
[3]马洪芹用单片机控制液晶模块显示[J].电子科技.2008
[4]澎伟.单片机C语言程序设计实训100例——基于8051+Proteus仿真基. 北京: 北京电子工业出版社.2009