打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
基于C8051F的AD UART0 KEY FLASH TIME3程序
//------------------------------------------------------------------------------------// 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;      }     }     }  }

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
DS18B20的51单片机驱动源代码
百度经验
51单片机学习
PC 机与单片机通信(RS232 协议)
单片机入门-C51实现用TLC549模数转换用数码管设计电压表解说
正反转可控步进电机(仿真图 代码)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服