LCD显示的电子秤.docx
《LCD显示的电子秤.docx》由会员分享,可在线阅读,更多相关《LCD显示的电子秤.docx(37页珍藏版)》请在冰豆网上搜索。
LCD显示的电子秤
浙江海洋学院
东海科学技术学院
单片机课程设计报告
设计题目基于18b20的多点温度检测
年级专业
学生姓名(学号)
课程
名称
单片机原理及应用课程设计
设计
题目
10.基于18b20的多点温度检测
完成
期限
自20年6月日至20年月日共2周
设
计
依
据
已经学习了《单片机原理及应用》、《电子技术基础》课程的内容,实验室提供必要的设备,可以进行相关设计。
设
计
要
求
及
主
要
内
容
1、基本要求
(1)实现用 4路温度检测(可以用单片机的多个端口)。
(2)LCD分时显示测试的结果
2、发挥部分
(1)加入停止、复位/启动的功能
(2)变成单个端口进行4路温度的检测
参
考
资
料
[1]彭伟.单片机C语言程序设计实训100例.电子工业出版社.
[2]周景润张丽娜.Proteus入门实用教程
指导教
师签字
王建行、鲁晓东
日期
2014.9.25
摘 要
在实际工业生产及日常生活中,为了避免局部的温度过高或过低,需要对某个空间内多个点的温度进行监测,如在粮库测温系统、智能建筑自控系统、冷库测温系统、中央空调系统等多种系统中都需要多点温度测量。
为了改善监测人员的工作条件,监测人员一般需要远离监测对象。
因此,多点温度远程监测在实际生产中具有重要的应用价值。
本设计系统地介绍基于DS18B20的多点温度测量的方法和原理,利用DSI8B20单总线温度传感器和单片机与其它外围设备结合在一起实现温度的测量和显示。
DS18B20多点温度测量系统是以AT89C51单片机作为控制核心,智能温度传感DS18B20为控制对象,运用C语言编程实现系统的各种功能。
该系统由单片机最小系统、传感器电路、LCD显示电路、电源电路四大部分组成。
借助PROTEUS软件,实现了系统电路设计和仿真。
通过DS18B20的单总线技术,实现对远程环境的温度测量与监控。
关键词:
DS18B20、仿真、测量系统、PROTEUS、单片机
7.附录A.................................................................................................................18
7.1源程序118
7.2源程序2...............................................................................................................25
8.附录B实物...............................................................................................................31
基于18b20的多点温度检测
引言
在人类的生活环境中,温度扮演着极其重要的角色。
无论你生活在哪里,从事什么工作,无时无刻不在与温度打着交道。
自18世纪工业革命以来,工业发展对是否能掌握温度有着绝对的联系。
在冶金、钢铁、石化、水泥、玻璃、医药等等行业,可以说几乎80%的工业部门都不得不考虑着温度的因素。
进入21世纪后,温度传感器正朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速发展。
目前市场主要存在单点和多点两种温度测量仪表。
对于单点温测仪表,主要采用传统的模拟集成温度传感器,其中又以热电阻、热电偶等传感器的测量精度高,测量范围大,而得到了普遍的应用。
此种产品测温范围大都在-200℃~800℃之间,分辨率12位,最小分辨温度在0.001~0.01之间。
自带LED显示模块,显示4位到16位不等。
有的仪表还具有存储功能,可存储几百到几千组数据。
该类仪表可很好的满足单个用户单点测量的需要。
多点温度测量仪表,相对与单点的测量精度有一定的差距,虽然实现了多路温度的测控,但价格昂贵。
而在传统的温度测量系统设计中,往往采用模拟技术进行设计,这样就不可避免地遇到诸如引线误差补偿、多点测量中的切换误差和信号调理电路的误差等问题;而其中某一环节处理不当,就可能造成整个系统性能的下降。
随着现代科学技术的飞速发展,特别是大规模集成电路设计技术的发展,微型化、集成化、数字化正成为传感器发展的一个重要方向。
美国Dallas半导体公司推出的数字温度传感器DS18B20,具有独特的单总线接口,仅需要占用一个通用I/0端口即可完成与微处理器的通信;在-10~+85℃ 温度范围内具有0.5℃ 精度;用户可编程设定9~12位的分辨率。
以上特性使得DS18B20非常适用于构建高精度、多点温度测量系统。
方案设计
设计要求
按系统要实现功能,设计必须达到以下的几个步骤的要求
(1)实现用 4路温度检测(可以用单片机的多个端口)。
(2)LCD分时显示测试的结果
(3)编写程序,用Proteus软件进行仿真。
发挥部分
(1)加入停止、复位/启动的功能
(2)变成单个端口进行4路温度的检测
设计方案
2.1.1单片机芯片的选择
本设计选用STC89C52单片机,它是一种带8K字节闪烁可编程可擦除只读存储器的低电压,足够本设计之用,高性能CMOS8位微处理器该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
功能强大、使用方便的STC89C52单片机适用于许多较为复杂的应用场合。
2.1.2总体设计及系统原理
以单片机接口原理,DS18B20芯片功能与接口设计,LCD1602液晶屏接口设计等理论知识为基础,设计出完整的系统原理图。
根据系统功能,设计编写固件程序,下载后进行调试,通过DS18B20及LCD1602正常工作实现系统的多点温度测量。
本课题涉及的理论知识主要是DS18B20多点温度测量原理及LCD1602显示原理控制器选取STC89C52RC;而且这款单片机支持在线编程,通过串口下载程序,这给程序的下载和使用带来方便。
电路设计采用Protel99SE,程序设计采用C语言进行编程,用Proteus软件进行仿真。
DS18B20是数字温度传感器,它的输入/输出采用数字量,以单总线技术,接收主机发送的命令,根据DS18B20内部的协议进行相应的处理,将转换的温度以串口发送给主机。
主机按照通信协议用一个IO口模拟DS18B20的时序,发送命令(初始化命令、ROM命令、RAM命令)给DS18B20,转换完成之后读取温度值,在内部进行相应的数值处理,用图形液晶模块显示各点的温度。
图2-1系统设计
硬件设计
单片机最小系统
单片机最小系统选用STC89C52,包含上电自动复位电路和手动复位电路,可对单片机进行复位操作。
对本设计的单片机驱动电路说明如下:
1、单片机的供电系统采用USB接口供电电路;
2、单片机采用外接晶振的方法,晶振频率为11.0592MHz;
3、复位电路采用按键复位。
图3-1最小系统
3.2.温度显示部分
在考虑显示和操作的难以程度后,我们决定使用LCD1602。
1602是字符型液晶,显示字母和数字比较方便,控制简单,而且成本较低。
1602采用标准的16脚接口,其中:
第1脚:
VSS为地电源
第2脚:
VDD接5V正电源
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
背光电源正极
第16脚:
背光电源负极。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
在单片机编程中还可以用字符型常量或变量赋值,如'A’。
因为CGROM储存的字符代码与我们PC中的字符代码是基本一致的,因此我们在向DDRAM写C51字符代码程序时甚至可以直接用P1=‘A’这样的方法。
PC在编译时就把'A'先转换为41H代码了。
LCD的指令也有很多,通过书本和网上资料我们基本了解和初步掌握了一些基本的指令。
如:
清屏、显示移位等。
图3-2温度显示电路
3.3.温度检测电路
温度检测电路的核心是DS18B20。
按照设计要求,我们决定采用四路DS18B20用单个接口连接的方式。
DS18B20引脚和实物如图3.3.1所示。
图3.3.1DS18B20的管脚排列和实物
DALLAS半导体公司的单线数字温度传感器DS18B20是一种新型的“一线器件”,其体积小、适用于多种场合。
其温度测量范围为-55~+125°C,可编程为9位~12位转换精度,测温分辨率可达0.0625°C。
被测温度用符号扩展的16位数字量方式串行输出。
而且多个DS18B20可以串联到一条数据线上,单片机只需一根端口线就能与诸多DS18B20通信,提高了I/O口的利用率,可节省大量的引线和逻辑电路。
3.2.1DS18B20特性
(1)适应电压范围宽:
3.0V~5.5V,在寄生电源方式下可由数据线供电。
(2)独特的单线接口方式,在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
(3)DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。
(4)测温范围-55℃~+125℃,在-10℃~+85℃时精度为±0.5℃。
(5)可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温。
(6)在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字。
(7)测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU,同时可传送CRC校验码,具有很强的抗干扰纠错能力。
(8)负压特性:
电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
3.2.2DS18B20内部结构
(1)DS18B20的内部结构如图3.2.2所示。
图3.2.2DS18B20内部结构图
配置寄存器与分辨率关系表
R0
R1
温度计分辨率/bit
最大转换时间/us
0
0
9
93.75
0
1
10
187.5
1
0
11
375
1
1
12
750
(2)高速暂存存储器
高速暂存存储器由9个字节组成。
当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。
单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如图3-8所示。
对应的温度计算:
当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。
DS18B20的温度值以0.5℃/LSB(最低有效位)来表示,输出数据格式如下(如T=-25℃):
MSBLSB
1
1
1
0
0
1
1
1
0
由此可看出,DS18B20的温度值是以9位二进制数来表示的,其中最高有效位MSB为符号位,符号位为“1”表示负温度,“0”表示正温度。
其中最底有效位(LSB)由比较器进行0.25℃比较,当计数器1中的余值转化成温度后低于0.25℃时,清除温度寄存器的最底位(LSB),当计数器1中的余值转化成温度后高于0.25℃时,置位温度寄存器的最底位(LSB)。
DS18B20温度数据和典型对应的温度值如下表所示:
DS18B20温度数据表:
23
22
21
20
2-1
2-2
2-3
2-4
MSB
LSB
S
S
S
S
S
26
25
24
典型对应的温度值:
温度/℃
二进制表示
十六进制表示
+125
+25.0625
+10.125
+0.5
0
-0.5
-10.125
-25.0625
-55
0000011111010000
0000000110010001
0000000010100010
0000000000001000
0000000000000000
1111111111111000
1111111101011110
1111111001101111
1111110010010000
07D0H
0191H
00A2H
0008H
0000H
FFF8H
FF5EH
FE6FH
FC90H
每个DS18B20有自己的序列号,因此本系统可以在一根总线上挂接了4个DS18B20,通过CRC校验,对各个DS18B20的ROM进行寻址,地址符合的DS18B20才作出响应,接收主机的命令,向主机发送转换的温度。
采用这种DS18B20寻址技术,使系统硬件电路更加简单。
同时本设计将会附加一个小程序(附录程序2),用来检测并显示DS18B20的序列号
DS18B20的引脚如表3.1所示:
序号
名称
引脚功能描述
1
GND
地信号
2
DQ
数字输入输出引脚,开漏单总线接口引脚,当使用寄生电源时,可向电源提供电源
3
VDD
可选择的VDD引脚,当工作于寄生电源时,该引脚必须接地
表3.1DS18B20引脚描述
图中内部计数器2对一个随温度变化其振荡频率明显改变的振荡器所产生的脉冲进行计数,计数器1和温度寄存器被预置在-55℃对应的基数。
低温时,振荡器产生的脉冲信号可通过门电路,当到达某一设置温度值时,振荡器产生的脉冲信号无法通过门电路,此时温度寄存器中的数值就是所测温度值,这个值以16位形式存放在高速存储器中。
此温度值可由主机通过发存储器读命令而读出。
斜率累加器用于补偿、修正测温过程的非线性。
DS18B20的测温流程将会在软件设计中做详细的介绍。
图3-3指示电路
软件设计
软件流程
根据DS18b20多点测温的功能要求给出如下的软件设计流程
图4-1软件设计流程
主程序执行流程如图4-1所示,主程序先对各DS18B2O及LCD1602进行初始化,然后重复调用DS18B20的写命令和读数据模块,最后将数据处理后送LCD1602显示。
子程序模块
4.2.1LCD1602的显示程序调试
上文已经对LCD1602进行了大概的介绍。
显示程序,开始必须进行初始化,否则模块无法正常显示,LCD1602的常用初始化方法是利用内部复位电路进行初始化。
下面指令是在初始化进程中执行的。
(1)清屏(DISPLAYCLEAR);
(2)功能设置(FUNCTIONSET)
DL=1:
8Bin接口数据
N=0:
1行显示;F=0:
5×7dot字形;
(3)显示开/关控制(DisplayON/OFFConrtol)
D=0:
显示关;C=0:
光标关;B=0:
消隐关
(4)输入方式设置(ENTRYMODESET)
I/D=1:
(增量);S=0:
无移位。
本设计的LCD1602设置程序详见附录1
4.2.2DS18B20的测量温度程序调试
DS18B20测温的子程序,如图4-2所示。
当总线上连有多个DS18B20时,工作流程如下:
读出DS18B20中的数据,
并交给单片机处理显示
而每个DS18B20特有的64位序列号,将用另外的程序测试得出。
(详见附录的程序2)
图4-2温度检测子程序流程图
4.3.小结
本章主要讨论了系统的软件部分,包括主程序执行流程,LCD1602显示程序,DS18B20测量温度程序的调试。
最后通过硬件电路进行实际的控制,经过调试得出结果表明,单片机能独立控制元件工作,DS18B20能也实现多点温度的测量的正常运作。
实验结果与讨论
实验仿真
图5-1实验仿真结果
结果讨论
本设计以AT89C52单片机为系统的控制核心,采用proteus仿真软件进行测试。
Proteus是一款比较常用的单片机仿真软件,用proteus和keil配合进行仿真提高系统运行效率与稳定性。
由于采用了动态扫描的方式实现对点阵式LED电子显示屏的控制,使系统能够稳定、清晰地显示文字。
心得体会
本课题将多个DS18B20和STC89C52RC单片机相结合实现了多点温度测量。
对于单片机的独立控制外设而言,在技术上难度不大,所以,本文没有重点介绍,而对结合接口芯片DS18B20,对多点温度测量技术进行很大的篇幅进行介绍。
单片机作为我们专业主要课程之一,所以单片机的课程设计也是非常重要的。
刚开始接触这个题目时,我还是有一点迷茫的,甚至对DS18B20也不是很了解。
但是通过图书馆和网络查询了很多资料,请教了老师之后,我们还是一步步完成了这个设计。
虽然最后的实物做的不是很理想,但是我们用心努力过,专研过,就够了。
学习注重的是过程,而不是结果。
虽然结果有那么点遗憾,但是我相信我们的收获是巨大的。
C语言的编写修改,仿真的编制,对ASCLL码值和单片机运算的巩固等等。
这不仅仅是一个学习的任务,更是对我们耐心、毅力的考验。
附录A源程序1(设计程序)
#include
#include
#defineucharunsignedchar
sbitRS=P2^5;//定义LCD端口
sbitRW=P2^6;
sbitE=P2^7;
sbitDQ=P2^4;//定义单总线端口
ucharLCD_3,LCD_2,LCD_1,LCD_0;
uchards18b20_romA[8]={0x8e,0x00,0x00,0x00,0xb8,0xc5,0x30,0x28};
//四个DS18B20的64位ROM地址
uchards18b20_romB[8]={0x52,0x00,0x00,0x00,0xb8,0xc5,0x34,0x28};
uchards18b20_romC[8]={0x65,0x00,0x00,0x00,0xb8,0xc5,0x35,0x28};
uchards18b20_romD[8]={0x3c,0x00,0x00,0x00,0xb8,0xc5,0x36,0x28};
ucharcodeLCDData[]="0123456789";
ucharcodedot_tab[]="0112334456678899";
ucharfirst_line[16]="A:
000.0B:
000.0";//LCD第一行显示缓存数组
ucharsecond_line[16]="C:
000.0D:
000.0";//LCD第二行显示缓存数组
//************************************
//延时程序
//************************************
voiddelay(unsignedintN)
{
unsignedinti;
for(i=0;i}
//************************************
//LCD1602测忙
//************************************
voidcheck_busy(void)
{
while
(1)
{
P1=0xff;
E=0;
_nop_();
RS=0;
_nop_();
_nop_();
RW=1;
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
if((P1&0x80)==0)
{
break;
}
E=0;
}
}
//************************************
//LCD1602写命令
//************************************
voidwrite_command(uchartempdata)
{
E=0;
_nop_();
_nop_();
RS=0;
_nop_();
_nop_();
RW=0;
P1=tempdata;
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
E=0;
_nop_();
check_busy();
}
//************************************
//LCD1602写数据
//************************************
voidwrite_data(uchartempdata)
{
E=0;
_nop_();
_nop_();
RS=1;
_nop_();
_nop_();
RW=0;
P1=tempdata;
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
E=0;
_nop_();
check_busy();
}
//************************************
//初始化LCD1602
//************************************
voidinit_lcd1602()
{
write_command(0x01);//清除屏幕
write_command(0x38);//功能设定(8位,2行,5*7点阵式)
write_command(0x0c);//显示器ON,光标OFF,闪烁OFF
write_command(0x06);//地址加1
}
//************************************
//初始化ds18b20
//************************************
bitresetpulse(void)
{
DQ=0;
delay(40);//延时500us
DQ=1;
delay(4);//延时60us
return(DQ);//读取P1.