?? gsm.c
字號:
#include "c8051f020.h" // SFR declarations
#define UINT unsigned int
#define UCHAR unsigned char
#define STARTCODE 0xfb
#define ENDCODE 0xf7
#define TI1 (SCON1 & 0x02)
#define RI1 (SCON1 & 0x01)
//sms
unsigned char xdata rec[80]; //0923
unsigned char code GSMCommand0[3] = "AT\r";
unsigned char code GSMCommand1[7] = "AT+CSQ\r";
unsigned char code GSMCommand2[10] = "AT+CMGF=0\r";
unsigned char code GSMCommand3[12] = "AT+CMGS=027\r";
unsigned char code GSMhead[12]="0011000D9168";
//unsigned char xdata PHONE_number[12]="3186634579f0";
//unsigned char xdata PHONE_number[12] _at_ 0x1010;//="3196415615F0";
unsigned char xdata PHONE_number[8][256][13]_at_ 0x1010;//="3196638946f4";
//unsigned char xdata PHONE_number[12]="3186117183f2";
unsigned char code GSM_set[6]="000801";
//unsigned char code GSM_sms[10]="044F60597D"; //短消息內容:你好
unsigned char code GSM_sms[26]="0C62115DF27ECF52308FBE3002"; //短消息內容:我已經到達。
//sms
xdata UCHAR TxBuf1[256]; //
xdata UCHAR RxBuf1[256];
xdata UCHAR timer0_counter; // Delay counter.
sbit STATE=P1^0; //終端狀態標志(1-單機,0-聯機)
sbit led1=P1^3; //
sbit led2=P1^4; // (1-亮,0-滅)
sbit led3=P1^5; //
sbit bell=P1^6; //喇叭(0-響,1-不響)
sbit IGT=P1^1;
sbit PD=P1^7;
//函數原型聲明
//---------------------初始化-----------------------------------------------
void Mpu_ini(void); //單片機初始化
void Baudrate_Init(void); //串口初始化
//---------------------串口中斷控制-----------------------------------------
void Serial0_Inter_Close(void); //關串口0中斷
void Serial0_Inter_Open(void); //開串口0中斷
void Serial1_Inter_Close(void); //關串口1中斷
void Serial1_Inter_Open(void); //開串口1中斷
void Inter_Enable(void); //開總中斷
//---------------------識別模塊控制-------------------------------------
void set_compair_state(void); //進入比對狀態 08H/32H
void set_inner_compare_mode(); //設置XX模塊內部比對方式 05H
void set_work_mode(void); //設置為登陸工作方式 08H/31H
void send_to_module1(UCHAR commandcode,UCHAR lenth); //通過串口1發送數據(to module or PC)
void process_command_from_1(); //處理命令
//void Serial1(void) interrupt 20——串口中斷1——分別與 識別模塊(STATE=1單機)、計算機(STATE=0聯機)通訊
//---------------------手記號數據庫處理-------------------------------------
void clear_database(void); //清空所有手機號存在標志
void rec_success_for_PC(void); //告訴PC接受數據成功,可以發下一個了 13H/32H
void rec_err_for_PC(void); //告訴PC接受數據失敗,重發所有 13H/33H
//---------------------標志控制---------------------------------------------
void led1_open();
void led1_close();
void led2_open();
void led2_close();
void led3_open();
void led3_close();
void laba_close();
void laba_ring_1_time();
void laba_ring_3_times();
void Delay10ms(void); //延時10ms
void Delay_1S(void); //延時1s
void start_timer0(void);
void close_timer0(void);
//void time0(void) interrupt 1
void deal_with_error(void);
//-----------------------sms--------------------------------------------------
void start_GSM(void); //啟動并檢測GSM模塊
void start_tc35(void);
void AT_SEND(void);
void Signal_test(void);
void AT_cmgf(void);
void AT_cmgs(void);
void power_down(void);
//void SEND_sms(void);
void SEND_sms(UCHAR FID);
//**************main函數開始************
void main (void)
{
UINT idata i,j,k;
unsigned int idata address;
UCHAR idata temp;
Delay10ms();
Mpu_ini();
led1_close();
led2_close();
led3_close();
laba_close();
/*
PHONE_number[0][50][0]=0xff;
PHONE_number[0][50][1]='3';
PHONE_number[0][50][2]='1';
PHONE_number[0][50][3]='9';
PHONE_number[0][50][4]='6';
PHONE_number[0][50][5]='3';
PHONE_number[0][50][6]='3';
PHONE_number[0][50][7]='1';
PHONE_number[0][50][8]='9';
PHONE_number[0][50][9]='6';
PHONE_number[0][50][10]='2';
PHONE_number[0][50][11]='f';
PHONE_number[0][50][12]='7';//xzd
PHONE_number[0][49][0]=0xff;//0x31;
PHONE_number[0][49][1]='3';//0x33;
PHONE_number[0][49][2]='1';//0x31;
PHONE_number[0][49][3]='1';//0x32;
PHONE_number[0][49][4]='8';//0x35;
PHONE_number[0][49][5]='0';//0x35;
PHONE_number[0][49][6]='0';//0x30;
PHONE_number[0][49][7]='7';//0x38;
PHONE_number[0][49][8]='9';//0x38;
PHONE_number[0][49][9]='5';//0x35;
PHONE_number[0][49][10]='7';//0x31;
PHONE_number[0][49][11]='F';//70;
PHONE_number[0][49][12]='5';//0x34;miao
*/
/*
if(STATE==0) //聯機狀態
{
Delay_1S();
if(STATE==0)
{
led1_open();
while(1);
while(1);
while(1);
}
}
*/ //單機狀態
Inter_Enable();
Baudrate_Init(); // init the serial port
Serial1_Inter_Close();
start_GSM();
set_compair_state();
set_inner_compare_mode();
Serial1_Inter_Open();
// Inter_Enable();
while(1);
}
//-------------------------------------------------------------------------
//--------------------------------------------------------------------------
// 初始化程序模塊
void Baudrate_Init(void)
{
T2CON = 0x30; //Set Timer2 as Baudrate Generator of UART0
RCAP2H = 0xff; //Set Reload High Byte
// RCAP2L = 0xfb; //Set Reload Low Byte
RCAP2L = 0xc4;
SCON0 = 0x50; //Set UART0 Mode 1 (1 Start Bit ,8 Data Bit ,1 Stop Bit) and Enable Receive
T4CON = 0x30; //Use SysClk
RCAP4H = 0xff; //Set Timer4 Mode 2 (Auto Reload Byte)
RCAP4L = 0xc4; //Set Reload High Byte 115200bps
SCON1 = 0x50; //Set UART1 Mode 1 (1 Start Bit ,8 Data Bit ,1 Stop Bit) and Enable Receive
//**********************
EIE2 &= 0xfb; //Disable Timer4 Interrupt
ET2 = 0; //Disable Timer2 Interrupt
T4CON |= 0x04; //Start Timer4
TR2 = 1; //Start Timer2
}
//******************************************
//單片機初始化串口0串口1
//=================================
void Mpu_ini(void)
{
unsigned char idata delay;
OSCXCN = 0x67; // Enable external crystal
WDTCN = 0xDE; // disable watchdog timer
WDTCN = 0xAD;
EMI0CF = 0x07; // Set External Memory Configuration Register,使用片內 4K 和片外存儲器 低端口,地址數據復用
XBR0 = 0x0c; // Set UART0,CEX0,CEX1,
XBR1 = 0x00; // Set /INT0,/INT1
XBR2 = 0x46; // Set UART1,Enable XBAR,Enable EMFILE
P0MDOUT = 0xe5; // Output configuration for P0
P1MDOUT = 0xfE; // Output configuration for P1
P2MDOUT = 0xfc; // Output configuration for P2
P3MDOUT = 0xff; // Output configuration for P3
// P1MDIN |= 0x01;
P0 |= 0x1a; // Enable RX0
// Enable RX1
P1 |= 0x3b; // Enable RX2
// for(i=0;i<1000;i++)
{
delay=256; // Delay >1 ms before polling XTLVLD.
while(delay--);
}
while (!(OSCXCN & 0x80)); // Wait until external crystal has // started.
OSCICN = 0x0C; // Switch to external oscillator
OSCICN = 0x88; // Disable internal oscillator; enable
// missing clock detector.
while (!(OSCXCN & 0x80)); // Wait until external crystal has // started.
OSCICN = 0x08; // Switch to external oscillator
}
//=================================
//***********check_udp end*************
//==========================
//========================
void Serial0_Inter_Close()
{ ES0=0; }
void Serial0_Inter_Open()
{ ES0=1; }
void Serial1_Inter_Close(void)
{ EIE2 &= 0xbf; }
void Serial1_Inter_Open(void)
{ EIE2 |= 0x4f; }
//========================
//開中斷程序開始
void Inter_Enable()
{
EA=1;
}
//*********************************
void set_compair_state(void) //進入比對狀態 08H
{
UCHAR data lenth,commandcode;
commandcode =0x08;
lenth=1; //數據長度
TxBuf1[0]=0x32;
send_to_module1(commandcode,lenth);
}
void set_inner_compare_mode(void) //設置 模塊內部比對方式 05H
{
UCHAR data lenth,commandcode;
commandcode =0x05;
lenth=1; //數據長度
TxBuf1[0]=0x31;
send_to_module1(commandcode,lenth);
}
void set_work_mode(void) //設置 模塊內部比對方式 08H
{
UCHAR data lenth,commandcode;
commandcode =0x08;
lenth=1; //數據長度
TxBuf1[0]=0x31;
send_to_module1(commandcode,lenth);
}
void send_to_module1(UCHAR commandcode,UCHAR lenth) //通過串口1發送數據(to module or PC)
{
UCHAR data i;
Serial1_Inter_Close();
SCON1 &= 0xFD; //清發送標志
SBUF1 = STARTCODE; //發送起始位
while(TI1==0);
SCON1 &= 0xFD; //清發送標志
SBUF1 = lenth+5; //發送長度字節
while(TI1==0);
SCON1 &= 0xFD; //清發送標志
SBUF1 = 0x00; //發送保留字
while(TI1==0);
SCON1 &= 0xFD; //清發送標志
SBUF1 = commandcode; //發送命令碼
while(TI1==0);
SCON1 &= 0xFD; //清發送標志
for(i=0;i<lenth;i++)
{
SBUF1 = TxBuf1[i]; //發送數據
while(TI1==0);
SCON1 &= 0xFD; //清發送標志
}
SBUF1 = ENDCODE; //發送結束位
while(TI1==0);
SCON1 &= 0xFD; //清發送標志
Serial1_Inter_Open();
}
void process_command_from_1(void)
{
UCHAR data FIDH,FIDL,i;
i=RxBuf1[3];
switch(RxBuf1[3]){
case 0x01:
if(RxBuf1[5]==0x32) //比對成功
{
FIDH=0; //256枚 情況下
FIDL = RxBuf1[6]; //FID
i=PHONE_number[FIDH][FIDL][0];
if(PHONE_number[FIDH][FIDL][0]!=0x00) //對應手機號存在
{
led2_open();
laba_ring_1_time();
//添加查詢發送短信息命令
{
AT_cmgs();
SEND_sms(FIDL);
}
Delay_1S();
led2_close();
}
else
{
led3_open();
laba_ring_3_times();
Delay_1S();
led3_close();
}
}
if(RxBuf1[5]==0x33) //比對失敗
{
led3_open();
laba_ring_3_times();
Delay_1S();
led3_close();
}
break;
case 0x02:
case 0x03:
case 0x04:
case 0x0b:
case 0x0c:
case 0x0d:
case 0x10:
clear_database();
led2_open();
led3_close();
rec_success_for_PC();
break;
case 0x11:
FIDH = RxBuf1[4];
FIDL = RxBuf1[5];
PHONE_number[FIDH][FIDL][0] = 0xff; //表明該FID已存在
for(i=1;i<=12;i++)
PHONE_number[FIDH][FIDL][i] = RxBuf1[i+5]; //存儲手記號
rec_success_for_PC();
break;
case 0x12:
led2_close();
led3_open();
laba_ring_1_time();
rec_success_for_PC();
break;
}
}
void Serial1(void) interrupt 20
{
UCHAR data i;
Serial1_Inter_Close();
if(TI1)
{
SCON1 &= 0xFD; //清發送標志
}
if(RI1)
{
RxBuf1[0]=SBUF1;
SCON1 &= 0xFE; //清接收標志
if(RxBuf1[0]==STARTCODE) //判斷起始位是否正確
{
while(RI1==0);
RxBuf1[1]=SBUF1;
SCON1 &= 0xFE; //清接收標志
if(RxBuf1[1]>=5) //判斷數據長度是否正確
{
for(i=2;i<RxBuf1[1];i++) //接收余下的所有數據
{
while(RI1==0);
RxBuf1[i]=SBUF1;
SCON1 &= 0xFE; //清接收標志
}
if(RxBuf1[i-1]==ENDCODE) //判斷結束位是否正確
{
process_command_from_1();
}
}
}
SCON1 &= 0xFE; //清接收標志
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -