📄 meterage.c
字号:
c_i2c_tx_buf[2]=0x23;//24小时制
write_time(0xe0,1);//从控制寄存器1开始写
c_i2c_tx_buf[2]=c_second;//秒
c_i2c_tx_buf[3]=c_minute;//分
c_i2c_tx_buf[4]=c_hour;//时
c_i2c_tx_buf[5]=c_week;//周
c_i2c_tx_buf[6]=c_day;//日
c_i2c_tx_buf[7]=c_month;//月
c_i2c_tx_buf[8]=c_year;//年
write_time(0x00,7);//从控制寄存器1开始写
}
}
}
// if(((P1IN & 0x10)!=0) && c_meter_start==0xff)//c_1s_sign--1秒标志,做记录用
// {
// u_pass();
// do_lostv();
// do_losti();
// do_lost_other();
// }
}
//---------------------------------------------------------
if(c_1m_sign==1)//c_1m_sign--1分标志,做记录用
{
c_1m_sign=0;
for(i1=4;i1>0;i1--)//整分电流平移
{
read_f24c16(0x0195+(uint)(i1-1)*3,3);
for(i2=0;i2<3;i2++)
c_i2c_tx_buf[i2+2]=c_i2c_rx_buf[i2];
write_f24c16(0x0195+(uint)i1*3,3);
/* read_f24c16(0x01ae+(uint)(i1-1)*4,4);
for(i2=0;i2<4;i2++)
c_i2c_tx_buf[i2+2]=c_i2c_rx_buf[i2];
write_f24c16(0x01ae+(uint)i1*4,4);*/
}
convert.high=ul_i_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];
write_f24c16(0x0195,3);
//read_f24c16(0x0195,15);
if(c_min5_stat==1)
{
read_f24c16(0x01ae,4);
for(i2=0;i2<4;i2++)
c_i2c_tx_buf[i2+2]=c_i2c_rx_buf[i2];
write_f24c16(0x01ae+4,4);
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);
}
}
if((c_meter_id[0]==0x01&&(c_min5_stat==1&&(c_second>0x01&&c_second<0x13))&&c_work_start==1)||(c_meter_id[0]==0x02&&(c_min5_stat==1&&(c_second>0x20&&c_second<0x33))&&c_work_start==1)||(c_meter_id[0]==0x03&&((c_min5_stat==1&&(c_second>0x40&&c_second<0x53)))&&c_work_start==1))
{// c_1m_sign=0;
if(c_comm_succeed==0&&c_emission_stat==1)
{
P1OUT|=0x10;//打开无线模块控制脚
c_emission_stat=0;
c_rf_stat=1;
c_tx_pointer=(char*)0x22c;
read_f24c16(0x01ae+4,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=convert.high;
read_f24c16(0x01ae,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_Ah_emission=bcd_hex_long(convert.high);
ul_Ah_emission=ul_Ah_emission-bcd_hex_long(ul_temp);
convert.high=ul_Ah_emission;
*(c_tx_pointer+31)= convert.low[0]+0X33;
*(c_tx_pointer+32)= convert.low[1]+0X33;
*(c_tx_pointer+33)= convert.low[2]+0X33;
*(c_tx_pointer+34)= convert.low[3]+0X33;
for(i1=0;i1<5;i1++)//整分电流平移
{
read_f24c16(0x0195+3*i1,3);
*(c_tx_pointer+16+3*i1)= c_i2c_rx_buf[0]+0X33;
*(c_tx_pointer+17+3*i1)= c_i2c_rx_buf[1]+0X33;
*(c_tx_pointer+18+3*i1)= c_i2c_rx_buf[2]+0X33;
/* read_f24c16(0x01ae+4*i1,4);
*(c_tx_pointer+31+4*i1)= c_i2c_rx_buf[0]+0X33;
*(c_tx_pointer+32+4*i1)= c_i2c_rx_buf[1]+0X33;
*(c_tx_pointer+33+4*i1)= c_i2c_rx_buf[2]+0X33;
*(c_tx_pointer+34+4*i1)= c_i2c_rx_buf[3]+0X33;
*/
}
*(c_tx_pointer+35)=c_err_stat+0X33;
*(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)= 0x1f;
*(c_tx_pointer+9)= 26;
*(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;
// i3=c_data_length+12;
*(c_tx_pointer+36)=*(c_tx_pointer);
for(i1=1;i1<36;i1++)//计算校验码
{
*(c_tx_pointer+36)=*(c_tx_pointer+36)+*(c_tx_pointer+i1);
}
*(c_tx_pointer+37)=0x16;
*(c_rx_pointer+84)=37;//发送长度长度
//U0TXBUF=c_tx1_buf[c_tx1_num];
//U0TXBUF=*(c_tx_pointer);
c_tx1_num=0;
U0TXBUF=c_tx1_buf[c_tx1_num];
}
}
//---------------------------------------------------------
/*if(c_clear_meter!=0)//c_clear_meter--1:新表 2:总清 3:需量清零(编程按键按下,670703,下翻5秒新表。960101,下翻5秒总清。其他日期,下翻5秒需清)
{
if(c_clear_count==0)
{
read_f24c16(0x0c49,1);//总清次数
i1=bcd_hex_char(c_i2c_rx_buf[0]);
if((c_clear_meter==2&&i1>0)||c_clear_meter==1||c_clear_meter==3)
c_clear_count=1;//c_clear_count--新表显示CLA.CLA3秒计数器
lcd_fill();
if(c_clear_meter==1)
{
new_meter();
read_int();
par_init();
c_break_stat=0;//c_break_stat--断相状态字:高半字节本次,低半字节上次
c_lost_v_stat=0;//c_lost_v_stat--失压状态:高半字节本次,低半字节上次
c_high_v_stat=0;//c_high_v_stat--过压状态:高半字节本次,低半字节上次
c_low_v_stat=0;//c_low_v_stat--欠压状态:高半字节本次,低半字节上次
c_high_i_stat=0;//c_high_i_stat--过流状态:高半字节本次,低半字节上次
c_lost_i_stat=0;//c_lost_i_stat--失流状态:高半字节本次,低半字节上次
c_all_lostv_i_stat=0;//c_all_lostv_i_stat-全失压时异常电流出现状态:高半字节本次,低半字节上次
}
if(c_clear_meter==2)
{
if(i1>0)
{
i1--;
i1=hex_bcd_char(i1);
c_i2c_tx_buf[2]=i1;
write_f24c16(0x0c49,1);
all_clear();
c_meter_stat=c_meter_stat | 0x04;//c_meter_stat--电表状态指示 7:失压 6:过压 5:逆相序 4:断相报警 3:编程开关按下 2:需量正在清零 1:2是否有通信 0:1是否有通信
}
else
c_clear_meter=0;
// reset_data();
// c_meter_stat2=c_meter_stat2| 0x01;//手动抄表//jhf_20061029:
}
if(c_clear_meter==3)
{
ui_clear_time=1;
c_meter_stat=c_meter_stat | 0x04;//c_meter_stat--电表状态指示 7:失压 6:过压 5:逆相序 4:断相报警 3:编程开关按下 2:需量正在清零 1:2是否有通信 0:1是否有通信
reset_data();
c_meter_stat2=c_meter_stat2| 0x01;//手动抄表//jhf_20061029:
}
}
}*/
if(c_clear_meter==2)
{
read_f24c16(0x00f6,1);//总清次数
i1=bcd_hex_char(c_i2c_rx_buf[0]);
i1++;
i1=hex_bcd_char(i1);
c_i2c_tx_buf[3]=i1;
write_f24c16(0x00f6,1);
all_clear();
// c_meter_stat=c_meter_stat | 0x04;//c_meter_stat--电表状态指示 7:失压 6:过压 5:逆相序 4:断相报警 3:编程开关按下 2:需量正在清零 1:2是否有通信 0:1是否有通信
c_clear_meter=0;
// reset_data();
// c_meter_stat2=c_meter_stat2| 0x01;//手动抄表//jhf_20061029:
}
if(c_clear_meter==1)
{
c_clear_meter=0;
new_meter();
read_int();
par_init();
}
}
}
void init_module(void)
{
/*配置I/O口*/
P1SEL=0;//sel为端口选择寄存器=0:I/O端口 =1:外围模块 P1.2定义定时器功能(PWM输出模式)
P1DIR=0xf1;
P1OUT=0;
P1IES=0x00;//沿触发选择 0:上升沿 1:下降沿
P1IFG=0x00;//中断标志寄存器
P1IE=0x00;//中断使能
P2SEL=0x38;
P2DIR=0x03;
P2OUT=0;
P2IES=0x00; //沿触发选择 0:上升沿 1:下降沿
P2IFG=0x00;//中断标志寄存器
P2IE=0x00;//中断使能
/*USART0配置为异步UART串行通讯模式,波特率为1200bps*/
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=0x55;
U0BR1=0x03;//1200(主频为1M赫兹)
U0MCTL=0x89;//10001001
/*
U0BR0=0xaa;
U0BR1=0x1a;//1200(主频为8M赫兹)
U0MCTL=0x6b;//01101011
*/
/*震荡器和系统时钟,外接32768晶震,系统主频1.024MHz*/
FLL_CTL0 |= XCAP14PF; /* 配置电容 */
SCFI0 = FLLD_1; /* Freq = 1.024MHz */
SCFQCTL = 32 - 1;
FLL_CTL0 |= DCOPLUS;
/*配置特殊功能寄存器*/
IFG1=0x00;
//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 URXIFG0(1)--UART0接收中断标志 rw-0
//+---------------7 UTXIFG0(1)--UART0发送中断标志 rw-1 c_i2c_tx_buf[2]=c_day;
IFG2=0x00;
//7 6 5 4 3 2 1 0
//0 0 0 0 0 0 0 0
//| | | | | | | +-0
//| | | | | | +---1
//| | | | | +-----2
//| | | | +-------3
//| | | +---------4
//| | +-----------5
//| +-------------6
//+---------------7 BTIFG--基本定时器中断标志rw-0
ME1=0xc0;//使能异步通信口接收发送模块
//7 6 5 4 3 2 1 0
//0 0 0 0 0 0 0 0
//| | | | | | | +-0
//| | | | | | +---1
//| | | | | +-----2
//| | | | +-------3
//| | | +---------4
//| | +-----------5
//| +-------------6 URXE0--UART0接收允许 rw-0; USPIE0 --SPI模式接收发送允许
//+---------------7 UTXE0--UART0发送允许 rw-0
// ME2=0x30; //F42X系列没有ME2项
//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=0xc0;
//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 URXIE
//+---------------7 UTXIE
// IE2=0x80;//打开基本定时器中断
IE2=0x80;//关闭基本定时器中断
//7 6 5 4 3 2 1 0
//0 0 0 0 0 0 1 1
//| | | | | | | +-0
//| | | | | | +---1
//| | | | | +-----2
//| | | | +-------3
//| | | +---------4
//| | +-----------5
//| +-------------6
//+---------------7 BTIE --基本定时器中断
/*配置SVSIN管脚,选择监测电压为2.65V且不复位*/
SVSCTL |= (SVSON | 0xf0);
/*配置基本定时器,0.5秒定时中断*/
BTCNT1=0;//配置基本定时器
BTCNT2=0;
BTCTL=BTDIV+BTIP2+BTIP0;//BTDIV=0x20 BTFRFQ1=0x10
//16位定时器,基本定时器用作液晶时钟(f=32768/128),定时器中断间隔时间1s(32768/256/128)
//选择计数器2时中由计数器1输出(组成16位模式,时钟源为ACLK=32768),停止计数,中断间隔=Fclk2/128=32768/32768=1S
//7 6 5 4 3 2 1 0
//| | | | | +-+-+-IP2-0(3)--此3位决定中断间隔时间。000:Fclk2/2 001:Fclk2/2 010:Fclk2/8 011:Fclk2/16 100:/32 101:/64 110:/128 111:/256
//| | | +-+-------FRFQ1-0(2)--00:Flcd=Faclk/32 01:/64 10:/128 11:/256
//| +-------------HOLD(1)--停止定时器
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -