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

📄 meterage.c

📁 采样高压电流
💻 C
📖 第 1 页 / 共 4 页
字号:
			//LCDAPCTL1 = 0x00; 
			//LCDAVCTL0 = 0x00;// enable charge pump
			//LCDAVCTL1 = 0x00;    
			U0CTL=0x01;//复位485通信口1
			//7 6 5 4 3 2 1 0
			//| | | | | | | +-SWRST(1)--1:初始化成复位状态 0:USART	模块被允许。
			//| | | | | | +---MM(1)--0:线路空闲多机协议(异步模式),从机模式(同步方式) 1:地址位多机协议(异步模式),主机模式(同步方式)
			//| | | | | +-----SYNC(1)--0:UART模式(同步) 1:SPI模式(异步)
			//| | | | +-------Listen(1)--0:无反馈 1:有反馈,自己发送的数据别自己接收
			//| | | +---------CHAR(1)--0:7位 1:8位
			//| | +-----------SP(1)--0:1位停止位 1:2位停止位
			//| +-------------PEV(1)--0:奇校验 1:偶校验
			//+---------------PENA(1)--0:校验禁止 1:校验允许
			//UCA0CTL1=0x01;//复位485通信口0
			
			TACTL=TACTL & 0xffcf;
			//15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
			// |  |  |  |  |  | | | | | | | | | | +-TAIFG(1)--定时器益出标志位
			// |  |  |  |  |  | | | | | | | | | +---TAIE(1)--中断允许标志位。
			// |  |  |  |  |  | | | | | | | | +-----TACLR(1)--定时器清除位。
			// |  |  |  |  |  | | | | | | | +-------未用(1)
			// |  |  |  |  |  | | | | | +-+---------MC1,MC0(2)--00:停止模式 01:增计数模式 10:连续计数模式 11:增/减计数模式
			// |  |  |  |  |  | | | +-+-------------ID1,ID0(2)--00:直通,不分频 01:1/2分频 10:1/4分频 11:1/8分频
			// |  |  |  |  |  | +-+-----------------TASSEL1,TASSEL0(2)--00:TACLK外部引脚 01:ACLK 10:MCLK 11:INCLK外部输入时钟
			// +--+--+--+--+--+---------------------未用(6)

	
			P1SEL=0x00;
			//sel为端口选择寄存器=0:I/O端口 =1:外围模块 P1.2定义定时器功能(PWM输出模式) 
			//P1.0 WDOG
			//P1.1 CTLR VPP红外接收电源控制
			//P1.2 TXD1 红外通讯发送
			//P1.3 RXD1 红外通讯接收 下降沿中断
			//P1.4 POWER 电源监测中断 下降沿中断
			//P1.5 多功能输出
			//P1.6 K1上翻键
			//P1.7 K2下翻键 轮显按键
			P1DIR=0xc0;//0x27//最高两位做按键输入,4位电源电压监测,3位红外通信输入,其它位输出 0:输入 1:输出
			P1OUT=0x00;
			
			P2SEL=0x00;
			//0X38;sel为端口选择寄存器=0:I/O端口 =1:外围模块//管角定义接收发送模块,TB2捕获允许
		    	//7 6 5 4 3 2 1 0
		    	//0 0 1 1 1 1 1 0
			//| | | | | | | +-P2.0--485 0接收中断
			//| | | | | | +---P2.1--编程开关
			//| | | | | +-----P2.2--开盖记录
			//| | | | +-------P2.3--SAMPLE 周期检测中断
			//| | | +---------P2.4--TXDA 485 0发送
			//| | +-----------P2.5--RXDA 485 0接收
			//| +-------------P2.6--报警灯=1输出
			//+---------------P2.7--485 1接收中断
			P2DIR=0x23;
			P2OUT=0x00;
	
			P1IES=0;
			P1IE=0;
			P1IFG=0;
			P2IFG=0;
			P2IES=0;
			P2IE=0;

		//	SVSCTL=0x00;
			
			c_second_count_start=0;


			
			_EINT();//允许中断

			//FLL_CTL1=FLL_CTL1 | 0x60;
			//00B1-0(rw-00)--FLL_DIV LFXT1分频因子 ACLK/n可以在P1.5输出 n=1,2,4,8
			//0B2(rw-0)--SELS =0:SMCLK=DCOCLK =1:SMCLK=XT2CLK
			//10B4-3(rw-00)--SELM 0,1:MCLK=DCOCLK 2:MCLK=XT2CLK 3:MCLK=ACLK(LFXT1)
			//0B5(rw-1)--XT2Off 0:如果XT2没有被用作MCLK或SMCLK,则关闭XT2 1:打开XT2
			//B6(rw-0)--SMCLKOff 0:打开SMCLK 1:关闭SMCLK	
			_NOP();
			if((c_meter_stat2 & 0x04)==0)//c_meter_stat2--电能表运行状态字,0:抄表方式0-自动1-手动 1:最大需量积算方式0-滑差1-区间 2:3.6V电池电压3: 4:有功电能方向 5:无功电能方向 6:7:          
				LPM3;//进入低功耗模式3
			else
				LPM4;//换电池进入休眠或电池欠压休眠则停止工作
			delay(2);
		}
		if(c_low_mode==3&&((SVSCTL&0x01)==0))//必须放在休眠程序后面,退出休眠状态时程序要从这里开始执行。否则重新上电会产生复位
	//	if(c_low_mode==3)//必须放在休眠程序后面,退出休眠状态时程序要从这里开始执行。否则重新上电会产生复位
		{
	//	     LPM3_EXIT;//只能在中断里用
			_DINT();
			init_module();
			
			//P1OUT=P1OUT ^ 0x20;//复位看门狗

			
			read_int();
    			par_init();
			c_low_mode=0;
			c_inside_par=c_inside_par & 0xfe;//c_inside_par--测试参数 7: 6:(0-ee正常 1-ee故障) 5: 4:485低端低 3: 2:(0-电池正常 1-电池欠电) 1: 0:(0-正常上电 1=未上电) 
		    	_EINT();
			read_time();

			//P1OUT=P1OUT ^ 0x20;//复位看门狗

		}
		if(c_work_start==0)
		{
				P1OUT|=0x10;
		}
		if(c_second==0&&c_work_start==1&&c_work_start_flag==0)
		{
			c_second_count_start=1;
			c_work_start_flag=1;

			convert.high=ul_Ah_bcd;
			c_i2c_tx_buf[2]=convert.low[0];//
			c_i2c_tx_buf[3]=convert.low[1];
			c_i2c_tx_buf[4]=convert.low[2];
			c_i2c_tx_buf[5]=convert.low[3];
			write_f24c16(0x01ae,4);

		}
		i1=IE2;	
		if((i1&0x80)==0)//防止秒信号中断丢失
			IE2=IE2|0x80;
		

/*		read_time();	
		if(c_comm1_stat==0xaa )//UART1
		{
			c_comm1_stat=0xff;
			do_comm();
			 c_tx1_num=0;
			U0TXBUF=c_tx1_buf[c_tx1_num];
		    	if(c_modify_par>0 && c_modify_par<3)
			{
				par_init();
			}
			else
			{
				if(c_modify_par==3)
					read_int();
			}
		    	c_modify_par=0;
		}
*/
		
	//	if(c_work_start==1)
	//	{
		//	init_analog_front_end_SD16( );
	//	}
		read_time();	

		if(c_i_computation==1)
		{
			c_i_computation=0;
		 	for(i1=10;i1<20;i1++)
			{
				l_i_accumulate+=i_i_from_ad[i1];
				l_bat_accumulate+=i_bat_from_ad[i1];
		//		l_i_accumulate+=i_bat_from_ad[i1];
		//		l_bat_accumulate+=i_i_from_ad[i1];
			}
	//			//P1OUT=P1OUT ^ 0x20;//复位看门狗

			l_averag=l_i_accumulate/10;
			f_i_value=(float)l_averag*f_scale_equalize;
		//	f_i_value=(float)l_averag*0.00721;

			//P1OUT=P1OUT ^ 0x20;//复位看门狗

			i_averag=(int)(l_bat_accumulate/10);		
			c_bat_vol=(unsigned char)((float)i_averag*0.0021);
			c_bat_vol=hex_bcd_char(c_bat_vol);
			

			//填充电流
			ul_i_bcd=hex_bcd_long((ulong)(f_i_value*1000));

				//P1OUT=P1OUT ^ 0x20;//复位看门狗

			
			l_i_accumulate=0;
			l_bat_accumulate=0;
			c_sample_count=0;
			SD16CCTL1 |= SD16SC;
			

			bg=ul_i_bcd;
			bg1=ul_i_bcd>>8;
			bg2=ul_i_bcd>>16;
		//	bg3=ul_i_bcd>>24;

			if(c_bat_vol<0x24)
			{
				c_err_stat=c_err_stat|0x02;//c_err_stat--错误状态 7: 6:电量走飞 5:电能潮向改变(任1相反向) 4:存储器故障 3:电压逆相序 2:时钟异常 1:电池低 0:外部主晶振故障 
			}
			  
		//	ui_over_i_verify=(uint)(bcd_hex_long(ul_i_bcd));
		//	if(ui_over_i_verify>200)	
			if(bg2>0x20&&c_over_i_stat!=0xAA)
			{      
          	       	P1OUT|=0x10;//打开无线模块控制脚
				c_over_i_stat=0xAA;
				convert.high=ul_i_bcd;
				
				c_tx_pointer=(char*)0x22c;


				*(c_tx_pointer)=0x68;
				*(c_tx_pointer+1)=c_meter_id[0];
				*(c_tx_pointer+2)=c_meter_id[1];
				*(c_tx_pointer+3)=c_meter_id[2];
				*(c_tx_pointer+4)=c_meter_id[3];
				*(c_tx_pointer+5)=c_meter_id[4];
				*(c_tx_pointer+6)=c_meter_id[5];
				*(c_tx_pointer+7)=0x68;

				*(c_tx_pointer+8)=0x1e;
				*(c_tx_pointer+9)= 0x07;
		//		*(c_tx_pointer+10)= convert.low[2];
		//		*(c_tx_pointer+11)= convert.low[0];

				*(c_tx_pointer+10)= c_second+0X33;
				*(c_tx_pointer+11)=c_minute+0X33;
				*(c_tx_pointer+12)=c_hour+0X33;
				*(c_tx_pointer+13)=c_day+0X33;
				*(c_tx_pointer+14)=c_month+0X33;
				*(c_tx_pointer+15)=c_year+0X33;

				*(c_tx_pointer+16)= 0xAA+0X33;//大电流短路报警状态字为0xAA

				//	i3=c_data_length+12;
				*(c_tx_pointer+17)=*(c_tx_pointer);
				for(i1=1;i1<17;i1++)//计算校验码
				{
					*(c_tx_pointer+17)=*(c_tx_pointer+17)+*(c_tx_pointer+i1);
				}
				*(c_tx_pointer+18)=0x16;

				*(c_rx_pointer+84)=18;//发送长度长度


				//U0TXBUF=c_tx1_buf[c_tx1_num];
			//	U0TXBUF=*(c_tx_pointer);
				c_tx1_num=0;
				U0TXBUF=c_tx1_buf[c_tx1_num];
			
			}
         }
		
	P1OUT=P1OUT ^ 0x20;//复位看门狗

		
            
		if(c_emission_return==1&&c_comm1_stat==0xaa)
		{    
			c_emission_return=0;
		//	c_comm_succeed=1;
			c_comm1_stat=0xff;
			 do_comm1();
		}
		else
		{
		//	if(c_comm1_stat==0xaa && ((P1IN & 0x10)!=0))//UART1
			if(c_comm1_stat==0xaa )//UART1
			{
				//P1OUT|=0x10;//打开无线模块控制脚
				c_comm1_stat=0xff;
				do_comm(); 
		//		P1OUT|=0x10;
				c_tx1_num=0;
				U0TXBUF=c_tx1_buf[c_tx1_num];
				
			    	if(c_modify_par==2)
				{
					par_init();
				}
				else
				{
					if(c_modify_par==3)
						read_int();
				}
			    	c_modify_par=0;
			}
		}
		
	
/*
		if(c_com_rest_count>3)//通讯超时复位计数器
		{
			c_com_rest_count=0;
			U0CTL=PENA+PEV+CHAR;//控制寄存器 配置通信口0,校验使能,偶效验,8位字符,一位停止位,复位通信口,
		    	//7 6 5 4 3 2 1 0
			//| | | | | | | +-SWRST(1)--1:初始化成复位状态 0:USART	模块被允许。
			//| | | | | | +---MM(1)--0:线路空闲多机协议(异步模式),从机模式(同步方式) 1:地址位多机协议(异步模式),主机模式(同步方式)
			//| | | | | +-----SYNC(1)--0:UART模式(同步) 1:SPI模式(异步)
			//| | | | +-------Listen(1)--0:无反馈 1:有反馈,自己发送的数据别自己接收
			//| | | +---------CHAR(1)--0:7位 1:8位
			//| | +-----------SP(1)--0:1位停止位 1:2位停止位
			//| +-------------PEV(1)--0:奇校验 1:偶校验
			//+---------------PENA(1)--0:校验禁止 1:校验允许
		    	U0TCTL=SSEL1;//发送控制寄存器 时钟选择主时钟 SSEL1=0x20
		    	//7 6 5 4 3 2 1 0
		    	//0 0 1 0 0 0 0 0
			//| | | | | | | +-TXEPT(1)--1:发送器空 0:发送器有数据。
			//| | | | | | +---STC(1)--异步模式不使用 0:选择SPI的4线模式 1:3线模式
			//| | | | | +-----TXWAKE(1)--多处理器通信传送控制位(同步方式不使用)
			//| | | | +-------URXSE(1)--接收出发沿控制位,在同步时没有使用 0:没有收到数据 1:接收到数据,请求接收中断服务
			//| | +-+---------SSEL1-0(2)--00:选择外部时钟UCLK 01:选择辅助时钟ACLK 10:11:选择子系统时钟SMCLK
			//| +-------------CKPL(1)--时钟极性控制位
			//+---------------CKPH(1)--时钟相位控制位
		    	U0RCTL=0X08;//清除各种错误标志
		    	//7 6 5 4 3 2 1 0
		    	//0 0 0 0 0 0 0 0
			//| | | | | | | +-RXERR(1)--接收错误标志位 1:有错误接收,该位不能自动复位 0:没有接收错误
			//| | | | | | +---RXWAKE(1)--接收唤醒检测位 0:没有被唤醒 1:唤醒
			//| | | | | +-----URXWIE(1)--接收唤醒中断允许位
			//| | | | +-------URXEIE(1)--接收错误中断允许位
			//| | | +---------BRK(1)--打断检测位
			//| | +-----------OE(1)--溢出标志位
			//| +-------------PE(1)--校验错误标志位
			//+---------------FE(1)--桢错标志
		    	U0BR0=0x0a;
		    	U0BR1=0x1a;//1200
		    	U0MCTL=0x6b;//01101011
		}*/


		if(c_1s_sign==1)//c_1s_sign--1秒标志,做记录用
		{
			c_1s_sign=0;
                /*     if(ul_i_bcd>0x1500)
                     {
                     	ul_Ah_residual=ul_Ah_residual+bcd_hex_long(ul_i_bcd);
                     }
				
			ul_Ah_residual=ul_Ah_residual+bcd_hex_long(ul_i_bcd);
			i1=0;
			while(ul_Ah_residual>=36000)// 0.01AH
			{
				ul_Ah_residual=ul_Ah_residual-36000;
				i1++;
			}*/
				
			ui_Ah_residual=ui_Ah_residual+(uint)(bcd_hex_long(ul_i_bcd));
			
			i1=0;
			while(ui_Ah_residual>=36000)// 0.01AH
			{
				ui_Ah_residual=ui_Ah_residual-36000;
				i1++;
			}
			if(i1!=0)
			{
				read_f24c16(0x0106,4);
				convert.low[0]=c_i2c_rx_buf[0];
				convert.low[1]=c_i2c_rx_buf[1];
				convert.low[2]=c_i2c_rx_buf[2];
				convert.low[3]=c_i2c_rx_buf[3];
				ul_temp=bcd_hex_long(convert.high)+i1;
				if(ul_temp>99999999)//防止溢出
					ul_temp=0;
				ul_temp=hex_bcd_long(ul_temp);
				ul_Ah_bcd=ul_temp;
				c_i2c_tx_buf[2]=ul_temp;
				c_i2c_tx_buf[3]=ul_temp>>8;
				c_i2c_tx_buf[4]=ul_temp>>16;
				c_i2c_tx_buf[5]=ul_temp>>24;
				write_f24c16(0x0106,4);//存储失压相安培小时数
				//P1OUT=P1OUT ^ 0x20;//复位看门狗

			}
			if(c_second==0x15||c_second==0x45)
			{
				c_day1=c_day;
				c_hour1=c_hour;
				c_minute1=c_minute;
				c_month1=c_month;
				c_second1=c_second;
				c_year1=c_year;
				read_time();
				if(c_i2c_read_stat==0)
				{
					if((c_year1!=c_year)||(c_month1!=c_month)||(c_day1!=c_day)||(c_hour1!=c_hour)||(c_minute1!=c_minute)||(abs(c_second1-c_second)>10))
					{
						c_second=c_second1;
						c_minute=c_minute1;
						c_hour=c_hour1;
						c_day=c_day1;
						c_month=c_month1;
						c_year=c_year1;

						judge_week();

⌨️ 快捷键说明

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