📄 ddsy922.c
字号:
//入口参数:无
//出口参数:无
//********************************************************************/
void main(void) //主程序
{
unsigned char i,TEMP[4];
//TEMP[0]=sizeof(struct real_energy);
EA=0; // disable all interrupts
io_init();
//WDT_Init();
Clock_Init();
// LVI_Init();
INT_Init();
//WT_Init();
timer_init();
init_serialcomm(); //对CPU 各个部件初始化
//rst_wdog();
comm_ini();
wren_cmd(); //; Set write enable latch
wrsr_cmd();// ; Write 00H to status register
eeprom();
EA=1; // enable all interrupts
ec.ReceBuf[0]=0X99;
while(1)
{
// page_read(OFFSET_OF(EEPROM_DATA,eprom_factory_No),&meter_para.factory_No,sizeof(struct meter_para));
rst_wdog();
energy_add();
//page_read(OFFSET_OF(EEPROM_DATA,eprom_factory_No)+16,display_time,16);//&real_energy.energy[0]SIZE_OF(EEPROM_DATA,eprom_real_energy)
// page_read(OFFSET_OF(EEPROM_DATA,eprom_factory_No)+16,&display_select+16,16);//&real_energy.energy[0]SIZE_OF(EEPROM_DATA,eprom_real_energy)
// page_read(OFFSET_OF(EEPROM_DATA,eprom_factory_No)+32,&display_select+32,16);//&real_energy.energy[0]SIZE_OF(EEPROM_DATA,eprom_real_energy)
// ec.ReceBuf[0]=0XFF;
// ec.ReceBuf[1]=0XFF;
// ec.egy[0]=ec.ReceBuf[0]*256+ec.ReceBuf[1];
/// ec.egy[0]=(bin2bcd(ec.egy[0]));
// for(i=0;i<4;i++)
// TEMP[i]=ec.ReceBuf[i+1];
// p=TWO_BCD_Add(real_energy.money_sum,TEMP);
// for(i=0;i<4;i++)
// {
// TEMP[i]= *(p+i);
// }
if((flag_send==1)&&(CTRL485==0)) //如果取数标志已置位,就将读到的数从串口发出
{
Serial_Command();
flag_send=0; //取数标志清0
CTRL485=1;
}
if(Flag_Sec)
{
Flag_Sec=LOW;
CalcCalendar();
DataToDisBuf();
page_read(OFFSET_OF(EEPROM_DATA,eprom_money_notice0),TEMP,SIZE_OF(EEPROM_DATA,eprom_money_notice0));
if(Tow_Compare(&real_energy.money0.money_overplus+1,&TEMP[0])==2) // if(Tow_Compare(real_energy.money_overplus+4,ec.ReceBuf+4)==1)
{
real_energy.relayflag.bitflag.iccommand=0;
}
else
real_energy.relayflag.bitflag.iccommand=1;
relaynotice();
for(i=0;i<3;i++)
TEMP[i]=0;
if(Tow_Compare(&real_energy.money0.money_overplus+1,&TEMP[0])==1)
real_energy.relayflag.bitflag.command=1;
else
real_energy.relayflag.bitflag.command=0;
relayON_OFF();
}
if(!Flag_Play)
{
if(Flag_ICPort)
_ICardType();
}
}
}
/***************************************************************************
* 帋臇儖P擮殠罌幬媍栮曽崕瓡?
崕瓡麣帿槑? restoredate()
岴拵? 搊嫀蛬P擮殠罆幣婑殠纴A槦殠纴A旔掕2殠纴B檸見幧攷祴帵栮曽 ;
************************/
unsigned char m_days(unsigned char mmonth)
{
unsigned char days;
if((mmonth==4)||(mmonth==6)||(mmonth==9)||(mmonth==11))
{
days=31;
}
else if(mmonth==2)
{if((current_time.year%4==0&¤t_time.year%100!=0)||(current_time.year%400==0))
days=30;
else days=29;
}
else days=32;
return(days);
}
void CalcCalendar(void)
{
unsigned char temp1;
half_second++;
if(half_second%2==0)
{
current_time.second++;
current_time.second1++;
if(current_time.second1>2)
{
current_time.second=0;
DisMode++;}
if(current_time.second>=60)
{
current_time.second=0;
current_time.minute++;
if(current_time.minute>=60)
{
current_time.minute=0;
current_time.hour++;
if((current_time.hour)>=24)
{
current_time.hour=0;
current_time.day++;
temp1=m_days(current_time.month);
if(current_time.day>=temp1)
{
current_time.day=1;
current_time.month++;
if(current_time.month>=13)
{
current_time.month=1;
current_time.year++;
}
}
}
}
}
}
}
void INT_Init( void )
{
//SetIORBit(EGP,0X02);
//SetIORBit(EGN,0X08);
//ClrIORBit(INTM0, 0x0c);
//ClrIORBit(ISC,0x01);
//SetIORBit(PM3, 0x01); /* set P30 input mode */
//ClrIORBit(IF0, 0x04);
//ClrIORBit(MK0, 0x04); /* enable INTP0 */
//INTM1=01;
//SetIORBit(PM1, 0x07); // set P3.1 cf p3.2 intp2 P3.3 rx input mode
//ClrIORBit(IF1, 0x04);
//ClrIORBit(MK1, 0x04); // enable INTP3
}
void io_init(void)
{
rst_wdog();
/* Initialize the port registers */
//P0 = PORT_P0;
//P1 = PORT_P1;
//P2 = PORT_P2;
//P3 = PORT_P3;
//P6 = PORT_P6;
//P12 = PORT_P12;
/* Initialize the pull-up resistor option registers */
//PU0 = PORT_PU0;
//PU1 = PORT_PU1;
//PU3 = PORT_PU3;
//PU12 = PORT_PU12;
/* Initialize the mode registers */
// PM0 = PORT_PM0;
// PM1 = PORT_PM1;
// PM2 = PORT_PM2;
// PM3 = PORT_PM3;
// PM6 = PORT_PM6;
// PM7 = PORT_PM7;
// PM12 = PORT_PM12;
// ClrIORBit(ADM, 0x81);
// ADPC=5;
}
void Clock_Init(void)
{
}
void timer_init(void)
{
/*ClrIORBit(TMHMD0, 0x80);
// internal countclock
TMHMD0 |= 0x00;//(TM_TMH0_CLOCK << 4);
SetIORBit(PR0H, 0x10); // low priority level
ClrIORBit(IF0H, 0x10);
// TMH0 interval timer
ClrIORBit(TMHMD0, 0x8c);
CMP00 = 0x00;//TM_TMH0_INTERVALVALUE;*/
}
/********************************************************************
延时函数
原型:void Delay_T(unsigned char );
功能:延时1ms*i
入口参数: i 是设定延时时间
出口参数:无
********************************************************************/
void init_serialcomm(void)
{
TL0=0X78;
TH0=0XEC;
TR0=ET0=TR1=ES=EA=HIGH;
SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x21; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80; //SMOD=1;
TH1 = 0xF4; //Baud:4800 fosc=11.0592MHz
IE |= 0x90; //Enable Serial Interrupt
TR0 = 1;
DelayNus(50); /*延时100ms,以稳定CPU*/
rst_wdog();
CTRL485=1; /*485通讯为接收状态*/
// COMMSEL=1; /*485通讯为接收状态*/
/*串口初始化*/
PCON&=0x3f; /*UART 设置工作方式3,11 位数据*/
SCON=0xd0;
}
void eeprom(void)
{
unsigned char buff;
if(judg_eeprom_init()==0XAA)
{
page_read(OFFSET_OF(EEPROM_DATA,eprom_real_energy), &real_energy.electric.energy[0],sizeof(struct real_energy));
buff=xaoyanghe_cs(real_energy.electric.energy,sizeof(struct real_energy)-1);
if(buff!=real_energy.cs)
{
page_read(OFFSET_OF(EEPROM_DATA,eprom_back_real_energy), &real_energy.electric.energy[0],sizeof(struct real_energy));
buff=xaoyanghe_cs(real_energy.electric.energy,sizeof(struct real_energy)-1);
if(buff!=real_energy.cs)
{
L_default();
}
}
}
else
{
L_default();
page_read(OFFSET_OF(EEPROM_DATA,eprom_real_energy), &real_energy.electric.energy[0],sizeof(struct real_energy));
}
page_read(OFFSET_OF(EEPROM_DATA,eprom_factory_No),&meter_para.factory_No,sizeof(struct meter_para));
}
unsigned char judg_eeprom_init(void)
{
unsigned char Ttemp;
page_read(OFFSET_OF(EEPROM_DATA,eprom_meter_iniflag),&Ttemp,1);
if(Ttemp==0xaa)
return 0xAA;
else
return 0x00;
}
void L_default(void)
{
page_write(OFFSET_OF(EEPROM_DATA,eprom_factory_No),&eeprominit,16);//&real_energy.energy[0]SIZE_OF(EEPROM_DATA,eprom_real_energy)
page_write(OFFSET_OF(EEPROM_DATA,eprom_factory_No)+16,&eeprominit+16,16);//&real_energy.energy[0]SIZE_OF(EEPROM_DATA,eprom_real_energy)
current_time.second=0x00;
current_time.minute=0x00;
current_time.hour=0x12;
current_time.week=0x02;
current_time.day=0x08;
current_time.month=0x0a;
current_time.year=0x06;
page_write(OFFSET_OF(EEPROM_DATA,eprom_factory_No)+32,&eeprominit+32,16);//&real_energy.energy[0]SIZE_OF(EEPROM_DATA,eprom_real_energy)
page_write(OFFSET_OF(EEPROM_DATA,eprom_factory_No)+48,&eeprominit+48,16);//&real_energy.energy[0]SIZE_OF(EEPROM_DATA,eprom_real_energy)
}
//void interrupt_init(void)
//{
// SetIORBit(INTM1, 0x01);
// ClrIORBit(INTM1, 0x02);
// SetIORBit(PM4, 0x02); /* set P41 input mode */
// ClrIORBit(IF1, 0x04);
// ClrIORBit(MK1, 0x04); /* enable INTP3 */
//}
/* void Power_fail(void)
{
// DI();
//WDTE=0xac;
Initialize the port registers //
//P0.0=0;
P1.7=0;
P3.1=0;
P3.2=0;
PM0.0=0;
PM1.7=0;
PM3.1=0;
PM3.2=0;
//P4 = PORT_P4;
//P12 = PORT_P12;
//P13 = PORT_P13;
// Initialize the pull-up resistor option registers /
//PU2 = PORT_PU2;
//PU3 = PORT_PU3;
//PU4 = PORT_PU4;
//PU12 = PORT_PU12;
//Initialize the mode registers /
//PM0 = 0X00;
//PM2 = PORT_PM2;
//PM3 = PORT_PM3;
//PM7 = 0X00;
//PM4 = PORT_PM4;
//PM12 = PORT_PM12;
ClrIORBit(ADM, 0x81);
ADPC = 5;
MK0L = 0XFF;
MK0H = 0XFF;
MK1H = 0XFF;
MK1L = 0XDF;
// Change CPU clock from main clock to sub clock
SetIORBit(PCC, 0x10);
SetIORBit(MOC, 0x80);
while(!CLS)
ClrIORBit(OSCCTL,0X40);
RCM=0X01;
//EI();
}*/
/*void POWER_On(void)
{
DI();
WDTE=0xac;
ClrIORBit(ADM, 0x81);
ADPC = 5;
MK0L = 0XFF;
MK0H = 0XFF;
MK1H = 0XFF;
MK1L = 0XDF;
// Change CPU clock from main clock to sub clock
ClrIORBit(PCC,0X80);
SetIORBit(PCC, 0x40);
ClrIORBit(MOC, 0x80);
// OSTC=0X10;
ClrIORBit(OSCCTL,0X41);
RCM=0X00;
PCC=0X00;
EI();
;
} */
/********************中断服务子程序*********************//*******
外部中断0函数
原型: interrupt0 using 2
功能:延时1ms*i
入口参数: i 是设定延时时间
出口参数:无
********************************************************************/
inter0(void) interrupt 0
{
unsigned char cs;
cs=xaoyanghe_cs(real_energy.electric.energy,sizeof(struct real_energy)-1);
real_energy.cs=cs;
page_write(OFFSET_OF(EEPROM_DATA,eprom_real_energy),&real_energy.electric.energy[0],sizeof(struct real_energy));
page_write(OFFSET_OF(EEPROM_DATA,eprom_back_real_energy), &real_energy.electric.energy[0],sizeof(struct real_energy));
}
/********************************************************************
定时中断函数
原型:timer0(void) interrupt 1 using 2
功能:延时1ms*i
入口参数: i 是设定延时时间
出口参数:无
********************************************************************/
timer0(void) interrupt 1 using 2
{
TL0=0X66;
TH0=0Xf5;
TR0=HIGH;
SecCounter++;
if(Flag_Rece)
{
Rece500ms++;
if(Rece500ms>=255)
{
Rece500ms=0;
Flag_Rece=1;
//Flag_Rece=LOW;
RecCounter=0;
}
}
if(SecCounter>=20)
{
SecCounter500ms++;
if (SecCounter500ms>=20)
{
Flag_Sec=HIGH;
SecCounter500ms=0;
}
TR0=LOW;
DelayNus(8);
TR0=HIGH;
DelayNus(1);
SecCounter=0;
Flag_ReadTime=1;
}
P=0XFF;
Display();
}
/********************************************************************
延时函数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -