⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 在MSP430下操作IC卡以及FLASH以及ADS1242
💻 C
字号:
/*
* copyright (c) 兰州瑞德高科技有限公司电专项目组
* all rights reserved.

* 文件名称: main.c
* 摘    要: ic卡热表主程序

* 当前版本: v1.0
* 作    者: 杨晓卫 
* 完成日期: 2004.7.30
* 修改日期: 2004.8.2
*/

#include <msp430x41x.h>
#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<len;i++)
  {
    if(*src++!=*des++)
    {
      return 0;
    }
  }
  return 1;
}

 
 
 
 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -