www.pudn.com > gsm1.zip > gsm1.c


#include                     /* special function register 8052       */ 
#include                  /* RTX-51 tiny functions & defines      */ 
 
	#define frequency	200000//20M=200000 
	#define const_t1	2500 
	#define dtmf_data P1 & 0x0f; 
	sbit	dtmf_rdy P3^5 
#define  OLEN  16                     /* size of serial transmission buffer   */ 
unsigned char  ostart;                /* transmission buffer start index      */ 
unsigned char  oend;                  /* transmission buffer end index        */ 
idata    char  outbuf[OLEN];          /* storage for transmission buffer      */ 
 
#define  ILEN  16                     /* size of serial receiving buffer      */ 
unsigned char  istart;                /* receiving buffer start index         */ 
unsigned char  iend;                  /* receiving buffer end index           */ 
idata    char  inbuf[ILEN];           /* storage for receiving buffer         */ 
 
#define   CTRL_Q  0x11                /* Control+Q character code             */ 
#define   CTRL_S  0x13                /* Control+S character code             */ 
 
#define   start=0x1 
#define   net_not_reg=0x1 
#define   net_regging=0x2 
#define   net_regged=0x3 
#define   net_reg_fail=0x4 
#define   call_start=0x5 
bit   code_h 
bit   code_c; 
bit   code_cp; 
bit   code_cpi; 
bit   code_cpin; 
bit   code_cpin_s; 
bit   code_cpin_si; 
bit   code_cpin_sim; 
bit   code_cpin_sim_p; 
bit   code_cpin_sim_pi; 
bit   code_cpin_sim_pin; 
bit   code_cr; 
bit   code_cre; 
bit   code_creg; 
bit   code_creg_1; 
bit   code_cm 
bit   code_cme 
bit   code_cme_e 
bit   code_cme_er 
bit   code_cme_err 
bit   code_cme_erro 
bit   code_cme_error 
bit   code_cme_error 
 
bit   cpin_ready 
bit   cpin_sim_pin; 
bit   creg_1; 
bit   cme_error 
bit   off_hook 
 
bit   s_at_cpinz 
bit   s_at_cpinx 
bit   s_at_cregz 
bit   s_at_wtone 
bit   s_atd 
void initialize(void) 
{ 
	IE= 
	TMOD=0x01; 
	TH0=(0x10000-const_t1*frequency/120000)/256;	//0xee; 
	TL0=(0x10000-const_t1*frequency/120000)&255;//0x13; 
	TR0=1; 
} 
void main(void) 
{ 
initialize(); 
serial_init(); 
while(1){ 
	dtmf_rcv(); 
	state_deal(); 
	} 
} 
void state_deal() 
{ 
    switch (user_state)  { 
    	case net_not_reg: 
    	start_trans=1; 
    	send_state=start; 
    	s_at_cpinz=1; 
    	user_state=net_regging; 
    	break; 
 
    	case net_regging: 
    	if(cpin_ready) { 
    	cpin_ready=0; 
    	s_at_cregz=1; 
    	start_trans=1; 
    	send_state=start; 
    	} 
    	if(cpin_sim_pin) { 
    	cpin_sim_pin=0; 
    	s_at_cpinx=1; 
    	start_trans=1; 
    	send_state=start; 
    	} 
    	if(creg_1) { 
    	creg_1=0; 
    	user_state=net_regged; 
    	} 
    	if(cme_error) { 
    	cme_error=0; 
    	user_state=net_reg_fail; 
    	} 
    	break; 
 
    	case net_regged: 
    	if(off_hook) { 
    	off_hook=0; 
    	s_at_wtone=1; 
    	start_trans=1; 
    	send_state=start; 
    	user_state=call_start; 
    	} 
    	break; 
 
    	} 
} 
void dtmf_rcv() 
{ 
if(dtmf_rdy) {dtmf_buf=dtmf_data; 
} 
void int_timer0 (void) interrupt	1 using 1 
{ 
	TH0=(0x10000-const_t1*frequency/120000)/256;	//0xee; 
	TL0+=(0x10000-const_t1*frequency/120000)&255;//0x13; 
} 
/******************************************************************************/ 
/*       serial_init: initialize serial interface                             */ 
/******************************************************************************/ 
void serial_init (void)  { 
  SCON  = 0x50;                      /* mode 1: 8-bit UART, enable receiver   */ 
  TMOD |= 0x20;                      /* timer 1 mode 2: 8-Bit reload          */ 
  TH1   = 0xf3;                      /* reload value 9600 baud                */ 
  TR1   = 1;                         /* timer 1 run                           */ 
  ES    = 1;                         /* enable serial port interrupt          */ 
} 
/******************************************************************************/ 
/*       serial:  serial receiver / transmitter interrupt                     */ 
/******************************************************************************/ 
serial () interrupt 4 using 2  {     /* use registerbank 2 for interrupt      */ 
  unsigned char c; 
  bit   start_trans = 0; 
 
  if (RI)  {                         /* if receiver interrupt                 */ 
    c = SBUF;                        /* read character                        */ 
    RI = 0;                          /* clear interrupt request flag          */ 
    switch (c)  {                    /* process character                     */ 
    	case 0xd: 
	if (code_cpin_sim_pin) {code_cpin_sim_pin = 0;cpin_sim_pin = 1;} 
	if (code_creg_1) {code_creg_1 = 0;creg_1 = 1;} 
	if (code_cme_error) {code_cme_error = 0;cme_error = 1;} 
	if (code_cpin_ready) {code_cpin_ready = 0;cpin_ready = 1;} 
        break; 
 
    	case 0x1: 
	if (code_creg) {code_creg = 0;code_creg_1 = 1;} 
        break; 
 
	case '+': 
        code_h = 1; 
        code_c = 0; 
        break; 
 
	case 'A': 
	if (code_cpinre) {code_cpinre = 0;code_cpinrea = 1;} 
        break; 
 
	case 'C': 
	if (code_h) {code_h = 0;code_c = 1;} 
        break; 
 
	case 'D': 
	if (code_cpinrea) {code_cpinrea = 0;code_cpinread = 1;} 
        break; 
 
	case 'E': 
	if (code_cr) {code_cr = 0;code_cre = 1;} 
	if (code_cpinr) {code_cpinr = 0;code_cpinre = 1;} 
	if (code_cm) {code_cm = 0;code_cme = 1;} 
	if (code_cme) {code_cme = 0;code_cme_e = 1;} 
        break; 
 
	case 'G': 
	if (code_cre) {code_cre = 0;code_creg = 1;} 
        break; 
 
	case 'I': 
	if (code_cp) {code_cp = 0;code_cpi = 1;} 
	if (code_cpin_s) {code_cpin_s = 0;code_cpin_si = 1;} 
	if (code_cpin_sim_p) {code_cpin_sim_p = 0;code_cpin_sim_pi = 1;} 
        break; 
 
	case 'M': 
	if (code_c) {code_c = 0;code_cm = 1;} 
	if (code_cpin_si) {code_cpin_si = 0;code_cpin_sim = 1;} 
        break; 
 
	case 'N': 
	if (code_cpi) {code_cpi = 0;code_cpin = 1;} 
	if (code_cpin_sim_pi) {code_cpin_sim_pi = 0;code_cpin_sim_pin = 1;} 
        break; 
 
	case 'O': 
	if (code_cme_err) {code_cme_err = 0;code_cme_erro = 1;} 
        break; 
 
	case 'P': 
	if (code_c) {code_c = 0;code_cp = 1;} 
	if (code_cpin_sim) {code_cpin_sim = 0;code_cpin_sim_p = 1;} 
        break; 
 
	case 'R': 
	if (code_c) {code_c = 0;code_cr = 1;} 
	if (code_cpin) {code_cpin = 0;code_cpinr = 1;} 
	if (code_cme_e) {code_cme_e = 0;code_cme_er = 1;} 
	if (code_cme_er) {code_cme_er = 0;code_cme_err = 1;} 
	if (code_cme_erro) {code_cme_erro = 0;code_cme_error = 1;} 
        break; 
 
	case 'S': 
	if (code_cpin) {code_cpin = 0;code_cpin_s = 1;} 
        break; 
 
	case 'Y': 
	if (code_cpinread) {code_cpinread = 0;code_cpin_ready = 1;} 
        break; 
 
	default:                       /* read all other characters into inbuf  */ 
        code_h = 0; 
        code_c = 0; 
        break; 
	} 
  } 
 
  if (TI || start_trans)  {          /* if transmitter interrupt              */ 
    TI = 0;                          /* clear interrupt request flag          */ 
    switch (send_state)  { 
    	case start: 
    	SBUF = 'A'; 
    	send_state=send_a; 
    	break; 
 
    	case send_a: 
    	SBUF = 'T'; 
    	send_state=send_at; 
    	break; 
 
    	case send_at: 
    	if (s_atd) { 
    	SBUF = 'd'; 
    	send_state=send_atd; } 
    	else { 
    	SBUF = '+'; 
    	send_state=send_at_;} 
    	break; 
 
    	case send_at_: 
    	SBUF = 'C'; 
    	send_state=send_at_c; 
    	break; 
 
    	case send_at_c: 
	if (s_at_cpinz | s_at_cpinx) { 
    	SBUF = 'P'; 
    	send_state=send_at_cp;} 
	if (s_at_cregz) { 
    	SBUF = 'R'; 
    	send_state=send_at_cr;} 
    	break; 
 
    	case send_at_cr: 
    	SBUF = 'E'; 
    	send_state=send_at_cre; 
    	break; 
 
    	case send_at_cre: 
    	SBUF = 'G'; 
    	send_state=send_at_creg; 
    	break; 
 
    	case send_at_creg: 
    	SBUF = '?'; 
    	send_state=send_at_complate;} 
    	break; 
 
    	case send_at_cp: 
    	SBUF = 'I'; 
    	send_state=send_at_cpi; 
    	break; 
 
    	case send_at_cpi: 
    	SBUF = 'N'; 
    	send_state=send_at_cpin; 
    	break; 
 
    	case send_at_cpin: 
	if (s_at_cpinz) { 
    	SBUF = '?'; 
    	send_state=send_at_complate; } 
	if (s_at_cpinx) { 
    	SBUF = '='; 
    	send_state=send_at_cpin_; } 
    	break; 
 
    	case send_at_cpin_: 
    	SBUF = '8'; 
    	send_state=send_at_cpin_8; 
    	break; 
 
    	case send_at_cpin_8: 
    	SBUF = '2'; 
    	send_state=send_at_cpin_82; 
    	break; 
 
    	case send_at_cpin_82: 
    	SBUF = '7'; 
    	send_state=send_at_cpin_827; 
    	break; 
 
    	case send_at_cpin_827: 
    	SBUF = '6'; 
    	send_state=send_at_complate; 
    	break; 
 
    	case send_atd: 
    	if (send_buf1_lenth==0) send_state=send_atd1; 
    	else { 
    	send_buf1_lenth--; 
    	SBUF = send_buf1+send_buf1_lenth;} 
    	break; 
 
    	case send_atd1: 
    	if (send_buf1_lenth==0) send_state=send_atd1; 
    	else { 
    	send_buf1_lenth--; 
    	SBUF = send_buf1+send_buf1_lenth;} 
    	break; 
 
    	case send_at_complate: 
    	SBUF = 0xd; 
    	send_state=send_at_complate1; 
    	break; 
 
    	case send_at_complate1: 
    	SBUF = 0xa; 
    	send_state=send_at_complate2; 
    	start_trans=0; 
    	break; 
	} 
}