广州周立功单片机发展有限公司 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
/*宏定义*/
#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