📄 wqxqz.c
字号:
//////////////////////////////////////////////////////////////////////////////
// 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 + -