📄 gd485-08.c
字号:
}
void Read_ADE_SFR(uchar *Pointer, char Register)
{
char ByteH, ByteM, ByteL;
MADDPT = Register;
ByteH = MDATH;
ByteM = MDATM;
ByteL = MDATL;
*Pointer = ByteL;
*(Pointer+1) = ByteM;
*(Pointer+2) = ByteH;
return;
}
void INIT7166()
{
//**** initializes the power management
KYREG = 0xA7;
POWCON=0x00; //POWCON &amt; 0xF8; //CD2 CD1 CD0=000 4.096MHz
IPSMF = 0x00;
// if (VSWSOURCE) //set BATPR only when the part is supplied from VDD
BATPR = 0x00; //00=battery switchover enabled on Low VDD only
//BATVTH = Battery_Low;
STRBPER=STRBPER | 0x0c;
// PERIPH =PERIPH&0xf8;
// EPSR = 1; EVDCIN=1;
IPSME |=0x89; //psm中断允许
// PERIPH=PERIPH|0x03;
//**** initializes the RTC
IEIP2_bit.ETI=1;
IEIP2_bit.EADE=1;
IEIP2_bit.PTI=0;
TIMECON = 0x43;
INTVAL = 128;
RTCCOMP = 0; //every 1sec=128* 1/128 sec, the interval timer generates an interrupt
//IEIP2 &=0xBF; //RTC interrupt with Low Priority (Bit6=PTI=0)
// IEIP2 |=0x04; //Enable RTC interrupt (Bit2=ETI=1)
//**** initializes watchdog
WDCON_bit.WDWR = 1; // WDCON |=BIT0;
WDCON = 0x73;//0x01; // Disable WDT; 0x73 enable WDT 2s
WDCON_bit.WDE = 1;
CFG|=0x01;
//**** initializes lcd
LCDCON=0xa7; // LCDEN+MUX4_BIAS3; enable LCD with 1/3 bias and 4x multiplecing. LCDEN|MUX4_BIAS3|BLINKEN Blink mod by srt
LCDCLK=0x82; // FD1; FD1|BLKMOD1 Blink mod by srt
LCDCONX=0x18; // use charge pump. set the bias level for 3V;Va = Vref X (BLVL[4:0]/31)
// LCDSEGE2=SEG19EN|SEG18EN|SEG17EN; // enable FP17-19
// LCDSEGE=FP23EN|FP22EN|FP21EN|FP20EN; // enable FP20-23
LCDCONY=0x40;
//**** initializes ade
Write_ADE_SFR(0x00, 0x80, MODE1);
Delay(200);
Write_ADE_SFR(0x00, 0x04, MODE1);
Write_ADE_SFR(0x00, 0x45, MODE2);
Write_ADE_SFR(0x00, 0x07, WAVMODE);
Write_ADE_SFR(0x00, 0x55, NLMODE);
Write_ADE_SFR(0x00, 0x00, ACCMODE);
Write_ADE_SFR(0x00, 0x10, CALMODE);
Write_ADE_SFR(0x00, 0x14, LINCYC);
Write_ADE_SFR(0x00, 0x00, WDIV);
Write_ADE_SFR(0x00, 0x00, CF1NUM);
//ee_read_bytes(ADDR_OF_GAIN_VAL,tmp_buf,1);
// Write_ADE_SFR(0x00, tmp_buf[0], GAIN);
//ee_read_bytes(ADDR_OF_CF1DEN_VAL,tmp_buf,2);
//Write_ADE_SFR(tmp_buf[1], tmp_buf[0], CF1DEN);
// ee_read_bytes(ADDR_OF_WGAIN_VAL,tmp_buf,2);
// Write_ADE_SFR(tmp_buf[1], tmp_buf[0], WGAIN);
// ee_read_bytes(ADDR_OF_PHCAL_VAL,tmp_buf,1);
// Write_ADE_SFR(0x00, tmp_buf[0], PHCAL);
// ee_read_bytes(ADDR_OF_WATTOS_VAL,tmp_buf,2);
// Write_ADE_SFR(tmp_buf[1], tmp_buf[0], WATTOS);
MIRQENH=0;
MIRQENM=0x40;
MIRQENL=0;
//enable Energy Metering Interrupt
IPSME = 0;
// IEIP2 |=0x08; //EADE=1;
// INITtime();
}
void INITtime()
{
// INT1
TCON_bit.IT1=1; // 边沿触发
IE_bit.ET1=0; // 不准许中断
IP_bit.PT1=0; // 中断优先级:低
// Serial Port
PCON=0x00; // SMOD=0
SCON=0xd8; // SCON=(多机)方式3:xf0?单机)方式1:x50
// 方式3: 1个起始位(0)、8个数据位、
// 1个(标志位)、1个停止位(1)
// 波特率=2^SMOD*定时器1的溢出率/32
SCON_bit.SM2=0; // 单机方式SM2=0,多机方式SM2=1
IE_bit. ES=1; // 准许中断
IP_bit.PS=0; // 中断优先级: 高
// Baud Rate
TMOD=0x21; // 0010 0001:T1=方式2、 T0=方式1
// 波特率=2^SMOD*fosc/((2^8-0xfdh)*12*32)=9600
TH1=0xf7;
TL1=0xf7; // fosc=11.0592MHz
TCON_bit. TR1=1; // 波特率=1200 TH1=TL1=0xE8h // =2400 TH1=TL1=0xF4h
// =4800 TH1=TL1=0xFAh
// =9600 TH1=TL1=0xFDh
// Timer0
TCON_bit.IT0=1;
TL0=0xE6; // Tman=(2^16-X)*12/fosc =(65536-0)*12/(4.092*10^6)=71ms
TH0=0xE6; // 定时20ms
TCON_bit.TR0=1;
// TCON_bit.TF0=0;
IE_bit. ET0=1; // 准许定时器0中断
IP_bit. PT0=1;
}
//////////////////////////////////////////////////////////////////////////
////////////////////////串口中断函数 //////////////////////////////////
//////////////////////////////////////////////////////////////////////////
#pragma vector=0x23
__interrupt void SIOservice(void)
{
if(SCON_bit.RI)
{
uchar ucA,ucB;
ucA=SBUF;
SCON_bit.RI=0;
if(!StartFlag){
if(ucA!=STX){
return;
}
else {
CheIDFlag=0;SR_P=1;IP_bit.PX1=1;IE_bit.EX1=1;
SRTIME=0;StartFlag=1;SR_STAT=1;
recv[1]=0x68;
return;
}
}
if(!CheIDFlag){
SR_P++;
if(SR_P<8)
{
SRTIME=0;
recv[SR_P]=SBUF;
return;
}
if(SR_P==8)
{ if((recv[2]==0x99)&&(recv[3]==0x99)&&(recv[4]==0x99)&&(recv[5]==0x99)&&(recv[6]==0x99)&&(recv[7]==0x99))
goto MeterIDOK;
for(ucB=0;ucB<6;ucB++)
{
if((recv[2+ucB]!=MeterID[0+ucB])&&(recv[2+ucB]!=0xaa))
{ goto sioend;}
}
MeterIDOK: if(ucA==STX)
{recv[8]=0x68;
StartFlag=1;CheIDFlag=1;SRTIME=0;IP_bit.PX1=0; IE_bit.EX1=0;
// if(INT1SUM>12) { SR485_bz=1;}
// else SR485_bz=0;
// IR_star=0;
// INT1SUM=0;
return;
}
else{
}
}
}
recv[++SR_P]=ucA;
SRTIME=0;
if(SR_P==10)
{ if(recv[10]>MaxL) goto sioend;}
if(SR_P>10)
{
if(SR_P>=recv[10]+12)
{
if(recv[recv[10]+12]==0x16)
{ ucB=0;
for(ucA=1;ucA<=(10+recv[10]);ucA++) { ucB+=recv[ucA]; } /**计算检验和CS**/
if(ucB!=recv[ucA]) { goto sioend;} /** 校验和正确与否 **/
for(ucA=11;ucA<recv[10]+11;ucA++) { recv[ucA]-=0x33; } /**余三码处理**/
StartFlag=0;CheIDFlag=0; SCON_bit.REN=0;
SIOrecvFlag=1;SR_STAT=0;SRTIME=0;
goto siorecvend;
}
else { goto sioend;
}
}
else {
return;
}
}
return;
sioend:
SCON_bit.REN=1;
IE_bit.EX1=0;
IP_bit. PX1=0;
StartFlag=0;CheIDFlag=0;SR_P=0;SR_STAT=0;
return;
siorecvend: RS485Rcv;
}
}
////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
///////////////////////////////ADE中断函数///////////////////////////
////////////////////////////////////////////////////////////////////////////
#pragma vector=0x4B
__interrupt void ade_ISR(void)
{
}
///////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
///////////////////////////////////RTC中断
//////////////////////////////////////////////////////////////////////
#pragma vector=0x53
__interrupt void RTC(void)
{
if (TIMECON_bit.ALARM ) //(ALARM)
{
TIMECON_bit.ALARM=0;
ADDTIME=1;
}
}
void DisLcd(void)
{
LCDbuf[0]=DL[3]>>4;
LCDbuf[1]=DL[3]&0x0f; //显示最高位
LCDbuf[2]=DL[2]>>4;
LCDbuf[3]=DL[2]&0x0f;
LCDbuf[4]=DL[1]>>4;
nodiszero();
LCDbuf[5]=DL[1]&0x0f;
LCDbuf[6]=PulseAdd[1]>>4;
writeLCD();
}
void MonthChange(void)
{
uchar ucA;
readEE(BYVALADD+4,4);
writeEE(BYVALADD+8,4);
readEE(BYVALADD,4);
writeEE(BYVALADD+4,4);
for(ucA=0;ucA<4;ucA++)
{
EEbuf[ucA]=DL[ucA];
}
EEbuf[0]=PulseAdd[1];
writeEE(BYVALADD,4);
// 当前需量时间不用清零
EEbuf[0]=Time.month;
writeEE(MONTHMARKADD,1); // 改变月标志,为当月
MonthMark=Time.month;
}
void DayChange(void)
{
uchar ucA,ucB;
readEE(NOWZEROADD,1);
ucB=EEbuf[0];
ucB++;
if(ucB>=8) ucB=0;
for(ucA=0;ucA<4;ucA++)
{
EEbuf[ucA]=DL[ucA];
}
EEbuf[0]=PulseAdd[1];
EEbuf[4]=HEX2BCD(Time.day);
writeEE(ZEROADD+5*ucB,5);
EEbuf[0]=ucB;
writeEE(NOWZEROADD,1);
}
/************************************/
/************************************/
void main(void)
{
INIT7166();
INITtime();
IE_bit.EA=1;
//do
//{
LCDbuf[0]=0x00;
LCDbuf[1]=0x01;
LCDbuf[2]=0x02; //显示最高位
LCDbuf[3]=0x03;
LCDbuf[4]=0x04;
LCDbuf[5]=0x05;
LCDbuf[6]=0x06;
writeLCD();
Delay(120);
Delay(120);
Delay(120);
Delay(120);
//}
// while(1);
PCON=0x00; // SMOD=0
TCON_bit.TR1=1; // 波特率=1200 TH1=TL1=0xE8h
SCON_bit.REN=1;
RS485Rcv;
Xulon=0;MOTOR_Timer=0;S_timeFlag=1;
PulTime[0]=160;
PulTime[1]=160;
do
{
ei();
if(PERIPH_bit.VSWSOURCE==0)
{
IE_bit.EA = 0;
KYREG = 0xa7;
POWCON = 0x40; //energy off
PERIPH_bit.REF_BATT_EN=1; //LCD active in psm2 IPSMF = 1; //clear inter flag
// IEIP2 |=0x80; //IEIP2_bit.EPSR = 1;
IE_bit.EA = 1;
IEIP2_bit.ETI =0; //进入sleep之前修改rtc参数 eti=0;
TIMECON = 0x7b;
// INTVAL = 128;
RTCCOMP = 0;
IEIP2_bit.PTI =0; //RTC interrupt with Low Priority (Bit6=PTI=0) pti=0;
IEIP2_bit.ETI=1; //0000 0100 enable the rtc 中断 eti=1;
KYREG = 0xa7;
POWCON = 0x50;
LEDBJ=0;
}
else
{
if(MOTOR_FLAG==0x99)
{ if(Db_S_Jdq==0)
{
poweron();
}
else if((Db_S_Jdq&0xf1)==0xf1)
{
MOTOR_FLAG=0x0f;
}
}
if(PulseFlag)
{
if(testbyte==0xaa)
{
testbyte=0;
checkpulseadd();
}
else
{
Delay(250);
}
}
if((Dis_bz==1))
{
if(IncZZFlag==0)
{
DisLcd();
Dis_bz=0;
}
}
if((S_timeFlag)&&(IncZZFlag==0))
{
DisLcd();
DisTime=0;
S_timeFlag=0; //04 15
}
if(minute_bz)
{
minute_bz=0;
if(HourMark!=Time.hour)
{
CLRWDT();
Hour_Change();
}
if(MonthMark!=Time.month)
{
CLRWDT();
MonthChange();
}
if(DayMark!=Time.day)
{
DayMark=Time.day;
SetTimeFlag=0;
DayChange();
readEE(JDQADD,1);
if(EEbuf[0]!=0xf1)
{
if(PERIPH_bit.VSWSOURCE)
{
poweron();
Delay(120);
OUTA=0;OUTB=0;
}
}
}
}
if (WDT_bz)
{ CLRWDT(); WDT_bz=0; }
if(SIOrecvFlag==1)
{
//LCDDATA10&=0x7f; //通讯显示
TakeCommunication(); SIOrecvFlag=0;
}
if(SIOtrFlag)
{ if(SCON_bit.TI) SIOTX();}
// if(WDT_bz)
if((t2flg==1)&&(SleepFlag==0))
{
t2flg=0;
if(RXD1) {
if(OFFRXD>100) LEDBJ=1;
else
OFFRXD++;
}
else
{
OFFRXD=0;LEDBJ=0;
}
if(KRES==0)
CleanCnt++;
else
CleanCnt=0;
if(CleanCnt>15)
{
KRES_bz=1;CleanCnt=16;
}
else
{
KRES_bz=0;
}
if((MOTOR_FLAG==0x0f)&&(SleepFlag==0)) //等待执行OFF
{
if((PulTime[0]>PulT_ib)&&(PulTime[1]>PulT_ib))
{
poweroff();MOTOR_FLAG=0x99;MOTOR_Timer=0;Db_S_Jdq|=0xf4;
}
}
else if(MOTOR_FLAG==0x66)
{
}
else if(MOTOR_FLAG==0x00)
{}
}
}
}while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -