www.pudn.com > newrlb.rar > main.c


/* 
* copyright (c) 兰州瑞德高科技有限公司电专项目组 
* all rights reserved. 
 
* 文件名称: main.c 
* 摘    要: ic卡热表主程序 
 
* 当前版本: v1.0 
* 作    者: 杨晓卫  
* 完成日期: 2004.7.30 
* 修改日期: 2004.8.2 
*/ 
 
#include  
#include "predef.h" 
#include "flash.h" 
#include "iccard.h" 
#include "lcd.h" 
#include "ads1242.h" 
 
#define secMem       0x1000 
#define totalFluxMem 0x1084 
#define totalHeatMem 0x1088 
#define workTimeMem  0x108c 
#define heatMem      0x1090 
 
uchar interruptFlag=0; 
uchar timerFlag=0; 
uchar openFlag=1,closeFlag=0;  //阀门开关到位标志 
uchar wrongFlag=0;             //卡错标志 
uchar setFlag=0;               //表是否设置标志 
uchar userFlag=0;              //判断用户卡是不是第一次插入标志 
uchar measureFlag = 0;             //是否测温标志 
 
uint cardLcd = 0;           //用户卡中的热量值,便于显示存入热量 
ulongint flashTemp = 0;     //热量暂存,便于显示 
float heatValue = 0;     //热量值 
ulongint totalFlux = 0;     //累计流量 
float instntFlux = 0;    //瞬时流量 
float totalHeat = 0;     //累计热量 
float instntHeat = 0; //瞬时热量 
ulongint workTime = 0;      //工作时间 
ulongint counterTime = 0;   //温度测量计时函数 
uint instntFluxCounter = 0; //瞬时流量计数器 
 
void SetCard(void); 
void ChangeCard(void); 
void UserCard(void); 
 
void OpenValve(void); 
void CloseValve(void); 
uchar CompArray(uchar *src,uchar *des,uchar len); 
 
void di(void) 
{ 
 P2OUT|=BIT5; 
 delay(20000); 
 P2OUT&=~BIT5; 
} 
 
void main() 
{ 
uchar *sec; 
uchar cardID; 
 
WDTCTL = WDTPW+WDTHOLD; 
WDTCTL = 0X05A1C; 
 
P1IES |= BIT2; //IC卡中断设置降沿触发  常开   
P1IE |= BIT2;  //P1.2中断允许 
P1IES |= BIT3; //脉冲输入计数中断 
P1IE |= BIT3; 
//P1IES |= BIT0; //拆表破坏中断 
//P1IE |= BIT0; 
 
P2DIR |= BIT5+BIT4+BIT3;    
P2OUT &= ~BIT5; //蜂鸣器不响 
P2OUT &= ~BIT4; //1242 
 
P2IES |= BIT2; // 电池低电中断 
P2IE |= BIT2; 
P2IE |= BIT0+BIT1;//电机开关到位中断 
P2IES |= BIT0+BIT1; 
P6DIR |= 0xff; //P6口都置为输出 
 
IE1 |= WDTIE; 
 
SCFQCTL = 15; 
FLL_CTL0 = DCOPLUS +  XCAP18PF;  // DCO+ set so freq = xtal x D x N+1 
 
LCDCTL = 0x5F;                    /*液晶使用4MUX,使用S0~S19段*/ 
P5SEL = 0xFF;                   /*Common与Rxx都选择*/ 
P4SEL = 0XFF; 
P3SEL = 0XFF; 
P2SEL |= 0XC0;    
 
TACTL = TASSEL0 + TACLR ; //timera 
CCR0 = 60000; 
TACTL |= MC0; 
 
BTCTL = BT_ADLY_500;//基本定时器用于报警 
 
initads1242(); 
Clear_LCD(); 
 
if(SegARead(0x1080)!=0x1234) 
{ 
  SegAWrite(0,0,0,0); 
} 
else 
{ 
  totalFlux = SegARead(totalFluxMem); 
  totalHeat = SegARead(totalHeatMem); 
  workTime = SegARead(workTimeMem); 
  heatValue = SegARead(heatMem); 
} 
 
_EINT(); 
 
if(P2IN&BIT0) 
{ 
  OpenValve(); 
} 
   
measure(); 
_NOP(); 
 
while(1) 
{ 
  if((heatValue>50)&&(heatValue<100)&&(userFlag==1)) 
  { 
    Set_pleasebuy(); 
  } 
   
LPM3; 
 
if(interruptFlag==1) 
{ 
  sec = &cardID; 
   
  PowerOn(); 
  Reset(); 
   
  DataRead(MainMemRead,0x08,1,sec); 
  switch(cardID) 
  { 
     case 1:  
     { 
        if((setFlag==0)&&(userFlag==0)) 
        { 
          SetCard(); 
        } 
        else 
        { 
          di(); 
          delay(50000); 
          delay(50000); 
          di(); 
        } 
     } break; 
      
     case 6:  
     { 
        if(userFlag==1) 
         { 
           ChangeCard(); 
         } 
        
        else 
        { 
        Clear_LCD(); 
        Set_cardwrong(); 
        di(); 
        delay(50000); 
        delay(50000); 
        delay(50000); 
        delay(50000); 
        Clear_LCD(); 
        } 
     }break; 
      
     case 12:  
     { 
        if(setFlag==1) 
        { 
          UserCard(); 
        } 
         
        else 
        { 
        Clear_LCD(); 
        Set_cardwrong(); 
        di(); 
        delay(50000); 
        delay(50000); 
        delay(50000); 
        delay(50000); 
        Clear_LCD(); 
        } 
     }break; 
      
     default: 
     { 
        Clear_LCD(); 
        Set_cardwrong(); 
        wrongFlag = 1; 
        CCTL0 = CCIE; 
        di(); 
     }break; 
      
  } 
   
  interruptFlag=0; 
  P6OUT &= ~0x1f; 
} 
 
if(measureFlag==1) 
{ 
  measure(); 
}   
} 
} 
 
#pragma vector=PORT1_VECTOR 
__interrupt void PORT1 (void) 
{ 
 
delay(100); 
if(P1IFG&BIT3) 
{ 
  P1IFG &= ~BIT3; 
   
  if(!(P1IN&BIT3)) 
  { 
    LPM3_EXIT; 
 
    instntFlux = (3600/instntFluxCounter); 
    instntFluxCounter = 0; 
    ++totalFlux; 
    totalHeat = totalHeat + instntHeat; 
     
    if(instntFlux>=65535) 
    { 
      instntFlux = 0; 
    } 
     
    if(userFlag==1) 
    { 
      if(heatValue>(instntHeat/3600)) 
      { 
        heatValue = heatValue - instntHeat/3600; 
        _NOP(); 
      } 
       
      else 
      { 
        heatValue = 1.0; 
      } 
       
      if((heatValue<5)&&(openFlag==1)) 
      { 
        CloseValve(); 
      } 
    } 
  } 
} 
 
if(P1IFG&BIT2) 
{ 
  LPM3_EXIT; 
  P1IFG &= ~BIT2; 
  measureFlag=1; 
  interruptFlag=1; 
} 
} 
 
#pragma vector=PORT2_VECTOR 
__interrupt void PORT2 (void) 
{ 
LPM3_EXIT; 
 
if(P2IFG&BIT2) 
{ 
  P2IFG &= ~BIT2; 
  SegAWrite(totalFlux,totalHeat,workTime,heatValue); 
  Set_battery(); 
} 
 
if(P2IFG&BIT0) 
{ 
  P2IFG &= ~BIT0; 
  delay(1000); 
  if(!(P2IN&BIT0)) 
  { 
    P6OUT &= ~0Xc0; 
    openFlag = 1; 
    closeFlag = 0; 
  } 
} 
 
if(P2IFG&BIT1) 
{ 
  P2IFG &= ~BIT1; 
  delay(1000); 
  if(!(P2IN&BIT1)) 
  { 
    P6OUT &= ~0Xc0; 
    openFlag = 0; 
    closeFlag = 1; 
  } 
} 
} 
 
#pragma vector=WDT_VECTOR 
__interrupt void WDT_INT(void) 
{ 
  workTime++; 
  counterTime++; 
  instntFluxCounter++; 
  if(counterTime>360) 
  { 
    LPM3_EXIT; 
    measureFlag = 1; 
    counterTime = 0; 
  } 
} 
 
#pragma vector=TIMERA0_VECTOR 
__interrupt void Timer_A (void)  
{ 
  float workTimeBuf = 0; 
  timerFlag++; 
  if(wrongFlag==0) 
  { 
    switch(timerFlag) 
    { 
      case 1: 
      { 
        Clear_LCD(); 
        Set_left(); 
        Set_number(flashTemp,0); 
        Set_reliang(); 
        Set_KWh(); 
      }break; 
       
      case 3: 
      { 
        Clear_LCD(); 
        Set_cunru(); 
        Set_number(cardLcd,0); 
        Set_reliang(); 
        Set_KWh(); 
      }break; 
       
      case 5: 
      { 
        Clear_LCD(); 
        Set_left(); 
        Set_number(heatValue,0); 
        Set_leiji(); 
        Set_reliang(); 
        Set_KWh(); 
      }break; 
       
    } 
     
    if(timerFlag>5) 
    { 
      timerFlag = 0; 
      CCTL0 &= ~CCIE; 
      Clear_LCD(); 
    } 
  } 
   
  else 
  { 
    switch(timerFlag) 
    { 
      case 1: 
      { 
        Clear_LCD(); 
        Set_number(totalHeat/3.6,2); 
        Set_reliang(); 
        Set_leiji(); 
        Set_KWh(); 
      }break; 
       
      case 3: 
      { 
        Clear_LCD(); 
        if(tempdisplay1<10001) 
        { 
          Set_number(tempdisplay1,1); 
        } 
        else 
        { 
          Set_number(10000,0); 
        } 
        Set_input(); 
        Set_temp(); 
      }break; 
      case 4: 
      { 
        Clear_LCD(); 
        if(tempdisplay2<10001) 
        { 
          Set_number(tempdisplay2,1); 
        } 
        else 
        { 
          Set_number(10000,0); 
        } 
        Set_output(); 
        Set_temp(); 
      }break; 
       
      case 5: 
      { 
        Clear_LCD(); 
        Set_number(instntFlux,1); 
        Set_shunshi(); 
        Set_liuliang(); 
      }break; 
       
      case 6: 
      { 
        Clear_LCD(); 
        Set_number(totalFlux,1); 
        Set_leiji(); 
        Set_liuliang(); 
      }break; 
       
      case 7: 
      { 
        Clear_LCD(); 
        workTimeBuf = workTime; 
        workTimeBuf = workTimeBuf/36; 
        Set_number(workTimeBuf,1); 
        Set_hour();         
      }break; 
       
    } 
     
    if(timerFlag>7) 
    { 
      timerFlag = 0; 
      CCTL0 &= ~CCIE; 
      wrongFlag = 0; 
      Clear_LCD(); 
    } 
  } 
} 
 
#pragma vector=BASICTIMER_VECTOR 
__interrupt void BASICTIMER (void) 
{ 
uchar btimer=0; 
CCTL0&=~CCIE; 
btimer++; 
P2OUT^=BIT5; 
if(btimer>6) 
{ 
  IE2&=~BTIE; 
  P2OUT&=~BIT5; 
  btimer=0; 
  Clear_LCD(); 
} 
 
} 
 
void SetCard(void) 
{ 
  setFlag=1; 
  di(); 
  if(openFlag==1) 
  { 
    CloseValve(); 
  } 
} 
 
void ChangeCard(void) 
{ 
  uchar changeFlag = 0; 
  uchar *change; 
  uchar flashSec[3]; 
  uchar changeSec[3]; 
  uchar changeHeat[4]; 
  ulongint heatValueBuf = 0; 
  change=&changeFlag; 
  heatValueBuf = heatValue; 
   
  DataRead(MainMemRead,0x59,1,change); 
  SegBRead(secMem,flashSec,3); 
   
  if(changeFlag==0) 
  { 
    if(!(P1IN&BIT2)) 
    { 
    SecVerify(0xff,0xff,0xff); 
    DataWrite(MainMemUpdate,0x60,(heatValueBuf>>24)&0xff); 
    DataWrite(MainMemUpdate,0x61,(heatValueBuf>>16)&0xff); 
    DataWrite(MainMemUpdate,0x62,(heatValueBuf>>8)&0xff); 
    DataWrite(MainMemUpdate,0x63,heatValueBuf&0xff); 
    DataWrite(MainMemUpdate,0x50,flashSec[0]); 
    DataWrite(MainMemUpdate,0x51,flashSec[1]); 
    DataWrite(MainMemUpdate,0x52,flashSec[2]); 
    DataWrite(MainMemUpdate,0x59,0x01); 
    } 
     
    flashSec[0]=0; 
    flashSec[1]=0; 
    flashSec[2]=0; 
    SegBWrite(flashSec,3); 
     
    SegAWrite(0,0,0,0); 
     
    setFlag = 0; 
    userFlag = 0; 
     
    heatValueBuf = heatValue; 
    heatValue=0; 
 
    if(P2IN&BIT0) 
    { 
      OpenValve(); 
    } 
 
    di();       
 
    Clear_LCD(); 
    Set_left(); 
    Set_number(heatValueBuf,0); 
    Set_reliang(); 
    Set_KWh(); 
    delay(50000); 
    delay(50000); 
    delay(50000); 
    delay(50000); 
    Clear_LCD();                    
     
  } 
  else if(changeFlag==1) 
  { 
    DataRead(MainMemRead,0x50,3,changeSec); 
    if(CompArray(changeSec,flashSec,3)) 
    { 
      DataRead(MainMemRead,0x60,4,changeHeat); 
      flashTemp = changeHeat[0]; 
      flashTemp = (flashTemp<<8) + changeHeat[1]; 
      flashTemp = (flashTemp<<8) + changeHeat[2]; 
      flashTemp = (flashTemp<<8) + changeHeat[3]; 
     
     
      if(flashTemp>0xffffff) 
      { 
        flashTemp = 0; 
      } 
     
      heatValue = heatValue + flashTemp; 
   
      if(!(P1IN&BIT2)) 
      {    
      SecVerify(0xff,0xff,0xff); 
      DataWrite(MainMemUpdate,0x50,0xff); 
      DataWrite(MainMemUpdate,0x51,0xff); 
      DataWrite(MainMemUpdate,0x52,0xff); 
      DataWrite(MainMemUpdate,0x60,0x00); 
      DataWrite(MainMemUpdate,0x61,0x00); 
      DataWrite(MainMemUpdate,0x62,0x00); 
      DataWrite(MainMemUpdate,0x63,0x00); 
      DataWrite(MainMemUpdate,0x59,0x00); 
      } 
       
      SegAWrite(totalFlux,totalHeat,heatValue,workTime); 
 
      di(); 
     
      Clear_LCD(); 
      Set_cunru(); 
      Set_number(flashTemp,0); 
      Set_reliang(); 
      Set_KWh(); 
      delay(50000); 
      delay(50000); 
      delay(50000); 
      delay(50000); 
      Clear_LCD();                    
      if((heatValue>5)&&(closeFlag==1)) 
      { 
        OpenValve(); 
      } 
    } 
     
    else 
    { 
      Set_cardwrong(); 
      IE2=BTIE; 
      Clear_LCD(); 
    }  
  } 
   
} 
 
void UserCard(void) 
{ 
  uchar userSec[3];         //卡中读出的用户密码 
  uchar heatbuf[2];         //卡中读出的热量值 
  uchar flashSec[3];          //flash中读出的用户密码 
  ulongint heatValueBuf = 0;  
  DataRead(MainMemRead,0x09,3,userSec); 
   
  if(userFlag==0) 
  { 
    SegBWrite(userSec,3); 
    DataRead(MainMemRead,0x40,2,heatbuf); 
    heatValueBuf = heatbuf[0]; 
    heatValueBuf = (heatValueBuf<<8) + heatbuf[1]; 
    heatValue = heatValueBuf; 
     
    SecVerify(0xff,0xff,0xff); 
    DataWrite(MainMemUpdate,0x40,0); 
    DataWrite(MainMemUpdate,0x41,0); 
     
    SegAWrite(totalFlux,totalHeat,heatValue,workTime); 
 
    di(); 
 
    Clear_LCD(); 
    Set_cunru(); 
    Set_number(heatValue,0); 
    Set_reliang(); 
    Set_KWh(); 
    delay(50000); 
    delay(50000); 
    delay(50000); 
    delay(50000); 
    Clear_LCD();                       
     
    if((heatValue>5)&&(closeFlag==1)) 
    { 
      OpenValve(); 
    } 
     
    userFlag = 1; 
  } 
   
  else 
  { 
    SegBRead(secMem,flashSec,3); 
    if(CompArray(userSec,flashSec,3)) 
    { 
      DataRead(MainMemRead,0x40,2,heatbuf); 
      cardLcd = heatbuf[0]; 
      cardLcd = (cardLcd<<8) + heatbuf[1]; 
      flashTemp = heatValue; 
      heatValue = heatValue + cardLcd; 
       
       
      if((P1IN&BIT2)==0) 
      { 
        SecVerify(0xff,0xff,0xff); 
        DataWrite(MainMemUpdate,0x40,0); 
        DataWrite(MainMemUpdate,0x41,0); 
        di(); 
        CCTL0=CCIE;                                  
      } 
       
      if(cardLcd!=0) 
      { 
        SegAWrite(totalFlux,totalHeat,heatValue,workTime); 
      } 
 
      if((cardLcd>10)&&(closeFlag==1)) 
      { 
        OpenValve(); 
      } 
    } 
     
    else 
    { 
      Clear_LCD(); 
      Set_cardwrong(); 
      IE2=BTIE; 
    } 
  }  
} 
 
void OpenValve(void) 
{ 
P6OUT&=~BIT7; 
P6OUT|=BIT6; 
delay(500); 
P6OUT|=BIT5; 
} 
 
void CloseValve(void) 
{ 
P6OUT|=BIT7; 
P6OUT&=~BIT6; 
delay(500); 
P6OUT|=BIT5; 
} 
 
uchar CompArray(uchar *src,uchar *des,uchar len) 
{ 
  int i; 
   
  for(i=0;i