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; } }