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

📄 slave.c

📁 这是一个单片机的项目
💻 C
📖 第 1 页 / 共 5 页
字号:
xdata uchar  RecvDataBuff[60];   //外设数据的接收数组,应大于56。
xdata uchar  SendBuff[4];        //发送读取外设数据的命令数组。
/******************************************从机分配的数组**************************************************/

/***********************************************************************************************************
功能:Delay
描述:延时函数
参数:t
返回:无
************************************************************************************************************/
void Delay(uint t)     /*延时函数*/
{
    while(t!=0)
        t--; 
}

/***********************************************************************************************************
功能:InitSerialCom
描述:串口初始化
参数:无
返回:无
************************************************************************************************************/
void InitSerialCom(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)
	  {
	      TimeCount=0;
		  FlagTime0=1;
	  }
      Time0Initial();
}

/***********************************************************************************************************
功能:SendCharCom
描述:向串口发送一个字符 
参数:t
返回:无
************************************************************************************************************/
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;
    while( (k < strlen) && (strlen > 0) )
    {
        SendCharCom(*(str + k));
        k++;
    }
}

/***********************************************************************************************************
功能:Extern0;产生外部中断0,是仲裁机分配IIC使用权的。
描述:FlagMutex---用于隔离外部中断,假如一次外部中断没有执行完,不能响应下一次外部中断;
     FlagExt0---外部中断期间标志;P20---保证IIC使用权已经完全释放才可以再次响应。
参数:无
返回:无
************************************************************************************************************/
void EXT0() interrupt 0 using 1
{ 
   if((FlagExt0 == 0) && (P20 == 1))
   {
       FlagExt0 = 1;
   }
}

/***********************************************************************************************************
功能:ClearMyRom
描述:清零字节数存储地址
参数:无
返回:无
************************************************************************************************************/
void ClearMyRam(uint address)
{
    MyWriteOneByte(address,0x00);
	MyWriteOneByte(address+1,0x00);
}

/***********************************************************************************************************
功能:SetDataBytes
描述:设置自带RAM的字节长度
参数:address---存放长度的地址 len---长度值
返回:无
************************************************************************************************************/
void SetMyDataBytes(uint address,uchar len)
{
	uint num;
	xdata uchar temp[2];
	MyReadBytes(address,temp,2);
	num = temp[0] + temp[1] * 0x100 + len;  
	temp[0]=num%256;
	temp[1]=num/256;  
    MyWriteBytes(address,temp,2);
}

/***********************************************************************************************************
功能:GetMyDataBytes
描述:得到自带RAM里的数据字节数
参数:address---存放长度的地址
返回:uint
************************************************************************************************************/
uint GetMyDataBytes(uint address)
{
	uint num;
	xdata uchar temp[2] = {0x00,0x00};
	MyReadBytes(address,temp,2);
	num = temp[0] + temp[1] * 0x100;
	return num;
}

/***********************************************************************************************************
功能:ClearComRam
描述:清零字节数存储地址
参数:address---需要清零的地址
返回:无
************************************************************************************************************/
void ClearComRam(uint address)
{
    ComWriteOneByte(address,0x00);
	ComWriteOneByte(address+1,0x00);
}

/***********************************************************************************************************
功能:SetComDataBytes;设置字节数的函数
描述:设置公共RAM的字节长度。是先读出长度,再累加一个需要设置的长度。
参数:address---需要设置字节数的地址;len---需要设置的长度。
返回:无
************************************************************************************************************/
void SetComDataBytes(uint address,uchar len)
{
	uint num;
	xdata uchar temp[2];
	ComReadBytes(address,temp,2);
	num = temp[0] + temp[1] * 0x100 + len;   
	temp[0]=num%256;
	temp[1]=num/256;
    ComWriteBytes(address,temp,2);
}

/***********************************************************************************************************
功能:GetComDataBytes;取到字节数的函数
描述:取得公共RAM里的数据字节数
参数:address---存放字节数的地址
返回:uint
************************************************************************************************************/
uint GetComDataBytes(uint address)
{
	uint num;
	xdata uchar temp[2] = {0x00,0x00};

	ComReadBytes(address,temp,2);
	num = temp[0] + temp[1] * 0x100;
	return num;
}

/***********************************************************************************************************
功能:ProcessOrders,处理上位机发来的数据包。
描述:从自己的RAM读取并处理接收到的命令字节,当为Ws命令时,每个通道的最大值(2Bytes),最小值(2Bytes),超高报警
     号(2Bytes),超低报警号(2Bytes),通道使能,(1Bytes),超高报警动作号(1Bytes),超低报警动作号(1Bytes)。  
     如果已知外设i ,通道j,则对应存储的位置为:
	 1000H +(i-1) *100H+ j *10H。
参数:无
返回:无
************************************************************************************************************/
void ProcessOrders()
{
   xdata uchar ProcessBuff[PROCESSLEN]; 
   uchar StarTemp,BagFlagTemp,SlaveAddrTemp; //前3个字节用来判断
   uchar Len;                                //除去首三个字节的其它字节总数
   uchar ws,channel;                         //外设号,通道号
   uint address2;                            //外设信息地址
   uint length;
   uint address1 = MyOrderStart;     //address1---命令的起始保存地址,length---保存命令包的总长度

   length=GetMyDataBytes(MyOrderLen);        //先从MyOrderLen取出命令数据包的长度

   if(length > 0)                            //判断length的有效性
   {
       for(;address1 < MyOrderStart+length;) //如果没有处理完,继续处理
       {
          StarTemp=MyReadOneByte(address1);  //先读取第一个字节,取出开始字符
          if(StarTemp==StartFlag)            //若第一个字节是开始字符2A
	      {
	          address1++;                            //地址向后移一个字节
   	          BagFlagTemp=MyReadOneByte(address1);   //读取下一个字节,取出包标识
              address1++;                            //地址向后移一个字节
   	          SlaveAddrTemp=MyReadOneByte(address1); //读出从机号

	          if(SlaveAddrTemp==SlaveCode)          //若是从机1的数据包
		      {
		           switch(BagFlagTemp)               //判断包标识
	               {
	   	               case CmdWs:                   //若是外设参数包
		                    address1++;              //地址向后移一个字节
					        Len=LenCmdWs-3;          //取出除掉前3个字节之后的包的长度。
		                    MyReadBytes(address1,ProcessBuff,Len); //然后把包读到ProcessBuff中。							
					        ws=ProcessBuff[0];                     //取出外设号
                            channel=ProcessBuff[1];                //取出通道号
					        address2=Ws1channel1+ (ws - 1) * 0x100+ channel * 0x10; //计算保存参数地址的地址
                            MyWriteBytes(address2,ProcessBuff+2,Len-2);       //指针应指向ProcessBuff[2]的地址,写到相应的地址中去。                            
					        address1+=Len;          //更新地址
					        break;
                       case CmdSlave:               //若是从机参数包
		                    address1++;             //地址向后移一个字节
					        Len=LenCmdSlave-3;      //取出除掉前3个字节之后的包的长度。
		                    MyReadBytes(address1,ProcessBuff,Len);//然后把包读到ProcessBuff中。
							if((ProcessBuff[0] >= 0x01) && (ProcessBuff[0] <= 0x03))
							{
							   BodeRate=ProcessBuff[0]; //取出波特率0x01-2400,0x02-4800,0x03-9600
							   MyWriteOneByte(MySlaveParaStart,BodeRate); //保存波特率
							}
					        if((ProcessBuff[1] == 0x01) || (ProcessBuff[1] == 0x02))
							{
							   WsType=ProcessBuff[1];   //取出外设类型0x01---7017,0x02---7053
							   MyWriteOneByte(MySlaveParaStart+1,WsType); //保存外设类型
							   if(WsType == WsType1)       //如果外设是7017,则RecvDataSize==56。
	                           {
	                               RecvDataSize = LenRecvWsType1;
	                            }
	                            else if(WsType == WsType2)  //如果外设是7053,则RecvDataSize==4。
	                            {
	                                 RecvDataSize = LenRecvWsType2;
	                            }
							  }
                            if((ProcessBuff[2] >= 0x01) && (ProcessBuff[2] <= 0x05))
							{
							   WsNumber=ProcessBuff[2]; //取出外设个数
							   MyWriteOneByte(MySlaveParaStart+2,WsNumber); //保存外设个数
							}
                            ReadDataRate=ProcessBuff[3] * 0x100 + ProcessBuff[4]; //取出读外设数据的速率
                            address1+=Len;   //更新地址
							MyWriteOneByte(MySlaveParaStart+3,ReadDataRate/0x100); //保存读外设数据的速率 
							MyWriteOneByte(MySlaveParaStart+4,ReadDataRate%0x100); //保存读外设数据的速率
							FlagReInit = 1;  //从机初始化标志,标识从机的参数包已经处理,可以执行新的从机参数设置操作了。
					        break;       
	                   case CmdWsControl:                          //若是外设控制包.
		                    address1++;                            //地址向后移一个字节.
					        ws= MyReadOneByte(address1);           //取出外设编号.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -