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

📄 meterage.c

📁 采样高压电流
💻 C
📖 第 1 页 / 共 4 页
字号:
#include  <msp430x42x.h>
#include  <math.h>
#include  <stdlib.h>

#define CURRENT_CH_1_GAIN                   SD16GAIN_1
#define CURRENT_CH_2_GAIN                   SD16GAIN_16
#define VOLTAGE_CH_GAIN                     SD16GAIN_1

#define SD16CONF0_FUDGE     0xC0
#define SD16CONF1_FUDGE     0x40

#define  uint   unsigned int
#define  ulong  unsigned long  

//char        c_emission_times;//一次通讯过程中的发射次数
char        c_emission_stat;// 通讯2s不成功再发送标志

char        c_work_start;//开始正常工作标志(在变量初始化时置1,新表时为零在电猫1和2联络成功后置为1此时电猫才能开始采样及定时发射等工作)
//char        c_emission_failure;//在定时发射通讯过程中通讯失败标志,每次最多通讯4次
char        c_emission_return;//定时发射接收电猫2返回成功标志
//char        c_emission_failure_times;//5分钟定时发射没有通讯成功的总的失败次数
char        c_comm_succeed;//定时发射成功标志
char        c_half_second_sign;// 0.5s标志
char        c_1s_sign;// 1s标志
char        c_sec_count;
char        c_min_count;
char        c_min5_stat;
char        c_1m_sign;
char       	c_4s_sign_count;
char        c_rf_stat;//正常工作过程中的定时发射标志
char        c_5s_stat;
char        c_second_count_start;
uint         ui_over_i_verify;//短路电流判断

char     	c_low_mode;//c_low_mode--0:正常耗模式 1:低功耗休眠模式 3:唤醒模式
char     	c_day1;
char     	c_month1;
char     	c_year1;
char     	c_second1;
char     	c_minute1;
char     	c_hour1;

char     	c_i2c_rx_count;//c_i2c_rx_count--i2c读取长度
char     	c_i2c_rx_buf[20];
char     	c_i2c_tx_count;
char     	c_i2c_tx_buf[20];
char     	c_i2c_read_stat;
char     	c_i2c_write_stat;
char     	c_i2c_rx_buf_bak[20];

//char     	c_stop_second;//c_stop_second--停电唤醒时间计数器


char     	c_rx1_num;//c_rx1_num--通讯接收计数器
char     	c_rx1_count;//c_rx1_count--通讯接收长度
char     	c_tx1_num;
char     	c_comm1_stat;//c_comm1_stat--通讯状态
char     	c_comm1_end;//485通信结束标志
char     	c_comm1_delay;
char     	c_meter_id[6];//表号新表默认88
char     	c_user_id[6];//用户号
char     	c_equip_id[6];//设备号
char     	c_pass[3][3];//填充密码用
//char     	c_p_timer[4];//c_p_timer[4]--A\B\C\总 电能余数计数器
//char     	c_p_timer;//Ah余数计数器


//char 	c_bat_vol;//c_bat_vol--电池电压//??????????????????????????????
char 	c_stop_bat_vol;//停电抄表电池电压//??????????????????????????????
//ulong 	ul_bat_work;//电池工作时间
//ulong    	ul_p_pulse_const;//ul_p_pulse_const--有功、基波、视在发脉冲常数
//ulong    	ul_q_pulse_const;//ul_q_pulse_const--无功发脉冲常数
char		c_ray_alarm_stat;//c_ray_alarm_stat--光控报警控制字
char       	c_watchdog_count;


char     	c_meter_stat;//c_meter_stat--电表状态指示 7:失压 6:过压 5:逆相序  4:断相报警   3:编程开关按下 2:需量正在清零 1:2是否有通信 0:1是否有通信 
char        c_com_rest_count;//通讯超时复位计数器

char     	c_modify_par;//通信程序修改参数后重新从e2中读出参数并进行配置(时段等)
char     	c_meter_start;//电表启动标志字 0-刚刚启动有些功能不进行处理(断相、失压、电压合格率、显示等)
char     	*c_pointer;
//ulong    	*ul_pointer;
char     	*c_rx_pointer;
char     	*c_tx_pointer;
char     	c_sample_count;//c_sample_count--ad采样计数变量

char        c_i_computation;//电流计算标志
char     	c_comm_error;//通信错误信息字:0非法数据 1数据标识错 2密码错 4年数区数超 5日时段数超 6费率数超
char     	c_data_length;//通信数据内容的数据长度
char     	c_clear_meter;//c_clear_meter--1:新表 2:总清 3:需量清零(编程按键按下,670703,下翻5秒新表。960101,下翻5秒总清。其他日期,下翻5秒需清)
char        c_over_i_stat;

char bg,bg1,bg2,bg3;

int      	i_i_from_ad[20];//AD采样电流值
int           i_bat_from_ad[20];//电池电压采样值
int           i_averag;//电池电压采样平均值

//ulong      ul_Ah_residual;//Ah余数计数器
ulong    	ul_temp;
ulong     ul_Ah_emission;//发送5分钟内Ah数
uint        ui_Ah_residual;//Ah余数计数器

long        l_averag;//电流采样平均值
long        l_i_accumulate;//电流采样累加值
long        l_bat_accumulate;
float    	f_i_value;//电流计算中间值
float		f_scale_equalize;
char       c_work_start_flag;

char      c_thief_start;
char		c_thief_end;
char		c_thief_start_1;
ulong    	ul_thief_time;//窃电时间计算中间值
ulong     ul_thief_Ah;//窃电Ah计算中间值


__no_init ulong ul_Ah_bcd @ 0x200;//当前 总Ah
__no_init char c_rx1_buf[24] @ 0x214;
__no_init char c_tx1_buf[60] @ 0x22c;
__no_init char c_tx1_count @ 0x268;
__no_init char c_week @ 0x269;
__no_init char c_day @ 0x26a;
__no_init char c_month @ 0x26b;
__no_init char c_year @ 0x26c;
__no_init char c_second @ 0x26d;
__no_init char c_minute @ 0x26e;
__no_init char c_hour @ 0x26f;

__no_init char c_err_stat @0x270;//c_err_stat--错误状态 7: 6:电量走飞 5:电能潮向改变(任1相反向) 4:存储器故障 3:电压逆相序 2:时钟异常 1:电池低 0:外部主晶振故障 
__no_init char c_inside_par @ 0x271;//c_inside_par--测试参数 7: 6:(0-ee正常 1-ee故障) 5: 4:485低端低 3: 2:(0-电池正常 1-电池欠电) 1: 0:(0-正常上电 1=未上电)

__no_init char c_meter_stat1 @ 0x272;//c_meter_stat1--电表运行状态 7: 6:C相断流 5:B相断流 4:A相断流 3:逆相序 2:C相断电 1:B相断电 0:A相断电
__no_init char c_bat_vol @ 0x273;//--3.6V电池电压
__no_init ulong ul_i_bcd @ 0x274;//瞬时电流
__no_init char c_meter_stat2 @ 0x278;//c_meter_stat1--电表运行状态 7: 6:C相断流 5:B相断流 4:A相断流 3:逆相序 2:C相断电 1:B相断电 0:A相断电



const unsigned char gc_day_table[12]={31,28,31,30,31,30,31,31,30,31,30,31};//每月的天数
const unsigned int  gc_month_table[12]={0,31,59,90,120,151,181,212,243,273,304,334};//累计天数

const unsigned char uc_comm_table[]={
	/*
	此表为通信编程顺序表,表格排列顺序如下:
	--通信序号(2), 
	--起始地址(2),(最高位为1时代表数据是内存中的数据此时的地址是对应0x1100的偏移量,对应e2的地址是实际地址)
	--数据长度(1), 
	--密码控制权限(1).(其中为数据 为0表示R,为1表示R/W) 
	--每个量占6个字节  //unsigned long i1,i2,i3;思路决定出路,智商引领工商,清泉之澈、流水之润’,你说这是什么意思?我说,‘估计前一句是教你如何做事,后一句是教你如何待人。

*/
	
	0xb6,0x7e,0x00,0x0a,4,0,/*内部测试参数程序名4,程序序列号3,版本号1*/  // 0          
	0xb6,0x7d,0x00,0x0e,2,0,/*内部测试参数,电能芯片1,小版本号1*/            
	
	0xc0,0x32,0x01,0x00,6,1,/*电猫设备号 */
	0xc3,0x17,0x82,0x00,4,0,/* 安培小时数 */ //0x106
	0xb6,0x21,0x82,0x74,3,0,/* 当前电流 */
	0xc0,0x10,0x82,0x69,4,1,/*日期及周次*/                              // 5
	0xc0,0x11,0x82,0x6d,3,1,/*时间*/
	0xb6,0x76,0x82,0x73,1,0,/* 3.6v电池电压 */
	0xb7,0x40,0x82,0x70,1,0,/* 故障状态字 */
	0xc5,0x20,0x00,0xf6,1,0,/* 总清次数 */
	0xe9,0x10,0x00,0xf4,2,1,/* 电流调整系数 */                 //10


	
	0xe0,0x30,0x01,0x0a,5,0,/* 最近1次短路时间 */
	0xe0,0x31,0x01,0x0f,5,0,/* 最近2次短路时间 */
	0xe0,0x32,0x01,0x14,5,0,/* 最近3次短路时间 */
	0xe0,0x33,0x01,0x19,5,0,/* 最近4次短路时间 */
	0xe0,0x34,0x01,0x1e,5,0,/* 最近5次短路时间 */                // 15
	0xe0,0x35,0x01,0x23,5,0,/* 最近6次短路时间 */
	0xe0,0x36,0x01,0x28,5,0,/* 最近7次短路时间 */
	0xe0,0x37,0x01,0x2d,5,0,/* 最近8次短路时间 */
	0xe0,0x38,0x01,0x32,5,0,/* 最近9次短路时间 */
	0xe0,0x39,0x01,0x37,5,0,/* 最近10次短路时间 */              // 20
	0xe0,0x3a,0x01,0x3c,1,0,/* 短路总次数 */
	
	0xe0,0x40,0x01,0x41,8,0,/* 最近1次窃电记录 */
	0xe0,0x41,0x01,0x49,8,0,/* 最近2次窃电记录 */
	0xe0,0x42,0x01,0x51,8,0,/* 最近3次窃电记录 */
	0xe0,0x43,0x01,0x59,8,0,/* 最近4次窃电记录 */               //25
	0xe0,0x44,0x01,0x61,8,0,/* 最近5次窃电记录 */
	0xe0,0x45,0x01,0x69,8,0,/* 最近6次窃电记录 */
	0xe0,0x46,0x01,0x71,8,0,/* 最近7次窃电记录 */
	0xe0,0x47,0x01,0x79,8,0,/* 最近8次窃电记录 */
	0xe0,0x48,0x01,0x81,8,0,/* 最近9次窃电记录 */              // 30
	0xe0,0x49,0x01,0x89,8,0,/* 最近10次窃电记录 */
       0xe0,0x4a,0x01,0x91,4,0,/* 窃电总时间 */                           // 32
       
};

void read_f24c16(unsigned int ui_read_add,unsigned char c_count);
void i2c_read_one(void);
void write_time(unsigned char c_timm_add,unsigned char c_timm_count);
void write_f24c16(unsigned int ui_write_add,unsigned char c_count);
void i2c_write_one(void);
//void read_time(void);
//void init_module(void);
unsigned long bcd_hex_long(unsigned long gl_bcd);
unsigned long hex_bcd_long(unsigned long gl_hex);
unsigned int bcd_hex_int(unsigned int gi_bcd);
unsigned int hex_bcd_int(unsigned int gi_hex);
unsigned char bcd_hex_char(unsigned char gc_bcd);
unsigned char hex_bcd_char(unsigned char gc_hex);
 void init_sys(void);
 void init_fll(void);
 void goto_high_freq(void);
// void init_bt(void);
// void init_TA(void);
 void init_variable(void);
 void init_module(void);
 void read_time(void);
 void delay(unsigned int count);
 void init_analog_front_end_SD16(void);
 void read_int(void);
 void par_init(void);//parameter initialize参数初始化(读出已经设置的内部参数)
 void new_meter(void);
 void judge_week(void);
void do_comm1(void);
void do_comm(void);
unsigned char check_set_bcd(unsigned char gc_start_add,unsigned char gc_data_len);
void all_clear(void);
void par_save(void);


union    {unsigned long high;unsigned int middle;unsigned char low[4];}convert;
union    {unsigned int ui_add;unsigned char c_add[2];}add,add1;

#pragma vector = USART0RX_VECTOR
__interrupt void UART1_RX() // interrupt[ESP430_VECTOR] void esp_isr (void)
{
	unsigned char i1,i2,i3;
	
//	if((TBCCTL0 & 0x10)==0x10)//当进行ad变换时允许中断嵌套
//		_EINT();
	
 	c_comm1_end=1;
//	if(c_baud_stat_3s!=0)
//		c_baud_stat_3s=1;
	c_rx1_buf[c_rx1_num]=U0RXBUF;
	c_rx1_num++;
	if(c_rx1_num==1)
	{
		if(c_rx1_buf[0] != 0x68)
		{
			c_rx1_buf[0]=0;
			c_rx1_num=0;
		}
		//else
		//{
		//	P2IE=P2IE&0x7f;//禁止中断
		//	ui_comm1_low=65535;
		//	P2IES=P2IES|0x80;//改为下降沿
		//}
	}
	else
    	{
    		if(c_rx1_num==8)  //判断地址域
		{
			i2=0;
			i3=0;
			for(i1=1;i1<7;i1++)
			{
				if(c_rx1_buf[i1]==0x99)//广播命令回答本表号
					i3=i3+1;
			}
			if(i3!=6)
			{
				i3=0;
				for(i1=1;i1<7;i1++)
				{
					if(c_rx1_buf[i1]==0xaa)//广播命令回答本表号
						i3=i3+1;
				}
				if(i3!=6)
				{
					for(i1=0;i1<6;i1++)
					{
						if(c_rx1_buf[i1+1] != c_meter_id[i1])
						{  //判断既不是广播命令也不是本表号
							i2=0xff;
						}   		
					}
				}
			}

			if(c_rx1_buf[7]!=0x68)
				i2=0xff;

			if(i2 != 0)
			{	
				c_rx1_num=0;
				c_rx1_count=0;
				c_rx1_buf[0]=0;
			}
		}
    		else
		{	
			if(c_rx1_num==10)//判断长度		
			{
				if(c_rx1_buf[9]==0)
					c_rx1_count=12;//无数据
				else
				{
					if(c_rx1_buf[9] > 50)
					{
						c_rx1_num=0;//写入长度>50无效
					}
					else 
						c_rx1_count=c_rx1_buf[9]+12;
				}
			}
			else
			{
				if(c_rx1_num==c_rx1_count)//接收完全
				{
				
					if(c_rx1_buf[c_rx1_num-1]==0x16)//结束符对否
					{
						i2=c_rx1_buf[0];
						for(i1=1;i1<=(c_rx1_count-3);i1++)//加和效验
						{
							i2=i2+c_rx1_buf[i1];
						}

						if(i2==c_rx1_buf[c_rx1_count-2])//效验正确否
						{
						//       if(c_rx1_buf[10]==0x44 && c_rx1_buf[11]==0x13)
						//	   	c_relation_stat=1;
							i2=0;
							for(i1=1;i1<7;i1++)
							{
								if(c_rx1_buf[i1]!=0x99)//判断是否是广播命令
									i2=0xff;
							}
							if(i2==0)//广播命令只处理广播校时及设表号及广播冻结,载波冻结
							{
								//if(c_rx1_buf[8]==0x08 || c_rx1_buf[8]==0x0a || c_rx1_buf[8]==0x19 || c_rx1_buf[8]==0x12)
								if(c_rx1_buf[8]==0x08 || c_rx1_buf[8]==0x0a )
								i2=0xff;
								//0x08--广播校时 0x0a--写设备地址 0x19--
							}
							
							if(c_rx1_buf[2]==0xaa)
							{
								i2=0;
								if((c_rx1_buf[10]==0x65 && c_rx1_buf[11]==0xf3) ||(c_rx1_buf[10]==0x43 && c_rx1_buf[11]==0xf3)
														||(c_rx1_buf[10]==0x44 && c_rx1_buf[11]==0xf3))//读写表号、时间
									i2=0xff;
							}
							
							if(i2==0xff)
							{
								for(i1=10;i1<=(c_rx1_count-3);i1++)
								{
									c_rx1_buf[i1]=c_rx1_buf[i1]-0x33;//数据减33H格式化处理
								}
								if(c_rf_stat==1)
								{
									c_rf_stat=0;
									c_emission_return=1; 
									c_comm_succeed=1;
								}
								
								c_comm1_stat=0xaa;
								c_meter_stat=c_meter_stat | 0x02;//c_meter_stat--电表状态指示 7:失压 6:过压 5:逆相序  4:断相报警   3:编程开关按下 2:需量正在清零 1:2是否有通信 0:1是否有通信 
								if((SVSCTL&0x01)==1)
								{	
								//	P1OUT&=0xef;//关闭无线模块控制脚

								}

							}
						}
					}
					c_rx1_num=0;
					c_rx1_count=0;
				}
			}
		}
    	}		
	c_com_rest_count=0;
}

#pragma vector = USART0TX_VECTOR
__interrupt void UART1_TX()
{

       c_tx1_num++;

⌨️ 快捷键说明

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