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

📄 meterage.c

📁 采样高压电流
💻 C
📖 第 1 页 / 共 4 页
字号:
	c_comm1_end=1;
	if(c_tx1_num<=c_tx1_count)
   	{
		U0TXBUF=c_tx1_buf[c_tx1_num];
	}
	else
	{
		c_comm1_end=0;
	}

//	if((TBCCTL0 & 0x10)==0x10)//当进行ad变换时允许中断嵌套
//    		_EINT();
     // i4=0;
 /*     ++lj2;
	c_tx1_num++;
	c_comm1_end=1;
	if(c_tx1_num<=7)
	//if(c_tx1_num<=c_tx1_count)
   	{
		U0TXBUF=c_tx1_buf[c_tx1_num];
	}
	else
	{
		c_tx1_num=0;
	//	 P1OUT&=0xfb;
	//	i4=0x01;
		
//		ui_comm1_high=0;
//		P2IES=P2IES&0x7f;//改为上升沿
//	    	P2IFG=P2IFG & 0x7f;
//	    	P2IE=P2IE|0x80;
	}*/
}
#pragma vector = BASICTIMER_VECTOR
__interrupt void BASICTIMER()
{	
      P1OUT=P1OUT ^ 0x20;//复位看门狗

	 SVSCTL=SVSCTL&0xfe;
	 delay(1000);
	if(c_low_mode==1&&(SVSCTL&0x01)==0)
	{
	//	FLL_CTL1=FLL_CTL1 & 0x00;
	     // P1OUT|=0xd0;
		_NOP();
		c_low_mode=3;
		_BIC_SR_IRQ(LPM3_bits);//主程序中的低功耗模式停止
		_NOP();
		return;
//		c_stop_second=0;
	}
  /*    if(c_low_mode==3)
	{
		c_stop_second=c_stop_second+1;//c_stop_second--停电唤醒时间计数器
	}

	  
	 if(c_wink_count==0)//c_wink_count--液晶显示闪烁计数器
        	c_wink_count++;
    	else
        	c_wink_count=0;*/
	if(c_second_count_start==1)	
	{    	
		c_half_second_sign++;
	//	if(c_half_second_sign==0x02&&c_second_count_start==1)
		if(c_half_second_sign==0x02)
		{      
		       c_4s_sign_count++;
			   
		       c_sec_count++;
			  c_5s_stat++;
			  
			c_half_second_sign=0;
			c_1s_sign=1;
			
		}
	
	
		if(c_4s_sign_count==4)
		{
		        c_4s_sign_count=0;
			if(c_min5_stat==1)
		      {
				c_emission_stat=1;
				
			}
			else
			{
				c_comm_succeed=0;
			}
		}

/*		if((SVSCTL&0x01)==1&&c_5s_stat==5)
		{
			c_5s_stat=0;
			_NOP();
		      c_low_mode=3;
			_BIC_SR_IRQ(LPM3_bits);//主程序中的低功耗模式停止
			_NOP();
		}
	*/	
		if(c_sec_count==60)
		{
		        c_1m_sign=1;
			c_sec_count=0;
			c_min_count++;
			c_min5_stat=0;
			c_rf_stat=0;
		}
		if(c_min_count==5)
		{
			c_min_count=0;
			//c_min_count=1;
			c_min5_stat=1;
		}
	}
	else
	{
		c_half_second_sign++;
	//	if(c_half_second_sign==0x02&&c_second_count_start==1)
		if(c_half_second_sign==0x02)
		{      
			c_half_second_sign=0;
			c_1s_sign=1;
		}
	}
}


#pragma vector = SD16_VECTOR
__interrupt void SD16()
{
    	c_sample_count++;
   	 i_i_from_ad[c_sample_count] = SD16MEM0;       //Neutral current
   	 i_bat_from_ad[c_sample_count] = SD16MEM1;       // battry voltage

	if(c_sample_count>20)
	{
		SD16CCTL1&=~SD16SC;
		c_i_computation=1;
	}
		
}
#pragma vector = TIMERA0_VECTOR
__interrupt void TIMERA0()//计算20 ms内的Ah数
{
//	Ah_M+=adc_buffer[2]*0.0019*655/32768/3600;
	if((SVSCTL&0x01)==0)//c_power_low--=1 电源电压低准备进入低功耗模式
	{
		c_watchdog_count++;//看门狗计数器计数
	}

}


void main(void)
{	
       unsigned char i1,i2,i3;

	WDTCTL = WDTPW + WDTHOLD;//Stop watchdog timer
	_DINT();
	init_module( );
	init_variable( );
	//P1OUT|=0xd0;
//	goto_high_freq();
	//P1OUT=P1OUT ^ 0x20;//复位看门狗

    if((SVSCTL&0x01)==0x01)//停电判断 避免停电换电池cpu进入正常工作模式
					   //P1.4 POWER 电源监测中断 下降沿中断
	{    
	       SVSCTL=SVSCTL&0xfe;
		for(i2=0;i2<10;i2++)//延时10ms滤除干扰
		{
			delay(1000);
		}
		 if((SVSCTL&0x01)==1&&c_comm1_end==0)
		{
            		//进入低功耗模式
           		SVSCTL=SVSCTL&0xfe;
			c_low_mode=1;
		//	c_meter_stat2=0x04;//c_meter_stat2--电能表运行状态字,0:抄表方式0-自动1-手动 1:最大需量积算方式0-滑差1-区间 2:3.6V电池电压3: 4:有功电能方向 5:无功电能方向 6:7:
			goto sleep;//停止工作状态
		}
	}
	   
	c_i2c_tx_buf[2]=0x23;//24小时制,每秒中断一次   
	write_time(0xe0,1);//从控制寄存器1开始写
	
	read_f24c16(0x0000,10);//读新表状态字10个
	i3=0;
	for(i2=0;i2<10;i2++)
	{
		if(c_i2c_rx_buf[i2]==0x55) 
			i3++;
	}
//i3=0;//测试用
	if(i3==0)
	{
		new_meter();
	}   
       read_int();
/*//$$$$	
	//写不足0.01度的剩余脉冲 0xfa
	c_i2c_tx_buf[2]=0;
	c_i2c_tx_buf[3]=0;
	c_i2c_tx_buf[4]=0;
	c_i2c_tx_buf[5]=0;
	c_i2c_tx_buf[6]=0;
	c_i2c_tx_buf[7]=0;
	write_f24c16(0x00fa,6);
	write_f24c16(0x1b10,3);
	c_p_timer[0]=0;//c_p_timer[4]--总\A\B\C\ 电能余数计数器
	c_p_timer[1]=0;
	c_p_timer[2]=0;
	c_p_timer[3]=0;
//	c_1p_timer=c_i2c_rx_buf[4];
	c_q_timer[0]=0;
	c_q_timer[1]=0;//c_q_timer[4]--总\A\B\C\ 电能余数计数器
	c_q_timer[2]=0;
	c_q_timer[3]=0;
//$$$$*/	

       par_init();
	read_time();
	

	

	
/*	c_i2c_tx_buf[2]=c_day;
	c_i2c_tx_buf[3]=c_month;
	c_i2c_tx_buf[4]=c_year;
	c_i2c_tx_buf[5]=c_minute;
	c_i2c_tx_buf[6]=c_hour;
	write_f24c16(0x0147,5);//记录上电时间	
	c_i2c_tx_buf[2]=0;
	c_i2c_tx_buf[3]=0;
	c_i2c_tx_buf[4]=0;
	c_i2c_tx_buf[5]=0;
	c_i2c_tx_buf[6]=0;
	write_f24c16(0x0142,5);//清停电时间
	
 
//	c_i2c_tx_buf[2]=0x00;//时钟补偿字
//	write_time(0x70,1);//补偿时钟控制字
//	c_jhf_banben=0x23;
	//P1OUT=P1OUT ^ 0x20;//复位看门狗办公室一族健康食谱
*/
 
       _EINT();
	while(1)
	{
		//P1OUT=P1OUT ^ 0x20;//复位看门狗
/*		if(c_week_stat==1)
		{
			IE2|=0x80;//打开基本定时器中断

		}
			*/

             if((IFG1&0x02)!=0)//震荡器故障重新设置震荡器
		{
			IFG1=0;
			
			FLL_CTL0 |= XCAP14PF;      	    /* 配置电容 */
			SCFI0 = FLLD_1;  			    /* Freq = 1.024MHz */
			SCFQCTL = 32 - 1;
			FLL_CTL0 |= DCOPLUS;  	
	
			IFG1=0;

		}
	/*	if((SVSCTL&0x01)==0)
		{
			if(c_watchdog_count!=0)
			{
				//P1OUT=P1OUT ^ 0x20;//复位看门狗
				c_watchdog_count=0;
			}
		}*///	这一段判断看门狗计数器有什么作用?
		
		 if((SVSCTL&0x01)==1)//停电判断 避免停电换电池cpu进入正常工作模式
							   //P1.4 POWER 电源监测中断 下降沿中断
		{    
		       SVSCTL=SVSCTL&0xfe;
			for(i2=0;i2<10;i2++)//延时10ms滤除干扰
			{
				delay(1000);
			}
			 if((SVSCTL&0x01)==1&&c_comm1_end==0)
			{
			      SVSCTL=SVSCTL&0xfe;
				_DINT();
				c_low_mode=1;//进入低功耗模式 
				
				if(c_thief_start!=0)//保证电能量写入正确
				{
				//	c_i2c_tx_buf[2]=0x00;//时钟补偿字
				//	write_time(0x70,1);//补偿时钟控制字
					par_save();
				//	c_low_mode=1;//进入低功耗模式 
				}
			}
		}
		
			//P1OUT=P1OUT ^ 0x20;//复位看门狗

		if(c_low_mode==1)//低功耗模式
		{
			sleep: 
			_DINT();//禁止中断
			_NOP();
			IFG1=0;//中断标志1
			//7 6 5 4 3 2 1 0
		    	//0 0 0 0 0 0 0 0
			//| | | | | | | +-0 WDTIFG(1)--rw-0
			//| | | | | | +---1 OFIFG(1)--rw-0
			//| | | | | +-----2 
			//| | | | +-------3 
			//| | | +---------4 NMIFG(1)--rw-0
			//| | +-----------5
			//| +-------------6 
			//+---------------7 
			IFG2=0;//中断标志2
			//7 6 5 4 3 2 1 0
		    	//0 0 0 0 0 0 0 0
			//| | | | | | | +-0 URXIFG0(1)--UART0接收中断标志 rw-0
			//| | | | | | +---1 UTXIFG0(1)--UART0发送中断标志 rw-1
			//| | | | | +-----2 
			//| | | | +-------3 
			//| | | +---------4 URXIFG1(1)--UART1接收中断标志 rw-0
			//| | +-----------5 UTXIFG1(1)--UART1发送中断标志 rw-1
			//| +-------------6 
			//+---------------7 
			ME1=0;//模块使能1
			//7 6 5 4 3 2 1 0
		    	//0 0 0 0 0 0 0 0
			//| | | | | | | +-0 
			//| | | | | | +---1 
			//| | | | | +-----2 
			//| | | | +-------3 
			//| | | +---------4 
			//| | +-----------5 
			//| +-------------6 URXE0(1)--UART0接收允许 rw-0
			//+---------------7 UTXE0(1)--UART0发送允许 rw-0
		//	ME2=0;//模块使能2
			//7 6 5 4 3 2 1 0
		    	//0 0 0 0 0 0 0 0
			//| | | | | | | +-0 
			//| | | | | | +---1 
			//| | | | | +-----2 
			//| | | | +-------3 
			//| | | +---------4 URXE1(1)--UART1接收允许 rw-0
			//| | +-----------5 UTXE1(1)--UART1发送允许 rw-0
			//| +-------------6 
			//+---------------7 
			IE1=0;//中断使能1
			//7 6 5 4 3 2 1 0
		    	//0 0 0 0 0 0 0 0
			//| | | | | | | +-0 WDTIE rw-0
			//| | | | | | +---1 OFIE rw-0
			//| | | | | +-----2 
			//| | | | +-------3 
			//| | | +---------4 NMIIE rw-0
			//| | +-----------5 ACCVIE rw-0
			//| +-------------6 
			//+---------------7 
			IE2=0x80;//0;//打开基本定时器中断
			//7 6 5 4 3 2 1 0
		    	//0 0 0 0 0 0 0 0
			//| | | | | | | +-0 URXIE0(1)--UART0接收使能 rw-0
			//| | | | | | +---1 UTXIE0(1)--UART0发送使能 rw-0
			//| | | | | +-----2 
			//| | | | +-------3 
			//| | | +---------4 URXIE1(1)--UART1接收使能 rw-0
			//| | +-----------5 UTXIE1(1)--UART1发送使能 rw-0
			//| +-------------6 
			//+---------------7 //基本定时器
			
			SD16CTL=0;//关断SD16
			SD16CCTL0=0x00;
			SD16CCTL1=0x00;


			LCDCTL=0;//关闭液晶显示

			//7 6 5 4 3 2 1 0
		    	//0 0 0 0 0 0 0 0
			//| | | | | | | +-0 LCDM0(1)--定时发生器开关。0:定时发生器关闭,COM线与段驱动端为抵电平,液晶复用端口被选为输出端口的,输出不受影响;LCD+模块切断电阻网络电源。
			//| | | | | | +---1 LCDM1(1)--只对LCD+有效,选择LCD驱动电压幅度;0:模拟发生器内阻为高阻抗 1:内阻为低阻抗
			//| | | +-+-+-----2 LCDM4,3,2(3)--LCDM2选择允许或禁止段输出;LCDM3,4--4种模式输出;静态,2MUX,3MUX,4MUX
			//+-+-+-----------7 选择输出段或端口信息组合 111--4MUX
			//LCDAPCTL0 = 0x00;// Segments 0-13

⌨️ 快捷键说明

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