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

📄 wqxqz.c

📁 一个用MPS430F1211单片机开发的电话MODEM数据集抄器的原代码
💻 C
📖 第 1 页 / 共 4 页
字号:
//////////////////////////////////////////////////////////////////////////////
//                    TELEPHONE MODEM UPTOWN Repeaters                      //
//////////////////////////////////////////////////////////////////////////////
#include  <msp430x12x.h>
#define   uchar          unsigned char
#define   uint           unsigned int
////////////////////////const number define///////////////////////////////////
#define   LYRMTIME             20000                                        //
////////////////////////I/O DEFINE////////////////////////////////////////////
#define   MODPOWON            (P2OUT |= 0X20)        //P2.5=1
#define   MODPOWOFF           (P2OUT &= (~0X20))     //P2.5=0//MODPOW ON/OFF
#define   E2PROM_SCLH         (P2OUT |= 0X10)        //P2.4 FOR 24LC04 SCL
#define   E2PROM_SCLL         (P2OUT &= (~0X10))     /////////////////////////
#define   E2PROM_ENR          (P2OUT |= 0X08)        //P2.3 FOR 24LC04 WP
#define   E2PROM_ENW          (P1OUT &= (~0X08))     /////////////////////////
#define   E2PROM_SDAH         (P1OUT |= 0X01)        //P1.0 FOR 24LC04 SDA
#define   E2PROM_SDAL         (P1OUT &= (~0X01))     /////////////////////////
#define   PHONE_CHK           (P2IN  & 0X01)         //P2.0 SET INPUT FOR PHONE IN, LOW IS active
#define   E2PROM_CTLBYTE_W    0X0A0                  //E2PROM CONTRL BYTE
#define   E2PROM_CTLBYTE_R    0X0A1
#define   LED_ON              (P1OUT  &= (~0X08))
#define   LED_OFF             P1OUT  |= 0X08
#define   V_CHECK             (P1IN  & 0x02)         //if v_check=0 that is low volt
                                                     //
////////////////////////define ds1302/////////////////////////////////////////
#define nop _NOP()
//the used I/O Pin define
//SCK_DS P3.0	
//SDA_DS P3.1	
//SRS_DS P3.2	
#define  SCK_DSH	( P3OUT |= 0X01 )
#define  SCK_DSL	( P3OUT &= (~0X01) )
#define  SDA_SET_INPUT  ( P3DIR &= (~0x02) )
#define  SDA_SET_OUTPUT ( P3DIR |= 0x02 )
#define  SDA_DS_INPUT   ( P3IN & 0x02 )
#define  SDA_DSH        ( P3OUT |= 0X02 )
#define  SDA_DSL	( P3OUT &= (~0X02) )
#define  SRS_DSH	( P3OUT |= 0X04)
#define  SRS_DSL	( P3OUT &= (~0X04) )
#define  CKADDR	0x80			             //RAM Clock register
                                                     //second minute hour date mon Week year //in BCD
#define  CKCTRL	0x8E			             //Ctrl register

///////////////////////e2prom address define/////////////////////////////////
#define   E2_MODEM_INIT_FLG      0x01
#define   E2PROM_INIT_FLG        0x02
#define   MAINNUMBER             0x03                //03h~06h 4byte for mainnumber
#define   E2_ADDR_COUNTER        0X08                //HOW MANY ADDR IN THE E2PROM(0~255)
#define   E2_METER_DAY           0X09                //0x09~0x1f save 7 meter day
#define   E2_METER_DAY_BESET     0X20
#define   E2_ADDR_FRIST_ADDR     0x037

////////////////////////////////////////////////////////////////////////////
///////////////////////LS138 DEFINE/////////////////////////////////////////
#define   NO_ALLOFF           P3OUT  |=  0x08        //P3.3
#define   ALLOFF              P3OUT  &=  (~0x08)     //P3.3
#define   AH                  P3OUT  |=  0x40        //P3.6
#define   AL                  P3OUT  &=  (~0x40)     //P3.6
#define   BH                  P3OUT  |=  0x80        //P3.7
#define   BL                  P3OUT  &=  (~0x80)     //P3.7
#define   CH                  P2OUT  |=  0x02        //P2.1
#define   CL                  P2OUT  &=  (~0x02)     //P2.1
#define   P_C_1_ON            {AL;BL;CL;}
#define   P_C_2_ON            {AL;BL;CH;}
#define   P_C_3_ON            {AL;BH;CL;}
#define   P_C_4_ON            {AL;BH;CH;}
#define   P_C_5_ON            {AH;BL;CL;}
#define   P_C_6_ON            {AH;BL;CH;}
#define   P_C_7_ON            {AH;BH;CL;}
#define   P_C_8_ON            {AH;BH;CH;}

///////////////////////////////////////////////////////////////////////////
//////////////////////////function statement///////////////////////////////
//DALEY
void    DELAY_ms(uint ms);
void    DELAY_us(uint us);
//UART
void    INIT_UART(void); //SET UART BAUD RATE ,UCLK,N81,EN TX RX
//E2PROM AT24C02
void    INIT_E2PROM (void);
void    E2PRON_START (void);
void    E2PROM_STOP (void);
void    MCU_T_ACK (void);
void    MCU_T_NOACK (void);
uchar   MCU_R_ACK (void);
uchar   MCU_R_1BYTE (void);
void    MCU_T_1BYTE (uchar);
void    WRITE_E2PROM (uchar *mcu_ramadd,uchar e2promadd,uchar n);
void    WRITE_1_BYTE_E2PROM (uchar *mcu_ramadd,uchar e2promadd,uchar n);//singened byte write *n
void    READ_E2PROM (uchar *mcu_ramadd,uchar e2promadd,uchar n);
void    CTL_READ_METER(void);
void    SETMODEM (void);                                                //set modem
void    UART_T (uchar *txbuf,uchar number);                             //uart t data
void    INIT_P20 (void);                                                //init telephone on check port p2.2
void    TELEON_TASK (void);                                             //telephone tast
void    ERRLED (void);                                                  //moden set error display
void    ANALYZE_CMD (void);                                             //
void    SYS_RD_MN (void);
void    SYS_RD_TIME (void);
void    SYS_WR_MN (void);
void    SYS_WR_TIME (void);
void    SYS_POWON (void);
void    SYS_POWOFF (void);
void    SYS_TELEOFF (void);
void    SYS_DOWNLOAD_ADDR (void);
void    SYS_UPLOAD_ADDR (void);
void    SYS_CLEAR_ADDR (void);
void    SYS_READ_STATE (void);
void    SYS_DOWNLOAD_METER_DAY(void);
void    SYS_UPLOAD_METER_DAY(void);
void    SYS_CLEAR_METER_DAY(void);
void    RECTIME(void);
void    LED_ONTIME(uchar mms);
void    LEDPLAY (uchar ledctlbb);

//////////////////////////////////
uchar   ACCOUNT_CHKSUM(uchar length);                                   //account uart check sum
uchar   BCDT0DEC (uchar bcdtemp);
uchar   DECTOBCD (uchar dectemp);
void    OFF_HOOK(void);
void    CLRWDT(void);                                                   //CLEAR WDT CNT
void    LED_DISPLAY (uint times);
//////////////ds1302//////////////
void    ResetDs(void);
void    OutByte(uchar outdata);		                                //SPI bus out byte
uchar   InByte(void);			                                //in one byte
void    WriteByteDs(uchar addr,uchar outdata);	                        //write one byte to address
uchar   ReadByteDs(uchar addr);			                        //read one byte from address
void    ReadTime(uchar * time);			                        //continue read 7 bytes from 0x80
void    WriteTime(uchar * time);			                //write 7 bytes to 0x80
void    En_dswork(void);
/////////////////////////////////
void    TAKETELE(void);
void    ANALYZE_WHICHWAY_POW(uchar tempway);

#pragma memory=constseg(TABLE)

uchar atq1   [6]  =  {'a','t','q','1',0x0d,'\0'};                       //at command
uchar ate0   [6]  =  {'a','t','e','0',0x0d,'\0'};
uchar atd0   [7]  =  {'a','t','&','d','0',0x0d,'\0'};
uchar atr1   [7]  =  {'a','t','&','r','1',0x0d,'\0'};
uchar ats0   [7]  =  {'a','t','&','s','0',0x0d,'\0'};
uchar atw    [6]  =  {'a','t','&','w',0x0d,'\0'};
uchar theadd [4]  =  {'+','+','+','\0'};
uchar h0     [5]  =  {'a','t','h','0','\0'};
uchar fe     [3]  =  {0xfe,0xfe,0xfe};
uchar tele   [6]  =  {'a','t','d','t','=','\0'};
uchar telenum[5]  =  {'8','0','0','7','\0'};

uchar ent  = 0x0d;
uchar math [10] =  {1,2,3,4,5,6,7,8,9,0};
uchar set    = 'S';
uchar zero   = 0X00;
uchar e20h   = 0X20;

#pragma memory=default
////////////////////////////////

uchar   systemtime[7];         //rtc time datatype[year,mon,week,day,hour,min,sec]
//uchar   telephoneflg;        //set mask for telephone on
uchar   systemflg;             //BIT 7:receive whole frame that waitting for system dispoes flg
                               //BIT 6:will off-hook
                               //BIT 5:TELEPHONE ON FLG ,SET1 MAENS HAVE TELE_ON
                               //BIT 4:set one means meterday is come,set zero means meterday is complete
                               //BIT 3:set one means it`s real telephone on,set zero means no confirm
                               //BIT 2:low volt flg , set one means low
                               //BIT 1:
                               //BIT 0:

uchar   mainnumber[4];         //byte1~byte2:address byte3~byte4:0x00,0x00
uchar   rxtxdatabuf[20];
uchar   rxdatapoint;
uchar   rxtxchksum;            //receive data checksum
uchar   dataarea;              //receive data area point
uchar   addr_counter;
//char    timecounter;
uchar   meterday[7];
uchar   timer_min;
uchar   clearwdtcounter;
uchar   whichway;



////////////////////////////////////////////////////////////////////////////////
///                   / \     /\       / \       /      /\    /              ///
///                  /   \  /   \     /__ \     /      /  \  /               ///
///                 /     \/     \   /     \   /      /    \/                ///
///                                                                          ///
////////////////////////////////////////////////////////////////////////////////
void main(void)
{

  //////////////////////////////////WDT SET////////////////////////////////////////////
  WDTCTL = WDTPW+WDTHOLD;                           //CLOSE WDT

  //////////////////////////////////I/O SET/INIT///////////////////////////////////////
  //VOLT CHECK PORT
  P1DIR &= (~0X02);                                 //P1.1 for check power voltage
  P1OUT |= 0X02;                                    //SET INPUT P1.1 INIT STEATE
  P1IES |= 0X02;                                    //INTERRUPT BECOME DOWN
  P1IE  |= 0X02;                                    //OPEN INIERRUPT

  //PHONE CHECK
  P2DIR &= (~0X01);                                 //INPUT
  P2OUT |= 0X01;                                    //INIT HIGH
  P2IES |= 0X01;                                    //DOWN
  P2IE  |= 0X01;                                    //OPEN INTERRUPT

  //2404 SDA
  P1DIR |= 0X01;                                    //P1.0 SET OUTPUT FOR 24LC04 SDA
  P1OUT |= 0X01;                                    //INIT 24LC04 SDA HIGH
  //2404 SCL
  P2DIR |= 0X10;                                    //OUTPUT
  P2OUT |= 0X10;                                    //INIT HIGH
  //2404 WP
  P2DIR |= 0X08;                                    //OUTPUT
  P2OUT |= 0X08;                                    //INIT HIGH

  //LS138 A
  P3DIR |= 0X40;                                    //P3.6 set output for ls138 A
  P3OUT &= (~0X40);                                 //p3.6 init 0
  //LS138 B
  P3DIR |= 0X80;                                    //P3.7
  P3OUT &= (~0X80);
  //LS138 C
  P2DIR |= 0X02;                                    //P2.1
  P2OUT &= (~0X20);
  //LS138 G1
  P3DIR |= 0X08;                                    //P3.3
  P3OUT &- (~0X08);                                 //INIT 0 VOLT TO DISIBLE LS138 WORK

  //MODEM POWER CONTRL
  P2DIR |= 0X20;                                    //P2.5
  P2OUT &= (~0X20);                                 //INIT MODEM POWER OFF

  //LED
  P1DIR |= 0X08;
  P1OUT |= 0X08;                                    //P1.3,INIT 1,LED OFF

  //UART
  //P3OUT |= 0X10;                                  //P3.4 OUT
  //P3OUT &= (~0X20);                               //P3.5 INPUT
  P3SEL |= 0X30;                                    //SELECET UART

  //DS1302 SCL
  P3DIR |= 0X01;                                    //P3.0
  P3OUT |= 0X01;
  //DS1302 SDA
  P3DIR |= 0X02;                                    //P3.1
  P3OUT |= 0X02;
  //DS1302 RST
  P3DIR |= 0X04;                                    //P3.2
  P3OUT |= 0X04;
  ////////////////////////////////////////////////////////////////////////////////////////////////
  LED_OFF;                                                   //INIT p2.3 HIGH LED CLOSE
  E2PROM_ENR;                                                //E2PPROM SET READ STATE
  ALLOFF;
  READ_E2PROM(mainnumber,MAINNUMBER,4);                      //read mainnumber from e2prom
  ReadTime(systemtime);
  WriteTime(systemtime);
  INIT_UART();                                               //init buad rate 4800
  //INIT VCHCEK/TELEPHONCHECK INTERRPUT;

  /*
  /////////////////////////////init timer_a for DISPLAY LED///////////////////////////////////////
  //taclk=32.768/8=4.096    CCR0=20000   5s happen onec interrupt   //                          //
  TACTL = TASSEL0+TACLR;                                            //TACLK=16.384   CLEAR TAR  //
  CCTL0 = CCIE;                                                     //                          //
  CCR0 = 0X5000;                                                    //LOAD TAR FOR TA0 INTERRUPT//
  ////////////////////////////////////////////////////////////////////////////////////////////////
  */




  _EINT();                                                   //Enable interrupts
  IE1 |= WDTIE;                                              //OPEN WDT INITERRUPT
  SETMODEM();                                                //WHEN POWER IS ON SET MODEM WORK STATE
  /////////////////////////////////////SET WDT////////////////////////////////////////////////////
  ////
  ////////////////////////////////////////////////////////////////////////////////////////////////
  //WDTCTL = WDT_ARST_1000;
  clearwdtcounter=10;
  systemflg=0x40;                                            //MODPOWON;
  TACTL |= MC0;                                              //START TA  set modem of WITH 0-->CCR0-->0

  /////////////////////////////////////MAIN LOOP//////////////////////////////////////////////////
  for(;;)
  {
    if( (systemflg & 0X02) )                                 //if power is low volt
        {

        }

    //_BIS_SR(LPM3_bits);
    CLRWDT();
    _NOP();
    if(systemflg & 0x20)                                      // if set 1 have ring signal
        {
            CLRWDT();
            MODPOWON;
            TACTL &= (~0X0030);                               //STOP TA0
            LED_ON;
            DELAY_ms(100);
            LED_OFF;
            CLRWDT();
            DELAY_ms(60);
            LED_ON;
            DELAY_ms(100);
            CLRWDT();
            LED_OFF;
            DELAY_ms(60);
            CLRWDT();
            LED_ON;
            DELAY_ms(100);
            CLRWDT();
            LED_OFF;                                          //LED ON 3
            RECTIME();                                        //RECORD TELEPHONE IN TIME
            CLRWDT();
            while( systemflg & 0x40 )
                 {
                   CLRWDT();
                   if( systemflg & 0x80 )
                        {
                          ANALYZE_CMD();
                        }
                   CLRWDT();
                   systemtime[1] = ReadByteDs(0x83);
                   if( systemtime[1] == timer_min )          //after 5min close modem power
                        {
                          systemflg &= ( ~0x40 );
                          ALLOFF;
                          MODPOWOFF;                         //CLOSE MODEM POWER;
                          timer_min = 0xff;                  //set no_work number
                          CLRWDT();
                        }
                 }
            systemflg |= 0x40;
            P2IE |= 0X01;                                     //ENIBLE INTERRUPT FOR P2.0 TELECHEACK
	    systemflg &= (~0x20);
            CLRWDT();
            TACTL |= 0X0030;                                  //RESTART TAO
        }
    if(systemflg & 0x10)                                      //read meter service
        {
            CLRWDT();
            //_DINT();
            TACTL &= (~0X0030);                               //STOP TA0
            P2IE  &= (~0X01);                                 //disable telephone check
            //system power on
            MODPOWON;
            CLRWDT();
            DELAY_ms(500);
            //TAKETELE();
            CTL_READ_METER();
            CLRWDT();
            ALLOFF;
            MODPOWOFF;
            TACTL |= 0X0030;                                  //RESTART TAO
            P2IE  |= 0X01;                                    //enable telephone check
            systemflg &= (~0x10);                             //set bit4 0 means meterday is go away
            //_EINT();
            CLRWDT();
        }
   }
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////auto read meter function
////
////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CTL_READ_METER(void)
{
  signed char tempe2counter;
  CLRWDT();
  READ_E2PROM(&addr_counter,E2_ADDR_COUNTER,1);
  CLRWDT();
  tempe2counter = addr_counter-1;
  do
  {
    CLRWDT();
    READ_E2PROM(&(rxtxdatabuf[2]),0x37+tempe2counter*4,0x04);
    CLRWDT();
    tempe2counter--;
    rxtxdatabuf[0]  = 0x68;
    rxtxdatabuf[1]  = 0x81;
    rxtxdatabuf[6]  = 0x29;
    rxtxdatabuf[7]  = 0x03;
    rxtxdatabuf[8]  = 0x90;
    rxtxdatabuf[9]  = 0x2f;
    CLRWDT();
    rxtxdatabuf[10] = 0x01;
    rxtxdatabuf[11] = ACCOUNT_CHKSUM(11);
    rxtxdatabuf[12] = 0x16;
    CLRWDT();
    UART_T (fe,3);
    UART_T (rxtxdatabuf,13);
    //DELAY_ms(400);
    //if(systemflg & 0x08)
      //{
        DELAY_ms(LYRMTIME);   //delay 2.5 min
        CLRWDT();
        DELAY_ms(LYRMTIME);   //delay 2.5 min
        CLRWDT();
        //systemflg &= (~0x08);
      //}
  }
  while(tempe2counter>=0);
  CLRWDT();
}

/////////////////////////////////////////////////////
///P2.2 SET INPUT INTERRUPT FOR TELEPHONE CHECK    //
///THIS FUNCTION IS INIT PORT P2.2                 //
///                                                //
///                                                //
/////////////////////////////////////////////////////
void INIT_P20(void)   //SET P2.0 INITERRPT ENABLE
{
  P2OUT  &= (~0X01);
  P2DIR  &= (~0X01);
  P2IES  |=   0X01;
  P2IE   |=   0X01;
}


void INIT_UART(void)
{
  UCTL0  &= (~SWRST);
  UCTL0  |= CHAR;                                            //8-bit character N 1
  UTCTL0 |= SSEL0;                                           //BAUDRATE FROM ACLK
  UBR00   = 0x06;                                            //uart set 4800
  UBR10   = 0x0;
  U0MCTL  = 0x6f;
  ME2    |= UTXE0 + URXE0;                                   //Enabled USART0 TXD/RXD
  IE2    |= URXIE0 + UTXIE0;                                 //Enabled USART0 RX interrupt
}

/////////////////////////////////////////////////////
////UART0 RECEIVE INTERRUPT                       ///
////                                              ///
////                                              ///
////                                              ///
/////////////////////////////////////////////////////
#pragma vector=UART0RX_VECTOR
__interrupt void uartorx (void)
{
  CLRWDT();
  rxtxdatabuf[rxdatapoint] = RXBUF0;
  switch(dataarea)
  {

      case 0:   if(rxtxdatabuf[rxdatapoint] == 0xfe)                           //receive 0xef
                    {
                      dataarea = dataarea + 1;
                      rxdatapoint = 0;
                    }
                else
                    {
                      if(rxtxdatabuf[rxdatapoint] == 0x4e )                     //receive 'N'
                            dataarea = 12;
                      else
                          {
                            dataarea = 0;
                            rxdatapoint = 0;
                          }
                    }
                break;
                // modem string
      case 1:   if(rxtxdatabuf[rxdatapoint] == 0x68)                           //receive startbyte in fraem
                    {
                      dataarea = dataarea + 1;
                      rxtxchksum = 0x68;
                      rxdatapoint ++;
                    }
                else
                    {
                      dataarea = 0;
                      rxdatapoint = 0;
                    }
                break;

      case 2:   if(rxtxdatabuf[rxdatapoint] == 0x82)//receive mater type byte

⌨️ 快捷键说明

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