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

📄 参赛最终版.c

📁 本文针对目前利用GSM进行无线数据通信的需要
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<AT89X52.H>
#include <string.h>
#include <intrins.h>
typedef unsigned char    INT8U;                		//无符号8位数 
#define OFF 1
#define ON  0
#define OK  1

/**************************************************************************
*                               与GSM模块相关的定义
*                              (Read and writ GSM)
**************************************************************************/			
//工作指示灯
sbit led1=P2^0;						//
sbit led2=P2^3;						//    (0-亮,1-灭)
sbit led3=P2^2;						//
sbit led4=P2^4;
sbit Test=P1^0;  
sbit Test1=P1^1;
sbit Test2=P1^2;
sbit Test3=P1^3;               	
sbit flag = P3^7;
/***********************************GSM指令定义**************************/
INT8U code Command_AtE[4] 	= "ATE\r";					//Send AT
INT8U code Command_IPR[12] 	= "AT+IPR=9600\r";	//Set baud rate
INT8U code Command_Csq[7] 	= "AT+CSQ\r";           //Signal quality test
INT8U code Command_Creg[9] 	= "AT+CREG?\r";
INT8U code Command_Cmgf[10] = "AT+CMGF=0\r";	//发送短信模式选择
INT8U Command_Cmgs1[12]		= "AT+CMGS=031\r";	//030是指去掉短信中心号码,和紧接其后的00后
INT8U Command_Cpbr[10]		= "AT+CPBR=1\r";	//查前3个电话号码INT8U code GSMhead[8]		= "0011000D";             //短信中心号码默认为00		
INT8U code GSM_set[6]		= "000801";
INT8U code GSM_sms1[30]		= "0E4E3B63A7533A67098B6660C53002";		   // 短信内容:主控区有警情。"104f60597dff0c53d190016210529fff01"
INT8U code GSM_sms2[34]		= "104E0053F79632533A67098B6660C53002";    // 短信内容:一号防区有警情。
INT8U code GSM_sms3[34]		= "104E8C53F79632533A67098B6660C53002";    // 短信内容:二号防区有警情。
INT8U code GSM_sms4[34]		= "104E0953F79632533A67098B6660C53002";    // 短信内容:三号警情有警情。
INT8U code GSM_sms5[34]		= "1056DB53F79632533A67098B6660C53002";    // 短信内容:四号防区有警情。
INT8U code GSM_sms6[30]		= "0E9632533A67095E7262706E903002";    	   // 短信内容:防区有干扰源。
INT8U code GSM_sms7[34]		= "104E0053F74E3B533A67098B6660C53002";    // 短信内容:一号主区有警情。
INT8U code ATD_number[7]	= "ATD>1;\r";
//短消息内容:你好,发送成功。
//===================================函数声明===========================
void Serial_Inter_Open(void);
void Serial_Inter_Close(void);
void Inter_Enable(void);
//void Inter_Disable(void);
bit  Test_Set_GSM(void);
void Uart_send(INT8U data_buffer[], INT8U data_len);
void ATE_Send(void);
void AT_Creg(void);
void Signal_test(void) ;
void AT_CPBR(INT8U Command_CPBR[],INT8U Cpbr_len);
void AT_cmgs(INT8U Cmgs_sbuffer[],INT8U Cmgs_len);
void Send_sms(INT8U GSM_sms_buffer[],INT8U Send_sms_len);
void led1_open(void);
void led1_close(void);
void led2_open(void);
void led2_close(void);
void led3_open(void);
void led3_close(void);
void Delay1ms(INT8U t);
void Delay1s(void);
void Baudrate_Init();
void deal_with_error(void);
void Number_change();
void AT_sms_test(void);
void AT_test1(void);
void ATD();
//===================================变量声明===========================
INT8U rec[30];
INT8U ok_flag;			//初始化成功标志位
INT8U User_number1[11];	//电话号码存储单元
INT8U User_number[16];	//编辑过的电话号码存储单元
INT8U temp;				//读取P3口变量
INT8U zhqu;				//主区报警
INT8U zhqu1;			//一号主控区报警
INT8U f1;				//辅助区一
INT8U f2;				//辅助区二
INT8U f3;				//辅助区三
INT8U f4;				//辅助区四
INT8U wf;				//违法操作
//===================================主函数===========================
void main(void)
{
	INT8U t,i;
  	Inter_Enable();	             				//总中断开启 
	Baudrate_Init();							//串口初始化
	Serial_Inter_Open();								
	for(t = 0;t < 4;t++)						//延时一段时间等待GSM模块启动完毕
	{
		Delay1ms(800);
		led1_open();
		Delay1ms(800);
		led1_close();
	}
	while(1)
	{	
		temp=0;
		if(Test == 0)               		       //测试调试用,调试或首次启动把该引脚接地
		{
		 	Delay1ms(200);
			if(Test == 0)
			ok_flag=Test_Set_GSM();
			zhqu=1;
		}
		if(Test1 == 0)               		       //测试调试用,调试或首次启动把该引脚接地
		{
		 	Delay1ms(200);
			if(Test1 == 0)
			ok_flag=Test_Set_GSM();
			zhqu1=1;
		}
		if( flag == 0)
		{
			Delay1ms(10);
			if( flag == 0)	
			{
				temp=P3&0x78;
				for(i=0;i<30;i++)
				{	
					if(flag == 1)
					{
						break;
					}
					else Delay1ms(100);
				}
				if(i==30)
				{
					ok_flag=Test_Set_GSM();
					temp=0xff;
		 			wf=1;//违法
				}
			}
		}
		if(temp== 0x20)
		{  
			ok_flag=Test_Set_GSM();
			f1=1;
		}
		if(temp == 0x40)
		{ 
	 		ok_flag=Test_Set_GSM();
			f2=1;
		}
		if(temp == 0x08)
		{ 
	 		ok_flag=Test_Set_GSM();
			f3=1;
		}
		if(temp == 0x10)
		{  	
	 		ok_flag=Test_Set_GSM();
			f4=1;

		}
		if(ok_flag)
		{	
			ok_flag=0;
			for(i=1;i<3;i++)
			{	
				led2_open();
				Command_Cpbr[8]=i+0x30;			 
				AT_CPBR(Command_Cpbr,10);
				Number_change();			
				if(zhqu == 1)
				{	
					Command_Cmgs1[9]=0x32;
					Command_Cmgs1[10]=0x39;
					AT_cmgs(Command_Cmgs1,12);
					Send_sms(GSM_sms1,30);
				}
				if(f1 == 1)
				{	
					AT_cmgs(Command_Cmgs1,12);
					Send_sms(GSM_sms2,34);
				}
				if(zhqu1 == 1)
				{	
					AT_cmgs(Command_Cmgs1,12);
					Send_sms(GSM_sms7,34);
				}
				if(f2 == 1)
				{	
					AT_cmgs(Command_Cmgs1,12);
					Send_sms(GSM_sms3,34);
				}
				if(f3 == 1)
				{	
					AT_cmgs(Command_Cmgs1,12);
					Send_sms(GSM_sms4,34);
				}
				if(f4 == 1)
				{	
					AT_cmgs(Command_Cmgs1,12);
					Send_sms(GSM_sms5,34);
				}
				if(wf == 1)
				{	
					Command_Cmgs1[9]=0x32;
					Command_Cmgs1[10]=0x39;
					AT_cmgs(Command_Cmgs1,12);
					Send_sms(GSM_sms6,30);
					AT_sms_test();
					if(i==2)
					{	
						while(!flag);
					}
				}
				if(wf != 1)
				{
					AT_sms_test();
				
				}
				led2_close();
				Delay1ms(1000);
			}
			if(zhqu ==1 )
			{	
				led1=0;
				led2=0;
				led3=0;
				led4=0;
				ATD();
				Delay1ms(1000);
				led1=1;
				led2=1;
				led3=1;
				led4=1;
			}
			zhqu=0;
			f1=0;
			f2=0;
			f3=0;
			f4=0;
			wf=0;
		}
	 }
	 								
}
/******************************************************************************** 函数名称: 
start_GSM
** 功能描述:  启动gsm模块,并进行初始设置 
** 输 入:   无
** 输 出:   无
** 全局变量: 无
** 调用模块: 无
******************************************************************************/
bit Test_Set_GSM(void)
{
	led3_close();
	ATE_Send();                         // Send command   AT
	led3_open();
	Delay1ms(100);
	led3_close();
	Delay1ms(1000);

	Signal_test();						  // Test signal quality
	led3_open();
	Delay1ms(100);
    	led3_close();
	Delay1ms(1000);		

	AT_Creg();           //查询GSM 注册情况
	led3_open();
	Delay1ms(100);
	led3_close();
	Delay1ms(1000);

	return OK;
}
/******************************************************************************** 函数名称: 
** 功能描述: Interrupts Open and Close    
** 输 入:   无
** 输 出:   无
** 全局变量: 无
** 调用模块: 无
******************************************************************************/
void Serial_Inter_Close(void)
{ 
	ES=0;
}
void Serial_Inter_Open(void)
{ 
	ES=1;
} 
void Inter_Enable(void)
{
	EA=1;
}/*
void Inter_Disable(void)
{
	EA=0;
}  */
/******************************************************************************** 
Baudrate_Init
** 功能描述: 串口初始化,波特率设置  9600,n,8,1,外部晶振18.432MHz 
** 输 入:   无
** 输 出:   无
** 全局变量: 无
** 调用模块: 无
******************************************************************************/
void Baudrate_Init(void)
{
	TMOD |= 0x20;		// T1使用工作方式2
	TH1 = 0xFD;			// 设置T1初值
	TL1 = 0xFD;
	SCON = 0x50;		// 工作方式1,波特率9600bit/s,允许接收
	TR1 = 1;			// T1开始计数
	ET1 =0;   			//定时器1中断关
}
/******************************************************************************** 函数名称: 
AT_Send
** 功能描述: 发送AT联机命令,通信正常返回'ok'
** 输 入:   
** 输 出:   无
** 全局变量: 无
** 调用模块: Start_timer2,Uart_send,Close_timer2, deal_with_error
******************************************************************************/
void  ATE_Send(void)               
{
	INT8U i, error_counter;
	error_counter = 0;
	Serial_Inter_Close();
	while(1)
	{      
		TI = 0;
	 	RI = 0;
		for(i = 0; i < 6; i++)
			rec[i] = 0x00;
       	Uart_send(Command_AtE,4);
		for(i = 0; i < 6; i++)
		{ 			
			while(!RI);
			rec[i] = SBUF;
			RI = 0;
		
		}
		if(rec[2] == 'O'&&rec[3] == 'K') 			//返回ok说明通信成
			break;
		else if(error_counter++<5)                  //否则延时重发
			Delay1ms(1000);
		else
			deal_with_error();
	}
	Serial_Inter_Open();
	Delay1ms(1000);
    	RI = 0;
}
/******************************************************************************** 函数名称: 
ATD
** 功能描述: 发送AT联机命令,通信正常返回'ok'
** 输 入:   
** 输 出:   无
** 全局变量: 无
** 调用模块: Start_timer2,Uart_send,Close_timer2, deal_with_error
******************************************************************************/
void ATD()             
{
	INT8U  i,error_counter;
	error_counter = 0;
	Serial_Inter_Close();
	while(1)
	{      
		TI = 0;
	 	RI = 0;
		for(i = 0; i < 14; i++)
			rec[i] = 0x00;
       	Uart_send(ATD_number,7);
		led1=0;
		for(i = 0; i < 14; i++)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -