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

📄 init.c

📁 湖北水文信息系统水位雨量采集器的C51源代码
💻 C
字号:
#include "sm89516a.h"
#include "time.h"
#include "string.h"
#include "scan.h"
#include "common.h"
#include "process.h"
#include "recframe.h"
#include "i2c.h"
#include "save_rf.h"
#include "cond.h"


/*********************************************************************
* 函 数 名: void mult_rainfall_init(void)
* 功能描述: 雨量倍数初始化
* 函数说明: 
* 调用函数: 无
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
***********************************************************************/
void mult_rainfall_init(void)
{
		unsigned char mult_init;
		
		R_block(WPAGE5,RPAGE5,i2c_addr_mult_rainfall,&mult_init,1); 	 
		if(mult_init==0xff)
		{   
				mult_init=0x31;
					
				W_block(WPAGE5,i2c_addr_mult_rainfall,&mult_init,1);
		}	
		Mult_Rainfall=CHAR_TO_LONG(&mult_init,1); 
}


/*********************************************************************
* 函 数 名: void basiclevel_init(void)
* 功能描述: 基本水位初始化
* 函数说明: 
* 调用函数: 无
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
***********************************************************************/
void basiclevel_init(void)
{
		unsigned char basic_init[5];
		unsigned char i;
		
		/*-----------配置基本水位---------------*/	
		R_block(WPAGE5,RPAGE5,i2c_addr_basic_level,basic_init,5); 	 
		if(basic_init[0]==0xff)
		{   
				for(i=0;i<5;i++)
							basic_init[i]=0;
					
				W_block(WPAGE5,i2c_addr_basic_level,basic_init,5);
		}	
		Basic_WaterLevel=CHAR_TO_LONG(basic_init,5); 
}

/*********************************************************************
* 函 数 名: void rainfall_config_init(void)
* 功能描述: 雨量采集时间间隔初始化
* 函数说明: 
* 调用函数: 无
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
***********************************************************************/
void rainfall_config_init(void)
{
		unsigned char i;
		unsigned char config[3],new_cfg[3]={0x30,0x30,0x35};	
		
		
		/*-----------雨量采集间隔时间---------------*/	
		R_block(WPAGE0,RPAGE0,i2c_addr_rainconfig,config,3); 	
		if(config[0]==0xff)
		{
				R_block(WPAGE1,RPAGE1,i2c_addr_rainconfig,config,3);  
				if(config[0]==0xff)
				{ 					
						W_block(WPAGE1,i2c_addr_rainconfig,&new_cfg,3);
		 		}
		 		
		 		new_cfg[0]|=0x80; 
		 		W_block(WPAGE0,i2c_addr_rainconfig,&new_cfg,3);
		 		
		 		for(i=0;i<3;i++)
		 				config[i]=new_cfg[i];
		}
		 		
		if((config[0]&0x80)!=0x80)
		{   
				R_block(WPAGE1,RPAGE1,i2c_addr_rainconfig,config,3);   		
		}
		config[0]&=0x7f;
		rain_cfg=CHAR_TO_INT(config,3); 
}

/*********************************************************************
* 函 数 名: void waterlevel_config_init(void)
* 功能描述: 水位采集时间间隔初始化
* 函数说明: 
* 调用函数: 无
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
***********************************************************************/
void waterlevel_config_init(void)
{
		unsigned char i;
		unsigned char config[3],new_cfg[3]={0x30,0x30,0x35};		
			
		/*-----------水位采集间隔时间---------------*/
		R_block(WPAGE0,RPAGE0,i2c_addr_levelconfig,config,3); 		
		if(config[0]==0xff)
		{
				R_block(WPAGE1,RPAGE1,i2c_addr_levelconfig,config,3);  
				if(config[0]==0xff)
				{ 					
						W_block(WPAGE1,i2c_addr_levelconfig,&new_cfg,3);
		 		}
		 		
		 		new_cfg[0]|=0x80; 
		 		W_block(WPAGE0,i2c_addr_levelconfig,&new_cfg,3);
		 		
		 		for(i=0;i<3;i++)
		 				config[i]=new_cfg[i];
		}
			 
		if((config[0]&0x80)!=0x80)
		{   
				R_block(WPAGE1,RPAGE1,i2c_addr_levelconfig,config,3);   		
		}
		config[0]&=0x7f;
		level_cfg=CHAR_TO_INT(config,3);
}

/*********************************************************************
* 函 数 名: void rain_conditions_init(void)
* 功能描述: 雨量门限初始化
* 函数说明: 
* 调用函数: 无
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
***********************************************************************/
void rain_conditions_init(void)
{
		unsigned char i,j;
		unsigned char xdata cd_config[11][10],new_cd[11][10];
		
		for(i=0;i<11;i++)
	  for(j=0;j<10;j++)
    {
				new_cd[i][j]=0x00;
	  }
	
		R_block(WPAGE2,RPAGE2,i2c_addr_rnct,&cd_config[0][0],110); 	 
	 	if(cd_config[0][0]==0xff)
    {				
				R_block(WPAGE3,RPAGE3,i2c_addr_rnct,&cd_config[0][0],110); 	 
	 			if(cd_config[0][0]==0xff)
	 			{
							W_block(WPAGE3,i2c_addr_rnct,&new_cd[0][0],110);
				}
				
				new_cd[0][0]|=0x80; 
				W_block(WPAGE2,i2c_addr_rnct,&new_cd[0][0],110);
				
				for(i=0;i<11;i++)
	  		for(j=0;j<10;j++)
    		{
						cd_config[i][j]=new_cd[i][j];
	  		}
	  }
		
		if((cd_config[0][0]&0x80)!=0x80)
		{   
				R_block(WPAGE3,RPAGE3,i2c_addr_rnct,&cd_config[0][0],110);   		
		}
		cd_config[0][0]&=0x7f;
 		for(i=0;i<11;i++)
		{
				rain_cd[i].cd_time=CHAR_TO_LONG(&cd_config[i][0],4);
				rain_cd[i].cd_data=CHAR_TO_LONG(&cd_config[i][4],6);
		}  
		
}

/*********************************************************************
* 函 数 名: void level_conditions_init(void)
* 功能描述: 水位门限初始化
* 函数说明: 
* 调用函数: 无
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
***********************************************************************/
void level_conditions_init(void)
{
		unsigned char i,j;
		unsigned char xdata cd_config[11][10],new_cd[11][10];
		
		for(i=0;i<11;i++)
	  for(j=0;j<10;j++)
    {
				new_cd[i][j]=0x00;
	  }
	
		R_block(WPAGE2,RPAGE3,i2c_addr_lvct,&cd_config[0][0],110); 	 
		if(cd_config[0][0]==0xff)
    {				
				R_block(WPAGE3,RPAGE3,i2c_addr_lvct,&cd_config[0][0],110); 	 
	 			if(cd_config[0][0]==0xff)
	 			{
							W_block(WPAGE3,i2c_addr_lvct,&new_cd[0][0],110);
				}
				
				new_cd[0][0]|=0x80; 
				W_block(WPAGE2,i2c_addr_lvct,&new_cd[0][0],110);
				
				for(i=0;i<11;i++)
	  		for(j=0;j<10;j++)
    		{
						cd_config[i][j]=new_cd[i][j];
	  		}
	  }
	  
		if((cd_config[0][0]&0x80)!=0x80)
		{   
				R_block(WPAGE3,RPAGE3,i2c_addr_lvct,&cd_config[0][0],110);   		
		}
		cd_config[0][0]&=0x7f;
  	for(i=0;i<11;i++)
		{
				level_cd[i].cd_time=CHAR_TO_LONG(&cd_config[i][0],4);
				level_cd[i].cd_data=CHAR_TO_LONG(&cd_config[i][4],6);
		}
}


/*********************************************************************
* 函 数 名: void rainfall_5min_init(void)
* 功能描述: 初始化读取每5分钟的雨量
* 函数说明: 
* 调用函数: 无
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
***********************************************************************/
void rainfall_5min_init(void)
{
		unsigned char i,j;
			
		R_block(WPAGE4,RPAGE4,i2c_addr_rainfall,&RainFall_5Min[0][0],rf_dlen*2);
		if((RainFall_5Min[0][0]==0xff)||(RainFall_5Min[0][1]==0xff))
		{
				for(i=0;i<rf_dlen;i++)
				for(j=0;j<2;j++)
						RainFall_5Min[i][j]=0; 
				W_block(WPAGE4,i2c_addr_rainfall,&RainFall_5Min[0][0],rf_dlen*2); 
 		}	 
}

/*********************************************************************
* 函 数 名: void Rd_i2c_init(void)
* 功能描述: 读I2C初始化数据
* 函数说明: 
* 调用函数: 无
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
***********************************************************************/
void Rd_i2c_init(void)
{
		mult_rainfall_init();
		basiclevel_init();
		rainfall_config_init();
		waterlevel_config_init();
		rain_conditions_init();
		level_conditions_init();
		rainfall_5min_init();
}


/*********************************************************************
* 函 数 名: init
* 功能描述: 初始化
* 函数说明: 
* 调用函数: 无
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
***********************************************************************/
void init(void)
{
		unsigned char i,j;

		for(i=0;i<5;i++)
				Scan_WaterLevel[i]=0; //水位初始化

		rfcd_1min=0;
		for(j=0;j<11;j++)
		{
				rfcd_time[j]=0;  //雨量门限定时
		}
		save_time=0;		

		new_cfg=0; //新门限配置初始化

	//	sum_rf=0; //门限雨量和初始化

		RainFall=0; //雨量初始化
		WaterLevel=0; //平均水位初始化
		Scan_RainFall=0;   //雨量门限累加初始化
	
		rain_1min=0;
		r_time=0;  //雨量采集初始化

		level_1min=0;
		l_time=0;  //水位采集初始化	
}

/*********************************************************************
* 函 数 名: sys_init
* 功能描述: 系统初始化
* 函数说明: 定时器1产生通信波特率9600
* 调用函数: 无
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
***********************************************************************/

void sys_init(void)
{
		con_485=R_CON;

    TMOD=0x21;        // 设置定时器1工作方式 2 
    TH0=0xfc;         // 定时1MS
    TL0=0x66; 
    TR0=1;
    ET0=1;
    
    TH1=0xfd;         // 设置波特率9600bps
    TL1=0xfd;
    PCON&=0x00;       // SMOD=0
    TR1=1;	          // 开启定时器 
    SCON=0x40;        // 设置串行口工作方式 1
    REN=1;            // 允许接收
    EA=1;             // 总中断允许 
    ES=1;             // 串行口中断允许

    SCONF=0x02;       // 片内扩展ram使能
	
		RCAP2H=0xb8;      // 重装值
		RCAP2L=0x00;
    TH2=0xb8;         //定时器2定时20ms	 
		TL2=0x00;   			      
    ET2= 1;           // 允许T2中断
		T2CON= 0x00;
    TR2= 1;
  	
		WDTKEY=0x1E;
		WDTKEY=0xE1;
		WDTC=0x85;        // 看门狗定时器使能,溢出时间为65.536ms
		WDTKEY=0xE1;
		WDTKEY=0x1E;

    EX0=1;            // INT0中断开
    IT0=0;            // INT0低电平触发

    P4=0x0f;
		init(); 
		Rd_i2c_init();

}

⌨️ 快捷键说明

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