基于STM32的GPS定位GSM短信上报系统

本文介绍了使用STM32单片机配合GPS和GSM模块,实现GPS定位、LCD显示经纬度、按键控制LED灯和短信发送功能的嵌入式设计。通过Keil5编程并利用Protues进行仿真。设计详细到原理图、程序代码和功能实现过程。
摘要由CSDN通过智能技术生成

目录

具体实现功能

设计介绍

51单片机简介

设计思路

设计内容

原理图(AD19)

程序(Keil5)

仿真实现(protues8.7)

全部资料


具体实现功能

本设计由STM32单片机+LCD1602液晶显示电路+GPS模块+GSM模块+按键电路+LED灯电路+电源电路组成。

1、液晶1602显示时钟,带日期,且可以显示经纬度信息,两个信息通过一个按键切换显示。

2、通过GPS定位,获取当前的经纬度信息。

3、通过电位器可以调节液晶屏的清晰度。

4、具有手电筒功能,通过另外一个按键,按下,灯亮,再次按下,灯灭。

5、通过第3个按键来发送经纬度信息给指定手机,按下后,开始发短信。

6、短信处理过程有指示灯显示。

7、接受短信的手机号码可以主动获取经纬度信息,发送"GET"给设备手机号,设备会回复信息给发送者。

设计介绍

51单片机简介

51单片是一种低功耗、高性能CMOS-8位微控制器,具有8K可编程Flash存储器,使得其为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

51系列单片机具有以下标准功能:

8k字节Flash,512字节RAM,

32位I/O口线,看门狗定时器,

内置4KB EEPROM,

MAX810复位电路,

三个16位定时器/计数器,

一个6向量2级中断结构,

全双工串行口。

另外, 51系列在空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机停止工作,直到下一个中断或硬件复位为止。本设计所使用的芯片可兼容以下所有的51系列单片机(包括AT系列和STC系列)。

设计思路

文献研究法:搜集整理相关研究资料,阅读文献,为研究做准备;

调查研究法:通过调查、分析、具体实验等方法,发现相关存在问题和解决办法;

比较分析法:比较不同设计的具体原理,以及同一类传感器性能的区别,分析系统的研究现状与发展前景;

软硬件设计法:通过软硬件设计实现硬件,最后测试各项功能是否满足要求。

设计内容

原理图(AD19)

本系统原理图设计采用Altium Designer19,具体如图。

程序(Keil5)

本设计利用KEIL5软件实现程序设计,主函数如下:

int main(void)
 { 	
	unsigned char i ;	 
	delay_init();	    	 //延时函数初始化	  
	uart_init(115200);	 	//串口初始化为115200
	uart2_init(9600)	;
	 
  TIM3_Int_Init(499,7199);//50ms  	 
	
	LED_Init();		  		//初始化与LED连接的硬件接口 	 
	KEY_Init();
	 
	led_gsm =0 ; ligh =1;//上电初始化
	Lcd_GPIO_init();  //初始化lcd 接口
	Lcd_Init();		 //初始化函数
	delay_ms(200);
	ligh =0;//关闭led
	Lcd_Puts(0,0,(u8 *)Lin0_No);//显示				
	Lcd_Puts(0,1,(u8 *)Lin1_Ea);//显示
	 
	i=60;
	while(i--) delay_ms(100);//延时

	UART_SendStr(USART1 ,"AT+CMGF=1\r\n",11); //设置字符集
	i=7;
	while(i--) delay_ms(100);//延时
	UART_SendStr(USART1 ,"AT+CSCS=\"GSM\"\r\n",15);//设置文本
	i=7;
	while(i--) delay_ms(100);//延时

	UART_SendStr(USART1 , "AT+CMGDA=\"DEL ALL\"\r\n",20); //删除所有短信
	for(i=0;i<5;i++)
	delay_ms(100);          //延时有助于稳定
	
  led_gsm = 1;
	while(1)
	{	
		if((key_c==0)||(key_l==0))//按键按下
		{
			if(rekey == 0)
			{
				delay_ms(10);
				if((key_c==0)||(key_l==0))//确认按键
				{
						if(key_c==0)		//按键显示切换
						{
							rekey =1;
							if(disNum==0){disNum=1;}
							else {disNum=0;}
						}
						else if(key_l==0)		//led灯开关处理
						{ligh=!ligh;rekey=1;}					
				}
			}		
		}
		else
		{rekey =0;}
		
		if(disFlag ==1)	//定时更新显示
		{
			disFlag =0;
	    if(sysmode_GPS==1)		//gps有效
      {
//        sysmode_GPS=0;	
				dealGps();
				if(disNum==0)
				{
					Lcd_Puts(0,0,(u8 *)Lin0_No);//显示				
					Lcd_Puts(0,1,(u8 *)Lin1_Ea);//显示				
				}
				else
				{
					Lcd_Puts(0,0,(u8 *)dis0);//显示				
					Lcd_Puts(0,1,(u8 *)dis1);//显示							
				}	
			}					
		}
		
    if(key_m==0)	//发送按键按下
    {
			delay_ms(10);
			if(key_m==0)	
			{			
				led_gsm =  0; 
				UART_SendStr(USART1 ,"AT+CMGF=1\r\n",11); //设置字符集
				i=3;
				while(i--) delay_ms(100);//延时
				UART_SendStr(USART1 ,"AT+CSCS=\"GSM\"\r\n",15);//设置文本
				i=3;
				while(i--) delay_ms(100);//延时

				UART_SendStr(USART1 ,"AT+CMGS=\"+8618105140357\"\r\n",26); //测试号码        				
//		  UART_SendStr(USART1 ,"AT+CMGS=\"+8615296556420\"\r\n",26); //发送短信号码
				
				i=3;
				while(i--) delay_ms(100);//延时
				if(sysmode_GPS==1)		//gps有效
				{
					sysmode_GPS=0;			
					dealGps();
					UART_SendStr(USART1 ,Lin0_No,12); //发送纬度
					UART_SendStr(USART1 ,Lin1_Ea,12); //发送经度
				}
				else
				{
					UART_SendStr(USART1 ,"gps linking...",14); //gps无信号
				}
				delay_ms(200);
				UART_SendStr(USART1 ,( char *)Crtl_Z, 1);        //发送
				i=30;
				while(i--) delay_ms(100);//延时发送
				led_gsm = 1;
			}
		}
		
		if(readFlag==1)    //读取短信息标志
	  {	     
			readFlag=0;	 //读取标志清零
			readMesIng = 1;//读取短信过程中
			timeCount++ ;
			if((stepNum == 0)&&(timeCount>=4))	//定时读取短信
			{					
				UART_SendStr(USART1 , "AT+CMGF=1\r\n",11);   //设置字符集
				timeCount = 0;//延时设置量	
				stepNum++;//进入操作过程1
			}			
			else if((stepNum == 1)&&(timeCount>=4))	//定时读取短信
			{
				for(i=0;i<SIZEBUF;i++)
				{
					timebuf[i]='0';   //清空timebuf
				}					
				UART_SendStr(USART1 ,"AT+CMGR=1\r\n",11);	
				timeCount = 0;//延时设置量	
				stepNum++;//进入操作过程1
			}
			else if((stepNum == 2)&&(timeCount >= 4))	//定时读取短信
			{	
				rebackMesFlag=INIT;	
				for(i=0;i<(SIZEBUF-3);i++)
				{
					if((timebuf[i]=='G')&&(timebuf[i+1]=='E')&&(timebuf[i+2]=='T'))	//查询是否接收到GET
					{
						rebackMesFlag=OPEN_01;	//状态标识打开
						break ;
					}
					if((timebuf[i]=='+')&&(timebuf[i+1]=='8')&&(timebuf[i+2]=='6'))//查询短信息中的号码
					{
						led_gsm = 0;
						rebackMesFlag = SOMEONE; //有人发送短信 
						AT_CMGS[9]=timebuf[i+0]; //提取号码
						AT_CMGS[10]=timebuf[i+1];
						AT_CMGS[11]=timebuf[i+2];
						AT_CMGS[12]=timebuf[i+3];
						AT_CMGS[13]=timebuf[i+4];
						AT_CMGS[14]=timebuf[i+5];
						AT_CMGS[15]=timebuf[i+6];
						AT_CMGS[16]=timebuf[i+7];
						AT_CMGS[17]=timebuf[i+8];
						AT_CMGS[18]=timebuf[i+9];
						AT_CMGS[19]=timebuf[i+10];
						AT_CMGS[20]=timebuf[i+11];         
						AT_CMGS[21]=timebuf[i+12];
						AT_CMGS[22]=timebuf[i+13];
					}
				}
				AT_CMGS[23]='"';	 //整理字符串 
				AT_CMGS[24]=0x0d;
				AT_CMGS[25]=0x0a;
	
				if(rebackMesFlag != INIT)
				{		
					UART_SendStr(USART1 ,"AT+CMGDA=\"DEL ALL\"\r\n",20);//删除所有短信															
					for(i=0;i<5;i++)
					delay_ms(100);          //延时有助于稳定
							
					UART_SendStr(USART1 ,"AT+CMGF=1\r\n",11);   //设置字符集
					for(i=0;i<3;i++)
					delay_ms(100);          //延时有助于稳定
				
					UART_SendStr(USART1 ,"AT+CSCS=\"GSM\"\r\n",15); //设置干什么、
					for(i=0;i<3;i++)
					delay_ms(100);          //延时有助于稳定
								
			   	UART_SendStr(USART1 , ( char *)AT_CMGS,26);//准备发送短信
					for(i=0;i<2;i++)
					delay_ms(100);          //延时有助于稳定 
	
					if(rebackMesFlag==OPEN_01)
					{
						UART_SendStr(USART1 ,Lin0_No,12); //发送纬度
						UART_SendStr(USART1 ,Lin1_Ea,12); //发送经度											
					}
					else
					{
						UART_SendStr(USART1 ,"CMD_ERR",7); //发送短信息命令错误
					}
					delay_ms(100);  
			    UART_SendStr(USART1 ,(char *)Crtl_Z, 1);        //发送
					for(i=0;i<20;i++)
					delay_ms(100);          //延时有助于稳定	
				}
				timeCount = 0;//延时设置量	
				stepNum++	;//进入操作过程1
			}
			else if((stepNum == 3)&&(timeCount >= 4))	//定时读取短信
			{
				clearMesFlag++;
				if(clearMesFlag>10)
				{
				  clearMesFlag = 0;
					UART_SendStr(USART1 ,"AT+CMGDA=\"DEL ALL\"\r\n",20);//删除所有短信
				}
				timeCount = 0;//延时设置量	
				stepNum = 0	;//进入操作过程1							
				led_gsm=1;	  //关闭指示灯
				readMesIng = 0;//读取短信过程中
			}								 		   
		 }
					
	}											    
}

代码运行截图:

全部资料

全部资料包括程序(KEIL5)、AD原理图(AD19)、参考论文(仅供参考)、开题报告、任务书、实物图、讲解视频、软硬件设计框图等,具体如图,全网最全!!

资料获取:
https://docs.qq.com/doc/DSWNKa3FEUkZUVXVB

  • 19
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值