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

📄 uartsio2.h

📁 Fujitsu MB89P475的应用实例
💻 H
字号:
//The Uart use for 8 bit data length,
//2 bit stop,1200 baud
//Odd parity
//********************************************************************
//const 		TargetAddressCode[]={0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6};						//目标地址室内机1、2、3、4、5、6、7、8
const 			TargetAddressCode[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};						//目标地址室内机1、2、3、4、5、6、7、8
const 			LeadCode[]={0xaa,0x55,0xe7,0x18};






#define		OutRoomAddress		0xFF										//室外机地址
#define		OwnAddress			0x00										//线控器地址

#define		tUart2SendInterval			10                              //接收到数据后间隔发送的时间(Ms)
#define		SendLeadCode_s				4								//发送时引导码的个数
#define		RecevLeadCode_s				4								//接收时引导码的个数

//LedCode[4]是源地址(线控器地址)
UartProgram()
{
	if (UartSendingFlag) return;
	if	(UartReceivedFlag)			 			//数据没有接收完清除100MS计时器
		{
			if (tUart2SendInterval>=UartDelaySendTime) return;
			SourceAddress=OwnAddress;   //源地址
			InformationType=0;			//发送的数据类型为0
			UartLoadSendDataToIn();		//装载发送的数据
			CheckSumP();				//发送前计算校验和
			UART2_TIE=1;				//启动发送中断
		}
}





UartLoadSendDataToIn()
{
	Uart2BufClear();
	WDTC.byte=0x05;
	i=cUart2Send-1;
	CommandState=ModeRegister[i].byte;		//模式
/*
	if (InError[i]==9)
		{//模式冲突关闭当前室内机
			ModeRegister[i].byte |= 0x01;
			LcdClear3sFlag=0;	
			Time3SecondCounter=0;
		}				
*/
	if (TempErrorFlag)
		{CommandState &= 0x7f;}			//传感器故障时自动转到室内机传感器
	Uart2Buf[0]=FuctionRegister[i].byte;	//功能	
	Uart2Buf[1]=FanDoorAndSetTemp[i].byte;	//风门及设定温度
	Uart2Buf[2]=Command1[i].byte;			
	Uart2Buf[3]=A_DAverageValue;			//室内温度AD值
	
	Uart2Buf[4]=hiword(TimerOn[i]);
	Uart2Buf[5]=loword(TimerOn[i]);
	Uart2Buf[6]=hiword(TimerOff[i]);
	Uart2Buf[7]=loword(TimerOff[i]);
	Uart2Buf[8]=hiword(ValveOpen[i]);
	Uart2Buf[9]=loword(ValveOpen[i]);
	Uart2Buf[10]=NewIndoorNumber;			//新的室内机器编码
}

Uart2BufClear()
{//缓冲区清零
	for (i=0;i<16;i++)
	{Uart2Buf[i]=0;}
}


//计算校验和
CheckSumP()
{
	pointsend=&TargetAddress;				//
	if (UartSendTargetFlag)					//-----------------------	//发送给室内机的目标地址
		{TargetAddress=TargetAddressCode[cUart2Send];}	

	CheckSum=SourceAddress;						//------------------------------------>计算校验和时,第一个数是集控器的地址码
	for (j=0;j<19;j++)//(j=0;j<(&CheckSum-&TargetAddress);j++)
		{
			WDTC.byte=0x05;
			CheckSum += *pointsend;
			pointsend++;
		}
}

//****************************中断主程序*****************************************************

__interrupt void uart_sio2_int(void)
{
	if (UartReceivedFlag)
		{UART2_SendProgram();}
	else
		{UART2_ReceivProgram();}	
}
//*****************************************************************************************
//发送程序
UART2_SendProgram()
{
	unbyte i,j,k;
//----------------------------------------------------------------------------------------	
	if (!UartSendingFlag)
		{
			UartSendingFlag=1;
			pointsend=&SourceAddress;
			cUart2=0;
		}
	if (SendLeadCode_s>cUart2)	
		{//--------------------------------------------->发送引导码
			SIDR2.byte=LeadCode[cUart2];
			cUart2++;	
			return;
		}
	SIDR2.byte=*pointsend++;
	if (pointsend>=(&CheckSum+1))	
		{
			
			UART2_TIE=0;			//----------------->关闭发送
				
			UartSendingFlag=0;		//----------------->清除数据正在发送标志

			if (0==UartSendTargetFlag && IndoorTestOverFlag )//--------------->如果集控器正在给室外机发送指令,且没有检测到室不给室内机发信号
				{UartSendTargetFlag=1;UartDelaySendTime=0;return;}//------------->设置标志,给室外机发送完后直接给室内机发送指令
				
			UartSendTargetFlag=0;	
			
			UartReceivedFlag=0;		//----------------->清除数据接收完毕标志
			UART2_RIE=1;			//----------------->启动接收中断允许

//			cUart2Send++;
//			if (IndoorMacs<cUart2Send)//-------------->IndoorMacs是室内机个数,此宏定义在文件"Keypress.h"中
//				{cUart2Send=1;}
		}
}


	
UART2_ReceivProgram()
{
	unbyte i,j,k;
	if (!UartReceivingFlag)
		{
			UartReceivingFlag=1;
			pointreceiv = &SourceAddress;
			cUart2=0;
		}
//==========================================================================
	i=SSD2.byte;
	if (i&0xe0)	
		{									//接收数据出错处理
			UartReceivingFlag=0;
			UART2_RERC=0;					//清除所有错误标志
			i=SIDR2.byte;
			return;
		}
//===========================================================================		
	*pointreceiv=SIDR2.byte;	
	if (RecevLeadCode_s>cUart2)
		{	
			if (*pointreceiv!=LeadCode[cUart2])	//判断接收到的引导码是否正确,
					{UartReceivingFlag=0;}		//引导码错误重新接收								
			cUart2++;		
			return;
		}
	pointreceiv++;
//---------------------------------------------------------------------------	
	if (pointreceiv>=(&CheckSum+1))	
		{
			UartReceivingFlag=0;
//-------------------------------------------------
			pointreceiv=&SourceAddress;									//指针复位
			k=0;
//-------------------------------------------------			
			for (j=0;j<20;j++)//(j=0;j<(&CheckSum-&SourceAddress);j++)
				{k=k+*pointreceiv++;}
//--------------------------------------------------------------				
			if (k != CheckSum) {return;}				//接收校验和不对,退出	
//--------------------------------------------------------------			
			if (OwnAddress==TargetAddress && SourceAddress<17)	
					{//---------------------室内机发送给线控器的命令
						k=SourceAddress-1;
						if (MacNumEntOkFlag)
							{
								if (k != DisplayMachineOrder)
									{
											point= &Seg0_Seg1.byte;
												for (i=0;i<16;i++)
												{*point++ =0;}
											ModeRegister[k].byte=ModeRegister[DisplayMachineOrder].byte;
											FanDoorAndSetTemp[k].byte=FanDoorAndSetTemp[DisplayMachineOrder].byte;
											ValveOpen[k]=ValveOpen[DisplayMachineOrder];
											TimerOn[k]=TimerOn[DisplayMachineOrder];
											TimerOff[k]=TimerOff[DisplayMachineOrder];		
											InError[k]=InError[DisplayMachineOrder];
											FuctionRegister[k].byte=FuctionRegister[DisplayMachineOrder].byte;
											SetCoolHeartTemp[k].byte=SetCoolHeartTemp[DisplayMachineOrder].byte;
											
											ModeRegister[DisplayMachineOrder].byte=1;
											FanDoorAndSetTemp[DisplayMachineOrder].byte=129;
											ValveOpen[DisplayMachineOrder]=200;
											TimerOn[DisplayMachineOrder]=0;
											TimerOff[DisplayMachineOrder]=0;		
											InError[DisplayMachineOrder]=0;
											FuctionRegister[DisplayMachineOrder].byte=0x80;
											SetCoolHeartTemp[DisplayMachineOrder].byte=0x88;
											if (NewIndoorNumber)
											{
												BuzzerWorkNumber=3;
												NewIndoorNumber=0;
											}	
									}
								}
							DisplayMachineOrder=k;//收到室内机的命令则读取机器编码
							MacNumEntOkFlag=1;						//收到数据
							
							cUart2Send=SourceAddress;			//接收到室内机给线控器发的命令后,将线控器发送目标定为当前室内机	
							UartSendTargetFlag=1;				//设置此标志线控器一直向室内机发送命令
//							if (Uart2Buf[0]&0x40)				//确认室内机编号完成,且设置转移没完成
//								{MoveMode();}			
							InError[SourceAddress-1]=Uart2Buf[2];//读室内机故障
							ErrCode					=Uart2Buf[3];//室外机故障	
							TargetFrequency			=Uart2Buf[4];
							InInAirTemp				=Uart2Buf[5];//室内进风温度
							InOutAirTemp			=Uart2Buf[6];//室内出风温度
							InInExchangeTemp		=Uart2Buf[7];//室内进管温度
							InOutExchangeTemp		=Uart2Buf[8];//室内出管温度

							AIR_T					=Uart2Buf[9];
							HEAT_T_A				=Uart2Buf[10];
							DISCHARGE_T				=Uart2Buf[11];
							HpMPa_H					=Uart2Buf[12];
							HpMPa_L					=Uart2Buf[13];	
							OutCurrent				=Uart2Buf[14];
							OutValveOpenH			=Uart2Buf[15];

							ResSendProgram();
						}
		}
}


ResSendProgram()
{
	UartReceivedFlag=1;					//数据接收好标志
	UART2_RIE=0;						//禁止接收
	UartDelaySendTime=0;				//延时发送时间清零
}
//*****************************************************************************************

⌨️ 快捷键说明

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