RS485现场通信监测系统.docx

上传人:b****3 文档编号:4871425 上传时间:2022-12-11 格式:DOCX 页数:11 大小:146.30KB
下载 相关 举报
RS485现场通信监测系统.docx_第1页
第1页 / 共11页
RS485现场通信监测系统.docx_第2页
第2页 / 共11页
RS485现场通信监测系统.docx_第3页
第3页 / 共11页
RS485现场通信监测系统.docx_第4页
第4页 / 共11页
RS485现场通信监测系统.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

RS485现场通信监测系统.docx

《RS485现场通信监测系统.docx》由会员分享,可在线阅读,更多相关《RS485现场通信监测系统.docx(11页珍藏版)》请在冰豆网上搜索。

RS485现场通信监测系统.docx

RS485现场通信监测系统

在一些要求响应速度快、实时性强、控制量多的应用场合,往往理由多个单片机结合PC机组成分布系统,在这样的系统中可以使用RS-485接口连接单片机和PC机。

RS-485是RS-232的改良标准,在通信速率、传输距离、多机连接等方面较RS-232有了很大的提高,在软件设计上和RS-232基本一致。

在结合RS-485及有关资料基础上学习了用单片机实现485总线现场监测系统。

这个系统以PC机为主机,多个单片机为从机的现场监测系统,单片机组组成的各个节点负责采集终端设备的状态信息,主机以轮询的方式向各个节点获取这些设备信息,并根据信息内容进行相关的操作。

 

主要器件:

1、 PC机端的232/485转换接口:

MC1488和MC1489实现TTL电平和RS-232通信电平的转化;PC147光电隔离器件;MAX481485驱动收发芯片。

2、 单片机端:

AT89C52单片机芯片,用于数据采集和与485总线接口;MAX481485驱动收发芯片;DIP-6开关用于确定本机的设备号。

 

试验流程图:

主机端流程:

单片机端流程图:

试验电路图:

主机端

单片机端:

试验程序代码:

//485Mon.h程序

#ifndef   _485MON_H                           //防止485Mon.h被重复引用

 

#define   _485MON_H

 

#include                 //引用标准库的头文件

#include

#include

 

#defineucharunsignedchar

#defineuintunsignedint

 

#defineACTIVE 0x11

#defineGETDATA     0x22

#defineREADY         0x33

#defineSENDDATA     0x44      

 

#defineRECFRMMAXLEN16          //接收帧的最大长度,超过此值认为帧超长错误

#defineSTATUSMAXLEN10                    //设备状态信息最大长度   

 

ucharDevNo;                            //设备号

xdataucharStatusBuf[STATUSMAXLEN];

 

//为简化起见,假设了10位固定的采集数据

#defineDATA0   0x10

#defineDATA1   0x20

#defineDATA2   0x30

#defineDATA3   0x40

#defineDATA4   0x50

#defineDATA5   0x60

#defineDATA6   0x70

#defineDATA7   0x80

#defineDATA8   0x90

#defineDATA9   0xA0

 

sbitDE=P1^6;                   //驱动器使能,1有效

sbitRE=P1^7;                   //接收器使能,0有效

 

voidinit();                                 //系统初始化

voidGet_Stat();                         //简化的数据采集函数

bitRecv_Data(uchar*type);        //接收数据帧函数

voidSend(ucharm);                                 //发送单字节数据

voidSend_Data(uchartype,ucharlen,uchar*buf);                          //发送数据帧函数      

voidClr_StatusBuf();                  // 清除设备状态信息缓冲区函数  

 

#endif

 

//485Mon.c程序

#include"485Mon.h"

 

voidmain(void)

{

      uchartype;

 

      /*初始化*/

      init();

      

      while

(1)

      {

             if(Recv_Data(&type)==0)                 //接收帧错误或者地址不符合,丢弃

                    continue;

             switch(type)

             {

                    caseACTIVE:

                     //主机询问从机是否在位

                           Send_Data(READY,0,StatusBuf); //发送READY指令

                           break;

                    caseGETDATA:

                         //主机读设备请求

                           Clr_StatusBuf();

                           Get_Stat();                         //数据采集函数

                           Send_Data(SENDDATA,strlen(StatusBuf),StatusBuf);

                           break;

                    default:

                           break;                                //指令类型错误,丢弃当前帧

             }

      }

}

 

/*初始化*/

voidinit(void)

{

      P1=0xff;

      DevNo=(P1&0x00111111);               //读取本机设备号

 

      TMOD=0x20;

      SCON=0x50;

      TH1=0xfd;

      TL1=0xfd;

      TR1=1;

      PCON=0x00;                                         //SMOD=0

      EA=0;

                                         

}

 

/*接收数据帧函数,实际上接收的是主机的指令*/

bitRecv_Data(uchar*type)

{

      uchartmp,rCount,i;

      ucharr_buf[RECFRMMAXLEN];              //保存接收到的帧

      ucharFlag_RecvOver;                       //一帧接收结束标志  

      ucharFlag_StartRec;                         //一帧开始接收标志

      ucharCheckSum;                                     //校验和

      ucharDataLen;                                        //数据字节长度变量

             

      /*禁止发送,允许接收*/

      DE=0;

      RE=0;

 

      /*接收一帧数据*/

      rCount=0;

      Flag_StartRec=0;

   Flag_RecvOver=0;

      while(!

Flag_RecvOver)

      {

             RI=0;

             while(!

RI);

             tmp=SBUF;

             RI=0;

 

             /*判断是否收到字符'$',其数值为0x24*/         

             if((!

Flag_StartRec)&&(tmp==0x24))

             {

                    Flag_StartRec=1;

             }

 

             if(Flag_StartRec)

             {

                    r_buf[rCount]=tmp;

                    rCount++;           

                    

                    /*判断是否收到字符'*',其数值为0x2A,根据接收的指令设置相应标志位*/

                    if(tmp==0x2A)

                           Flag_RecvOver=1;

             }

 

             if(rCount==RECFRMMAXLEN)             //帧超长错误,返回0

                    return0;

      }

      接上篇程序:

 

/*计算校验和字节*/

      CheckSum=0;

      DataLen=r_buf[3];

      for(i=0;i++;i<3+DataLen)

      {

             CheckSum=CheckSum+r_buf[i+1];

      }

      

      /*判断帧是否错误*/

      if(rCount<6)                                    //帧过短错误,返回0,最短的指令帧为6个字节                                   

             return0;

      if(r_buf[1]!

=DevNo)                      //地址不符合,错误,返回0

             return0;

      if(r_buf[rCount-2]!

=CheckSum)        //校验错误,返回0

         return0;

 

      *type=r_buf[2];                              //获取指令类型

 

      return1;                                           //成功,返回1

}

 

/*发送数据帧函数*/

voidSend_Data(uchartype,ucharlen,uchar*buf)

{

      uchari,tmp;

      ucharCheckSum=0;

      

      /*允许发送,禁止接收*/

      DE=1;

      RE=1;

      

      /*发送帧起始字节*/

      tmp=0x24;

      Send(tmp);

      

      Send(DevNo);                                   //发送地址字节,也即设备号

      CheckSum=CheckSum+DevNo;

 

      Send(type);                                              //发送类型字节

      CheckSum=CheckSum+type;

 

      Send(len);                                                //发送数据长度字节

      CheckSum=CheckSum+len;

 

      /*发送数据*/

      for(i=0;i

      {

             Send(*buf);

             CheckSum=CheckSum+*buf;

             buf++;

      }

      

      Send(CheckSum);                                    //发送校验和字节

 

      /*发送帧结束字节*/

      tmp=0x2A;

      Send(tmp);

}

 

/*采集数据函数经过简化处理,取固定的10个字节数据*/

voidGet_Stat(void)

{

      StatusBuf[0]=DATA0;

      StatusBuf[1]=DATA1;

      StatusBuf[2]=DATA2;

      StatusBuf[3]=DATA3;

      StatusBuf[4]=DATA4;

      StatusBuf[5]=DATA5;

      StatusBuf[6]=DATA6;

      StatusBuf[7]=DATA7;

      StatusBuf[8]=DATA8;

      StatusBuf[9]=DATA9;

}

 

/*发送单字节数据*/

voidSend(ucharm)

{

      TI=0;

      SBUF=m;

   while(!

TI);

      TI=0;   

}

 

/*清除设备状态信息缓冲区函数*/

voidClr_StatusBuf(void)

{

      uchari;

      for(i=0;i

             StatusBuf[i]=0;   

}   

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1