好文档 - 专业文书写作范文服务资料分享网站

RS485使用手册与指南

天下 分享 时间: 加入收藏 我要投稿 点赞

广州周立功单片机发展有限公司 Tel:(020)38730977 38730977 Fax:38730925 http://www.zlgmcu.com

时如果要通过总线发送数据,应准备好发送数据缓存器的内容,启动发送程序,发送完毕时清除接收事件发生标志。

开始程序初始化接收帧事件发生吗?Y是本机地址吗?Y密码修改命令吗?NN其他命令吗?Y执行其他命令YNN密码正确吗?置发送缓存相应数据w.ww发送数据帧结束d15.jp存取修改的密码?tenYN清除接收事件帧标志

图 1-27 命令执行流程图

1.1.6 数据发送部分

本程序的数据发送部分是在主程序中执行的。

30

广州周立功单片机发展有限公司 Tel:(020)38730977 38730977 Fax:38730925 http://www.zlgmcu.com

发送程序开始置发送状态发送数据长度字节发送2 ~3个前导字节发送数据域发送帧头发送校验字节发送地址域 (A0 ~A5 )发送帧尾发送帧头打开接收中断 ,置接收状态发送命令字节发送程序结束图 1-28 发送程序流程图

1.1.7

RS-485程序清单

/********************************************************************************

此程序是RS-485从机通讯,包含3部分:接收帧程序、发送帧程序及执行命令程序。 从机通讯地址储存在E2PROM的0x00~0x05中,密码在0x06~0x09。 程序是参照电能表通讯规约编写的,选择P89LPC931单片机,内部振荡源

w

.ww

d15.jpten Serial.C

********************************************************************************/ #include

#include /*I2C通讯程序包,www.zlgmcu.com网站下载*/

/*宏定义*/

#define uchar unsigned char #define uint unsigned int

/*通讯变量定义*/

sbit CTRL485=P1^7; #define BRGR0_DATA 0xf0 #define N

31

32

/*通讯缓存区长度*/ /*定义通讯缓存区*/

uchar idata Serial_buf[N];

/ *RS-485切换控制信号*/ /*波特率1200bps*/

#define BRGR1_DATA 0x17

广州周立功单片机发展有限公司 Tel:(020)38730977 38730977 Fax:38730925 http://www.zlgmcu.com

===

/*数据结构: 地址域A0A1A2A3A4A5共6个,命令字节1个,长度字节1个,

=

数据区(标识符2个,密码,数据)*/

/*主程序变量定义*/

#define CAT24W08 0xa8 /*E2PROM的I2C地址*/ uchar data Command_status1=0x00;

/*程序运行状态字节*/

=

= 延时函数 =

原型:void Delay_T(uchar); 功能:延时1ms*i

入口参数: i是设定延时时间

出口参数:无

=/********************************************************************

********************************************************************/

void Delay_T(uchar i)

{

uint j;

= for(;i>0;i--)

for(j0;j<700;j++);/*1ms*/ }

CPU各个部件的初始化函数 原型:void Ini_CPU(); 功能:初始化CPU各个部件 入口参数:无 出口参数:无

/********************************************************************

********************************************************************/

void Ini_CPU() { P1M1&=0x7e;

w.ww

d15.jpten/*设置P1.0,P1.7为推挽输出,P1.1为输入状态*/

P1M2|0x81; P1M1|0x02; P1M2&0xfd; Delay_T(100); /*延时100ms,以稳定CPU*/

CTRL485=1; /*485通讯为接收状态*/

PCON&0x3f; /*UART设置工作方式3,11位数据*/

/*串口初始化*/

SCON=0xd0; SSTAT0x00; BRGCON0x00; /*装入波特率常数,1200bps*/ BRGR1=BRGR1_DATA; BRGR0BRGR0_DATA; BRGCON0x03;

32

本页已使用福昕阅读器进行编辑。福昕软件(C)2005-2009,版权所有,仅供试用。广州周立功单片机发展有限公司 Tel:(020)38730977 38730977 Fax:38730925 http://www.zlgmcu.com

}

/******************************************************************** 接收一个字节通讯函数 原型:uchar Receive_Data();

ESR=1;

===

/*启动接收状态*/

=

=功能:接收一个字节通讯

入口参数:无 出口参数:返回接收值

********************************************************************/

uchar Receive_Data()

{

RI0;

while(!RI); RI0;

ACCSBUF; = if(P!RB8) /*偶校验正确吗?*/

={ =

=/*错误返回*/ SP--;SP--;CY0;return CY; } =

return (ACC);

/*接收一个字节,并进行偶校验*/

}

/******************************************************************** 接收一帧通讯函数 原型:void Receive_One(uchar *); 功能:接收一帧通讯 入口参数:接收存取地址指针

出口参数:接收正确标志,1为接收正确

w.wwd15.jpten********************************************************************/ bit Receive_One(uchar *s)

{

uchar CS0x00,Serial_data; char i,j; RI0; Serial_data=SBUF;

/*接收第一字节*/ /*不是前导字节*/

while(Serial_data!=0xfe)

return 0;

do

/*是前导字节,继续查询*/ Serial_dataReceive_Data(); while(Serial_data0xfe); /*是前导字节吗?*/

if(Serial_data!=0x68) /*是帧头吗?*/

return 0; CS+=0x68;

33

本页已使用福昕阅读器进行编辑。福昕软件(C)2005-2009,版权所有,仅供试用。广州周立功单片机发展有限公司 Tel:(020)38730977 38730977 Fax:38730925 http://www.zlgmcu.com

===

for(i0;i<5;i++) /*接收电表通讯地址*/

{ *(s+i)Receive_Data(); CS+*(s+i); }

if(Receive_Data()!0x68) /*是数据帧头吗?*/

=return 0;

CS+=0x68;

/*接收通讯命令*/ CS+(*(s+6)Receive_Data());

j*(s+7)Receive_Data(); /*接收通讯数据长度*/

CS+=j;

for(i0;i<(j-1);i++) /*接收N个数据*/

{

CS+(*(s+i+8)=Receive_Data());

= *(s+i+8)-0x33; } =

if(CS!Receive_Data()) /*校验正确吗?*/

=

return 0;

= if(Receive_Data()!0x16) /*是帧尾吗?*/ =return 0;

=0; = ESR

/*一帧接收成功,关闭接收通讯,处理一帧完后再打开*/ =return 1; =

==}

=

=/********************************************************************

= 串口接收中断服务程序

=功能:接收数据

********************************************************************/ ==

void RXD_Int(void) interrupt 4

{

CYReceive_One(Serial_buf); if(CY)

/*一帧接收成功,通知主程序进行通讯处理*/ Command_status1|0x04; }

/******************************************************************** 串口发送一个字节 功能:发送一个字节数据 入口参数:发送数据 出口参数:无

w.wwd15.jpten********************************************************************/

void Send_Data(uchar Serial_data)

{

ACCSerial_data; TB8P;TI0;

34

RS485使用手册与指南

广州周立功单片机发展有限公司Tel:(020)3873097738730977Fax:38730925http://www.zlgmcu.com时如果要通过总线发送数据,应准备好发送数据缓存器的内容,启动发送程序,发送完毕时清除接收事件发生标志。开始程序初始化接收帧事件发生吗?Y是本机地址吗?Y密码修改命令吗?NN其他命令吗?Y
推荐度:
点击下载文档文档为doc格式
4yr5b96mxg8n6j487kif
领取福利

微信扫码领取福利

微信扫码分享