📄 meterage.c
字号:
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 + -