/********************************************************* Hardware : EVB9S08DZ60 BoardAuthor : WBRVersion : V1.0Begin Time: 2011.5.30**********************************************************/#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */#include "1302.h"//#include "lcd.h"//#include "mscan.h"//#include "KEY.h"/******************************************************IO说明: 1:四路AD输入通道 ADP19(AD1) ADP11(AD2) ADP3(AD3) ADP4(AD4) 2:485通信 DE (PTE2) TXD1(PTE0) RXD1(PTE1) 3:四路光耦输入 DI1(PTG2) DI2 (PTE5) DI3 (PTE4) DI4(PTE3) 4:DS1302 SCL(PTF2) SDA (PTF3) RST (PTG4) 5:继电器控制 PTA6 PTB5 PTA5 PTC4 PTB6 6:按键(输入) PTC0 PTB0 PTC1 PTA0 PTC2(SW1~SW5) 7:CAN TX(PTE6) RX(PTE7) 8:LCD RW(PTG3) RS(PTF0) E(PTF1) RST(PTF7) 背光(PTG5) DATA(PTD0~PTD7)************************************************************/#define DI1 PTGD_PTGD2 //外触发1----->PG2#define DI2 PTED_PTED5 //外触发2----->PE5#define DI3 PTED_PTED4 //外触发3----->PE4#define DI4 PTED_PTED3 //外触发4----->PE3//********以上为输入IO********//#define JDQ1 PTCD_PTCD4 //继电器1----->PC4#define JDQ2 PTAD_PTAD5 //继电器2----->PA5#define JDQ3 PTBD_PTBD5 //继电器3----->PB5#define JDQ4 PTAD_PTAD6 //继电器4----->PA6#define JDQ5 PTBD_PTBD6 //继电器5----->PB6#define DE485 PTED_PTED2 //485 T R切换----->PE2//#define ID_TX 0x0001 //自定义的CAN发送标识符//#define ID_RX 0x0002 //自定义的CAN接收标识符//Bool can_send_enable = FALSE; //CAN发送标志位,暂定RTC0.5秒发送一次#define Baud 19200 //串口波特率9600#define N 51#define T 1800 //运算电量的时间单位1800是半个小时(1800秒) extern byte time_buf1[8]; //1302时钟寄存器byte ReadTimeFlag = 0; //定时器每0.5秒读1302时间的标志位byte ADSET = 0; //发送电流电压功率等数值到显示屏标志位/*********************变量和函数定义****************************/word ADCbuffer1[N] = 0; //AD转换缓冲word ADC1,ADC2,ADC3,ADC4; //AD转换缓冲byte ADC1L,ADC1H,ADC2L,ADC2H,ADC3L,ADC3H,ADC4L,ADC4H;byte MW4L,MW4H,MW5L,MW5H,MW6L,MW6H,MW7L,MW7H,MW8L,MW8H,MW9L,MW9H;byte MW21L,MW21H,MW22L,MW22H,MW25L,MW25H,MW26L,MW26H; //历史充电电量记录byte MW29L,MW29H,MW30L,MW30H,MW33L,MW33H,MW34L,MW34H; //历史放电电量记录byte Buffer[15]; //串口接收缓冲byte ADch_s; //AD通道选择byte ADcount;//byte Key_value=0; //按键//byte CANbuffer[8]; //接收到的CAN内容缓冲区数组word sum=0; long P,P1,P2,P3,Premain,Pup,Pdown,Psum; //实时充电功率,实时放电功率,历史充电功率,历史放电记录word PL,PH; //拆分Pbyte P0L,P0H,P1L,P1H; //拆分PH,PLbyte RR = 1; //RR = 1;读屏的19号地址;RR = 2读屏的20号地址开始的时间;byte PAGE8; //进入设置时间页面和电量页面设置计数;byte T20 =0;word TENT;byte *p;//================================//中值滤波程序//================================void filter(){ static byte count,i,j; word value_buf[N]; word temp; sum=0; for(count=0;count<N;count++) { value_buf[count] = ADCbuffer1[count];; } for (j=0;j<N-1;j++) { for (i=0;i<N-j;i++) { if ( value_buf[i]>value_buf[i+1] ) { temp = value_buf[i]; value_buf[i] = value_buf[i+1]; value_buf[i+1] = temp; } } } for(count=1;count<N-1;count++) sum += value_buf[count];}//===================================//函数名:MCU_INIT//作用: 初始化MCU时钟 晶振16M总线频率8M//====================================void MCU_INIT(void){ MCGC1=0x04; //选择内部时钟 MCGC2=0x40; //时钟源二分频 MCGTRM=0xa8;//内部时钟微调}//===================================//函数名: IO_INIT//作用: 初始化IO 输入输出//====================================void IO_INIT(void){ PTADD = 0xe6; //数据方向 1为输出,0为输入 PTBDD = 0x76; PTCDD = 0xb0; //PTDDD = 0xff; PTEDD = 0x45; PTFDD = 0xff; PTGDD = 0x38; PTAD = 0 ; //初始状态IO全为0 PTBD = 0; PTCD = 0; PTDD = 0; PTED = 0; PTFD = 0; PTGD = 0; }//===================================//函数名: ADC_INIT//作用: 初始化ADC 总线时钟8M//===================================void ADC_INIT(void){ ADCCFG = 0xf9; //低功耗模式,10位精度,ADCK=总线频率/8/2=500K ADCSC2 = 0x00; //0x00:软件触发,比较功能禁止 APCTL1 = 0x14; //通道引脚使能: 使用通道为AD19 AD11 AD3 AD4 APCTL2 = 0x08; APCTL3 = 0x08; ADch_s = 19; //选择19通道开始 ADCSC1 = 0x73; //0x53:中断使能,单次转换,选择19通道启动转换.}//===================================//函数名:SCI_INIT//作用: 初始化SCI1//==================================== void SCI_INIT(void){ SCI1BD = 8000000/16/Baud; SCI1C1 = 0x00; SCI1C2 = 0x2c; //使能接受中断}//===================================//串口发送//===================================void SCI1send (byte x){ while(SCI1S1_TDRE==0); SCI1D = x;}//===================================//定时器1初始化//===================================void TPM1_Init(void) //定时器1初始化{ TPM1MODH=0x3d; // TPM1MODL=0x09; //250MS TPM1SC=0x4F; //TPM1时钟源为总线时钟;分频系数为128;溢出中断使能}//===================================//延时//===================================void Delay(Word time){ Word i,j; for(i=0;i<time;i++) { __RESET_WATCHDOG(); for(j=0;j<500;j++); }}void WEEP(){ FCMD=0x20; FSTAT_FCBEF=1; asm{ NOP NOP NOP NOP } while(FSTAT_FCCF==0); if(FSTAT_FACCERR==1) FSTAT_FACCERR=1;}/*********************主函数************************************/void main(void){ static byte MonthF1,DateF1,MonthF2,DateF2,MonthF3,DateF3,MonthC1,DateC1,MonthC2,DateC2,MonthC3,DateC3; //充电放电历史记录的两次时间变量及缓存变量 static byte FBETW0L,FBETW0H,FBETW1L,FBETW1H,CBETW0L,CBETW0H,CBETW1L,CBETW1H; static word PupCount,PdownCount; byte Pchange = 0 ; //充电0XFF 放电0X00转换标志 byte Failure; //故障信息指示MW17.0 = 1过压 MW17.1 = 1过流 word BetweenH,BetweenL; long a,b; byte SendSum; MCU_INIT(); IO_INIT(); Ds1302_Init(); ADC_INIT(); TPM1_Init(); SCI_INIT(); DE485 = 1; //485发送使能; PTED_PTED6 = 1; Ds1302_Read_Time(); //先读取一次时间用于判断历史时间 if(!DI1) //DI1 = 0 { Pchange = 0x01; //充电 } if(!DI2) //DI2 = 0 { //放电 Pchange = 0x02; } if(DI1&&DI2) //DI1,DI2都 为高电平 { Pchange = 0; } FCDIV = 39; //设置FLASH分频 8M总线时钟分频数39;FLASH读写200KH asm(nop);//**************读取记录的充电的历史记录************************//************前1次的前1次得充电记录 p=(byte *)(0x1401); // MonthC1= *p; p=(byte *)(0x1402); //时间 DateC1= *p; p=(byte *)(0x1403); //电量的最低位 MW21L= *p; p=(byte *)(0x1404); // MW21H= *p; p=(byte *)(0x1405); // MW22L= *p; p=(byte *)(0x1406); // MW22H= *p; if(MonthC1>12) { MonthC1 = 0; DateC1= 0; MW21L = 0; MW21H = 0; MW22L = 0; MW22H = 0; }//*************前1次的充电记录********************************* p=(byte *)(0x1411); // MonthC2= *p; p=(byte *)(0x1412); //时间