RS485现场通信监测系统Word文件下载.docx

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

RS485现场通信监测系统Word文件下载.docx

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

RS485现场通信监测系统Word文件下载.docx

#ifndef 

_485MON_H 

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

#define 

_485MON_H

#include<

reg52.h>

 

//引用标准库的头文件

stdio.h>

string.h>

#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);

default:

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

}

}

/*初始化*/

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;

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个字节 

if(r_buf[1]!

=DevNo) 

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

if(r_buf[rCount-2]!

=CheckSum) 

//校验错误,返回0

*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;

/*发送数据*/

len;

i++) 

Send(*buf);

CheckSum=CheckSum+*buf;

buf++;

Send(CheckSum);

//发送校验和字节

/*发送帧结束字节*/

tmp=0x2A;

/*采集数据函数经过简化处理,取固定的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);

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

voidClr_StatusBuf(void)

uchari;

STATUSMAXLEN;

i++)

StatusBuf[i]=0;

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

当前位置:首页 > 医药卫生 > 临床医学

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

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