一.硬件方案
本设计介绍了基于单片机的智能手表定位系统的设计与实现,控制系统采用STM32核心芯片,外围电路含有液晶显示器LCD1602,GPS,GSM电路,按键和LED灯电路组成,通过LCD模块能够将实时时间以及定位经纬度显示出来。系统可以通过GSM模块直接发送定位信息到指定的手机用户上。
主要由STM32单片机+LCD1602液晶显示电路+GPS模块+GSM模块+按键电路+LED灯电路+电源电路组成;如图:
二.设计功能
(1)液晶1602显示时钟,带日期,且可以显示经纬度信息,两个信息通过一个按键切换显示。
(2)通过GPS定位,获取当前的经纬度信息(可以通过浏览器查看具体位置)。
(3)通过电位器可以调节液晶屏的清晰度。
(4)具有手电筒功能,通过另外一个按键,按下,灯亮,再次按下,灯灭。
(5)通过第3个按键来发送经纬度信息给指定手机,按下后,开始发短信;
(6)短信处理过程有指示灯显示;
(7)接受短信的手机号码可以主动获取经纬度信息,发送"GET"给设备手机号,设备会回复信息给发送者.
三.设计原理图
(1)原理图主要采用AD软件进行设计,如图:
四.软件设计
(1)程序流程图
(2)主程序源码
- 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)
- {
- key_scan();
- 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;//读取短信过程中
- }
- }
-
- }
- }
- </i></i></i>
复制代码
|