基于RS485和VB的远程温度采集系统_第1页
基于RS485和VB的远程温度采集系统_第2页
基于RS485和VB的远程温度采集系统_第3页
基于RS485和VB的远程温度采集系统_第4页
基于RS485和VB的远程温度采集系统_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于RS485和VB的远程温度采集系统信息工程学院生医0701摘要:本系统以RS485总线和VB上位机控制台为核心,构成了一个可远达1200M范围内的远程温度采集网络。系统通过双绞线作为信号传输媒介,引入RS485总线信号传输的一些处理措施,具有良好的信息传输准确性和系统抗干扰性。另外,本系统可以在RS485总线上挂接最多由51单片机和DS18B20构成的32个温度采集节点,并且系统密切与RS485总线的“轮询〞思想和VB上位机控制台相结合,因此可以说是构成了真正意义上的远程智能温度采集网络!该系统可以广泛应用在需要对温度进行实时和全天候观察的各种场合,具有较高的实际应用价值!关键词:RS485总线轮询VB上位机51单片机DS18B20正文RS485总线接口做为多点、差分数据传输的标准,现已成为业界应用较为广泛的标准通信接口之一。RS485标准只对接口的电气特性做出了规定,而不涉及接插件、电缆或协议,因此,用户可在此根底上建立自己的高层通信协议。在工业自动控制中,计算机通过串口与单片机系统之间进行通信的应用越来越广泛。一般情况下,控制系统需要一个高级语言开发的相当于控制台的用户界面,用来进行参数设置,发送指令和系统检测,VB在这一领域用着很强的优势。从控制台发出的指令经过计算机串口传送给单片机系统,此时VB携带的通信控件MSComm起到了桥梁作用,给编程者带来了极大的方便。DALLAS公司生产的DS18B20可组网数字温度传感器具有“一线总线〞接口、测温范围-55℃~+125℃、固有测温分辨率0.5℃、体积小、耐磨耐碰等特点,非常适合与传统的51单片机构成温度采集节点。将RS485总线及“轮询思想〞、VB上位机控制台、51单片机和DS18B20构成的温度采集节点有机的结合起来就可以构成一个远程的智能温度采集系统。RS485总线1.1RS485总线介绍电子工业协会〔EIA〕于1983年制订并发布RS-485标准,并经通讯工业协会〔TIA〕修订后命名为TIA/EIA-485-A,习惯地称之为RS-485标准。RS-485标准是为弥补RS-232通信距离短、速率低等缺点而产生的。RS-485标准只规定了平衡发送器和接收器的电特性,而没有规定接插件、传输电缆和应用层通信协议。1.2RS485总线独特之处RS-485标准与RS-232不一样,数据信号采用差分传输方式〔DifferentialDriverMode〕,也称作平衡传输,它使用一对双绞线,将其中一线定义为A,另一线定义为B,如图1-1所示。图1-1通常情况下,发送发送器A、B之间的正电平在+2~+6V,是一个逻辑状态;负电平在-2~-6V,是另一个逻辑状态。另有一个信号地C。在RS-485器件中,一般还有一个“使能〞控制信号。“使能〞信号用于控制发送器与传输线的切断与连接,当“使能〞端起作用时,发送发送器处于高阻状态,称作“第三态〞,它是有别于逻辑“1〞与“0〞的第三种状态。 对于接收发送器,也作出与发送发送器相对的规定,收、发端通过平衡双绞线将A-A与B-B对应相连。当在接收端A-B之间有大于+200mV的电平时,输出为正逻辑电平;小于-200mV时,输出为负逻辑电平。在接收发送器的接收平衡线上,电平范围通常在200mV至6V之间。参见图1-2所示。图1-2定义逻辑1〔正逻辑电平〕为B>A的状态,逻辑0〔负逻辑电平〕为A>B的状态,A、B之间的压差不小于200mV。TIA/EIA-485串行通讯标准的性能如表格1-2所示:规格TIA/EIA-485传输模式平衡电缆长度@90Kbps4000ft〔1200m〕电缆长度@10Mbps50ft〔15m〕数据传输速度10Mbps昀大差动输出±6V昀小差动输出±1.5V接收器敏感度±0.2V发送器负载〔欧姆〕60Ω昀大发送器数量32单位负载昀大接收器数量32单位负载 RS-485标准的最大传输距离约为1219米,最大传输速率为10Mbps。通常,RS-485网络采用平衡双绞线作为传输媒体。平衡双绞线的长度与传输速率成反比,只有在20kbps速率以下,才可能使用规定昀长的电缆长度。只有在很短的距离下才能获得昀高速率传输。一般来说,15米长双绞线昀大传输速率仅为1Mbps。RS-485网络采用直线拓朴结构,需要安装2个终端匹配电阻,其阻值要求等于传输电缆的特性阻抗〔一般取值为120Ω〕。在矩距离、或低波特率波数据传输时可不需终端匹配。RS485转换器及RS-485网络直线拓扑结构1.3.1RS485转换器外形图1.3.2RS485转换器内部电路图1.3.3RS-485网络直线拓扑结构下位机RS485通信接口电路较为理想的下位机RS485通信接口电路本电路采用MAX485作为RS485总线的驱动芯片,如图1-3所示,将/RE和DE短接,由MCS-51的P1^0端口经反相器控制半双工通信时接收和发送的状态切换。三极管Q1及电阻R1、R2构成反向电路;R3、R4为总线空闲时的上拉电阻,抗随机干扰作用;R7为阻抗匹配电阻,以减小信号反射;R5、R6及四个快恢复稳压管D1~D4均为保护和抗干扰作用。图1-3实验室用下位机RS485通信接口电路在环境不是十分恶劣的现场中,可以采用图1-4中的RS485通信接口电路,图1-4实际上就是图1-3的精简版。图1-4RS485总线软件设计8051串行口的控制存放器SCON是一个特殊功能存放器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志:M0和SM1为工作方式选择位,可选择四种工作方式:SM2,多机通信控制位,主要用于方式2和方式3。当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI〔RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断效劳中将数据从SBUF读走〕。当SM2=0时,不管收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI〔即此时RB8不具有控制RI激活的功能〕。通过控制SM2,可以实现多机通信。TB8/RB8在方式2或方式3中,是发送数据的第九位,在多机通信中,作为地址帧/数据帧的标志位。RS485总线的程序实现流程所有从机的SM2位置1,处于接收地址帧状态。主机发送一地址帧,其中8位是地址,第9位为地址/数据的区分标志,该位置1表示该帧为地址帧。所有从机收到地址帧后,都将接收的地址与本机的地址比拟。对于地址相符的从机,使自己的SM2位置0〔以接收主机随后发来的数据帧〕,并把本站地址发回主机作为应答;对于地址不符的从机,仍保持SM2=1,对主机随后发来的数据帧不予理睬。主机收到从机应答地址后,确认地址是否相符,如果地址不符,发复位信号〔数据帧中TB8=1〕;如果地址相符,那么清TB8,开始发送数据.在前一步的根底上,如果从机收到的是复位命令那么回到监听地址状态〔SM2=1〕。否那么开始接收数据和命令,并相应的向上位机传送数据!从机发送数据结束后,置第9位〔TB8〕为1,再发送一帧校验和给上位机,作为从机数据传送结束的标志。(可以忽略)主机接收数据时先判断数据接收标志〔RB8〕,假设RB8=1,表示数据传送结束,并比拟此帧校验和,假设正确那么回送正确信号00H,此信号命令该从机复位〔即重新等待地址帧〕;假设校验和出错,那么发送FFH,命令该从机重发数据。假设接收帧的RB8=0,那么存数据到缓冲区,并准备接收下帧信息。〔可以忽略〕从机发送或接收完毕后置SM2=1,继续地址侦听。主机发送或接收完毕后修改MSComm的Settings属性为〞9600,M,8,1〞,并退出本次通信。发送另一从机地址帧准备进行一次通信。RS485总线接口程序清单#include<reg51.h>#include<absacc.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintsbitRT=P2^0;//MAX485收发控制位,低--接收,高---发送ucharqian,bai,shi,ge,data_crc;uintflag; //flag为从机地址验证正确标志位voiddelay(uintz){ uintx,y; for(x=0;x<z;x++) for(y=0;y<110;y++) ;}/***************************************************串行口中断子程序****************************************************/voidserial(void)interrupt4using1{ RI=0; ES=0;//一进入中断就把ES=0,这好似是比拟合理的方式---出自CNKI的优质PDF if(SBUF==0x04)//地址验证 { TB8=1;//**其实从机的第九位似乎根本起不到什么作用! /***********************************************************************这里要想让发送的数据在上位机上正常显示的话,必须使TB8=1,但是有些情况那么必须使TB8=0,以后我们可以两种情况都试一下以保证数据的正常显示;〔这好似于上位机软件的工作方式有关〕当上位机接收界面出现"???"时,我们可以马上更改TB8位的值,以期到达正确显示的目的! **********************************************************************/ P1=0xfe;//从机与主机建立连接的标志 SM2=0;//以后就可以直接接收主机发来的命令 flag=1; RT=1;//下面局部为向上位机返回自己的地址 SBUF=48; while(TI!=1);TI=0; SBUF=48+4; while(TI!=1);TI=0; RT=0; TB8=0; } if(flag==1) { if(SBUF==0x21)//要求从机发送数据的功能指令 { TB8=0;RT=1; data_crc=(qian+bai+shi+ge)%10; SBUF=48+qian;//向主机发送信息 while(TI!=1);TI=0; SBUF=48+data_crc;//JIAOYAN---->Thesecondbitwhile(TI!=1);TI=0; SBUF=48+bai;//向主机发送信息 while(TI!=1);TI=0; SBUF=48+shi;//向主机发送信息 while(TI!=1);TI=0; SBUF=48+ge;//向主机发送信息 while(TI!=1);TI=0; SBUF='';//向主机发送信息 while(TI!=1);TI=0; RT=0; TB8=0; } if(SBUF==0x30)//预定的结束通信指令 { TB8=0;//其实这里我们可以不管TB8,因为初始化的时候TB8=0; RT=0; SM2=1; flag=0; P1=0xff; } } ES=1; }/**********************主程序局部************************************/voidmain(void){ TMOD=0x20; TL1=0xfd; TH1=0xfd;PCON=0x00; //SCON=0xf0; SM0=1;SM1=1; SM2=1; REN=1; EA=1; ES=1;TR1=1; RT=0;//接收/发送数据控制位,初始化为接收while(1) {}}VB上位机控制台AT89S52与电脑的通信接口芯片比拟:综合观察比拟,我们可以利用“校验位〞模拟单片机的TB8/RB8.具体就是发送地址的时候校验位设定为〞M〞(值为1),发送指令的时候校验位设定为〞S〞〔值为0〕;VBMSComm通信控件的属性及参数设置Commport设置翻开端口号位1或2,3,4;Handshaking=0时无握手协议;InBufferSize=1024,接收缓冲区中字节数;InputLen=1,设置一次接收缓冲字节数位1;InputMode=0表示数据通过Input属性以文本形式取回,为1表示数据通过Input属性以二进制形式取回;OutBufferSize=512,设置并返回传输缓冲区的大小;Rhtreshold=1,在发生接收事件后并触发OnComm事件之前,设置并返回要接收的字节数。即接收缓冲区收到每一个字节后都会使MSComm控件产生OnComm事件。RTSEnable=False,假设设为True那么会发送信息到调制解调器,而不是通过串口通信;Setting=〞9600,N,8,1〞,设置并返回波特率、奇偶校验、数据位、停止位参数。9600,N,8,1即波特率为9600,无奇偶校验,8个数据位,1个停止位;Sthreshold=0(缺省值),数据传输事件不会产生OnComm事件。假设设置Sthreshold属性为1,当传输缓冲区完全为空时,MSComm控件产生OnComm事件。主从式多机通信中,必须为每个从机分配不同的地址,主机通过发送地址与从机取得联络后再与该从机进行数据帧或命令帧的交互,MCS-51中可通过灵活地控制串行口控制器SCON的SM2位和发送/接收的第9位TB8/RB8来区分地址或数据信息。本系统中以PC机为主机,使用VB6.0的MSComm控件与单片机通信,PC机要区分下发的是地址信息还是数据信息,是通过设置MSComm控件Settings属性中的奇偶校验位来巧妙实现的。发送地址时设置为M,即Settings=“9600,M,8,1〞,那么主机发送地址时置发送的第9位为1;发送数据时,设置为S,那么主机在每个字节数据时置发送的第9位为0;由于上位机中数据的发送和接收涉及到的情形比拟多,因此在这里不详加介绍。关于这方面比拟好的论文有深圳职业技术学院温晓军的《VB在串行通信中的应用》,当然该论文讲得比拟浅显,如果想要更深入的了解学习必须参看更多其它相关资料。VB上位机控制台及软件特色用VB6.0编写的上位机控制台如图1-5所示。图1-5软件特色解析:“通信设置〞区域该区域可进行串口号、波特率、数据位数、停止位数以及地址/数据帧设置。这些是通过MSComm控件的Settings属性来实现的。通常,在某些情况下我们会结合下位机进行波特率的修改,其它几个参数保持不变。“节点检测〞区域该区域可进行下位机节点是否正常性检查,做为后面节点选择的依据。在实际操作的时候是这样实现的:上位机发送从机地址并开启一个定时器,如果在500ms内收到了从机的应答地址那么弹出提示框“正常工作!〞,否那么弹出提示框“非正常工作!〞。“下位机节点〞区域该区域可进行下位机节点选择、“轮询〞时间间隔设置和目标数据以Excel保存的名称和位置设置。在这里可以将所选择的下位机节点一天24小时所采集的温度数据连续保存在所指定的Excel表格中,以供后续的数据分析。该区域功能的实现主要通过数组及相应算法、定时器、VB调用Excel表格的灵活组合应用来完成的。实现效果如图1-6、图1-7所示。图1-6图1-7(4) “节点显示单元〞区域通过该区域可以实时的观察所选择节点的温度数据。(5) 其它特性该上位机软件还具有端口开闭检测能力和突发事件处理能力。这里着重介绍一下突发事件处理能力。该上位机软件的突发事件处理能力表达在中选择的某一个下位机节点出现崩溃的时候可以很好的进行应急处理,从而防止对整个系统造成影响。该功能同样是通过定时器的灵活应用来实现的。下位机温度采集节点微处理器目前微处理器领域最火爆的莫过于32位的ARM,但出于本系统对微处理要求不高和性价比的考虑,因此选择传统的8051单片机.。本系统选择国产宏晶STC89C52RC,不选择AT89S52是因为两者性能根本一样,但STC价格廉价一半。STC89C52具有如下特点:40个引脚,8kBytesFlash片内程序存储器,512bytes的随机存取数据存储器〔RAM〕,32个外部双向输入/输出〔I/O〕口,5个中断优先级2层中断嵌套中断,3个16位可编程定时计数器,2个全双工串行通信口,看门狗〔WDT〕电路,片内时钟振荡器。可以看出STC89C52完全满足系统对微处理的要求。DS18B20DS18B20特性简介DALLAS半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线〞接口的温度传感器。一线总线独特而且经济的特点,使用户可以轻松的组建传感器网络,为测量系统的构建引入全新概念。现在新一代DS18B20体积更小、更经济、更灵活,使你可以充分发挥“一线总线〞的长处。DS18B20的具体特性如下:独特的单线接口仅需一个端口引脚进行通讯简单的多点分布应用无需外部器件可通过数据线供电零待机功耗测温范围-55~+125摄氏度,以0.5摄氏度递增9~12位可选分辨率温度数字量转换时间200ms(典型值)用户可定义的非易失性温度报警设置应用包括温度控制、工业系统、消费品、温度计或任何热感测系统DS18B20典型应用电路 上图是通过VDD引脚引入一个外部电源,这样做的好处是I/O线上不需要加强上拉,而且总线控制器不用在温度转换期间总保持高电平。这样在转换期间可以允许在单线总线上进行其它数据往来。另外,在单线总线上可以挂任意多片DS18B20,并且如果它们使用外部电源的话,就可以先发一个SkipROM命令,再接一个ConvertT命令,让它们同时进行温度转化。注意当加上外部电源时,GND引脚不能悬空。51单片机驱动DS18B20温度转化流程图51单片机和DS18B20温度采集局部程序清单#include<reg51.h>#include<intrins.h>#include<stdio.h>#include<math.h>#defineucharunsignedchar#defineuintunsignedintsbitDS=P3^2;//DS18b20的数据线端口sbitkey=P3^3;ucharcodetable0[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0到9与“-〞编码ucharcodetable3[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0E,0xff};//共阳带小数点段选ucharcodetable1[8]={0x28,0x1e,0x45,0xe9,0x00,0x00,0x00,0xb7};//两1820的ROM编码,可在单个时用readrom读出ucharcodetable2[8]={0x28,0x87,0x3f,0x08,0x02,0x00,0x00,0xc9};ucharzf_flag=0,temph,templ,ge,shi,bai,qian;ucharchoose=0;//1-wire总线,寻访不同1820的标志位inttemper;//温度真实值/********************************************************函数名称:delay_us(uintt)入口参数:t出口参数:无注备:此程序是为了1wire总线写时的us级延时而写的; 其中在外部晶振为11.0592MHz时,每次进入函数 大约要18us左右,每次循环大约13us左右********************************************************/voiddelay_us(uintt) { uinti; for(i=0;i<t;i++); }/********************************************************函数名称:delay_nms(uintt)入口参数:t出口参数:无注 备:毫秒级软件延时********************************************************/voiddelay_nms(uintt) { uinti; ucharj; for(i=0;i<t;i++) for(j=0;j<110;j++); }/********************************************************函数名称:reset_1820()入口参数:无出口参数:bit一位数:返回1,初始化成功;返回0,初始化失败注 备:这里主要要注意的是延时的问题********************************************************/bitresert_1820() { DS=1; _nop_();//MCU将DS拉低后,要保持至少大于1us,数据手册上说的。 _nop_();//这里为确保稳定延时2us左右 DS=0; delay_us(55);//这里延时大约750us左右 DS=1; // delay_us(2);//这里大约50us左右---********适当调整! delay_us(3); if(!DS){delay_us(50);//这个延时很重要!!!650us!!*****可能有点偏长!DS=1; //一定要在初始化完成后将DS置1,以释放总线return1;} else return0; }/********************************************************函数名称:write_bit(bitwei)入口参数:bitwei出口参数:无注 备:********************************************************/voidwrite_bit(bitwei) { DS=1; DS=0; _nop_(); //MCU将DS拉低后,要保持至少大于1us,数据手册上说的。 _nop_(); //这里为确保稳定延时2us左右 if(wei) DS=1; elseDS=0; delay_us(6);//*************大概81us DS=1; _nop_(); }/********************************************************函数名称:read_bit()入口参数:无出口参数:bit一位注 备:********************************************************/bitread_bit()//初期写程序出问题处!!!!!!!!! { DS=1; DS=0; _nop_();_nop_();//MCU将DS拉低后,要保持至少大于1us,数据手册上说的。//这里为确保稳定延时2us左右DS=1; //这里必须拉高:让MCU释放总线,好让DS18B20利用总线回送数据 _nop_();_nop_();//等待一定时间,让DS18B20回送的数据稳定_nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_(); returnDS; }/********************************************************函数名称:write_byte(ucharbyte)入口参数:byte出口参数:无注备:DB18B20写入数据或读出数据都是从最低位开始的********************************************************/voidwrite_byte(ucharbyte){ bitflag1; uchari,temp;temp=byte; for(i=0;i<8;i++) { temp=(temp>>1);//DB18B20写入数据或读出数据都是从最低位开始的 flag1=CY; /***********这种方式还是不错的!*/ write_bit(flag1); } }/********************************************************函数名称:read_byte()入口参数:无出口参数:byte型注备:DB18B20写入数据或读出数据都是从最低位开始的********************************************************/ucharread_byte() { bitflag2; uchari,j,temp; for(i=0;i<8;i++) { temp=(temp>>1); flag2=read_bit(); if(flag2)/*******中间变量对一个位进行操作!*/ j=0x80; else j=0x00; temp=temp|j; } returntemp; }/********************************************************函数名称:uint conversion(ucharh_byte,ucharl_byte)入口参数:ucharh_byte,ucharl_byte出口参数:uint型注备:将DB18B20读出的数据转化为真正的温度值********************************************************/uintconversion(ucharh_byte,ucharl_byte){ intwendu; floattt;//注意数据类型对运算的影响!!!!!!!!! if(h_byte<7||h_byte==7) { zf_flag=0; //温度正负标志位:1,为负;0,为正 wendu=h_byte; //将读入的带字符的高字节放入int型温度变量中 wendu=wendu<<8; //将其左移八位,让其进入高字节 wendu=wendu|l_byte; //并与温度的低字节相或,凑成整型值 tt=wendu*0.0625; //乘

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论