⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 这是一个单片机的项目
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 + -