【TI 技术资料分享】+基于MSP430单片机的智能电表

2019-07-30 18:38发布

基于MSP430单片机的智能电表 基于MSP430单片机的智能电表.zip (96.77 KB, 下载次数: 22) 2015-3-10 17:09 上传 点击文件名下载附件
  1. #include "msp430x41x.h"
  2. #include "string.h"
  3. #include "Def.h"
  4. #include "EepromAddr.h"
  5. #include "CommID.h"
  6. #include "Main.h"
  7. #include "Tariff.c"
  8. #include "Temperature.c"
  9. #include "Lcd.c"
  10. #include "I2C.c"
  11. #include "Comm.C"
  12. #include "Timer.C"


  13. void port_ini( void )
  14. {
  15.         P1OUT  = P1T485;
  16.         P1DIR  = TX | P1T485;
  17.         P1IES &=~P1IMPIN;
  18.         P1IES |= P1DISPLAY;
  19.         P1IE  |= P1IMPIN | P1DISPLAY;
  20.         P1IFG  = 0;
  21.         P1SEL  = 0;
  22.        
  23.         P2DIR  = 0;
  24.         P2IES |= (P2UNCOVER | P2POWERCHECK | 0x20);
  25.         P2IE  |= (P2UNCOVER | P2POWERCHECK | 0x20);
  26.        
  27.         P6DIR  = (P6E485 | P6LEDRATE2 | P6LEDRATE3 | P6LEDRATE4);
  28.         P6OUT  = (P6E485 | P6LEDRATE2 | P6LEDRATE3 | P6LEDRATE4);
  29. }

  30. void start_wdt( void )
  31. {
  32.         WDTCTL = WDT_ARST_1000;                        // Start WDT
  33.         IFG1 &=WDTIFG;
  34.         IE1  |=WDTIE;
  35. }
  36. /*
  37. void search_fee( void )
  38. {
  39.         bTmp=tar_que( &NowClk1, &TarList );
  40.         if( bTmp>3 ) bTmp=1;
  41. }
  42. */
  43. void main(void)
  44. {
  45.        
  46.         WDTCTL = WDTPW + WDTHOLD;                                // Stop watchdog timer
  47.         FLL_CTL0 |= XCAP14PF;
  48.        
  49. // 让 AD7416 进入掉电模式。
  50.         vars.tmpPtr[0] = 0x01;
  51.         w_I2C_bytes(vars.tmpPtr,0x9E,0x01,1);
  52.        
  53.         new_e2prom_ini();
  54.        
  55.         clk_ini();                        // --
  56.        
  57.         re_clk_ini();
  58.        
  59.         lcd_ini();
  60.        
  61.         port_ini();
  62.         vars.MetStatus=0;
  63.         vars.MetStatus=BATTEST(vars.MetStatus);
  64.        
  65.         TimeA_ini();
  66.         vars.cFlag=0;
  67.         vars.rt_Bit = 0;
  68.         vars.lByte = 0;
  69.         rx_cap_reseat();
  70.        
  71.         start_wdt();
  72.        
  73.         _EINT();                                                                // Enable interrupts
  74.        
  75.         while(1)
  76.         {
  77.                 if ( vars.Int_ID&ComInt )        // communication interrupt
  78.                 {
  79.                         ProcComm();
  80.                         vars.Int_ID &=~ComInt;
  81.                 }
  82.                 if ( vars.Int_ID&BtInt )                // basic timer interrupt
  83.                 {
  84.                         ProcSec();
  85.                         vars.Int_ID &=~BtInt;
  86.                 }
  87.                 if((vars.Int_ID&E2Int)&&!(vars.E2PROM_SAVE&E2BUSY))
  88.                 {
  89.                         vars.E2PROM_SAVE |= E2BUSY;
  90.                         E2_Save();
  91.                         vars.E2PROM_SAVE &=~E2BUSY;
  92.                         vars.Int_ID &=~E2Int;
  93.                 }
  94.                 _NOP();
  95.                
  96.                 LPM3;
  97.                 _NOP();
  98.         }
  99. }

  100. interrupt[BASICTIMER_VECTOR] void Basic_timer (void)
  101. {
  102.         IFG1 &=WDTIFG;
  103.        
  104.         WDTCTL = WDT_ARST_1000;                                // Clear WDT
  105.        
  106.         if ( vars.bt_int>=63 )
  107.         {
  108.                 vars.bt_int=0;
  109.         }
  110.         else vars.bt_int++;
  111.        
  112. // 以下程序为内部软件时钟温度补偿:
  113.         if(vars.Flags & Temp_F)
  114.         {
  115.                 vars.Flags &=~ Temp_F;
  116.                
  117.                 if ( vars.bt_int>=63 ) vars.bt_int=0;
  118.                 else vars.bt_int++;
  119.         }
  120. //
  121.        
  122.         if ( vars.bt_int==0 || vars.bt_int==32 ) vars.Int_ID |=BtInt;
  123.        
  124.         if(vars.Int_ID!=0) LPM3_EXIT;                                                        // wake CPU
  125. }

  126. interrupt[TIMERA0_VECTOR] void TA0_timer (void)
  127. {
  128.         if((vars.timer0status&comovertime)==comovertime)
  129.         {
  130. //                vars.rt_Bit = 0;
  131. //                vars.lByte = 0;
  132.                 rx_cap_reseat();
  133.                 vars.timer0status &=~comovertime;
  134.         }
  135.         if(vars.timer0status==0) CCTL0 &=~CCIE;
  136. }

  137. interrupt[TIMERA1_VECTOR] void TA1_timer (void)
  138. {
  139.         if ((TAIV|0x02)==0x02)
  140.         {
  141.                 if( (vars.ComFlags & rtflag)==rtflag )
  142.                 {
  143.                         ComFlagRAM |= sym_Comm;
  144.                         tx_prt(vars.rtByte[vars.lByte]);
  145.                 }
  146.                 else
  147.                 {
  148.                         switch(vars.rt_Bit)                                // 32.768k XT
  149.                         {
  150.                                 case  0:
  151.                                         CCTL0 &=~CCIE;
  152.                                         CCTL1 &= ~(CAP+CM1);
  153.                                         CCR1 =TAR+14;break;
  154.                                 case  3:CCR1=CCR1+28;break;
  155.                                 case  6:CCR1=CCR1+28;break;
  156.                                 case  9:CCR1=CCR1+28;break;
  157.                                 default:CCR1=CCR1+27;break;
  158.                         }
  159.                         vars.cFlag=0;                                                                        // 清超时计时.
  160.                        
  161.                         if (vars.rt_Bit==1)
  162.                         {
  163.                                 if ((P1IN&RX)==RX) goto looperr;                        // error return(9)
  164.                                 else
  165.                                 {
  166.                                         vars.hByte  = 0;
  167.                                         vars.csByte = 0;
  168.                                         goto loop0;
  169.                                 }
  170.                         }
  171.                         if ((vars.rt_Bit>1)&&(vars.rt_Bit<=10))                        // 7 or 8 bit: now 8 bit
  172.                         {
  173.                                 if ((P1IN&RX)==RX)
  174.                                 {
  175.                                         vars.hByte |= 0x200;                                        // 7 or 8 bit
  176.                                         vars.csByte++;
  177.                                 }
  178.                                 vars.hByte >>=1;
  179.                                 goto loop0;
  180.                         }
  181.                         if (vars.rt_Bit>10)                                                        // 7 or 8 bit
  182.                         {
  183.         //                        COMIFGS[0] |=RB_L;                                        // 字节结束,超时计时开始中。
  184.                                 vars.timer0status |= comovertime;
  185.                                 CCR0  =TAR+0x8000;
  186.                                 CCTL0 |= CCIE;
  187.                                 vars.hByte &=0xFF;                                                // 7 or 8 bit
  188.                                 if ((vars.csByte&1)==0) goto loop1;
  189.                                 else goto looperr;
  190.                         }
  191.         loop0:
  192.                         vars.rt_Bit++;
  193.                         goto loopend;
  194.         loop1:
  195.                         if((vars.lByte==0)&&(vars.hByte!=0x68)) goto looperr;
  196.                         ComFlagRAM |= sym_Comm;
  197.                         vars.rt_Bit = 0;
  198.                         vars.rtByte[vars.lByte]=vars.hByte;
  199.                         if ( vars.lByte == vars.rtByte[9]+11 )
  200.                         {
  201.                                 vars.lByte=0;
  202.                                 CCTL0 &=~CCIE;
  203.         //                        rtByte[rtByte[9]+11]=0;
  204.                                 vars.Int_ID |= ComInt;
  205.                         }
  206.                         else
  207.                         {
  208.                                 vars.lByte++;
  209.                                 if(vars.lByte>42) goto looperr;
  210.                         }
  211.                        
  212.                         rx_cap_start();                                // communication start
  213.                         goto loopend;
  214.         looperr:
  215.                         vars.rt_Bit = 0;
  216.                         vars.lByte = 0;
  217.                         rx_cap_reseat();                        // communication reseat
  218.         loopend:
  219.                         _NOP();
  220.                 }
  221.         }
  222.         if (TAIV|0x04)
  223.         {
  224.                 CCTL2 &=~CCIFG;
  225.                 CCR2  =TAR+0x8000;
  226.                 if( !(P1IN&P1DISPLAY) )
  227.                 {
  228.                         //
  229.                         if ( vars.LcdCtl.Switch==1 )
  230.                         {
  231.                                 vars.LcdCtl.Mode ^= 1;
  232.                         }
  233.                         else vars.LcdCtl.Switch++;
  234.                         //
  235.                         //LcdCtl.Mode ^= 1;
  236.                 }
  237.                 else { CCTL2 &=~CCIE; vars.LcdCtl.Switch = 0; }
  238.         }
  239. }

  240. interrupt[PORT1_VECTOR] void p1_int (void)
  241. {
  242.         if( (P1IFG&P1DISPLAY)!=0 )
  243.         {
  244.                 P1IFG &=~P1DISPLAY;
  245.                
  246.                 CCR2  =TAR+0xFFF0;
  247.                 CCTL2 |= CCIE;
  248.                
  249.                 vars.LcdCtl.SecCtr=0;
  250.                 if( vars.LcdCtl.PagePtr<23 ) vars.LcdCtl.PagePtr++;
  251.                 else vars.LcdCtl.PagePtr=0;
  252.                
  253.                 vars.Int_ID |= KeyInt;
  254.         }
  255.        
  256.         if( (P1IFG&P1REVP)!=0 )
  257.         {
  258.                 vars.CurrentRe.nTime[0]=vars.NowClk1.nMinute;
  259.                 vars.CurrentRe.nTime[1]=vars.NowClk1.nHour;
  260.                 vars.CurrentRe.nTime[2]=vars.NowClk1.nDay;
  261.                 vars.CurrentRe.nTime[3]=vars.NowClk1.nMonth;
  262.                
  263.                 vars.E2PROM_SAVE |= UnCover_S;
  264.                 vars.Int_ID |=E2Int;
  265.                
  266.                 P1IFG &=~P1REVP;
  267.         }
  268.        
  269.         if( (P1IFG&P1IMPIN)!=0 )
  270.         {
  271.                 P1IFG &=~P1IMPIN;
  272.                
  273.                 if (vars.PulseNum>=vars.MetConst)
  274.                 {
  275.                         vars.PulseNum=1;
  276.                        
  277.                         if((vars.Tariff.EC[0][0]&0x0F)>=9)                        // 电量增加 0.1,保存
  278.                         {
  279.                                 r_I2C_bytes(&vars.Tariff.EC[0][0],I2C_24CXX_P0,CuECTotal,4);
  280.                                 vars.Tariff.EC[0][0] &= 0xF0;
  281.                                 vars.Tariff.EC[0][0] += 0x09;
  282.                                 vars.E2PROM_SAVE |= EC_S;
  283.                                 vars.Int_ID |=E2Int;
  284.                         }
  285.                         if(P1IN&P1REVP) _BCD4INC((BYTE *)&vars.ECReAll[0]);
  286.                         _BCD4INC((BYTE *)&vars.Tariff.EC[0][0]);
  287.                         _BCD4INC((BYTE *)&vars.Tariff.EC[vars.bTmp+1][0]);                // [vars.bTmp+1]
  288.                 }
  289.                 else _BCD1INC((BYTE *)&vars.PulseNum);
  290.         }
  291.         P1IFG =0;
  292.         _NOP();
  293. }

  294. interrupt[PORT2_VECTOR] void p2_int (void)/////////////////////////////////////////开盖记录
  295. {
  296.         if( P2IFG&P2UNCOVER )
  297.         {
  298.                 P2IFG &=~P2UNCOVER;
  299.                 vars.UnCover.nTime[1][0]=vars.UnCover.nTime[0][0];
  300.                 vars.UnCover.nTime[1][1]=vars.UnCover.nTime[0][1];
  301.                 vars.UnCover.nTime[1][2]=vars.UnCover.nTime[0][2];
  302.                 vars.UnCover.nTime[1][3]=vars.UnCover.nTime[0][3];
  303.                 vars.UnCover.nTime[0][0]=vars.NowClk1.nMinute;
  304.                 vars.UnCover.nTime[0][1]=vars.NowClk1.nHour;
  305.                 vars.UnCover.nTime[0][2]=vars.NowClk1.nDay;
  306.                 vars.UnCover.nTime[0][3]=vars.NowClk1.nMonth;
  307.                 vars.UnCover.nTimes++;
  308.                 _NOP();
  309.                 vars.E2PROM_SAVE |= UnCover_S;
  310.                 vars.Int_ID |=E2Int;
  311.         }
  312.        
  313.         if( P2IFG&P2POWERCHECK )
  314.         {
  315.                 P2IFG &=~P2POWERCHECK;
  316.                 vars.E2PROM_SAVE |= EC_S;
  317.                 vars.E2PROM_SAVE |= PulseNum_S;
  318.                 vars.Int_ID |=E2Int;
  319.         }
  320.        
  321.         P2IFG =0;
  322.         _NOP();
  323. }
复制代码

0条回答

一周热门 更多>