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

📄 leak.txt

📁 基于 PLC935单片机的三相漏电检测系统
💻 TXT
📖 第 1 页 / 共 3 页
字号:

sbit secClock = P1^6;
//extern uint data delayTime;
//extern uchar data recPresetData[4];
//extern void ReadEEPROMByte(uchar orgAddr, uchar dataSize, uchar *bufPtr);
//extern void EEPROMWriteByte(uchar orgAddr, uchar dataSize, uchar *bufPtr);
void TimeGenerator(void);	

void RTC_ISR(void) interrupt 10
{
	static uint secCount = 0;
	
	EA=0;

	secCount++;

	RTCCON &= 0x63; 							//清除RTC中断标志位

	TimeGenerator();							//时间产生

	if(secCount==WRITE_EEPROM_INTERVAL)		    //到写EEPROM  时间
		{
		ReadEEPROMByte(EEPROM_TIME_ADDR, 7, recCurrentTimeBuf);
		secCount = 0;
		}
	
	EA=1;
}


//---------------------------------------------------------------------------
//函数名称:void TimeGenerator(void)                                                          
//功能描述:产生时钟                                                                      
//输入:无                                                   
//输出:无                                                                              
//---------------------------------------------------------------------------
void TimeGenerator(void)
{
	secClock = ~secClock;

	recCurrentTimeBuf[SEC]++;
	if(recCurrentTimeBuf[SEC]>59)
		{
		recCurrentTimeBuf[SEC] = 0;
		recCurrentTimeBuf[MIN]++;
		delayCount++;
		if(recCurrentTimeBuf[MIN]>59)
			{
			recCurrentTimeBuf[MIN] = 0;
			recCurrentTimeBuf[HOUR]++;
			if(recCurrentTimeBuf[HOUR]>23)
				{
				recCurrentTimeBuf[HOUR] = 0;
				recCurrentTimeBuf[DATE]++;
				switch(recCurrentTimeBuf[MON])	//查询当前月份
					{
					case 2:						//是2  月份
						if(((recCurrentTimeBuf[YEAR]!=0)&&(recCurrentTimeBuf[YEAR]%4==0))||((recCurrentTimeBuf[YEAR]==0)&&(recCurrentTimeBuf[CENT]%4==0)))
							{
							//是闰年2 月29  天
							if(recCurrentTimeBuf[DATE]>29)
								recCurrentTimeBuf[DATE] = 1;
							}
						else										
							{
							//是平年2 月28  天
							if(recCurrentTimeBuf[DATE]>28)
								recCurrentTimeBuf[DATE] = 1;
							}
						
						break;

					case 1:
					case 3:
					case 5:
					case 7:
					case 8:
					case 10:
					case 12:
						if(recCurrentTimeBuf[DATE]>31)
							recCurrentTimeBuf[DATE] = 1;
						
						break;
						
					default:
						if(recCurrentTimeBuf[DATE]>30)
							recCurrentTimeBuf[DATE] = 1;

						break;	
					}
				
				recCurrentTimeBuf[MON]++;
				if(recCurrentTimeBuf[MON]>12)
					{
					recCurrentTimeBuf[MON] = 1;
					recCurrentTimeBuf[YEAR]++;
					if(recCurrentTimeBuf[YEAR]>99)
						{
						recCurrentTimeBuf[YEAR] = 0;
						recCurrentTimeBuf[CENT]++;
						}
					}
	
				}
			}
		}
}




/****************************LPC935AD.C*******************************
*程序功能:测试LPC935 AD转换功能
*转换模式:单次转换
*启动方式:定时器0触发
**************************************************************************/
/*     对于AD 转换程序的编写,主要需要注意的有5点:
1.	 管脚的控制(选为AD 转换器输入的管脚,均应设置
	为仅为输入状态,禁止数字功能)。
2.	 AD转换工作模式的设置,LPC935 具有6 种模式,
	可通过设置ADMODA 获得相应的转换模式。
3.	 AD转换工作频率(500KHz—3.3MHz)
	及附加功能(DAC 或边界检测)的选择。
4.	 AD转换触发、启动方式的选择
	(通过设置ADCONx 获得相应的触发方式)。
5.	 每一次AD 转换完成,注意将AD 转换完成标志位清0。

//***************************************************************************/

//uchar data lineVolt[3];			//[0] 保存A line volt,[1] 保存B line volt  ,[3] 保存C line volt
//uchar data lineCurrent[3];			//[0] 保存A line current,[1] 保存B line current  ,[3] 保存C line current

/*漏电信息
[0]--漏电情况,1 :  有漏电;0 : 无漏电
[1]--漏电电流值
[2]--漏电线路,1: 表示A相漏电;2: 表示B相漏电; 3:表示C相漏电
*/

//uchar data leakageCurrentMsg[3];	

void ADConvert(void)
{
//AD0 转换器
	ADINS = 0x01;				//选择00 通道
	ADCON0 = START_ADC;
	while(!(ADCON0&0x08));
	lineCurrent[0] =  AD0DAT0;
	ADCON0 &= 0xF7;				//清除AD 转换完成标志

	ADINS = 0x02;				//选择02 通道
	ADCON0 = START_ADC;
	while(!(ADCON0&0x08));
	lineCurrent[1] =  AD0DAT1;
	ADCON0 &= 0xF7;				//清除AD 转换完成标志

	ADINS = 0x03;				//选择03 通道
	ADCON0 = START_ADC;
	while(!(ADCON0&0x08));
	lineCurrent[2] =  AD0DAT2;
	ADCON0 &= 0xF7;				//清除AD 转换完成标志

//AD1 转换器
	ADINS = 0x10;				//选择00 通道
	ADCON1 = START_ADC;
	while(!(ADCON1&0x08));
	lineVolt[0] =  AD1DAT0;
	ADCON1 &= 0xF7;				//清除AD 转换完成标志

	ADINS = 0x20;				//选择02 通道
	ADCON1 = START_ADC;
	while(!(ADCON1&0x08));
	lineVolt[1] =  AD1DAT1;
	ADCON1 &= 0xF7;				//清除AD 转换完成标志

	ADINS = 0x40;				//选择03 通道
	ADCON1 = START_ADC;
	while(!(ADCON1&0x08));
	lineVolt[2] =  AD1DAT2;
	ADCON1 &= 0xF7;				//清除AD 转换完成标志

	ADINS = 0x80;				//选择03 通道
	ADCON1 = START_ADC;
	while(!(ADCON1&0x08));
	leakageCurrentMsg[1] =  AD1DAT3;	//漏电流数值
	ADCON1 &= 0x00;				//关闭AD 转换功能


}



//---------------------------------------------------------------------------
//函数名称:void ReadEEPROMByte(uchar orgAddr,uchar dataSize,uchar *bufPtr)                                                          
//功能描述:从EEPROM 中读取数据到缓冲区                                                                     
//输入: orgAddr--EEPROM 中要读取数据的首地址
//			dataSize--读取的数据数量
//			bufPtr   --存储从EEPROM 中读取数据的缓冲区指针
//输出:无                                                                              
//---------------------------------------------------------------------------

void ReadEEPROMByte(uchar orgAddr, uchar dataSize, uchar *bufPtr)
{
	uchar i;
	
	for(i=0;i<dataSize;i++)
		{
		DEECON = 0x00;					//字节读方式,不中断,第0  页
		
		DEEADR = orgAddr;

		while((DEECON&0x80)==0);		//等待读操作完成否
		DEECON = DEECON&0x7F;			//清零读完成标识位
		*bufPtr = DEEDAT;
		
		orgAddr++;
		bufPtr++;
		}
}

//---------------------------------------------------------------------------
//函数名称:void EEPROMWriteByte(uchar orgAddr,uchar dataSize,uchar *bufPtr)                                                          
//功能描述:写数据到EEPROM                                                                    
//输入: orgAddr--写EEPROM 首地址
//			dataSize--写的数据数量
//			bufPtr   --数据缓冲区指针
//输出:无                                                                              
//---------------------------------------------------------------------------
void EEPROMWriteByte(uchar orgAddr, uchar dataSize, uchar *bufPtr)
{
	uchar i;

	for(i=0;i<dataSize;i++)
		{
		DEECON = 0x00;		//字节写方式,不中断,第0  页
		
		DEEDAT = *bufPtr;
		DEEADR = orgAddr;
		
		while((DEECON&0x80)==0);		//等待读操作完成否
		DEECON = DEECON&0x7F;			//清零写完成标识位
		
		orgAddr++;
		bufPtr++;
		}

}



/*******************************************************************
*                  申请总线
* 功能: 进行I2C总线的初始化----包括时钟选择,
			I2C使能,发送起始信号等等。
*                   I2EN为1,设置为主机;
			CRSEL位为0,使用内部SCL发生器
*******************************************************************/
void GetBus()
{ 
	I2SCLH = 15;				/* 设置SCL高电平的PCLK周期数*/
  	I2SCLL = 15;              		/* 设置SCL低电平的PCLK周期数,6MHz 时为100Kbit/S */
  /* 申请成为主机,起动总线。使用内部SCL发生器,I2EN 和AA 置位*/
  	I2CON = RELEASE_BUS_STA; 	
  	while( SI==0 );        						/* 等待起始位的发送*/
}


/*******************************************************************
*                    发送数据函数
* 功能:用于向总线发送数据 
* 入口参数:C   待发送的数据                   
*******************************************************************/
void SendByte(uchar c)
{ 
	I2DAT = c;
  	I2CON = RELEASE_BUS_ACK;    			/* 清除SI位等等   		*/
  	while( SI==0 );        					/* 等待数据的发送 	*/
}


/*******************************************************************
*                    向有子地址器件发送多字节数据函数                 
* 功能:从启动总线到发送地址,子地址,数据,结束总线的全过程。
* 入口参数:    sla	--	从器件地址
*                            subAddr--  子地址
*           			  s  --     发送内容的指针
*           			  num--   发送字节数
* 出口参数:   返回1 表示操作成功,否则操作有误。
********************************************************************/
bit ISendStr(uchar sla, uint subAddr, uchar *s, uchar num)
{ 
	uchar i;
	uchar subAddrH, subAddrL;

	subAddrL = (subAddr&0x00FF);
	subAddrH = (subAddr&0xFF00)>>4;

  	GetBus();                				// 启动总线  
	
  	SendByte(sla|WRITE_DATA_COM);    //  发送器件地址
  	if( I2STAT!=0X18 )				//已发送器件地址和写信号,并已接收应答信号
  	{ 
  		I2CON = GENERATE_STOP;
    		return(0);
  	}

  	SendByte(subAddrH);           		//发送器件子地址高位
  	if( I2STAT!=0X28 )				//已发送数据,并已接收应答信号
  	{ 
  		I2CON = GENERATE_STOP;
    		return(0);
  	}

	SendByte(subAddrL);           		//发送器件子地址低位
  	if( I2STAT!=0X28 )				//已发送数据,并已接收应答信号
  	{ 
  		I2CON = GENERATE_STOP;
    		return(0);
  	}
	
  	for(i=0; i<num; i++)
  	{ 
  		SendByte(*s);           			// 发送数据
    		if(I2STAT!=0X28)				//已发送数据,并已接收应答信号
		{ 
			I2CON = GENERATE_STOP;
	  		return(0);
		}
    		s++;
  	} 

  	I2CON = GENERATE_STOP;   		// 结束总线	
  	return(1);
}


/*******************************************************************
*                    向有子地址器件读取多字节数据函数                
*功能:从启动总线到发送地址,子地址,读数据,结束总线的全过程。
*入口参数:sla --	从器件地址
*          			 subAddr--	子地址
*		  		 s	--   读出的内容存储区的指针
*          			 num--	读num个字节。
*出口参数:函数返回1表示操作成功,否则操作有误。
********************************************************************/
bit IRcvStr(uchar sla, uint subAddr, uchar *s, uchar num)
{ 
	uchar i;
	uchar subAddrH, subAddrL;

	subAddrL = (subAddr&0x00FF);
	subAddrH = (subAddr&0xFF00)>>4;

  	GetBus();                					// 启动总线		
  	
  	SendByte(sla|WRITE_DATA_COM);      	// 发送器件地址
  	if( I2STAT!=0X18)					//已发送器件地址和写信号,并已接收应答信号
  	{ 
  		I2CON = GENERATE_STOP;
    		return(0);
  	}
	
  	SendByte(subAddrH);          			// 发送器件子地址高位	
  	if( I2STAT!=0X28 )					//已发送数据,并已接收应答信号
  	{ 
  		I2CON = GENERATE_STOP;
    		return(0);
  	}

	SendByte(subAddrL);          			// 发送器件子地址低位	
  	if( I2STAT!=0X28 )					//已发送数据,并已接收应答信号
  	{ 
  		I2CON = GENERATE_STOP;
    		return(0);
  	}

  	I2CON = RELEASE_BUS_STA;  			// 重新启动总线	
  	while( SI==0 );
	
  	SendByte(sla|READ_DATA_COM);		//发送读数据信号
	
  	if( I2STAT!=0X40 )					//已发送器件地址和读信号,并已接收应答信号
  	{ 
  		I2CON = GENERATE_STOP;
    		return(0);
  	} 
   
  	for(i=0; i<num-1; i++)
  	{ 
  		I2CON = RELEASE_BUS_ACK;  		// 接收一字节数据并发送应答位
    		while( SI==0 );            			// 等待接收数据					
    		if( I2STAT!=0X50 )				//已接收数据字节,已返回应答信号
		{ 	
			I2CON = GENERATE_STOP;
	  		return(0);
		}
    		*s = I2DAT;               				// 读取数据
  	} 
	
    	s++;
  	I2CON = RELEASE_BUS_NOACK;  		// 接收最后一字节数据并发送非应答位
  	while( SI==0 );  
  	*s = I2DAT;
  	I2CON = GENERATE_STOP;     			 //结束总线			
  	return(1);
	
}


⌨️ 快捷键说明

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