多路温度采集和显示系统设计与实现Word文件下载.docx
《多路温度采集和显示系统设计与实现Word文件下载.docx》由会员分享,可在线阅读,更多相关《多路温度采集和显示系统设计与实现Word文件下载.docx(23页珍藏版)》请在冰豆网上搜索。
(7)测温点与控制显示部分拉长距离,即无线测温。
遥测距离100m。
(8)增加湿度的测量
2、课程设计实现的方案
采用数字温度传感器DS18B20测量温度,输出信号全数字化。
便于单片机处理及控制,省去传统的测温方法的很多外围电路。
且该芯片的物理化学性很稳定,它能用做工业测温元件,此元件线性度较好。
在0~100摄氏度时,最大线形偏差小于1摄氏度。
DS18B20的最大特点之一采用了单总线的数据传输,由数字温度计DS1820和微控制器AT89S52构成的温度测量装置,它直接输出温度的数字信号,可直接与计算机连接。
这样,测温系统的结构就比较简单,体积也不大,且由于AT89S52可以带多个DS18B20,因此可以非常容易实现多点测量。
轻松的组建传感器网络。
采用温度芯片DS18B20测量温度,可以体现系统芯片化这个趋势。
部分功能电路的集成,使总体电路更简洁,搭建电路和焊接电路时更快。
而且,集成块的使用,有效地避免外界的干扰,提高测量电路的精确度。
用无线遥控PT2272L4和PT2262实现数据的接受与传送。
使用于各种工业遥控,遥测,防盗报警器信号接收,各种家用电器的遥控等。
天线用软导线或其它硬质金属(如拉杆天线),长度为250mm,不能过长也不能过短,否则会影响接收距离。
若使用软导线,请拉直悬空使用,并尽量不要靠近金属物体。
应尽量避免电磁干扰和金属屏蔽。
采用AT89S52八位单片机实现。
单片机软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制。
而且体积小,硬件实现简单,安装方便。
既可以单独对多DS18B20控制工作,还可以与PC机通信。
另外AT89C51在工业控制上也有着广泛的应用,编程技术及外围功能电路的配合使用都很成熟。
3、模块功能
本课题所设计的外围电路包括:
温度监控、显示模块、报警电路、无线传送模块等电路。
下面将依次对各个模块进行说明。
3.1温度监控:
对温室进行测量,通过温度传感器DS18B20将温度值转换为数字量输出。
3.2显示模块:
用LCD1602立即显示摄氏温度和华氏温度。
3.3报警电路:
当温度越限时报警,对于多路可以知道是哪一路出现温度越限。
3.4无线传送模块:
按键实现两地不同温度值显示的转换,按键值由无线传送,接收到以后实现LCD1602的显示变换。
4、温度监控的实现
4.1DS18B20简介
温度芯片DS18B20是Dallas公司生产的一线式数字温度传感器,具有3引脚,小体积封装形式。
测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出。
测量温度范围为-55℃~+125℃,在-10℃~+85℃范围内,精度为±
0.5℃。
其工作电源既可在远端引入,也可采用寄生电源方式产生。
CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
由于每一个DS18B20都有唯一系列号,因此多个DS18B20可以存在同一条单总线上。
这允许许多不同地方放置温度灵敏器件。
此特性的应用范围包括环境控制,建筑物、设备或机械内的温度检测,以及过程监控和控制中的温度检测等。
DS18B20有4个主要的数据部件:
(1)64位激光ROM。
64位激光ROM从高位到低位依次为8位CRC、48位序列号和8位家族代码(28H)组成。
(2)温度灵敏元件。
(3)非易失性温度报警触发器TH和TL。
可通过软件写入用户报警上下限值。
(4)配置寄存器。
配置寄存器为高速暂存存储器中的第五个字节。
其中R0、R1:
温度计分辨率设置位,其对应四种分辨率如下表所列,出厂时R0、R1置为缺省值:
R0=1,R1=1(即12位分辨率),用户可根据需要改写配置寄存器以获得合适的分辨率。
R0
R1
分辨率/bit
最大转换时间/us
9
93.75
1
10
187.5
11
375
12
750
表1分辨率关系表
高速暂存存储器由9个字节组成,其分配如表1所示。
当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。
单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如表2所示。
对应的温度计算:
当符号位S=0时,直接将二进制位转换为十进制;
当S=1时,先将补码变为原码,再计算十进制值。
温度LSB
温度MSB
TH
TL
保留
计数寄存器
8位CRC
表2DS18B20存储器
4.2电路设计
本系统为多点温度测试。
DS18B20采用外部供电方式,理论上可以在一根数据总线上挂256个DS18B20,但时间应用中发现,如果挂接25个以上的DS18B20仍旧有可能产生功耗问题。
另外单总线长度也不宜超过80m,否则也会影响到数据的传输。
在这种情况下我们可以采用分组的方式,用单片机的多个I/O来驱动多路DS18B20。
在实际应用中还可以使用一个MOSFET将I/O口线直接和电源相连,起到上拉的作用,电路如图1。
在一线制总线上串接多个DS18B20器件时,需要先发送跳过ROM指令,将所有传感器都进行一次温度转换,之后通过匹配ROM依次读取每个传感器的温度数据,实现对单I/O口上的多个DS18B20器件的操作。
在系统安装及工作之前应将主机逐个与DS1820挂接,以读出其序列号。
其工作过程为:
主机发出一个脉冲,待“0”电平大于480μs后,复位DS1820,在DS1820所发响应脉冲由主机接收后,主机再发读ROM命令代码33H,然后发一个脉冲(15μs),并接着读取DS1820序列号的一位。
用同样方法读取序列号的56位。
另外,由于DS1820单线通信功能是分时完成的,遵循严格的时隙概念,系统对DS1820和各种操作必须按协议进行,即:
初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
图1单总线原理图
对DS18B20的设计,需要注意以下问题:
(1)对硬件结构简单的单线数字温度传感器DS18B20进行操作,需要用较为复杂的程序完成。
编制程序时必须严格按芯片数据手册提供的有关操作顺序进行,读、写时间片程序要严格按要求编写。
尤其在使用DS18B20的高测温分辨力时,对时序及电气特性参数要求更高。
(2)有多个测温点时,应考虑系统能实现传感器出错自动指示,进行自动DS18B20序列号和自动排序,以减少调试和维护工作量。
(3)测温电缆线建议采用屏蔽4芯双绞线,其中一对线接地线与信号线,另一组接VCC和地线,屏蔽层在源端单点接地。
DS18B20在三线制应用时,应将其三线焊接牢固;
在两线应用时,应将VCC与GND接在一起,焊接牢固。
若VCC脱开未接,传感器只送85℃的温度值。
(4)实际应用时,要注意单线的驱动能力,不能挂接过多的DS18B20,同时还应注意最远接线距离。
另外还应根据实际情况选择其接线拓扑结构。
5、显示模块的实现
5.1字符型液晶显示模块
图2液晶面板
字符型液晶显示模块是一类专门用于显示字母,数字,符号等的点阵式液晶显示模块。
在显示器件上的电极图型设计,它是由若干个5*7或5*11等点阵符位组成。
每一个点阵字符位都可以显示一个字符。
点阵字符位之间有一空点距的间隔起到了字符间距和行距的作用。
5.2字符型液晶显示模块引脚
VSS为地电源,VDD接5V正电源,VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
DB0~DB7为8位双向数据线,BLK和BLA是背光灯电源。
模块引脚如表3。
编号
符号
引脚说明
VSS
电源地
D2
DataI/O
2
VDD
电源正极
D3
3
VL
液晶显示偏压信号
D4
4
RS
数据/命令
D5
5
R/W
读/写
13
D6
6
E
使能信号
14
D7
7
D0
45
BLA
背光源正级
8
D1
16
BLK
背光源负级
表3字符型液晶显示模块引脚
5.3字符型液晶显示模块内部结构
液晶显示模块WM-C1602N的内部结构如图3分为三部份:
一为LCD控制器,二为LCD驱动器,三为LCD显示装置。
图3LCD1602内部结构
图4液晶接口
6、无线传送模块的实现
6.1无线发送电路
图5PT2262发射原理图
PT2262的发射原理如上图5所示,采用8位地址码和4位数据码的格式。
PT2262的第1~8引脚设置地址为“00000000”,及1~8脚都接地。
第10~13引脚为数据输入端,这四个引脚分别与单片机AT89S51的P2.0~P2.3口相连。
要发送的数据通过单片机AT89S51的P2.0~P2.3口写入PT2262的数据输入管脚10~13。
由于第14脚接地,所以编码启动端一直有效,当PT2262的管脚10~13有输入(有一个为“1”即有编码发出),则输入的4位数据再经过第17脚串行输出通过天线发送出去。
6.2无线接收模块
无线接收模块电路图,PT2272的接收原理如上图6所示,由于PT2262采用8位地址码和4位数据码的格式,所以PT2272也要采用同样的格式。
PT2272要与PT2262的地址相匹配才能进行传输,所以PT2272的地址引脚1~8也要设置为“00000000”,及都接地。
数据出端10~13引脚与单片机AT89S51的P1.0~P1.3口相连。
接收到的数据再通过单片机的外围接口P1.0~P1.3读入到单片机内部进行处理。
第17脚连接到单片机的P3.2(INT0)的外中断0的输入端,同时接一个发光二极管来确定解码有没有效。
当解码有效时17脚输出瞬间的高电平同时使单片机产生中断来读取数据和二极管瞬间发光。
每解码有效一次,发光二极管的闪烁一次。
图6PT2262接收原理图
7、程序设计流程图
整个系统的功能是由硬件电路配合软件来实现的,当硬件基本定型后,软件的功能也就基本定下来了。
从软件的功能不同可分为两大类:
一是监控软件(主程序),它是整个控制系统的核心,专门用来协调各执行模块和操作者的关系。
二是执行软件(子程序),它是用来完成各种实质性的功能如测量、计算、显示、通讯等。
每一个执行软件也就是一个小的功能执行模块。
这里将各执行模块一一列出,并为每一个执行模块进行功能定义和接口定义。
各执行模块规划好后,就可以规划监控程序了。
图7发射流程图图8接收流程图
图9温度检测流程图图10报警流程图
8、课程设计体会
课程设计结束了,对于我来说收获真的不少。
运用单片机板子制作实物,这个我一看就被吸引了的课题,让我下定决心一定要好好学好做好这一次的课程设计。
老师给了我们课程设计的任务。
一开始进度有点慢,几乎什么都不知道。
于是我开始上网阅读更多关于这方面的资料,在脑中形成较为体系的知识结构。
我还在课后的时间去了一下新街口的华龙电子城,接触事物的过程中让我懂得了更多,我买了芯片,回来一点一滴地摸索,发现当有实物的时候学东西真的好快。
原本什么都不会,经过不断地尝试,我居然可以用板子实现很多很多的功能,并会自己扩展一些功能。
看着自己做出来的成就,想想自己每天熬夜看书在自己电脑上改来改去,想想在设计过程中每一次面对困难又解决的快乐……不管会是怎么样的结果,至少自己真正努力过,就不会有遗憾,我一直抱着这样的信念坚持到最后一刻。
课程设计结束了,回想起来,自己的收获真的不少,努力总会有收获,这是永远都不变的道理。
想想这一次的课程设计,自己也会多一点今后学习上的经验和方法。
设计结束了,我发现我对板子更有兴趣了,我也会好好努力把一些我还不是很了解的细节做好。
这次做出来的系统还是一个不完善的系统,还有许多需要改进的地方。
我会继续不断地摸索。
9、参考文献
[1]马宗梅,籍顺心,张凯,马岩,单片机的C语言应用程序设计,北京:
北京航空航天大学出版社,2007。
[2]付晓光,单片机原理与实用技术,北京:
清华大学出版社,2004.1
[3]谭浩强,C语言设计,北京:
清华大学出版社,1999。
[4]丁镇生,传感器及传感技术应用,电子工业出版社,1998.8。
[5]黄俊钦,新型传感器原理,航空工业出版社,1991。
[6]夏路易,电路原理图与电路板设计教程Protel99SE,北京:
北京希望电子出版社,2002.6。
[7]李广弟,朱月秀,王秀山.单片机基础.北京:
北京航空航天大学出版社,2006。
[8]马共立.MCS-51单片机实用子程序.哈尔滨:
哈尔滨工业大学出版社,1989。
程序
发射部分程序:
#include<
reg52.h>
voidmain()
{
while
(1)
{if(P3==0xff)
P1=0xf0;
if(P3==0x7f)
P1=0xf1;
}
}
接收与温度显示控制程序:
1602-Temp.c
#include<
reg52.H>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitD18B20=P3^7;
//18b20的引脚定义
sbitBZ=P1^5;
//蜂鸣器的引脚定义
sbitrs=P2^6;
//1602引脚定义
sbitrw=P2^5;
sbite=P2^7;
#defineNOP()_nop_()/*定义空指令*/
#define_Nop()_nop_()/*定义空指令*/
voidTempDelay(ucharus);
//18b20的函数声明
voidInit18b20(void);
voidWriteByte(ucharwr);
//单字节写入
voidread_bytes(ucharj);
ucharCRC(ucharj);
voidGemTemp();
voidTemperatuerResult(ucharz);
voiddelay(uchara);
//1602分函数声明
voidlcd_mang();
voidwrite_lcd1602(ucharcmd,uchari);
voidini_lcd1602();
bitflag;
uintTemperature;
//用来存放读出温度后的值
uchartemp_buff[9];
//存储读取的字节,readscratchpad为9字节,read//romID为8字节
uchar*p,TIM;
ucharcodestr1[]={0x28,0xFF,0xC3,0x93,0x03,0x00,0x00,0xA9};
//ROM1
ucharcodestr2[]={0x28,0xC2,0x31,0xCB,0x03,0x00,0x00,0xEF};
//ROM2
//延时处理
voidTempDelay(ucharus)
{while(us--);
//18B20初始化
voidInit18b20(void)
{D18B20=1;
_nop_();
D18B20=0;
TempDelay(80);
//delay530uS//80
D18B20=1;
TempDelay(14);
//delay100uS//14
if(D18B20==0)
flag=1;
//detect1820success!
Else
flag=0;
//detect1820fail!
TempDelay(20);
//20
D18B20=1;
//向18B20写入一个字节
voidWriteByte(ucharwr)//单字节写入
{unsignedcharidatai;
for(i=0;
i<
8;
i++)
{
D18B20=0;
_nop_();
D18B20=wr&
0x01;
TempDelay(3);
//delay45uS//5
D18B20=1;
wr>
>
=1;
//读18B20的一个字节
unsignedcharReadByte(void)//读取单字节
{unsignedcharidatai,u=0;
for(i=0;
u>
D18B20=1;
if(D18B20==1)
u|=0x80;
TempDelay
(2);
return(u);
//读18B20
voidread_bytes(ucharj)
unsignedcharidatai;
j;
*p=ReadByte();
p++;
//匹配ROM
voidMatchrom(uchara)
charj;
WriteByte(0x55);
//发送匹配ROM命令
if(a==1)
for(j=0;
j<
j++)
WriteByte(str1[j]);
//发送18B20的序列号,先发送低字节
if(a==2)
WriteByte(str2[j]);
//读取温度
voidGemTemp()
{
Temperature=temp_buff[1]*0x100+temp_buff[0];
Temperature*=0.625;
Temperature+=0.5;
//四舍五入
//Temperature/=16;
TempDelay
(1);
//18B20ID全处理
voidTemperatuerResult(ucharz)
{Init18b20();
WriteByte(0xcc);
//skiprom
Init18b20();
if(z==1)
Matchrom
(1);
//匹配ROM1
if(z==2)
Matchrom
(2);
//匹配ROM2
WriteByte(0x44);
//Temperatureconvert启动温度转换
TempDelay(800);
//delay100uS//14
}
WriteByte(0xbe);
//readTemperature读取温度
p=temp_buff;
read_bytes(9);
GemTemp();
voidGetTemp(ucharz)
if(TIM==10)//每隔100ms读取温度
{TIM=0;
TemperatuerResult(z);
if(Temperature>
300)//蜂鸣器提示
{BZ=~BZ;
//[t1(10ms)中断]中断
voidT1zd(void)interrupt3
TH1=0xD8;
//10
TL1=0xF0;
TIM++;
//以下是1602显示模块
voiddelay(uchara)
uchari;
while(a--)
250;
{
_nop_();
}
}
//判忙
voidlcd_mang()
rs=0;
rw=1;
e=1;
_nop_();
while(P0&
0x80);
e=0;
//1602的写
voidwrite_lcd1602(ucharcmd,uchari)
lcd_mang();
rs=i;
rw=0;
e=0;
e=1;
P0=cmd;