📄 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 + -