📄 main.c
字号:
#include <SM89516A.h>
#include <string.h>
#include <intrins.h>
#include <math.h>
#include "MyRam.h"
#include "ComRam.h"
#define uchar unsigned char
#define uint unsigned int
/**************************************公共RAM区地址分配*****************************************/
//公共RAM区从机采集数据包存储开始地址.
#define ComSlaveDataStart1 0x0000 //000H~2FFH 公共RAM区从机1的数据的开始地址.
#define ComSlaveLenAdd1 0x02FE //公共RAM区从机1数据字节数的存贮地址.
#define ComSlaveDataStart2 0x0300 //300H~5FFH 公共RAM区从机2的数据的开始地址.
#define ComSlaveLenAdd2 0x05FE //公共RAM区从机2数据字节数的存贮地址。
#define ComSlaveDataStart3 0x0600 //600H~8FFH 公共RAM区从机3的数据的开始地址.
#define ComSlaveLenAdd3 0x08FE //公共RAM区从机3数据字节数的存贮地址。
#define ComSlaveDataStart4 0x0900 //900H~BFFH 公共RAM区从机4的数据的开始地址.
#define ComSlaveLenAdd4 0x0BFE //公共RAM区从机4数据字节数的存贮地址。
#define ComSlaveDataStart5 0x0C00 //C00H~EFFH 公共RAM区从机5的数据的开始地址.
#define ComSlaveLenAdd5 0x0EFE //公共RAM区从机5数据字节数的存贮地址。
/*******从机的报警区********/
#define ComAlarmStart1 0x1000 //1000H-10FDH 公共RAM区从机1报警的起始地址。
#define ComAlarmLenAdd1 0x10FE //10FEH-10FFH 公共RAM区从机1报警数据总长度的存储地址。
#define ComAlarmStart2 0x1100 //1100H-10FDH 公共RAM区从机2报警的起始地址。
#define ComAlarmLenAdd2 0x11FE //11FEH-11FFH 公共RAM区从机2报警数据总长度的存储地址。
#define ComAlarmStart3 0x1200 //1200H-12FDH 公共RAM区从机3报警的起始地址。
#define ComAlarmLenAdd3 0x12FE //12FEH-12FFH 公共RAM区从机3报警数据总长度的存储地址。
#define ComAlarmStart4 0x1300 //1300H-13FDH 公共RAM区从机4报警的起始地址。
#define ComAlarmLenAdd4 0x13FE //13FEH-13FFH 公共RAM区从机4报警数据总长度的存储地址。
#define ComAlarmStart5 0x1400 //1400H-14FDH 公共RAM区从机5报警的起始地址。
#define ComAlarmLenAdd5 0x14FE //14FEH-14FFH 公共RAM区从机5报警数据总长度的存储地址。
//公共RAM区从机命令数据包存放开始地址.
#define ComOrderStart 0x1500 //1500H~4FFFH 公共RAM区发给从机命令的起始地址。
#define ComLenOrder 0x4FFE //公共RAM区从机命令字节数的存贮RE认为》256N。
#define ComNewOrderFlag 0x4FFD //公共RAM区有新从机命令的标识位。
//公共RAM区从机时间命令数据包存放开始地址.
#define ComTimeStart 0x5000 //5000H~50FFH 公共RAM区日期和时间的其实地址。
#define ComLenTimer 0x50FE //公共RAM区时间字节数存贮地址。
//公共RAM区输出数据包存放开始地址.
#define ComOutputStart 0x5100 //5100H~6FFFH 公共RAM区发给输出单片机的起始地址。
#define ComLenOutput 0x6FFE //公共RAM区输出字节数存贮地址。
//公共RAM区从机使能数据包存放开始地址.
#define ComSlaveEnable 0x7500 //公共RAM区从机使能数据包存贮地址.
#define ComLenSlaveEnable 0x7510 //公共RAM区从机使能数据包状态标识存贮地址.
#define ComSlaveEnableNewFlag 0x7511 //公共RAM区从机使能数据包状态标识存贮地址.
/**************************************公共RAM区地址分配*****************************************/
/**************************************主机RAM区地址分配*****************************************/
//主机自带RAM区从机采集数据包存储开始地址.
#define MySlaveDataStart1 0x0000 //000H~2FFH 自带RAM区从机1的数据的开始地址.
#define MySlaveLenAdd1 0x02FE //自带RAM区从机1数据字节数的存贮地址.
#define MySlaveDataStart2 0x0300 //300H~5FFH 自带RAM区从机2的数据的开始地址.
#define MySlaveLenAdd2 0x05FE //自带RAM区从机2数据字节数的存贮地址.
#define MySlaveDataStart3 0x0600 //600H~8FFH 自带RAM区从机3的数据的开始地址.
#define MySlaveLenAdd3 0x08FE //自带RAM区从机3数据字节数的存贮地址.
#define MySlaveDataStart4 0x0900 //900H~BFFH 自带RAM区从机4的数据的开始地址.
#define MySlaveLenAdd4 0x0BFE //自带RAM区从机4数据字节数的存贮地址.
#define MySlaveDataStart5 0x0C00 //C00H~EFFH 自带RAM区从机5的数据的开始地址.
#define MySlaveLenAdd5 0x0EFE //自带RAM区从机5数据字节数的存贮地址.
//主机自带RAM区从机命令数据包存放开始地址.
#define MyOrderStart 0x1000 //1000H~3FFFH 自带RAM区发给从机命令的起始地址.
#define MyLenOrder 0x3FFE //自带RAM区从机命令字节数的存贮RE认为》256N
//主机自带RAM区从机时间命令数据包存放开始地址.
#define MyTimeStart 0x4000 //4000H~40FFH 自带RAM区日期和时间的起始地址.
#define MyLenTimer 0x40FE //自带RAM区时间字节数存贮地址。
//主机自带RAM区输出数据包存放开始地址.
#define MyOutputStart 0x4100 //4100H~5FFFH 自带RAM区发给输出单片机的起始地址.
#define MyLenOutput 0x5FFE //自带RAM区输出字节数存贮地址。
/**************************************主机RAM区地址分配*****************************************/
/**************************************主机RAM区从机信息*****************************************/
//从机1外设通道参数信息存放开始地址。
#define Slave1Ws1ChannelInfo 0x6000 //
#define Slave1Ws2ChannelInfo 0x6100
#define Slave1Ws3ChannelInfo 0x6200
#define Slave1Ws4ChannelInfo 0x6300
#define Slave1Ws5ChannelInfo 0x6400
//从机2外设通道参数信息存放开始地址。
#define Slave2Ws1ChannelInfo 0x6500 //
#define Slave2Ws2ChannelInfo 0x6600
#define Slave2Ws3ChannelInfo 0x6700
#define Slave2Ws4ChannelInfo 0x6800
#define Slave2Ws5ChannelInfo 0x6900
//从机3外设通道参数信息存放开始地址。
#define Slave3Ws1ChannelInfo 0x6500 //
#define Slave3Ws2ChannelInfo 0x6600
#define Slave3Ws3ChannelInfo 0x6700
#define Slave3Ws4ChannelInfo 0x6800
#define Slave3Ws5ChannelInfo 0x6900
//从机4外设通道参数信息存放开始地址。
#define Slave4Ws1ChannelInfo 0x6A00 //
#define Slave4Ws2ChannelInfo 0x6B00
#define Slave4Ws3ChannelInfo 0x6C00
#define Slave4Ws4ChannelInfo 0x6D00
#define Slave4Ws5ChannelInfo 0x6E00
//从机5外设通道参数信息存放开始地址。
#define Slave5Ws1ChannelInfo 0x6F00 //
#define Slave5Ws2ChannelInfo 0x7000
#define Slave5Ws3ChannelInfo 0x7100
#define Slave5Ws4ChannelInfo 0x7200
#define Slave5Ws5ChannelInfo 0x7300
/**************************************主机RAM区从机信息*****************************************/
//主机自带RAM区从机使能数据包存放开始地址.
#define MySlaveEnable 0x7500 //公共RAM区从机使能数据包存贮地址。
#define MyLenSlaveEnable 0x7510 //公共RAM区从机使能数据包长度存贮地址.
#define MySlaveEnableNewFlag 0x7511 //公共RAM区更新从机使能数据包状态标识.
/******从开始地址固定读5个字节********/
#define MyChannelInfoStart 0x7600
#define MyLenChannelInfo 0x7DEE
/**************************************服务器命令数据包接收信息**********************************/
//接收状态。
#define InitState 0 //开始接收状态。
#define CommandState 1 //命令包状态。
#define DataState 2 //数据状态。
//数据包头及数据包长度。
#define StartFlag 0x2A //包开始标识。
#define CmdWs 0xA1 //外设参数数据包。
#define LenCmdWs 0x10 //外设参数数据包长度。
#define CmdSlave 0xA2 //从机参数数据包。
#define LenCmdSlave 0x08 //从机参数数据包长度。
#define CmdTime 0xA3 //时间同步数据包。
#define LenCmdTime 0x09 //时间同步数据包长度。
#define CmdAlarm 0xA4 //联动配置表数据包。
#define LenCmdAlarm 0x05 //联动配置表数据包长度。
#define CmdWsControl 0xA5 //外设控制数据包。
#define LenCmdWsControl 0x05 //外设控制数据包长度。
#define CmdChannelPara 0xA6 //通道参数数据包。
#define LenCmdChannelPara 0x09 //通道参数数据包长度。
#define CmdGetChannelPara 0xA7 //取通道参数数据包。
#define LenCmdGetChannelPara 0x05 //取通道参数数据包长度。
#define CmdSlaveEnable 0xA8 //从机使能数据包。
#define LenCmdSlaveEnable 0x07 //从机使能数据包。
#define CmdSendSlave 0xB1 //提交从机数据数据包。
#define LenCmdCmdSendSlave 0x07 //从机使能数据包。
/**************************************服务器命令数据包接收信息**********************************/
/**************************************拷贝数据最大长度定义**************************************/
#define MaxOrderLen 0x6FD
#define MaxSlaveDataLen 0x230
#define MaxGetChannelParaLen 0x7ED
#define MaxAlarmLen 0xFD
/**************************************拷贝数据最大长度定义**************************************/
/******************************************从机IIC使用信息***************************************/
sbit P20 = P2^0; //用来通知仲裁机IIC使用全释放的信号线。
/******************************************从机IIC使用信息***************************************/
/******************************************定时器相关信息****************************************/
#define MAX 200 //定时器的倍频。
bit FlagTime0 = 0; //定时器0到的标志。
uint TimeCount = 0; //定时器的次数。
uchar TimeCountSend = 0; //定时器的次数。
/******************************************定时器相关信息****************************************/
/******************************************全局公共数据区域**************************************/
#define NUM1 150 //拷贝的数组缓冲区的大小。
#define LEN 20 //串口缓冲区大小。
#define DelayTime 5
/******************************************全局公共数据区域**************************************/
/******************************************标识位定义信息****************************************/
bit FlagCmdWsControl = 0; //命令已保存的标志。
bit FlagSaveSerial = 0; //命令已保存的标志。
bit FlagExt0 = 0; //外部中断0的标志。
bit FlagOrderSaved = 1; //命令已保存的标志。
bit FlagSendSlaveData =0 ; //发送从机命令
bit FlagExtInterrupt = 0;
bit FlagMainFirstExtInterrupt = 0;
/******************************************标识位定义信息****************************************/
/******************************************其它变量相关******************************************/
uchar RecvCount = 0; //串口中断里的计数。
uchar RecvState = InitState; //接收的状态。
uchar RecvSize = 0; //需要接收的数据长度。
xdata uchar RecvOrderBuff[LEN]; //串口接受缓冲区。
xdata uchar CopyToComRamBuff[NUM1];
xdata uchar CopyToMyRamBuff[NUM1];
xdata uchar SendSlaveDataBuff[NUM1];
uchar TimesCount = 0;
/******************************************其它变量相关******************************************/
uchar code valid_cmd[256]={ // 如果输入命令有效则为1,为了验证数据包的有效性。
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 00 - 0F
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 10 - 1F
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20 - 2F
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 30 - 3F
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 40 - 4F
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 50 - 5F
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 60 - 6F
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 70 - 7F
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 80 - 8F
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 90 - 9F
0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, // A0 - AF
0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // B0 - BF
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // C0 - CF
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // D0 - DF
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // E0 - EF
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // F0 - FF
};
/****************************************************************************************
功能:Delay
描述:延时函数
参数:t
返回:无
****************************************************************************************/
void Delay(uint t)
{
while(t!=0)
t--;
}
/****************************************************************************************
功能:InitSerialComm
描述:串口初始化
参数:无
返回:无
****************************************************************************************/
void InitSerialComm(void)
{
SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x21; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80; //SMOD=1;
TH1 = 0xF3; //Baud:4800 fosc=12MHz
IE |= 0x93; //Enable Serial Interrupt
TR1 = 1; // timer 1 run
IT0 = 1;
// TI=1;
}
/*****************************************************************************************
功能:Time0Initial()
描述:定时器0初始化,主要设定初值
参数:无
返回:无
*****************************************************************************************/
void Time0Initial()
{
TR0=0;
TH0=0x3C; //50ms
TL0=0xB0;
TR0=1;
}
/*****************************************************************************************
功能:Time0
描述:产生定时器0中断
参数:无
返回:无
*****************************************************************************************/
void Time0() interrupt 1 using 2
{
TimeCount++;
if(TimeCount >= MAX)
{
FlagTime0=1;
TimeCount = 0;
}
Time0Initial();
}
/****************************************************************************************
功能:SendCharCom
描述:向串口发送一个字符
参数:ch
返回:无
****************************************************************************************/
void SendCharCom(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
/****************************************************************************************
功能:SendStringCom
描述:向串口发送一个字符串,strlen为该字符串长度
参数:str---要发送的字符串指针 strlen---字符串长度
返回:无
****************************************************************************************/
void SendStringCom(unsigned char *str,unsigned int strlen)
{
unsigned int k=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -