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

📄 plc_demo.c

📁 该原代码应用在cpu(st89le516AD+)上,控制GPRS模块sim100,通过检测系统状态(通电状态,运行状态,AD采样值),通过GPRS模块的短信功能,实现无线报警.
💻 C
📖 第 1 页 / 共 5 页
字号:
		SendByte(suba1);            /*发送器件子地址1*/
		 if(ack==0)	return(0xFF);
		
		Start_I2c();
		SendByte(sla+1);
		  if(ack==0)return(0xFF);
		
		s=RcvByte();
					   	
		Ack_I2c(1);                 /*发送非应位*/
		Stop_I2c();                    /*结束总线*/
		return(s);
}

/*--------------------------------------------------
Initialize
初始化硬件以及寄存器,全局变量
--------------------------------------------------*/
void Initialize()
{
	unsigned char i, ch;
	
	
	/*初始化硬件参数,寄存器等等*/
	Init_CPU();	
	Init_16c550();

	Init_SRAM();			//Write Title into SRAM
	
	/*初始化全局变量*/

/*	PCTxBuffer = SRAM_BASEADDR + 0x200;
	PCRxBuffer = SRAM_BASEADDR + 0x600;
	ModuleTxBuffer = SRAM_BASEADDR + 0xa00;
	ModuleRxBuffer = SRAM_BASEADDR + 0xe00;
*/	
	PCTxBuffer = 0xc200;
	PCRxBuffer = 0xc600;
	ModuleTxBuffer = 0xca00;
	ModuleRxBuffer = 0xce00;
	
	Init_LCD();
	Display_LCD( LCD_Title );

	DelayCount = 0;
 	while( DelayCount < 10000 );
 	DelayCount = 0;

	Display_LCD( Sys_Title );

	PowerOffFlag = 0;
	PCDisconnectFlag = 0;
	RePowerOffFlag = 0;
	RePCDisconnectFlag = 0;
	memset(PCTxBuffer, 0, LINE_LENGTH);
	memset(PCRxBuffer, 0, LINE_LENGTH);
	memset(ModuleTxBuffer, 0, LINE_LENGTH);
	memset(ModuleRxBuffer, 0, LINE_LENGTH);
	memset( Phone1, 0, 32 );
	memset( Phone2, 0, 32 );
	EEPR_AT_data = 1;
	EEPR_DT_data = 5;
	ModuleWaitFlag = 0;
	DelayCount = 0;
	ModuleSendDelayCount = 0;
	Initialized = 0;
	ModuleReceiveCount = 0;
	PCReceiveCount = 0;
	PCWaitFlag = 0;
	ModuleTxCount = 0;
	PCTxCount = 0;
	PCConnectCount = 0;
	Sms_edit_mode = 0;
	Sms_send_type = 0;
	PowerOffDelayCount = 0;
	ConnectSmsHasSent = 0;
	PowerSmsHasSent = 0;
	LCDRefreshFlag = 0;
	LedFlashFlag = 0;
	LedFlashCount = 0;
	ReceiveSMSFlag = 0;

	/* EEProm data safe check */
	ch = 0;
	ch = ReadEEPROMonebyte( FIR_PHONE_NUMBER_ADDR );
	if( ch > 32 )
	{
		WriteEEPROMonebyte( FIR_PHONE_NUMBER_ADDR, 1 );
		DelayCount = 0;
		while( DelayCount < 100 );
		ch = ReadEEPROMonebyte( FIR_PHONE_NUMBER_ADDR + 1 );
		if( ch < 0x30 || ch > 0x39 )
		{
			WriteEEPROMonebyte( FIR_PHONE_NUMBER_ADDR+1, '1' );
			DelayCount = 0;
			while( DelayCount < 100 );
			
		}
	}

	ch = 0;
	ch = ReadEEPROMonebyte( SEC_PHONE_NUMBER_ADDR );
	if( ch > 32 )
	{
		WriteEEPROMonebyte( SEC_PHONE_NUMBER_ADDR, 1 );
		DelayCount = 0;
		while( DelayCount < 100 );
		ch = ReadEEPROMonebyte( SEC_PHONE_NUMBER_ADDR + 1 );
		if( ch < 0x30 || ch > 0x39 )
		{
			WriteEEPROMonebyte( SEC_PHONE_NUMBER_ADDR+1, '1' );
			DelayCount = 0;
			while( DelayCount < 100 );
			
		}
	}
	
	ch = ReadEEPROMonebyte( SEC_PHONE_NUMBER_ADDR );
	if( ch > 32 )
	{
		WriteEEPROMonebyte( SEC_PHONE_NUMBER_ADDR, 1 );
		DelayCount = 0;
		while( DelayCount < 100 );
		ch = ReadEEPROMonebyte( SEC_PHONE_NUMBER_ADDR + 1 );
		if( ch < 0x30 || ch > 0x39 )
		{
			WriteEEPROMonebyte( SEC_PHONE_NUMBER_ADDR+1, '1' );
			DelayCount = 0;
			while( DelayCount < 100 );
			
		}
	}

	ch = ReadEEPROMonebyte( DISCONNECT_TIME_ADDR );
	if( ch < 1 || ch > 10 )
	{
		WriteEEPROMonebyte( DISCONNECT_TIME_ADDR, 5 );
		DelayCount = 0;
		while( DelayCount < 100 );
		
	}
	
	ch = ReadEEPROMonebyte( SMS_SEND_TINE_ADDR );
	if( ch < 1 || ch > 3 )
	{
		WriteEEPROMonebyte( SMS_SEND_TINE_ADDR, 1 );
		DelayCount = 0;
		while( DelayCount < 100 );
		
	}

	ch = ReadEEPROMonebyte( NETDOG_POWER_OPEN_ADDR );
	if( ch != 1 && ch != 0 )
	{
		WriteEEPROMonebyte( NETDOG_POWER_OPEN_ADDR, 0 );
		DelayCount = 0;
		while( DelayCount < 100 );
		
	}
	
	ch = ReadEEPROMonebyte( NETDOG_CONNECT_OPEN_ADDR );
	if( ch != 1 && ch != 0 )
	{
		WriteEEPROMonebyte( NETDOG_CONNECT_OPEN_ADDR, 0 );
		DelayCount = 0;
		while( DelayCount < 100 );
		
	}

	ch = ReadEEPROMonebyte( USE_NAME_OPEN_ADDR );
	if( ch != 1 && ch != 0 )
	{
		WriteEEPROMonebyte( NETDOG_CONNECT_OPEN_ADDR, 0 );
		DelayCount = 0;
		while( DelayCount < 100 );
		
	}
	
	DelayCount = 0;
	NetFoxPowerOpenFlag =  ReadEEPROMonebyte( NETDOG_POWER_OPEN_ADDR );
	NetFoxConnectOpenFlag = ReadEEPROMonebyte( NETDOG_CONNECT_OPEN_ADDR );
	NetFoxUseNameOpenFlag = ReadEEPROMonebyte( USE_NAME_OPEN_ADDR );
	
	
	EEPR_AT_data = ReadEEPROMonebyte( SMS_SEND_TINE_ADDR );
	EEPR_DT_data = ReadEEPROMonebyte( DISCONNECT_TIME_ADDR );
	
	GetFirPhoneNo( Phone1, 0 );
	GetSecPhoneNo( Phone2, 0 );
	memset( Name, 0, 64 );
	if( ReadEEPROMonebyte(NETDOG_NAME_ADDR) > 32 )
	{
		strcpy( Name, "0000" );
	}
	else
	{
		GetStringFromEEPROM(Name, NETDOG_NAME_ADDR );	
	}	
}



/***********************************************************************************************************/
/***********************************************************************************************************/
/*-----------------------------------------
StrCatChar
工具函数,串尾接一个字符
------------------------------------------*/
void StrCatChar( unsigned char *str, unsigned char ch )
{
	int len;

	len = strlen( str );
	if( len < LINE_LENGTH - 1 )
	{
		str[len] = ch;
		str[len+1] = 0;
	}
}

/*-----------------------------------------
StrStr
工具函数,串字符串判断
------------------------------------------*/
unsigned char StrStr( unsigned char *str1, unsigned char *str2 )
{
	int i, j;
	
	i = 0;
	j = 0;
	while(str1[i] != 0 )
	{
		while( str2[j] != 0 )
		{
			if(str1[i+j] != str2[j])
				break;
			j ++;
		}
		if( str2[j] == 0)
			return 1;
		i ++;
		j = 0;
	}

	return 0;
}

/*-----------------------------------------
xStrstrFirst
工具函数,串首字符串判断
------------------------------------------*/
/*
unsigned char xStrstrFirst(unsigned char *str1, unsigned char *str2)
{
	int i, len2;
	len2 = strlen(str2);
	for(i = 0; i < len2; i ++)
	{
		if(str1[i] != str2[i])
			return 0;
	}
	return 1;
}
*/
int GetConcentFromString( unsigned char *str, unsigned char mark1, unsigned char mark2, unsigned char *ret )
{
	int i, len, temp;
	len = strlen(str);

	for( i = 0; i < len; i ++ )
	{
		if (str[i] == mark1)
		{
			*ret = (unsigned char)i +1;
			temp = i +1;
		}
		if( str[i] == mark2)
		{
			return i-temp;
		}
	}
	return 0;
}
void ConventPhoneNo2USC2(unsigned char *src, unsigned char *tar )
{
	int i;
	int len;
	len = strlen( src );
	for ( i= 0; i < len; i ++ )
	{
		/* USC2 mode */
		tar[i*4] = '0';
		tar[i*4+1] = '0';
		tar[i*4+2] = '3';
		tar[i*4+3] = src[i];
		tar[i*4+4] = 0;
	}	
}
/*-----------------------------------------
JudgePCString
判断来自PC的指令是什么内容
------------------------------------------*/
void JudgePCString(  )
{
	int i, j, len;
	unsigned char mark;
	unsigned char ch;
	
	if( PCRxBuffer[0] == 0 )
		return ;

	for (i = 0; i < TOTAL_CMD_NUMBER; i ++)
	{
		if( StrStr(PCRxBuffer, pc_cmd[i]) )
		{
			mark = 0;	
			switch(i)
			{
				case 0:
					DelayCount = 0;
					strcpy( ModuleTxBuffer, Module_AT[8] );
					break;				
				case 2:	/*写第一个紧急号码*/
					if( ModuleWaitFlag == 1 )
					{
						strcpy(PCTxBuffer, "NF:Busy\r\n");
						break;
					}
					len = GetConcentFromString( PCRxBuffer, '(', ')', &mark );

					memset( ModuleTxBuffer, 0, LINE_LENGTH );
					DelayCount = 0;
					strcpy( ModuleTxBuffer, Sms_PowerOff1 );
					
					ConventPhoneNo2USC2( Phone1, ModuleTxBuffer +9 );
					
					strcat( ModuleTxBuffer, "\"\r\n");
					//strcat( ModuleTxBuffer, Sms_PowerOff3 );
					 j = strlen( ModuleTxBuffer );
					memcpy( ModuleTxBuffer + j, PCRxBuffer+mark, len );
					StrCatChar( ModuleTxBuffer, 0x1a );
					Sms_edit_mode = 1;
					
					strcpy(PCTxBuffer, dog_reply[i]);
					
					
					break;
				case 3:
					if( ModuleWaitFlag == 1 )
					{
						strcpy(PCTxBuffer, "NF:Busy\r\n");
						break;
					}
					
					len = GetConcentFromString( PCRxBuffer, '(', ')', &mark );

					memset( ModuleTxBuffer, 0, LINE_LENGTH );
					DelayCount = 0;
					strcpy( ModuleTxBuffer, Sms_PowerOff1 );
					
					ConventPhoneNo2USC2( Phone2, ModuleTxBuffer +9 );
					
					strcat( ModuleTxBuffer, "\"\r\n");
					//strcat( ModuleTxBuffer, Sms_PowerOff3 );
					 j = strlen( ModuleTxBuffer );
					memcpy( ModuleTxBuffer + j, PCRxBuffer+mark, len );
					StrCatChar( ModuleTxBuffer, 0x1a );
					Sms_edit_mode = 1;
					
					strcpy(PCTxBuffer, dog_reply[i]);
					break;
				case 4:/*读取第一个紧急号码*/
					len = GetConcentFromString( PCRxBuffer, '(', ')', &mark );
					
					memset( Lcd_buffer, 0x20, 21 );
					memcpy( Lcd_buffer, PCRxBuffer+mark, len );
					Display_LCD1( Lcd_buffer );
					strcpy(PCTxBuffer, dog_reply[i]);
					
					break;
				case 5:
					len = GetConcentFromString( PCRxBuffer, '(', ')', &mark );
					
					memset( Lcd_buffer, 0x20, 21 );
					memcpy( Lcd_buffer, PCRxBuffer+mark, len );
					Display_LCD2( Lcd_buffer );
					strcpy(PCTxBuffer, dog_reply[i]);
					
					break;
				case 6:
					LCDRefreshFlag = 1;
					LedFlashFlag = 0;
					strcpy(PCTxBuffer, dog_reply[i]);
					
					break;
				case 7:
					strcpy(PCTxBuffer, dog_reply[i]);
					if( NetFoxPowerOpenFlag && NetFoxConnectOpenFlag )
					{
						strcat( PCTxBuffer,  "3)\r\n" );
					}
					else if( NetFoxPowerOpenFlag )
					{
						strcat( PCTxBuffer,  "1)\r\n" );
					}
					else if( NetFoxConnectOpenFlag )
					{
						strcat( PCTxBuffer,  "2)\r\n" );
					}
					else
					{
						strcat( PCTxBuffer,  "0)\r\n" );
					}
					
					break;
				case 8:
					Display_LCD1( Alarm_Title );
					len = GetConcentFromString( PCRxBuffer, '(', ')', &mark );
					memset( Lcd_buffer, 0x20, 21 );
					memcpy( Lcd_buffer, PCRxBuffer+mark, len );
					Display_LCD2( Lcd_buffer );
					strcpy(PCTxBuffer, dog_reply[i]);
					LedFlashFlag = 3;
					
					break;
				case 9:
					LCDRefreshFlag = 1;
					LedFlashFlag = 0;
					strcpy(PCTxBuffer, dog_reply[i]);
					
					break;
				case 11:
					strcpy(PCTxBuffer, dog_reply[i]);
					GetFirPhoneNo(PCTxBuffer + strlen(dog_reply[i]), 0 );
					strcat(PCTxBuffer, ")\r\n" );
					
					break;	
				case 12:
					strcpy(PCTxBuffer, dog_reply[i]);
					GetSecPhoneNo(PCTxBuffer + strlen(dog_reply[i]), 0 );
					strcat(PCTxBuffer, ")\r\n" );
					
					break;	
				case 13:
					len = GetConcentFromString( PCRxBuffer, '(', ')', &mark );
					SetFirPhoneNo(PCRxBuffer+mark, len);
					memset( Phone1, 0, 32 );
					memcpy( Phone1, PCRxBuffer+mark, len );
					strcpy(PCTxBuffer, dog_reply[i]);
					
					break;	
				case 14:
					len = GetConcentFromString( PCRxBuffer, '(', ')', &mark );
					SetSecPhoneNo(PCRxBuffer+mark, len);
					memset( Phone2, 0, 32 );
					memcpy( Phone2, PCRxBuffer+mark, len );
					strcpy(PCTxBuffer, dog_reply[i]);
					
					break;
				case 15:
					len = GetConcentFromString( PCRxBuffer, '(', ')', &mark );
					EEPR_DT_data = *(PCRxBuffer+mark);
					
					SetDisconnectTime( *(PCRxBuffer+mark)-0x30 );
					strcpy(PCTxBuffer, dog_reply[i]);
					
					break;
				case 16:
					strcpy(PCTxBuffer, dog_reply[i]);
					ch = GetDisconnectTime( );
					StrCatChar(PCTxBuffer, ch+0x30);
					strcat(PCTxBuffer, ")\r\n" );
					
					break;
				case 17:
					len = GetConcentFromString( PCRxBuffer, '(', ')', &mark );
					EEPR_AT_data = *(PCRxBuffer+mark);

					SetSMSSendTimes( *(PCRxBuffer+mark)-0x30 );
					
					strcpy(PCTxBuffer, dog_reply[i]);
					
					break;
				case 18:
					strcpy(PCTxBuffer, dog_reply[i]);
					
					ch = GetSMSSendTimes( );
					//ch = ReadEEPROMonebyte( NETDOG_CONNECT_OPEN_ADDR );
					
					StrCatChar(PCTxBuffer, ch+0x30);
					strcat(PCTxBuffer, ")\r\n" );
					
					break;
				case 19:
					WriteEEPROMonebyte( NETDOG_POWER_OPEN_ADDR, 1 );
					NetFoxPowerOpenFlag = 1;
					if( NetFoxConnectOpenFlag == 1 )
						Display_LCD( Work_Title );
					else
						Display_LCD( WorkAC_Title );	
					strcpy(PCTxBuffer, dog_reply[i]);
					PowerOffDelayCount = 0;
					
					break;
				case 20:
					WriteEEPROMonebyte( NETDOG_POWER_OPEN_ADDR, 0 );
					NetFoxPowerOpenFlag = 0;
					if(NetFoxConnectOpenFlag == 0 )
					{
						Display_LCD( Wait_Title );
					}
					else
					{

⌨️ 快捷键说明

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