//------------------------------------------------------------------------------------// Main.c//------------------------------------------------------------------------------------// Copyright (C) 2011 Shenyang 213.// Wbr// Tool chain: KEIL Full 'c'////#pragma CD OE DB SB // Compilation directives//------------------------------------------------------------------------------------// Includes//------------------------------------------------------------------------------------#include "C8051F340.h"#include "1302.h"#include "lcd.h"#include <INTRINS.H>#define SYSCLK 12000000 // SYSCLK frequency in Hz//------------------------------------------------------------------------------------// Global CONSTANTS//------------------------------------------------------------------------------------#define uint unsigned int#define uchar unsigned char#define T 1800 //运算电量的时间单位1800是半个小时(1800秒)#define N 11sfr16 TMR2 = 0xCC; //定义成16位地址sfr16 ADC0 = 0xBD; uint xdata ADCbuffer1[N];uint count;uint sum = 0; uchar ADcount = 0;uchar ADsend;uchar Page = 1,direction = 1;uchar set = 0,ent = 0,Tset;uchar TH,TL,TT1,TT2,TT3; //用来拆分送显示的变量uchar keybuffer[6];uchar BGset=0; //BGset背光关,开控制量,如果没有键按下超过1分钟,关闭背光!有键按下立刻开背光bit Disptime,PDD;sbit DI1 = P0^0 ;sbit DI2 = P0^1 ;sbit DE = P0^6 ;sbit BLK = P0^7 ; //LCD背光sbit JC1 = P2^7 ; sbit JC2 = P3^1 ;sbit JC3 = P3^2 ;sbit JC4 = P3^3 ;sbit DI3 = P3^6 ;sbit DI4 = P3^7 ;uchar code CPT_c[20] _at_ 0x8000; //7k的地址左右//充电时间要存入的FLASH地址,保存3天的时间和功率uchar xdata CPT_x[20] _at_ 0x8000;uchar code FPT_c[20] _at_ 0x8200; //7k的地址左右//放电时间要存入的FLASH地址,保存3天的时间和功率uchar xdata FPT_x[20] _at_ 0x8200; uchar xdata Between[20]; //0~11时间12~19存功率////////////////////////////////////extern void Init_Device(void);extern uchar time_buf1[8] ;uchar code tab1[]={"实时电压:"};uchar code tab2[]={"实时电流:"};uchar code tab3[]={"实时功率:"};uchar code tab4[]={"运行状态:"};uchar code tab5[]={"历史充电记录"};uchar code tab6[]={"历史放电记录"};uchar code tab7[]={"当前时间"};uchar code tab8[]={"修改时间"};uchar code tab9[]={"暂无记录"};uchar code run1[]={"停机"};uchar code run2[]={"充电"};uchar code run3[]={"放电"};uchar code run4[]={"故障"};//uchar code run5[]={//"系统故障信息"//};uchar code run5[]={"感谢您的使用"};uchar code run6[]={"本日累计充电"};uchar code run7[]={"本日累计放电"};uchar code run8[]={"版本号:V1.0"};uchar xdata TAB[11]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x20};//数字0~9及显示空白0x20//---------------------------------------- // Function PROTOTYPES//----------------------------------------void delayms(uint ms){ uint Temp; while(ms--) { Temp=1000; while(Temp--); { //PCA0CPH2 = 1; } }}/*void Timer2_Init(int count2s){ TMR2CN = 0x00; TMR2L = -count2s; TMR2 = 0xffff; ET2 = 1; TR2 = 1; }*///================================//中值滤波程序//================================void filter(){ static uchar count,i,j; uint value_buf[N]; uint 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];}void Uart0_SendData(uchar dat0){ SBUF0=dat0; //写SBUF0,开始发送 while(TI0==0); //等待发送 TI0=0; //清发送标志位}void Flash_Erase_CTP() //flash擦除充电时间和功率{ EA =0; VDM0CN = 0x80; // 使能VDD监视器 RSTSRC = 0x02; // 上电复位VDD监视器复位标志 FLSCL=0X80; // 使能FLASH单稳态定时器,FLASH读时间SYSCLK<=25MHz FLKEY = 0xA5; // 写入关键字 FLKEY = 0xF1; // 写入关键字 PSCTL |= 0x03; //允许擦,允许写 CPT_x[0] = 0; PSCTL &= ~0x03; //禁止写,禁止擦 //EA = 1; }void Flash_Program_CTP() //flash写入充电时间时间和功率{ uchar j; EA =0; //Flash_Erase_CTP(); VDM0CN = 0x80; //使能VDD监视器 RSTSRC = 0x02; //上电复位/VDD监视器复位标志 FLSCL=0X80; //使能FLASH单稳态定时器,FLASH读时间SYSCLK<=25MHz PSCTL |= 0x01; //write enable for(j =0;j<20;j++) { FLKEY = 0xa5; FLKEY = 0xf1; CPT_x[j] = Between[j]; //delayms(30); } PSCTL &= ~0x01; //禁止写 EA = 1;}//***********************************void Flash_Erase_FTP() //flash擦除放电时间和功率{ EA =0; VDM0CN = 0x80; // 使能VDD监视器 RSTSRC = 0x02; // 上电复位VDD监视器复位标志 FLSCL=0X80; // 使能FLASH单稳态定时器,FLASH读时间SYSCLK<=25MHz FLKEY = 0xA5; // 写入关键字 FLKEY = 0xF1; // 写入关键字 PSCTL |= 0x03; //允许擦,允许写 FPT_x[0] = 0; PSCTL &= ~0x03; //禁止写,禁止擦 //EA = 1;}void Flash_Program_FTP() //flash写入放电时间和功率{ uchar j; //Flash_Erase_FTP(); EA = 0; VDM0CN = 0x80; //使能VDD监视器 RSTSRC = 0x02; //上电复位/VDD监视器复位标志 FLSCL=0X80; //使能FLASH单稳态定时器,FLASH读时间SYSCLK<=25MHz PSCTL|=0x01; //write enable for(j =0;j<20;j++) { FLKEY = 0xa5; FLKEY = 0xf1; FPT_x[j] = Between[j]; } PSCTL &= ~0x01; //禁止写 EA = 1;}/*void Flash_Read(){ static uchar j; for(j=0;j<3;j++) { timer[j]=Ftime_c[j]; }}*///**********************************************//按键处理程序//**********************************************void key_scan() { static uchar i,k; uchar Mkey=P4; if(BGset<2) { if((Mkey&0xFE)!= 0XFE) //有键按下先开启背光 { delayms(200); if((Mkey&0xFE)!= 0XFE) { BGset++; if(BGset>1) { BGset = 2; } } } } if(BGset ==2 ){ if(!(Mkey&0x80)) //SW1按下吗?ALM { delayms(200); //消抖 if(!(Mkey&0x80)) //再判断 { BGset =2; //开背光 if(k<1) {Page = 0;} //页面0:显示故障状态} k++; if(k>1) {k =0;Page = 1; } //再按后退出 set = 0; } } if(!set) { if(!(Mkey&0x40)) //SW2按下吗?下翻 { delayms(200); if(!(Mkey&0x40)) { if(Page !=0) { Page++; BGset =2; if(Page>6) //如果超过5界面回到1画面 { Page = 1; } } } } if(!(Mkey&0x20)) //SW3按下吗?上翻 { delayms(200); if(!(Mkey&0x20)) { if(Page !=0) { Page--; BGset =2; if(Page<1) //小于1画面后不显示0画面,显示6画面 { Page = 6; } } } } } if(Page ==6) //修改时间界面 { if(!(Mkey&0x04)) //SW6按下吗?设定SET只在6画面设置时间 { delayms(200); if(!(Mkey&0x04)) { BGset =2; set = 1; //如果按下SET键表示开始设置时间,置设置标志位; } } if(set) { if(!(Mkey&0x10)) //SW4按下吗?左移<- 只在6画面修改时间 { delayms(200); if(!(Mkey&0x10)) { BGset =2; direction--; if(direction < 1) { direction = 6; } } } if(!(Mkey&0x08)) //SW5按下吗?右移->只在6画面修改时间 { delayms(200); if(!(Mkey&0x08)) { BGset =2; direction++; if(direction > 6) { direction = 1; } } } switch(direction) { case 1: { if(!(P4&0x40)) //SW2按下吗?下翻 { delayms(200); if(!(P4&0x40)) { BGset =2; keybuffer[0]++; if(keybuffer[0]>99) //年设置,不超过100年 { keybuffer[0] = 11; } } } if(!(P4&0x20)) //SW3按下吗?上翻 { delayms(200); if(!(P4&0x20)) { BGset =2; keybuffer[0]--; if(keybuffer[0]<11) //小于1画面后不显示0画面,显示6画面 { keybuffer[0] = 11; } } } if(Tset < 4) { TH = keybuffer[0]/10; TL = keybuffer[0]%10; number_disp (1,0,0x91,1,TAB[TH],TAB[TL]); } if(Tset>4) { number_disp (1,0,0x91,1,0x20,0x20); } }break; case 2: { TH = keybuffer[0]/10; TL = keybuffer[0]%10; number_disp (1,0,0x91,1,TAB[TH],TAB[TL]); if(!(P4&0x40)) //SW2按下吗?下翻 { delayms(200); if(!(P4&0x40)) { BGset =2; keybuffer[1]++; if(keybuffer[1]>12) //月设置,不超过12月 { keybuffer[1] = 1; } } } if(!(P4&0x20)) //SW3按下吗?上翻 { delayms(200); if(!(P4&0x20)) { BGset =2; keybuffer[1]--; if(keybuffer[1]<1) //小于1 显示12月 { keybuffer[1] = 12; } } } if(Tset < 4) { TH = keybuffer[1]/10; TL = keybuffer[1]%10; number_disp (1,0,0x93,1,TAB[TH],TAB[TL]); } if(Tset>4) { number_disp (1,0,0x93,1,0x20,0x20); } }break; case 3: { TH = keybuffer[1]/10; TL = keybuffer[1]%10; number_disp (1,0,0x93,1,TAB[TH],TAB[TL]); if(!(P4&0x40)) //SW2按下吗?下翻 { delayms(200); if(!(P4&0x40)) { BGset =2; keybuffer[2]++; if(keybuffer[2]>31) //日设置,不超过31日 { keybuffer[2] = 1; } } } if(!(P4&0x20)) //SW3按下吗?上翻 { delayms(200); if(!(P4&0x20)) { BGset =2; keybuffer[2]--; if(keybuffer[2]<1) //小于1,显示31日 { keybuffer[2] = 31; } } } if(Tset<4) { TH = keybuffer[2]/10; TL = keybuffer[2]%10; number_disp (1,0,0x95,1,TAB[TH],TAB[TL]); } if(Tset>4) { number_disp (1,0,0x95,1,0x20,0x20); } }break; case 4: { TH = keybuffer[2]/10; TL = keybuffer[2]%10; number_disp (1,0,0x95,1,TAB[TH],TAB[TL]); if(!(P4&0x40)) //SW2按下吗?下翻 { delayms(200); if(!(P4&0x40)) { BGset =2; keybuffer[3]++; if(keybuffer[3]>23) //时设置,不超过24 { keybuffer[3] = 0; } } } if(!(P4&0x20)) //SW3按下吗?上翻 { delayms(200); if(!(P4&0x20)) { BGset =2; keybuffer[3]--; if(keybuffer[3]<=0) //小于1,显示23 { keybuffer[3] = 23; } } } if(Tset < 4) { TH = keybuffer[3]/10; TL = keybuffer[3]%10; number_disp (0,1,0x85,1,TAB[TH],TAB[TL]); } if(Tset>4) { number_disp (0,1,0x85,1,0x20,0x20); } }break; case 5: { TH = keybuffer[3]/10; TL = keybuffer[3]%10; number_disp (0,1,0x85,1,TAB[TH],TAB[TL]); if(!(P4&0x40)) //SW2按下吗?下翻 { delayms(200); if(!(P4&0x40)) { BGset =2; keybuffer[4]++; if(keybuffer[4]>59) //分设置,不超过59 { keybuffer[4] = 0; } } } if(!(P4&0x20)) //SW3按下吗?上翻 { delayms(200); if(!(P4&0x20)) { BGset =2; keybuffer[4]--; if(keybuffer[4]<=0) //小于1,显示59 { keybuffer[4] = 59; } } } if(Tset < 4) { TH = keybuffer[4]/10; TL = keybuffer[4]%10; number_disp (0,1,0x87,1,TAB[TH],TAB[TL]); } if(Tset>4) { number_disp (0,1,0x87,1,0x20,0x20); } }break; case 6: { TH = keybuffer[4]/10; TL = keybuffer[4]%10; number_disp (0,1,0x87,1,TAB[TH],TAB[TL]); if(!(P4&0x40)) //SW2按下吗?下翻 { delayms(200); if(!(P4&0x40)) { BGset = 2; keybuffer[5]++; if(keybuffer[5]>59) //时设置,不超过24 { keybuffer[5] = 0; } } } if(!(P4&0x20)) //SW3按下吗?上翻 { delayms(200); if(!(P4&0x20)) { BGset = 2; keybuffer[5]--; if(keybuffer[5]<=0) //小于1,显示23 { keybuffer[5] = 59; } } } if(Tset < 4) { TH = keybuffer[5]/10; TL = keybuffer[5]%10; number_disp (0,1,0x89,1,TAB[TH],TAB[TL]); } if(Tset>4) { number_disp (0,1,0x89,1,0x20,0x20); } }break; default:break; } if(!(Mkey&0x02)) //SW7按下吗?确认ENT 只在6画面设定时间 { delayms(200); if(!(Mkey&0x02)) { BGset =2; for(i=0;i<6;i++) { time_buf1[i+1] = keybuffer[i]; } Ds1302_Write_Time(); //写DS1302 set = 0; Page = 1; //退出到1画面 } } } } }} void Pchange(uint PW){ TH = PW/10000; //放电万位 TL = (PW-TH*10000)/1000; //千位 TT1 = (PW-TH*10000-TL*1000)/100; TT2 = (PW-TH*10000-TL*1000-TT1*100)/10; TT3 = (PW-TH*10000-TL*1000-TT1*100)%10; if(!TH) { TH = 10; if(!TL) { TL = 10; if(!TT1) { TT1 = 10; } } } }//-----------------------------------------------------------------------------// Main 年:0xC4EA 月:0xD4C2 日:0xC8D5 时:0xCAB1: 分0xB7D6: 秒:0xC3EB 的汉字内码//-----------------------------------------------------------------------------void main(void){ uchar Page1,j; uchar Runstate ; //Runstate为运行状态指示:DI1=1;DI2=1停机;DI1=0;DI2=1充电;DI1=1;DI2=0放电;DI1=1;DI2=1故障 uint VT,AT,PT,PC1,PF1,PDIS,PdownCount; //电压电流功率功率计数变量 uint ADC1,ADC2,ADC3,ADC4; //四路AD通道变量 long a,PT1,PT2; //P1,P2充放电累计功率 //P0 = 0; //P1 = 0; P4 =0xfe; P2 = 0; P3 = 0; Init_Device(); PCA0MD &= ~0x40; EA = 0; //BLK = 1; delayms(1000); Ds1302_Init(); init_lcd (); clrram (); ADC0CF = ((SYSCLK/3000000)-1)<<3; // set SAR clock to 3MHz ADC0CN |=0x10; //写ADC0BUSY位启动转换 TMR3CN = 0x04; //启动TM3 //Timer2_Init(SYSCLK/12/50); //20ms EA = 1; DE = 1; TR1 = 1; Ds1302_Read_Time(); while(1) { //PCA0CPH2 = 1; //喂狗 key_scan(); if(BGset) { BLK = 1; } if(!BGset) { BLK = 0; } //按键扫描 if((DI1==1)&&(DI2==1)) Runstate = 0xa6; //停机 if((DI1==0)&&(DI2==1)) Runstate = 0xb7; //充电 if((DI1==1)&&(DI2==0)) Runstate = 0xc8; //放电 if((DI1==0)&&(DI2==0)) Runstate = 0xd9; //故障 //if(Runstate == 0xb7) //充电的FLASH存储处理 if(!set) { if((time_buf1[2] != CPT_c[10])|| (time_buf1[3] != CPT_c[11])) //读取的当前时间与缓存不等的时候,所有内容依次前移 { Between[0]=CPT_c[3]; //依次前移 Between[1]=CPT_c[4]; Between[2]=CPT_c[5]; Between[3]=CPT_c[6];//年 Between[4]=CPT_c[7];//月 Between[5]=CPT_c[8];//日 Between[6]=CPT_c[9]; Between[7]=CPT_c[10]; Between[8]=CPT_c[11]; Between[9]=time_buf1[1]; Between[10]=time_buf1[2]; Between[11]=time_buf1[3]; Between[12]=CPT_c[14]; Between[13]=CPT_c[15]; Between[14]=CPT_c[16]; Between[15]=CPT_c[17]; Between[16]=CPT_c[18]; Between[17]=CPT_c[19]; Between[18] = PC1>>8; Between[19] = PC1&255; Flash_Erase_CTP(); Flash_Program_CTP(); //保存至FLASH } } //if(Runstate == 0xc8) //放电时FLASH存储处理 if(!set) { if((time_buf1[2] != FPT_c[10])|| (time_buf1[3] != FPT_c[11])) { Between[0]=FPT_c[3]; //依次前移 Between[1]=FPT_c[4]; Between[2]=FPT_c[5]; Between[3]=FPT_c[6];//年 Between[4]=FPT_c[7];//月 Between[5]=FPT_c[8];//日 Between[6]=FPT_c[9]; Between[7]=FPT_c[10]; Between[8]=FPT_c[11]; Between[9]=time_buf1[1]; Between[10]=time_buf1[2]; Between[11]=time_buf1[3]; Between[12]=FPT_c[14]; Between[13]=FPT_c[15]; Between[14]=FPT_c[16]; Between[15]=FPT_c[17]; Between[16]=FPT_c[18]; Between[17]=FPT_c[19]; Between[18] = PF1>>8; Between[19] = PF1&255; Flash_Erase_FTP(); Flash_Program_FTP(); //保存至FLASH } } if(PDD) { PDD = 0; if(Runstate == 0xb7) //如果充电 { PdownCount++; //秒累加 PT1 = PT1+PT; //秒累计的功率, PC1 = PT1/3600; //实际充电功率,按小时计算,注意此时累计电量为实际的10倍,为了送小数显示 if(PdownCount > T) //超过半个小时开始写入EEPROM { PdownCount = 0; for(j=0;j<20;j++) //先读出FLASH里的时间 { Between[j]=CPT_c[j]; } if((time_buf1[2] == Between[10])&& (time_buf1[3] == Between[11])) //当前时间等于缓存时间,继续写入缓存 { Between[18] = PC1>>8; Between[19] = PC1&255; Flash_Program_CTP(); //写功率和时间到FLASH } } } if(Runstate == 0xc8) //如果放电 { PdownCount++; //秒累加 PT2 = PT2+PT; //秒累计的功率 PF1 = PT2/3600; //实际放电功率,按小时计算,,注意此时累计电量为实际的10倍,为了送小数显示 if(PdownCount > T) //超过半个小时开始写入EEPROM { PdownCount = 0; for(j=0;j<20;j++) //先读出FLASH里的时间 { Between[j]=FPT_c[j]; } if((time_buf1[2] == Between[10])&& (time_buf1[3] == Between[11])) //当前时间等于缓存时间,继续写入缓存 { Between[18] = PF1>>8; Between[19] = PF1&255; Flash_Program_FTP(); //写功率和时间到FLASH } } } } if(Disptime) { Disptime = 0; Ds1302_Read_Time(); if(Page!=Page1) { clrram (); //如果页面变化,需要清屏; } switch(Page) { case 1: //画面1:显示当前电压电流 { string_disp (1,0,0x80,10,tab1); //显示电压 string_disp (1,0,0x90,10,tab2); //显示电流 string_disp (0,1,0x80,10,tab3); //显示功率 string_disp (0,1,0x90,10,tab4); if(Runstate == 0xa6)string_disp (0,1,0x96,4,run1); //显示停机 if(Runstate == 0xb7)string_disp (0,1,0x96,4,run2); //显示充电 if(Runstate == 0xc8)string_disp (0,1,0x96,4,run3); //显示放电 if(Runstate == 0xd9)string_disp (0,1,0x96,4,run4); //显示故障 TH= VT/1000; //拆分送显示千位 TL = (VT%1000)/100; //拆分送显示百位 TT1 = ((VT%1000)%100)/10; //拆分送显示十位 TT2 = ((VT%1000)%100)%10; //拆分送显示个位 if(!TH) { TH = 10; if(!TL) { TL = 10; } } number_disp (1,0,0x85,1,TAB[TH],TAB[TL]); //电压送显示 number_disp (1,0,0x86,1,TAB[TT1],0x2E); number_disp (1,0,0x87,1,TAB[TT2],0x20); number_disp (1,0,0x88,1,0x56,0x20); TH= AT/1000; //拆分送显示千位 TL = (AT%1000)/100; //拆分送显示百位 TT1 = ((AT%1000)%100)/10; //拆分送显示十位 TT2 = ((AT%1000)%100)%10; //拆分送显示个位 if(!TH) //高位为零,灭零处理 { TH = 10; if(!TL) { TL = 10; } } number_disp (1,0,0x95,1,TAB[TH],TAB[TL]); //电流送显示 number_disp (1,0,0x96,1,TAB[TT1],0x2E); number_disp (1,0,0x97,1,TAB[TT2],0x20); number_disp (1,0,0x98,1,0x41,0x20); TH= PT/1000; //拆分送显示千位 TL = (PT%1000)/100; //拆分送显示百位 TT1 = ((PT%1000)%100)/10; //拆分送显示十位 TT2 = ((PT%1000)%100)%10; //拆分送显示个位 if(!TH) //高位为零,灭零处理 { TH = 10; if(!TL) { TL = 10; } } number_disp (0,1,0x85,1,TAB[TH],TAB[TL]); //功率送显示 number_disp (0,1,0x86,1,TAB[TT1],0x2E); number_disp (0,1,0x87,1,TAB[TT2],0x4B); number_disp (0,1,0x88,1,0x57,0x20); Page1=Page; //保存当前页面值 }break; case 2: { string_disp (1,0,0x80,12,run6); string_disp (0,1,0x80,12,run7); Pchange(PC1); number_disp (1,0,0x94,1,TAB[TH],TAB[TL]); number_disp (1,0,0x95,1,TAB[TT1],TAB[TT2]); number_disp (1,0,0x96,1,0x2e,TAB[TT3]); number_disp (1,0,0x97,1,0x4b,0x57); Pchange(PF1); number_disp (0,1,0x94,1,TAB[TH],TAB[TL]); number_disp (0,1,0x95,1,TAB[TT1],TAB[TT2]); number_disp (0,1,0x96,1,0x2e,TAB[TT3]); number_disp (0,1,0x97,1,0x4b,0x57); Page1=Page; }break; case 3: //显示历史充电记录 { string_disp (1,0,0x80,12,tab5); // //第1条信息 if((CPT_c[0]>99)||(CPT_c[1]>12)||(CPT_c[2]>31)) { string_disp (1,0,0x90,8,tab9); } //如果读取时间不对,显示“暂无记录” else { number_disp (1,0,0x90,1,0x32,0x30); //0送显示 TH = CPT_c[0]/10; TL = CPT_c[0]%10; number_disp (1,0,0x91,1,TAB[TH],TAB[TL]); number_disp (1,0,0x92,1,0xc4,0xea); //年 TH = CPT_c[1]/10; TL = CPT_c[1]%10; number_disp (1,0,0x93,1,TAB[TH],TAB[TL]); number_disp (1,0,0x94,1,0xd4,0xc2); //月 TH = CPT_c[2]/10; TL = CPT_c[2]%10; number_disp (1,0,0x95,1,TAB[TH],TAB[TL]); number_disp (1,0,0x96,1,0xc8,0xd5); //日 PDIS = CPT_c[12]; PDIS = PDIS<<8 + CPT_c[13]; Pchange(PDIS); number_disp (1,0,0x98,1,TAB[TH],TAB[TL]); number_disp (1,0,0x99,1,TAB[TT1],TAB[TT2]); number_disp (1,0,0x9A,1,0x2e,TAB[TT3]); number_disp (1,0,0x9B,1,0x4b,0x57); } //第2条信息 if((CPT_c[3]>99)||(CPT_c[4]>12)||(CPT_c[5]>31)) { string_disp (0,1,0x80,8,tab9); } //如果读取时间不对,显示“暂无记录” else { number_disp (0,1,0x80,1,0x32,0x30); //0送显示 TH = CPT_c[3]/10; TL = CPT_c[3]%10; number_disp (0,1,0x81,1,TAB[TH],TAB[TL]); number_disp (0,1,0x82,1,0xc4,0xea); //年 TH = CPT_c[4]/10; TL = CPT_c[4]%10; number_disp (0,1,0x83,1,TAB[TH],TAB[TL]); number_disp (0,1,0x84,1,0xd4,0xc2); //月 TH = CPT_c[5]/10; TL = CPT_c[5]%10; number_disp (0,1,0x85,1,TAB[TH],TAB[TL]); number_disp (0,1,0x86,1,0xc8,0xd5); //日 PDIS = CPT_c[14]; PDIS = PDIS<<8 + CPT_c[15]; Pchange(PDIS); number_disp (0,1,0x88,1,TAB[TH],TAB[TL]); number_disp (0,1,0x89,1,TAB[TT1],TAB[TT2]); number_disp (0,1,0x8A,1,0x2e,TAB[TT3]); number_disp (0,1,0x8B,1,0x4b,0x57); } //第3条信息 if((CPT_c[6]>99)||(CPT_c[7]>12)||(CPT_c[8]>31)) { string_disp (0,1,0x90,8,tab9); //如果读取时间不对,显示“暂无记录” } else { number_disp (0,1,0x90,1,0x32,0x30); //0送显示 TH = CPT_c[6]/10; TL = CPT_c[6]%10; number_disp (0,1,0x91,1,TAB[TH],TAB[TL]); number_disp (0,1,0x92,1,0xc4,0xea); //年 TH = CPT_c[7]/10; TL = CPT_c[7]%10; number_disp (0,1,0x93,1,TAB[TH],TAB[TL]); number_disp (0,1,0x94,1,0xd4,0xc2); //月 TH = CPT_c[8]/10; TL = CPT_c[8]%10; number_disp (0,1,0x95,1,TAB[TH],TAB[TL]); number_disp (0,1,0x96,1,0xc8,0xd5); //日 PDIS = CPT_c[16]; PDIS = PDIS<<8 + CPT_c[17]; Pchange(PDIS); number_disp (0,1,0x98,1,TAB[TH],TAB[TL]); number_disp (0,1,0x99,1,TAB[TT1],TAB[TT2]); number_disp (0,1,0x9A,1,0x2e,TAB[TT3]); number_disp (0,1,0x9B,1,0x4b,0x57); } Page1=Page; }break; case 4: //显示历史放电记录 { string_disp (1,0,0x80,12,tab6); // //第1条信息 if((FPT_c[0]>99)||(FPT_c[1]>12)||(FPT_c[2]>31)) //如果读取时间不对,显示“暂无记录” { string_disp (1,0,0x90,8,tab9); } else { number_disp (1,0,0x90,1,0x32,0x30); //0送显示 TH = FPT_c[0]/10; TL = FPT_c[0]%10; number_disp (1,0,0x91,1,TAB[TH],TAB[TL]); number_disp (1,0,0x92,1,0xc4,0xea); //年 TH = FPT_c[1]/10; TL = FPT_c[1]%10; number_disp (1,0,0x93,1,TAB[TH],TAB[TL]); number_disp (1,0,0x94,1,0xd4,0xc2); //月 TH = FPT_c[2]/10; TL = FPT_c[2]%10; number_disp (1,0,0x95,1,TAB[TH],TAB[TL]); number_disp (1,0,0x96,1,0xc8,0xd5); //日 PDIS = FPT_c[12]; PDIS = PDIS<<8 + FPT_c[13]; Pchange(PDIS); number_disp (1,0,0x98,1,TAB[TH],TAB[TL]); number_disp (1,0,0x99,1,TAB[TT1],TAB[TT2]); number_disp (1,0,0x9A,1,0x2e,TAB[TT3]); number_disp (1,0,0x9B,1,0x4b,0x57); } //第2条信息 if((FPT_c[3]>99)||(FPT_c[4]>12)||(FPT_c[5]>31)) { string_disp (0,1,0x80,8,tab9); //如果读取时间不对,显示“暂无记录” } else { number_disp (0,1,0x80,1,0x32,0x30); //0送显示 TH = FPT_c[3]/10; TL = FPT_c[3]%10; number_disp (0,1,0x81,1,TAB[TH],TAB[TL]); number_disp (0,1,0x82,1,0xc4,0xea); //年 TH = FPT_c[4]/10; TL = FPT_c[4]%10; number_disp (0,1,0x83,1,TAB[TH],TAB[TL]); number_disp (0,1,0x84,1,0xd4,0xc2); //月 TH = FPT_c[5]/10; TL = FPT_c[5]%10; number_disp (0,1,0x85,1,TAB[TH],TAB[TL]); number_disp (0,1,0x86,1,0xc8,0xd5); //日 PDIS = FPT_c[14]; PDIS = PDIS<<8 + FPT_c[15]; Pchange(PDIS); number_disp (0,1,0x88,1,TAB[TH],TAB[TL]); number_disp (0,1,0x89,1,TAB[TT1],TAB[TT2]); number_disp (0,1,0x8A,1,0x2e,TAB[TT3]); number_disp (0,1,0x8B,1,0x4b,0x57); } //第3条信息 if((FPT_c[6]>99)||(FPT_c[7]>12)||(FPT_c[8]>31)) { string_disp (0,1,0x90,8,tab9); } else { number_disp (0,1,0x90,1,0x32,0x30); //0送显示 TH = FPT_c[6]/10; TL = FPT_c[6]%10; number_disp (0,1,0x91,1,TAB[TH],TAB[TL]); number_disp (0,1,0x92,1,0xc4,0xea); //年 TH = FPT_c[7]/10; TL = FPT_c[7]%10; number_disp (0,1,0x93,1,TAB[TH],TAB[TL]); number_disp (0,1,0x94,1,0xd4,0xc2); //月 TH = FPT_c[8]/10; TL = FPT_c[8]%10; number_disp (0,1,0x95,1,TAB[TH],TAB[TL]); number_disp (0,1,0x96,1,0xc8,0xd5); PDIS = FPT_c[16]; PDIS = PDIS<<8 + FPT_c[17]; Pchange(PDIS); number_disp (0,1,0x98,1,TAB[TH],TAB[TL]); number_disp (0,1,0x99,1,TAB[TT1],TAB[TT2]); number_disp (0,1,0x9A,1,0x2e,TAB[TT3]); number_disp (0,1,0x9B,1,0x4b,0x57); } Page1=Page; }break; case 5: //显示当前时间 { string_disp (1,0,0x80,10,tab7); number_disp (1,0,0x90,1,0x32,0x30); //0送显示 TH = time_buf1[1]/10; TL = time_buf1[1]%10; number_disp (1,0,0x91,1,TAB[TH],TAB[TL]); number_disp (1,0,0x92,1,0xc4,0xea); //年 TH = time_buf1[2]/10; TL = time_buf1[2]%10; number_disp (1,0,0x93,1,TAB[TH],TAB[TL]); number_disp (1,0,0x94,1,0xd4,0xc2); //月 TH = time_buf1[3]/10; TL = time_buf1[3]%10; number_disp (1,0,0x95,1,TAB[TH],TAB[TL]); number_disp (1,0,0x96,1,0xc8,0xd5); //日 TH = time_buf1[4]/10; TL = time_buf1[4]%10; number_disp (0,1,0x85,1,TAB[TH],TAB[TL]); // number_disp (0,1,0x86,1,0xca,0xb1); //时 TH = time_buf1[5]/10; TL = time_buf1[5]%10; number_disp (0,1,0x87,1,TAB[TH],TAB[TL]); number_disp (0,1,0x88,1,0xb7,0xd6); //分 TH = time_buf1[6]/10; TL = time_buf1[6]%10; number_disp (0,1,0x89,1,TAB[TH],TAB[TL]); // number_disp (0,1,0x8a,1,0xc3,0xeb); //秒 Page1=Page; }break; case 6: //修改时间 { if(!set) //没有按SET键 { string_disp (1,0,0x80,10,tab8); number_disp (1,0,0x90,1,0x32,0x30); //0送显示 TH = time_buf1[1]/10; TL = time_buf1[1]%10; number_disp (1,0,0x91,1,TAB[TH],TAB[TL]); number_disp (1,0,0x92,1,0xc4,0xea); //年 TH = time_buf1[2]/10; TL = time_buf1[2]%10; number_disp (1,0,0x93,1,TAB[TH],TAB[TL]); number_disp (1,0,0x94,1,0xd4,0xc2); //月 TH = time_buf1[3]/10; TL = time_buf1[3]%10; number_disp (1,0,0x95,1,TAB[TH],TAB[TL]); number_disp (1,0,0x96,1,0xc8,0xd5); //日 TH = time_buf1[4]/10; TL = time_buf1[4]%10; number_disp (0,1,0x85,1,TAB[TH],TAB[TL]); // number_disp (0,1,0x86,1,0xca,0xb1); //时 TH = time_buf1[5]/10; TL = time_buf1[5]%10; number_disp (0,1,0x87,1,TAB[TH],TAB[TL]); number_disp (0,1,0x88,1,0xb7,0xd6); //分 TH = time_buf1[6]/10; TL = time_buf1[6]%10; number_disp (0,1,0x89,1,TAB[TH],TAB[TL]); // number_disp (0,1,0x8a,1,0xc3,0xeb); //秒 for (j = 0;j<6;j++) { keybuffer[j] = time_buf1[j+1]; } } Page1=Page; //保存当前页面值 }break; case 0: //显示故障状态 { string_disp (1,0,0x90,12,run5); string_disp (0,1,0x85,12,run8); Page1=Page; //保存当前页面值 }break; default:break; } } if(ADsend) { ADsend = 0; if(ADcount == 1) { filter(); ADC1= (sum/(N-2)); if(ADC1<5) { ADC1 = 0; } a = (long)7500*ADC1/1021; //放大10倍,为了送显示小数点 VT = a; // ADC0CN |=0x10; //写ADC0BUSY位启动转换 AMX0P = 0x06; //下一个转换通道P30 AD0EN = 1; } if(ADcount == 2) { filter(); ADC2= (sum/(N-2)); a = (long)4000*ADC2/1021; //放大10倍,为了送显示 AT = a; a =(long)VT*AT/10000; //放大10倍的功率,单位KW PT = a; ADC0CN |=0x10; //写ADC0BUSY位启动转换 AMX0P = 0x08; //下一个转换通道P26 AD0EN = 1; } if(ADcount == 3) { filter(); ADC3= (sum/(N-2)); ADC0CN |=0x10; //写ADC0BUSY位启动转换 AMX0P = 0x09; //下一个转换通道P34 AD0EN = 1; } if(ADcount == 4) { filter(); ADC4= (sum/(N-2)); ADC0CN |=0x10; //写ADC0BUSY位启动转换 AMX0P = 0x05; //下一个转换通道P35 AD0EN = 1; } } }}void UART0_ISR(void) interrupt 4{ static uchar Rcv; if(RI0) { Rcv = SBUF0; RI0 =0; } /*if(Rcv == 0x7E) // { i = 1; buffer[0] = Rcv; } else { if(i < 13) //12个字节 { buffer[i] = Rcv; i++; } } */ }/*void TIME2_ISR (void) interrupt 5{ TF2H = 0; //清标志位 count1++; if(count1 ==5) { count1 = 0; } } */void ADC0_ISR (void) interrupt 10{ static uchar count; // Loop counter AD0INT = 0; //清中断标志位 switch( AMX0P ) //通道转换 { case 0x05: //P2.6 ADCbuffer1[count]=ADC0; count++; ADC0CN |=0x10; //写ADC0BUSY位启动转换 if (count > N-1){ count = 0; AD0EN = 0; //禁止转换 ADcount = 1; } break; case 0x06: //P3.0 ADCbuffer1[count]=ADC0; count++; ADC0CN |=0x10; //写ADC0BUSY位启动转换 if (count > N-1){ count = 0; AD0EN = 0; ADcount = 2; } break; case 0x08: //P3.4 ADCbuffer1[count]=ADC0; count++; ADC0CN |=0x10; //写ADC0BUSY位启动转换 if (count > N-1){ count = 0; AD0EN = 0; ADcount = 3; } break; case 0x09: //P3.5 ADCbuffer1[count]=ADC0; count++; ADC0CN |=0x10; //写ADC0BUSY位启动转换 if (count > N-1){ count = 0; AD0EN = 0; ADcount = 4; } break; default:break; }}//-----------------------------------------------------------------------------//TIMER3中断//-----------------------------------------------------------------------------void Timer3_ISR(void) interrupt 14{ static uchar i,j,k; TMR3CN &=~(0x80); //清标志位 count++; i++; j++; if(count == 8) //200ms { count = 0; ADsend = 1; //开始进行AD处理标志 Tset++; if(Tset>5) { Tset = 0; } } if(i==20) { i = 0; Disptime = 1; } if(j==39) //1秒误差累积;正常是40 { j = 0; PDD = 1; //一秒时间到,开始计算功率 if(BGset) { k++; if(k>240) //4分钟关背光 { k=0; BGset = 0; } } } }
联系客服