//------------------------------------------------------------------------------------ // 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 11 sfr16 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背光關(guān),開控制量,如果沒有鍵按下超過1分鐘,關(guān)閉背光!有鍵按下立刻開背光 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[]={ "運行狀態(tài):" }; 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[]={ //"系統(tǒng)故障信息" //}; 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};//數(shù)字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,開始發(fā)送 while(TI0==0); //等待發(fā)送 TI0=0; //清發(fā)送標志位 } void Flash_Erase_CTP() //flash擦除充電時間和功率 { EA =0; VDM0CN = 0x80; // 使能VDD監(jiān)視器 RSTSRC = 0x02; // 上電復(fù)位VDD監(jiān)視器復(fù)位標志 FLSCL=0X80; // 使能FLASH單穩(wěn)態(tài)定時器,F(xiàn)LASH讀時間SYSCLK<=25MHz FLKEY = 0xA5; // 寫入關(guān)鍵字 FLKEY = 0xF1; // 寫入關(guān)鍵字 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監(jiān)視器 RSTSRC = 0x02; //上電復(fù)位/VDD監(jiān)視器復(fù)位標志 FLSCL=0X80; //使能FLASH單穩(wěn)態(tài)定時器,F(xiàn)LASH讀時間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監(jiān)視器 RSTSRC = 0x02; // 上電復(fù)位VDD監(jiān)視器復(fù)位標志 FLSCL=0X80; // 使能FLASH單穩(wěn)態(tài)定時器,F(xiàn)LASH讀時間SYSCLK<=25MHz FLKEY = 0xA5; // 寫入關(guān)鍵字 FLKEY = 0xF1; // 寫入關(guān)鍵字 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監(jiān)視器 RSTSRC = 0x02; //上電復(fù)位/VDD監(jiān)視器復(fù)位標志 FLSCL=0X80; //使能FLASH單穩(wěn)態(tài)定時器,F(xiàn)LASH讀時間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:顯示故障狀態(tài)} 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按下嗎?設(shè)定SET只在6畫面設(shè)置時間 { delayms(200); if(!(Mkey&0x04)) { BGset =2; set = 1; //如果按下SET鍵表示開始設(shè)置時間,置設(shè)置標志位; } } 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) //年設(shè)置,不超過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) //月設(shè)置,不超過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) //日設(shè)置,不超過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) //時設(shè)置,不超過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) //分設(shè)置,不超過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) //時設(shè)置,不超過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畫面設(shè)定時間 { 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 的漢字內(nèi)碼 //----------------------------------------------------------------------------- void main(void) { uchar Page1,j; uchar Runstate ; //Runstate為運行狀態(tài)指示:DI1=1;DI2=1停機;DI1=0;DI2=1充電;DI1=1;DI2=0放電;DI1=1;DI2=1故障 uint VT,AT,PT,PC1,PF1,PDIS,PdownCount; //電壓電流功率功率計數(shù)變量 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位啟動轉(zhuǎn)換 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])) //讀取的當前時間與緩存不等的時候,所有內(nèi)容依次前移 { 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倍,為了送小數(shù)顯示 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])) //當前時間等于緩存時間,繼續(xù)寫入緩存 { Between[18] = PC1>>8; Between[19] = PC1&255; Flash_Program_CTP(); //寫功率和時間到FLASH } } } if(Runstate == 0xc8) //如果放電 { PdownCount++; //秒累加 PT2 = PT2+PT; //秒累計的功率 PF1 = PT2/3600; //實際放電功率,按小時計算,,注意此時累計電量為實際的10倍,為了送小數(shù)顯示 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])) //當前時間等于緩存時間,繼續(xù)寫入緩存 { 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: //顯示故障狀態(tài) { 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倍,為了送顯示小數(shù)點 VT = a; // ADC0CN |=0x10; //寫ADC0BUSY位啟動轉(zhuǎn)換 AMX0P = 0x06; //下一個轉(zhuǎn)換通道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位啟動轉(zhuǎn)換 AMX0P = 0x08; //下一個轉(zhuǎn)換通道P26 AD0EN = 1; } if(ADcount == 3) { filter(); ADC3= (sum/(N-2)); ADC0CN |=0x10; //寫ADC0BUSY位啟動轉(zhuǎn)換 AMX0P = 0x09; //下一個轉(zhuǎn)換通道P34 AD0EN = 1; } if(ADcount == 4) { filter(); ADC4= (sum/(N-2)); ADC0CN |=0x10; //寫ADC0BUSY位啟動轉(zhuǎn)換 AMX0P = 0x05; //下一個轉(zhuǎn)換通道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個字節(jié) { 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 ) //通道轉(zhuǎn)換 { case 0x05: //P2.6 ADCbuffer1[count]=ADC0; count++; ADC0CN |=0x10; //寫ADC0BUSY位啟動轉(zhuǎn)換 if (count > N-1){ count = 0; AD0EN = 0; //禁止轉(zhuǎn)換 ADcount = 1; } break; case 0x06: //P3.0 ADCbuffer1[count]=ADC0; count++; ADC0CN |=0x10; //寫ADC0BUSY位啟動轉(zhuǎn)換 if (count > N-1){ count = 0; AD0EN = 0; ADcount = 2; } break; case 0x08: //P3.4 ADCbuffer1[count]=ADC0; count++; ADC0CN |=0x10; //寫ADC0BUSY位啟動轉(zhuǎn)換 if (count > N-1){ count = 0; AD0EN = 0; ADcount = 3; } break; case 0x09: //P3.5 ADCbuffer1[count]=ADC0; count++; ADC0CN |=0x10; //寫ADC0BUSY位啟動轉(zhuǎn)換 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分鐘關(guān)背光 { k=0; BGset = 0; } } } }