标题:
单片机单项智能电表的RS485现场总线通信程序问题
[打印本页]
作者:
小菜鸟1
时间:
2020-4-11 22:27
标题:
单片机单项智能电表的RS485现场总线通信程序问题
我做的是单项智能电表的RS485现场总线通信与监控管理系统,目前需要我的单片机接收一个人的单片机,单片机之间使用串口通信,都stc89c52的,我需要接收他的数据,所以这一块的程序怎么写?加到我的程序的主函数么?还是怎么办?
#include"main.h"
uchar idata uart1_rec_buff[34];
uchar uart1_send_buff[21] = {0x01,0x03,0x10,'v','o','l','t','c','u','r',
'r','p','o','w','e','k','w','.','h','H','L'};
uchar reg1,reg2,reg3,date[11],*time,*balance;
void Init_Uart1() //初始化串口1
{
TMOD = (TMOD&0x0F)|0x20; //定时器1工作在方式2,8位自动重装
SCON = 0x50; //串口1工作在方式1,10位异步收发,REN=1允许接收
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
ET1 = 0;
EA = 1;
ES = 1;
IP = 0x10; //设置串口1中断为最高优先级
time = &(uart1_rec_buff[16]); //赋时间地址给指针time
balance = &(uart1_rec_buff[25]); //赋余额地址给指针balance
}
void Wait_Uart1_Send_Ok() //等待Uart1把这个字节发送完毕
{
while(TI == 0);
TI = 0;
}
void Uart1_Send_RTC_Data() //Uart1把所有实时数据发送给PC
{
uchar i;
for(i=0; i<21; i++)
{
SBUF = uart1_send_buff[i];
Wait_Uart1_Send_Ok(); //等待Uart2发送完毕
}
}
void Uart1_Processing() interrupt 4 //串口1对接收的数据进行处理
{
static uchar i;
if(RI)
{
RI = 0;
uart1_rec_buff[i++] = SBUF;
if(uart1_rec_buff[0] == 0x01) //检验地址
{
if(i > 1) //接收到地址和功能码之后,再做检验
{
if(uart1_rec_buff[1] == 0x03) //读保持寄存器功能码
{
if(i == 8) //接收完毕,此处可省略CRC校验
{
i = 0;
Get_Electric_Data(); //获取电能数据
Uart1_Send_RTC_Data(); //Uart1把所有实时数据发送给PC
}
}
else if(uart1_rec_buff[1] == 0x10) //写多个保持寄存器功能码
{
if( (i>25)&&(uart1_rec_buff[i-1]=='\0') ) //接收完毕,此处可省略CRC校验
{
reg1 = uart1_rec_buff[2]; //警报信号
reg2 = uart1_rec_buff[3]; //开关信号
reg3 = uart1_rec_buff[4]; //清零信号
for(i=0; i<11; i++)
{
date[i] = uart1_rec_buff[i+5];
}
i = 0;
}
}
if( (uart1_rec_buff[1]!=0x03)&&(uart1_rec_buff[1]!=0x10) )
{
i = 0;
}
}
}
else
{
i = 0;
}
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1