⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gsm.c

📁 59564377SMS_Mcu_Program.rar
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -