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

📄 zhu19200.c.bak

📁 动力环境监控系统 动力环境监控系统
💻 BAK
📖 第 1 页 / 共 3 页
字号:

void timeout2()	//超时,送FFFF无效数据
{
	FalseTime2=0;
	memset(RealTimeData+6+B00AI*4+B11AI*4,0x46,B22AI*4);	//AI量
}
void timeout3()	//超时,送FFFF无效数据
{
	FalseTime3=0;
	memset(RealTimeData+6+AIsum-B33AI*4,0x46,B33AI*4);	//AI量
	memset(RealTimeData+12+AIsum+B00DI/2,0x46,B33DI/2);	//DI量
}

void SendPermit1()
{
	#ifdef	OpenEn
	SendEn |= 0x02;
	#else
	SendEn |= 0x06;
	#endif
	XBYTE[0xE000] = SendEn;	//允许发送进中断1
	SendCount1 = 0;		//串口1发送计数器清零
	SendingFlag1 = 1;
	if( ResetAnsFlag )	//系统复位(死循环)
	{
		ResetAnsFlag=0;
		while(1);
	}
}

void SendPermit2()
{
	#ifdef	OpenEn
	#else
	uchar xdata i=0;
	#endif
	#ifdef	OpenEn
	SendEn |= 0x20;
	#else
	SendEn |= 0x28;
	#endif
	XBYTE[0xE000] = SendEn;	//允许发送进中断1
	#ifdef	OpenEn
	#else
	while(i++<100)	_nop_();	//延时
	#endif
	SendCount2 = 0;		//串口2发送计数器清零
	SendingFlag2 = 1;
	if( ResetAnsFlag )	//系统复位(死循环)
	{
		ResetAnsFlag=0;
		while(1);
	}
}

void testAODO()
{
	#ifdef TestDO
	controlFlag=1;
	DotType = 0x83;
	DotModule = 0;
	DotChunnel = 0;
	Dotparam = 0;
	#endif
	_nop_();
}

void BaoCunZhengCh()	//保存曲线历史记录
{
	uint data kk,kk0;	//曲线历史记录保存768条记录,0x40000-0xFFFFF;
	uchar data RamRam;
	uchar xdata temp_a[MaxSend],YYMMDD[6];
//组织正常历史记录
	temp_a[0] = 0x7E;	//起始符
	temp_a[1] = VERh;	//版本号
	temp_a[2] = VERl;	//版本号
	temp_a[3] = 0x30;	//扩展地址(随意)
	temp_a[4] = 0x30;
	temp_a[7] = 0x34;	//命令类型
	temp_a[8] = 0x38;
	temp_a[9] = 0x30;	//返回状态
	temp_a[10]= 0x30;
	hex2asc0( temp_a + 5, Read_ID() );	//采集箱地址
	hex2asc1( temp_a + 11, AIDIsum+12);	//数据块长度
	clock_read(YYMMDD);			//读取日期时间
	hex2asc0( temp_a + 15, YYMMDD[0]);	//年//日期时间
	hex2asc0( temp_a + 17, YYMMDD[1]);	//月
	hex2asc0( temp_a + 19, YYMMDD[2]);	//日
	hex2asc0( temp_a + 21, YYMMDD[3]);	//时
	hex2asc0( temp_a + 23, YYMMDD[4]);	//分
	hex2asc0( temp_a + 25, YYMMDD[5]);	//秒
	memcpy(temp_a+27,RealTimeData,AIDIsum);	//实时数据
	kk=CrcCheck(temp_a+1,26+AIDIsum);	//计算CRC
	hex2asc1(temp_a+27+AIDIsum,kk);		//CRC校验
	temp_a[31+AIDIsum] = '\r';		//结束符
	temp_a[32+AIDIsum] = '\n';		//停止发送符
//保存正常历史记录
	AddLed=ZhengChZhi/64+4+(AddLed&0xF0);//确定扇区//选通扇区
	ledled = AddLed;		//选通扇区
	kk0 = ZhengChZhi%64*0x400;		//第几条,哪k
	if(ZhengChZhi%64<8)
	{
		for(kk=0;kk<33+AIDIsum;kk++)	//628128存到628512RAM
		{
			RamRom_Convert= 1;//选通628128RAM
			RamIO_Convert = 1;
			RamRam = temp_a[kk];
			RamRom_Convert= 0;
			RamIO_Convert = 0;//选通628512RAM
			XBYTE[kk0+kk]=RamRam;
		}
	}
	else
	{
		RamRom_Convert= 1;
		RamIO_Convert = 0;//选通628512RAM
		for(kk=0;kk<33+AIDIsum;kk++)	//628128存到628512RAM
		{
			XBYTE[kk0+kk]=temp_a[kk];
		}
	}
	RamRom_Convert= 1;//选通628128RAM
	RamIO_Convert = 1;
	if(ZhengChZhi<ZhengChRongL-1)	//调整正常历史记录第n条;
	{
		ZhengChZhi++;
	}
	else if(ZhengChZhi==ZhengChRongL-1)	//调整正常历史记录第n条加1;
	{				//方便读取
		ZhengChZhi=0;
	}
	else				//地址乱了
	{
		ZhengChZhi=0;
		ZhengChTiao=0;
	}
	if(ZhengChTiao<ZhengChRongL)	//调整保存的断开历史记录条数
	{
		ZhengChTiao++;
	}
	else if(ZhengChTiao==ZhengChRongL)	//保存的断开历史记录条数
	{
		;
	}
	else					//指针出错
	{
		ZhengChZhi=0;
		ZhengChTiao=0;
	}
}

void BaoCunDuanKai()	//保存断开历史记录
{
	uint data kk,kk0;	//断开历史记录保存256条记录,0x00000-0x3FFFF;
	uchar data RamRam;
	uchar xdata temp_a[MaxSend],YYMMDD[6];
	JiaoTiFlag = 0;	//断开后先发送实时记录
//组织断开历史记录
	temp_a[0] = 0x7E;	//起始符
	temp_a[1] = VERh;	//版本号
	temp_a[2] = VERl;	//版本号
	temp_a[3] = 0x30;	//扩展地址(随意)
	temp_a[4] = 0x30;
	temp_a[7] = 0x34;	//命令类型
	temp_a[8] = 0x32;
	temp_a[9] = 0x30;	//返回状态
	temp_a[10]= 0x30;
	hex2asc0( temp_a + 5, Read_ID() );	//采集箱地址
	hex2asc1( temp_a + 11, AIDIsum+12);	//数据块长度
	clock_read(YYMMDD);			//读取日期时间
	hex2asc0( temp_a + 15, YYMMDD[0]);	//年//日期时间
	hex2asc0( temp_a + 17, YYMMDD[1]);	//月
	hex2asc0( temp_a + 19, YYMMDD[2]);	//日
	hex2asc0( temp_a + 21, YYMMDD[3]);	//时
	hex2asc0( temp_a + 23, YYMMDD[4]);	//分
	hex2asc0( temp_a + 25, YYMMDD[5]);	//秒
	memcpy(temp_a+27,RealTimeData,AIDIsum);	//实时数据
	kk0=CrcCheck(temp_a+1,26+AIDIsum);	//计算CRC
	hex2asc1( temp_a+27+AIDIsum,kk0);	//CRC校验
	temp_a[31+AIDIsum] = '\r';		//结束符
	temp_a[32+AIDIsum] = '\n';		//停止发送符
//保存断开历史记录
	if(DuanKaiZhi==DuanKaiRongL-1)	//调整断开历史记录第n条;
	{				//方便读取
		DuanKaiZhi=0;
	}
	else if(DuanKaiZhi<DuanKaiRongL-1)	//断开历史记录第n条加1;
	{				//方便读取
		DuanKaiZhi++;
	}
	else				//地址乱了
	{
		DuanKaiZhi=0;
		DuanKaiTiao=0;
	}
	AddLed = (AddLed&0xF0)+DuanKaiZhi/64;	//存放到什么扇区?//选通扇区
	ledled = AddLed;		//选通扇区
	kk0 = DuanKaiZhi%64*0x400;		//第几条,哪k
	if(DuanKaiZhi%64<8)
	{
		for(kk=0;kk<33+AIDIsum;kk++)	//628128存到628512RAM
		{
			RamRom_Convert= 1;//选通628128RAM
			RamIO_Convert = 1;
			RamRam = temp_a[kk];
			RamRom_Convert= 0;
			RamIO_Convert = 0;//选通628512RAM
			XBYTE[kk0+kk]=RamRam;
		}
	}
	else
	{
		RamRom_Convert= 1;
		RamIO_Convert = 0;//选通628512RAM
		for(kk=0;kk<33+AIDIsum;kk++)	//628128存到628512RAM
		{
			XBYTE[kk0+kk]=temp_a[kk];
		}
	}
	RamRom_Convert= 1;//选通628128RAM
	RamIO_Convert = 1;
	if(DuanKaiTiao<DuanKaiRongL)	//调整保存的断开历史记录条数
	{
		DuanKaiTiao++;
	}
	else if(DuanKaiTiao==DuanKaiRongL)	//保存的断开历史记录条数
	{
		;
	}
	else
	{
		DuanKaiZhi=0;
		DuanKaiTiao=0;
	}
//2003.12.05 duan kai 18 minutes reset
	//if(DuanKaiCount++>20)	//断开历史纪录保存20条后,系统重起
	//{
		//DuanKaiCount=0;
		while(1);
	//}
}
void Test512()
{
	uchar data test0c;
	uint  data test0i;
	bit testFlag=0;
	FeedDogFlag=0;	//喂狗
	_nop_();
	FeedDogFlag=1;
	for(test0c=0;test0c<16;test0c++)
	{
		RamRom_Convert= 1;
		RamIO_Convert = 1;	//选通628512RAM
		Feed_watchdog();
		AddLed=(AddLed&0xF0)+test0c;	//选择扇区
		ledled=AddLed;
		RamRom_Convert= 0;
		RamIO_Convert = 0;	//选通628512RAM
		for(test0i=0;test0i<0x1FFF;test0i++)	//test 512 0x0000-0x1FFF
		{
			XBYTE[test0i]=0x55;
			if(XBYTE[test0i]!=0x55)
			{
				testFlag=1;
				break;
			}
			XBYTE[test0i]=0xAA;
			if(XBYTE[test0i]!=0xAA)
			{
				testFlag=1;
				break;
			}
		}
		if(testFlag)
		{
			break;
		}
		RamRom_Convert= 1;
		RamIO_Convert = 0;//选通628512RAM
		for(test0i=0x2000;test0i<0xFFFF;test0i++)//test 512 0x2000-0xFFFF
		{
			XBYTE[test0i]=0x55;
			if(XBYTE[test0i]!=0x55)
			{
				testFlag=1;
				break;
			}
			XBYTE[test0i]=0xAA;
			if(XBYTE[test0i]!=0xAA)
			{
				testFlag=1;
				break;
			}
			FeedDogFlag=0;	//喂狗
			_nop_();
			FeedDogFlag=1;
		}
		if(testFlag)
		{
			break;
		}
	}
	RamRom_Convert= 1;
	RamIO_Convert = 1;	//选通628512RAM
	if(testFlag)
	{
		KuaiShFlag=1;	//512坏,快闪
		memcpy(SendSbuf1,"SRAM test Fail\r\n\0",18);
	}
	else
	{
		ManShFlag=1;	//512好,慢闪
		memcpy(SendSbuf1,"SRAM test Pass\r\n\0",18);
	}
	SendPermit1();
}
void KaiJiRengZhen()		//开机认证
{
	uchar data iii0;
	bit   KaiJiFlag=0;
	for(iii0=0;iii0<8;iii0++)
	{
		if(iii0!=KaiJiRZh[iii0])
		{
			KaiJiFlag=1;
			break;
		}
	}
	if(KaiJiFlag)
	{
		Test512();
		for(iii0=0;iii0<8;iii0++)
		{
			KaiJiRZh[iii0]=iii0;
		}
		DuanKaiTiao=0;
		DuanKaiZhi=0;
		ZhengChTiao=0;
		ZhengChZhi=0;
	}
	if(DuanKaiTiao>DuanKaiRongL||DuanKaiZhi>=DuanKaiRongL)
	{
		DuanKaiTiao=0;
		DuanKaiZhi=0;
	}
	if(ZhengChTiao>ZhengChRongL||DuanKaiZhi>=ZhengChRongL)
	{
		ZhengChTiao=0;
		ZhengChZhi=0;
	}
}

void System_init()		//系统初始化
{
        uchar xdata ii3;
	TMOD = 0x10;	SCON = 0x90;//串行方式2,波特率为172.8k;定时器0:计数,1:定时
	PCON = 0x00;	TCON = 0x40;//1:波特率增大一倍;0:INT0/1为电平触发;1:为边沿触发
	TL0  = 0xFF;	TH0  = 0xFF;//上层中断3准备
	TL1  = 0xFA;	TH1  = 0x3C;//定时50ms:0x1000-0x3cfa=49926
	IP   = 0x10;	IE   = 0x1D;//串行中断级别优先;开串口中断,总中断

	TBUS_EN = 0;		//打开与从CPU的422通信使能

	//初始化8251:异步,波特率因子为16,8为数据位,一位停止位;接收开放
	AddLed = 0xB0;
	ledled=AddLed;//亮灯,鸣叫
	#ifdef	OpenEn
	SendEn = 0x0C;
	#else
	SendEn = 0;
	#endif
	XBYTE[0xE000] = SendEn;//扩展串口
	XBYTE[0x4001] = 0;
	XBYTE[0x4001] = 0;
	XBYTE[0x4001] = 0;
	XBYTE[0x4001] = 0x40;
	Delay_nop0(5);
	XBYTE[0x4001] = 0x4E;	//送方式选择字
	XBYTE[0x4001] = 5;	//送命令字,允许发送接受
	ii3 = XBYTE[0x4000];
	XBYTE[0x6001] = 0;
	XBYTE[0x6001] = 0;
	XBYTE[0x6001] = 0;
	XBYTE[0x6001] = 0x40;
	Delay_nop0(5);
	XBYTE[0x6001] = 0x4E;	//送方式选择字
	XBYTE[0x6001] = 5;	//送命令字,允许发送接受
	ii3 = XBYTE[0x6000];
	baud_select( 1,5 );	//通道1波特率设为19200
	baud_select( 2,5 );	//通道2波特率设为19200

	Feed_watchdog();	//喂狗
	#ifdef TestSendEn	//测试发送使能
	SendEn=0x0C;		//打开光端机的发送使能
	XBYTE[0xE000]=SendEn;	//扩展串口发送使能控制
	//(继电器掉电不影响环路的通信,模拟开关跟环路无关)
	while(1)		//测试继电器,模拟开关;
	{
                RamIO_Convert = 1;
                for( ii3=0; ii3<200; ii3++ )
		{
			Delay_nop0(255);
		}
		Feed_watchdog();
                SendEn3Flag = !SendEn3Flag;
		XBYTE[0xE000] = SendEn;	//扩展串口发送使能控制
	}
	#endif
	EA =1;
}
void valueCLK()
{
	RamRom_Convert	= 1;
	RamIO_Convert	= 1;
	lockFlagDn	= 0;
	controlFlag	= 0;
	ReceConFlag	= 0;

	ReceEndFlag0	= 0;
	SendingFlag1	= 0;
	ReceEndFlag1	= 0;
	SendingFlag2	= 0;
	ReceEndFlag2	= 0;
	bNeedSend1	= 0;
	bNeedSend2	= 0;

	SendCount0	= 0;
	ReceCount0	= 0;
	SendCount1	= 0;
	ReceCount1	= 0;
	SendCount2	= 0;
	ReceCount2	= 0;
	DelayCount	= 0;

	ResetAnsFlag	= 0;
	BaudAnsFlag	= 0;
	NoReceFlag	= 0;	//开始设为有发送
	ReBaudFlag	= 0;
	ReBaudCount	= 0;

	FalseTime0	= 0;
	FalseTime1	= 0;
	FalseTime2	= 0;
	FalseTime3	= 0;


	memset( SendSbuf0, 0, sizeof(SendSbuf0) );	//缓冲区清零
	memset( ReceSbuf0, 0, sizeof(ReceSbuf0) );	//缓冲区清零
	memset( SendSbuf1, 0, sizeof(SendSbuf1) );	//缓冲区清零
	memset( ReceSbuf1, 0, sizeof(ReceSbuf1) );	//缓冲区清零
	memset( SendSbuf2, 0, sizeof(SendSbuf2) );	//缓冲区清零
	memset( ReceSbuf2, 0, sizeof(ReceSbuf2) );	//缓冲区清零

	memset(RealTimeData,0x46,sizeof(RealTimeData));	//实时数据送无效数据0xFF
	RealTimeData[0]=0x38;				//AI标号
	RealTimeData[1]=0x30;
	hex2asc1(RealTimeData+2,75+B33AI);		//AI通道数
	RealTimeData[AIsum+6]=0x38;			//DI标号
	RealTimeData[AIsum+7]=0x31;
	hex2asc1(RealTimeData+AIsum+8,(8+B33DI)/4);	//DI通道数,压缩
}


main()
{
	uchar iii = 0;
	uchar data broad = 10;//,ExecuteCom;
        #ifdef	TestClock
        uchar xdata writeclock[6]={03,10,30,13,24,14};
        setup_write();
	clock_write(writeclock);
	#endif
	valueCLK();	//全局变量清零
	testAODO();
	System_init();	//系统初始化
	KaiJiRengZhen();
	EA=1;
	while(1)
	{
		FeedDogFlag=0;			//喂狗
		_nop_();
		FeedDogFlag=1;
		if( ReceEndFlag0 )		//解析串口0
		{
			Analyse0();
		}

		if( ReceEndFlag1 )		//解析串口1
		{
			Analyse1();
		}
		if( bNeedSend1 )		//串口1是否要发
		{
			SendPermit1();
		}
		if(ReBaudFlag)		//10分钟没发送就保存断开历史记录
		{
			ReBaudFlag = 0;
			BaoCunDuanKai();	//保存断开历史记录
		}

		if( ReceEndFlag2 )		//解析串口2
		{
			Analyse2();
		}
		if( bNeedSend2 )		//串口2是否要发
		{
			SendPermit2();
		}

		if( BaudAnsFlag )		//修改波特率
		{
			for( iii=0; iii<110; iii++ )	//延时110ms
			{
				Delay_nop0(61);
				Feed_watchdog();
			}
			BaudAnsFlag=0;
			baud_select(portBaud,NewBaud);
		}

		if( ReceEndFlag0 )		//解析串口0
		{
			Analyse0();
		}
		if( lockFlagDn == 0 )			//向下发送上锁?
		{
			if(controlFlag == 0)	//轮询下发要实时数据
			{
				if(broad++>Broadsum-2)
				{
					broad=0;
				}
				TurnOnCom(broad);
				switch(broad)
				{
					case 0:
						if( FalseTime0++>6)
						{
							timeout0();//从模块0超时(4次)
						}
						break;
					case 1:
						if(FalseTime1++>5)
						{
							timeout1();//从模块1超时
						}
						break;
					case 2:
						if(FalseTime2++>5)
						{
							timeout2();//从模块2超时
						}
						break;
					case 3:
						if(FalseTime3++>5)
						{
							timeout3();//从模块3超时
						}
						break;
				}
			}
			else	ControlComm();	//下发遥调遥测数据
		}
		if(ZhengChFlag)		//保存正常历史记录(10分钟)
		{
			ZhengChFlag = 0;
			BaoCunZhengCh();//保存曲线历史纪录
		}
	}
}

⌨️ 快捷键说明

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