新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于飞思卡尔DZ60的AD 1302 KEY 485 CAN FLASH LCD程序

基于飞思卡尔DZ60的AD 1302 KEY 485 CAN FLASH LCD程序

作者: 时间:2016-12-01 来源:网络 收藏
//*************前1次的放电记录*********************************
p=(byte *)(0x1511); //
MonthF2= *p;
p=(byte *)(0x1512); //时间
DateF2= *p;
p=(byte *)(0x1513); //电量的最低位
MW33L= *p;
p=(byte *)(0x1514); //
MW33H= *p;
p=(byte *)(0x1515); //
MW34L= *p;
p=(byte *)(0x1516); //
MW34H= *p;
if(MonthF2>12) //
{
MonthF2 = 0;
DateF2= 0;
MW33L = 0;
MW33H = 0;
MW34L = 0;
MW34H = 0;
}
//***************缓存的放电记录,用于比较计算******************
p=(byte *)(0x1521); //
MonthF3= *p;
p=(byte *)(0x1522); //时间
DateF3= *p;
p=(byte *)(0x1523); //电量的最低位
FBETW0L= *p;
p=(byte *)(0x1524); //
FBETW0H= *p;
p=(byte *)(0x1525); //
FBETW1L= *p;
p=(byte *)(0x1526); //
FBETW1H= *p;
if(MonthF3>12) //
{
MonthF3 = 0;
DateF3= 0;
FBETW0L = 0;
FBETW0H = 0;
FBETW1L = 0;
FBETW1H = 0;
}
p=(byte *)(0x1601); //
MW8L= *p;
p=(byte *)(0x1602); //时间
MW8H= *p;
p=(byte *)(0x1603); //电量的最低位
MW9L= *p;
p=(byte *)(0x1604); //
MW9H= *p;
if((MW8L==0xff)&&(MW8H==0xff)&&(MW9L==0xff)&&(MW9H==0xff)) //第一次上电
{
MW8L = 0;
MW8H = 0;
MW9L = 0;
MW9H = 0;
P2 = 0;
}
else{
Premain = MW9L+(MW9H<<8);
P2= (Premain<<16)+ (MW8L+(MW8H<<8));
P2 = P2*3600*1000;
}
if(Pchange==0x01) //充电时比较
{
if((time_buf1[2] == MonthC3)&& (time_buf1[3] == DateC3))
{
MW4L = CBETW0L;
MW4H = CBETW0H;
MW5L = CBETW1L;
MW5H = CBETW1H;
Premain = MW5L+(MW5H<<8);
P3= (Premain<<16)+ (MW4L+(MW4H<<8));
P3 = P3*3600;
}
else
{
MW4L = 0;
MW4H = 0;
MW5L = 0;
MW5H = 0;
P3 = 0;
}
}
if(Pchange==0x02) //放电时比较
{
if((time_buf1[2] == MonthF3)&& (time_buf1[3] == DateF3))
{
MW6L = FBETW0L;
MW6H = FBETW0H;
MW7L = FBETW1L;
MW7H = FBETW1H;
Premain = MW7L+(MW7H<<8);
P1= (Premain<<16)+ (MW6L+(MW6H<<8));
P1 = P1*3600;
}
else
{
MW6L = 0;
MW6H = 0;
MW7L = 0;
MW7H = 0;
P1 = 0;
}
}
EnableInterrupts; //开中断
for(;;)
{
__RESET_WATCHDOG(); //喂内部看门狗
if(!DI1)
{ //充电
Pchange = 0x01;
} //放电
if(!DI2)
{
Pchange = 0x02;
}
if(DI1&&DI2)
{
Pchange = 0; //停机状态
}
if(Pchange==0x02)
{
if((time_buf1[2] != MonthF3)|| (time_buf1[3] != DateF3)) //只要是 时间不等,就要把当前记录写入EEPROM,开始新的计算
{
p=( unsigned char *)(0x1500); //指定地址 缓存的时间写入前1天,前一天的时间写入前1天前1天
*p=0x01;
FCMD=0x40; //擦除命令
FSTAT_FCBEF=1; //启动命令
Delay(1);
while(FSTAT_FCCF==0); //等待完成
if(FSTAT_FACCERR==1)
FSTAT_FACCERR=1;
p=(byte *)(0x1500); //指定地址
*p = 0x01;
WEEP();
p=(byte *)(0x1501);
*p = MonthF2;
WEEP();
p=(byte *)(0x1502);
*p = DateF2;
WEEP();
p=(byte *)(0x1503);
*p = MW33L;
WEEP();
p=(byte *)(0x1504);
*p = MW33H;
WEEP();
p=(byte *)(0x1505);
*p = MW34L;
WEEP();
p=(byte *)(0x1506);
*p = MW34H;
WEEP();
p=( unsigned char *)(0x1510); //指定地址 //缓存的时间写入前1天,前一天的时间写入前1天前1天
*p=0x01;
FCMD=0x40; //擦除命令
FSTAT_FCBEF=1; //启动命令
Delay(1);
while(FSTAT_FCCF==0); //等待完成
if(FSTAT_FACCERR==1)
FSTAT_FACCERR=1;
p=(byte *)(0x1510); //指定地址
*p = 0x01;
WEEP();
p=(byte *)(0x1511); //如果时间变了,原缓存存入前一天的内存
*p = MonthF3;
WEEP();
p=(byte *)(0x1512);
*p = DateF3;
WEEP();
p=(byte *)(0x1513);
*p = FBETW0L;
WEEP();
p=(byte *)(0x1514);
*p = FBETW0H;
WEEP();
p=(byte *)(0x1515);
*p = FBETW1L;
WEEP();
p=(byte *)(0x1516);
*p = FBETW1H;
WEEP();
P1 = 0;
MW29L = MW33L;
MW29H = MW33H;
MW30L = MW34L;
MW30H = MW34H;
MonthF1 = MonthF2;
DateF1 = DateF2;
MW33L = FBETW0L;
MW33H = FBETW0H;
MW34L = FBETW1L;
MW34H = FBETW1H;
MonthF2 = MonthF3;
DateF2 = DateF3;
asm(nop);
MonthF3 =time_buf1[2]; //当前时间送入缓存
DateF3= time_buf1[3];
//MonthF3 = time_buf1[2];
//DateF3 = time_buf1[3];
FBETW0L = MW6L;
FBETW0H = MW6H;
FBETW1L = MW7L;
FBETW1H = MW7H;
p=( unsigned char *)(0x1520); //指定地址
*p=0x01;
FCMD=0x40; //擦除命令
FSTAT_FCBEF=1; //启动命令
Delay(1);
while(FSTAT_FCCF==0); //等待完成
if(FSTAT_FACCERR==1)
FSTAT_FACCERR=1;
p=(byte *)(0x1520); //指定地址
*p = 0x01;
WEEP();
p=(byte *)(0x1521);
*p = time_buf1[2];
WEEP();
p=(byte *)(0x1522);
*p = time_buf1[3];
WEEP();
p=(byte *)(0x1523);
*p = MW6L;
WEEP();
p=(byte *)(0x1524);
*p = MW6H;
WEEP();
p=(byte *)(0x1525);
*p = MW7L;
WEEP();
p=(byte *)(0x1526);
*p = MW7H;
WEEP();
}
}
if(Pchange == 0x01) //充电的时候
{
if((time_buf1[2] != MonthC3)|| (time_buf1[3] != DateC3)) //只要时间不等,开始新的计算
{
p=( unsigned char *)(0x1400); //指定地址 缓存的时间写入前1天,前一天的时间写入前1天前1天
*p=0x01;
FCMD=0x40; //擦除命令
FSTAT_FCBEF=1; //启动命令
Delay(1);
while(FSTAT_FCCF==0); //等待完成
if(FSTAT_FACCERR==1)
FSTAT_FACCERR=1;
p=(byte *)(0x1400); //指定地址
*p = 0x01;
WEEP();
p=(byte *)(0x1401);
*p = MonthC2;
WEEP();
p=(byte *)(0x1402);
*p = DateC2;
WEEP();
p=(byte *)(0x1403);
*p = MW25L;
WEEP();
p=(byte *)(0x1404);
*p = MW25H;
WEEP();
p=(byte *)(0x1405);
*p = MW26L;
WEEP();
p=(byte *)(0x1406);
*p = MW26H;
WEEP();
p=( unsigned char *)(0x1410); //指定地址 缓存的时间写入前1天,前一天的时间写入前1天前1天
*p=0x01;
FCMD=0x40; //擦除命令
FSTAT_FCBEF=1; //启动命令
Delay(1);
while(FSTAT_FCCF==0); //等待完成
if(FSTAT_FACCERR==1)
FSTAT_FACCERR=1;
p=(byte *)(0x1410); //指定地址
*p = 0x01;
WEEP();
p=(byte *)(0x1411);
*p = MonthC3;
WEEP();
p=(byte *)(0x1412);
*p = DateC3;
WEEP();
p=(byte *)(0x1413);
*p = CBETW0L;
WEEP();
p=(byte *)(0x1414);
*p = CBETW0H;
WEEP();
p=(byte *)(0x1415);
*p = CBETW1L;
WEEP();
p=(byte *)(0x1416);
*p = CBETW1H;
WEEP();
MW21L = MW25L;
MW21H = MW25H;
MW22L = MW26L;
MW22H = MW26H;
MonthC1 = MonthC2;
DateC1 = DateC2;
MW25L = CBETW0L;
MW25H = CBETW0H;
MW26L = CBETW1L;
MW26H = CBETW1H;
MonthC2 = MonthC3;
DateC2 = DateC3;
P3 = 0;
MonthC3 =time_buf1[2]; //当前时间送入缓存
DateC3= time_buf1[3];
//MonthC3 = time_buf1[2];
//DateC3 = time_buf1[3];
CBETW0L = MW4L;
CBETW0H = MW4H;
CBETW1L = MW5L;
CBETW1H = MW5H;
p=( unsigned char *)(0x1420); //指定地址
*p=0x01;
FCMD=0x40; //擦除命令
FSTAT_FCBEF=1; //启动命令
Delay(1);
while(FSTAT_FCCF==0); //等待完成
if(FSTAT_FACCERR==1)
FSTAT_FACCERR=1;
p=(byte *)(0x1420); //指定地址
*p = 0x01;
WEEP();
p=(byte *)(0x1421);
*p = time_buf1[2];
WEEP();
p=(byte *)(0x1422);
*p = time_buf1[3];
WEEP();
p=(byte *)(0x1423);
*p = MW4L;
WEEP();
p=(byte *)(0x1424);
*p = MW4H;
WEEP();
p=(byte *)(0x1425);
*p = MW5L;
WEEP();
p=(byte *)(0x1426);
*p = MW5H;
WEEP();
}
}
if(!RR)
{
Ds1302_Write_Time();
Delay(10);
T20 = 1;
}
if(T20) //切换到2界面
{
T20 = 0;
TENT = 0;
DE485 = 1; //保证切换到发射
Delay(200);
SCI1send (0x01); //站号
SCI1send (0x57); //写命令
SCI1send (0x12); //18号地址跳转页面指令,跳转到1界面
SCI1send (0x01); //1个长度
SCI1send (0x00); //18号地址
SCI1send (0x01);
SCI1send (0x6c);
Delay(100); //需加一段长延时
SCI1send (0x01); //站号
SCI1send (0x57); //写命令
SCI1send (0x12); //18号地址跳转页面指令,跳转到2界面
SCI1send (0x01); //1个长度
SCI1send (0x00); //18号地址
SCI1send (0x02);
SCI1send (0x6d);
Delay(200); //必须加段延时确保数据发送出去
RR = 1; //1分钟内ENT没有按下,转回正常模式
asm(nop);
}
if(ADSET) //处理AD;
{
ADSET = 0;
if(ADcount == 1)
{
filter();
ADC1= (sum/(N-2));
if(ADC1<7){ ADC1 = 0; //屏蔽掉待机状态时的不干净的初值
}
if (ADC1>163)
{
Failure = Failure|0x01; //置过压标志
}
else Failure = Failure&0xfe; //清过压标志
//b = 750*50;
//b = b/255;
b = (long)7500*ADC1; //放大10倍,为了送显示
//ADC1 = b*ADC1;
//ADC1 = ADC1/5;
ADC1 = b>>10; //除以1024
ADC1H = ADC1>>8;
ADC1L = ADC1&255;
ADch_s = 11;
ADCSC1=0x6b;
}
if(ADcount == 2)
{
filter();
ADC2= (sum/(N-2));
if(ADC2<7) { ADC2 = 0;
}
if (ADC2>191) //过流
{
Failure = Failure|0x02; //置过流标志
}
else Failure = Failure&0xfd; //清过流标志
//a= 400*50;
//a= a/255;
a = (long)4000*ADC2;
//ADC2 = a*ADC2; //转换成电压值 ,取小数点后一位,所以先扩大50倍
//ADC2 = ADC2/5; //10倍电流送显示,用于显示小数点
ADC2 = a>>10;
ADC2H = ADC2>>8;
ADC2L = ADC2&255;
ADC1 = ADC1/10;
ADC2 = ADC2/10;
P =(long)ADC1*ADC2;
PH = P>>16;
PL = P&0xffff;
P1H = PH>>8;
P1L = PH&255;
P0H = PL>>8;
P0L = PL&255;
if(Pchange==0x02) //如果放电
{
PdownCount++; //秒累加
P2 = P2+P; //一直累积的放电电量
Psum=(long)(P2/3600/1000);
BetweenH = Psum>>16;
BetweenL = Psum&0xffff;
MW9H = BetweenH>>8;
MW9L = BetweenH&255;
MW8H = BetweenL>>8;
MW8L = BetweenL&255;
P1 = P1+P; //秒功率累加
Pdown = (long)P1/3600; //实际放电功率,按小时计算
BetweenH = Pdown>>16;
BetweenL = Pdown&0xffff;
MW7H = BetweenH>>8;
MW7L = BetweenH&255;
MW6H = BetweenL>>8;
MW6L = BetweenL&255;
if(PdownCount > T) //超过半个小时开始写入EEPROM
{
PdownCount = 0;
p=( unsigned char *)(0x1600); //指定地址
*p=0x01;
FCMD=0x40; //擦除命令
FSTAT_FCBEF=1; //启动命令
Delay(1);
while(FSTAT_FCCF==0); //等待完成
if(FSTAT_FACCERR==1)
FSTAT_FACCERR=1;
p=(byte *)(0x1600); //指定地址
*p = 0x01;
WEEP();
p=(byte *)(0x1601); //总放电量写入EEPROM
*p = MW8L;
WEEP();
p=(byte *)(0x1602);
*p = MW8H;
WEEP();
p=(byte *)(0x1603);
*p = MW9L;
WEEP();
p=(byte *)(0x1604);
*p = MW9H;
WEEP();
asm(nop);
if((time_buf1[2] == MonthF3)&& (time_buf1[3] == DateF3)) //当前时间等于缓存时间,继续写入缓存
{
MonthF3 = time_buf1[2];
DateF3 = time_buf1[3];
FBETW0L = MW6L;
FBETW0H = MW6H;
FBETW1L = MW7L;
FBETW1H = MW7H;
p=( unsigned char *)(0x1520); //指定地址
*p=0x01;
FCMD=0x40; //擦除命令
FSTAT_FCBEF=1; //启动命令
Delay(1);
while(FSTAT_FCCF==0); //等待完成
if(FSTAT_FACCERR==1)
FSTAT_FACCERR=1;
p=(byte *)(0x1520); //指定地址
*p = 0x01;
WEEP();
p=(byte *)(0x1521);
*p = time_buf1[2];
WEEP();
p=(byte *)(0x1522);
*p = time_buf1[3];
WEEP();
p=(byte *)(0x1523);
*p = MW6L;
WEEP();
p=(byte *)(0x1524);
*p = MW6H;
WEEP();
p=(byte *)(0x1525);
*p = MW7L;
WEEP();
p=(byte *)(0x1526);
*p = MW7H;
WEEP();
}
}
}
if(Pchange == 0x01) //如果充电
{
PupCount++; //秒累加
P3 =P3+P; //秒功率累加
Pup = (long)P3/3600; //实际放电功率,按小时计算
BetweenH = Pup>>16;
BetweenL = Pup&0xffff;
MW5H = BetweenH>>8;
MW5L = BetweenH&255;
MW4H = BetweenL>>8;
MW4L = BetweenL&255;
if(PupCount >T)
{
PupCount = 0; //超过半个小时开始写入EEPROM
if((time_buf1[2] == MonthC3)&& (time_buf1[3] == DateC3)) //当前时间等于缓存时间,继续写入缓存
{
MonthC3 = time_buf1[2];
DateC3 = time_buf1[3];
CBETW0L = MW4L;
CBETW0H = MW4H;
CBETW1L = MW5L;
CBETW1H = MW5H;
p=( unsigned char *)(0x1420); //指定地址
*p=0x01;
FCMD=0x40; //擦除命令
FSTAT_FCBEF=1; //启动命令
Delay(1);
while(FSTAT_FCCF==0); //等待完成
if(FSTAT_FACCERR==1)
FSTAT_FACCERR=1;
p=(byte *)(0x1420); //指定地址
*p = 0x01;
WEEP();
p=(byte *)(0x1421);
*p = time_buf1[2];
WEEP();
p=(byte *)(0x1422);
*p = time_buf1[3];
WEEP();
p=(byte *)(0x1423);
*p = MW4L;
WEEP();
p=(byte *)(0x1424);
*p = MW4H;
WEEP();
p=(byte *)(0x1425);
*p = MW5L;
WEEP();
p=(byte *)(0x1426);
*p = MW5H;
WEEP(); //如果相等则认为是当前时间,继续
}
}
}
asm(nop);
ADch_s = 3;
ADCSC1=0x63;
}
if(ADcount == 3)
{
filter();
ADC3= (sum/(N-2));
ADC3H = (sum/(N-2))>>8;
ADC3L = (sum/(N-2))&255;
ADch_s = 4;
ADCSC1=0x64;
}
if(ADcount == 4)
{
filter();
ADC4= (sum/(N-2));
ADC4H = (sum/(N-2))>>8;
ADC4L = (sum/(N-2))&255;
ADch_s = 19;
ADCSC1=0x73;
}
if(RR ==2)
{
DE485 = 1;
Delay(2);
SCI1send (0x01); //站号
SCI1send (0x52); //读命令
SCI1send (0x14); //20号地址判断ENT键状态
SCI1send (0x01); //1个地址
SCI1send (0x68);
Delay(1); //必须加段延时确保数据发送出去
DE485 = 0; //485切换到接收状态
asm(nop);
}
if(RR ==3)
{
DE485 = 1;
Delay(2);
SCI1send (0x01); //站号
SCI1send (0x57); //写命令
SCI1send (0x14); //20号地址清零
SCI1send (0x01); //1个长度
SCI1send (0x00); //18号地址
SCI1send (0x00);
SCI1send (0x6D);
Delay(50);
RR =4;
}
if(RR ==4) //读时间
{
DE485 = 1;
Delay(5);
SCI1send (0x01); //站号
SCI1send (0x52); //读命令
SCI1send (0x0B); //11号地址
SCI1send (0x06); //6个地址
SCI1send (0x64);
Delay(1); //必须加段延时确保数据发送出去
DE485 = 0; //485切换到接收状态
//asm(nop);
}
}

关键词: 飞思卡尔DZ60AD

评论


技术专区

关闭