你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】基于STM32单片机智能手表GSM短信上报GPS定位设计

[复制链接]
STMCU小助手 发布时间:2022-5-11 13:45
一.硬件方案/ ^, |2 s* F& ?2 O; O
本设计介绍了基于单片机的智能手表定位系统的设计与实现,控制系统采用STM32核心芯片,外围电路含有液晶显示器LCD1602,GPS,GSM电路,按键和LED灯电路组成,通过LCD模块能够将实时时间以及定位经纬度显示出来。系统可以通过GSM模块直接发送定位信息到指定的手机用户上。& G( p8 D1 ?7 b" T/ q% H
主要由STM32单片机+LCD1602液晶显示电路+GPS模块+GSM模块+按键电路+LED灯电路+电源电路组成;如图:
( `0 p+ w# F* w  A% I% n6 h. H# v# Q' k/ ?4 S7 \; r! g" c3 T0 j
8]M2S1TVKXSO3[T1F34{Z[T.png
/ k. k1 u9 X% I8 M7 I& R# d; l! b, Y6 H( M3 |5 O' k8 L
二.设计功能
1 I% W. Y, E9 z7 X2 B' U  B(1)液晶1602显示时钟,带日期,且可以显示经纬度信息,两个信息通过一个按键切换显示。6 I8 A' S* x3 _- f
(2)通过GPS定位,获取当前的经纬度信息(可以通过浏览器查看具体位置)。
5 a4 D% v; V7 [# U" V; q8 G(3)通过电位器可以调节液晶屏的清晰度。' }8 D- M' u, g) F, x$ E
(4)具有手电筒功能,通过另外一个按键,按下,灯亮,再次按下,灯灭。1 N! K" s0 C  ^! ~3 Q5 H- F
(5)通过第3个按键来发送经纬度信息给指定手机,按下后,开始发短信;
( K2 p  h7 [6 q6 m' H7 G(6)短信处理过程有指示灯显示;! [% D% U2 P1 r" Q
(7)接受短信的手机号码可以主动获取经纬度信息,发送"GET"给设备手机号,设备会回复信息给发送者.0 r8 D. u7 ^' F/ `7 p$ O6 V

# d! M  z* `1 z. [8 I! p7 e  E$ K三.设计原理图
& K9 ^" |! [4 y(1)原理图主要采用AD软件进行设计,如图:
1 L  G5 Y/ r: l4 a. I
( A+ w: C1 }& v9 ~/ Y5 `# l ~RJR[M4YCW}D`J5)VSNZ)}Y.png
4 \/ v9 d( C( [& N$ }7 s( Y& F9 P# I$ @# Y$ R7 N" H. W) {3 \7 d
四.软件设计
/ H$ q3 q# S, O(1)程序流程图! Z0 _3 z1 e* o' J
9 d& m( A9 w: g5 q
3TMGYVF[Z{_FIG`ETNX[N{V.png
8 c& A0 |, v( U) L
4 Z/ l& j, ~# S& k3 B6 u2 g1 U5 [(2)主程序源码/ O. ^3 t$ b. A/ S& k! B) U5 `

+ ~+ _+ r- k/ f9 g3 ~7 A
  1. int main(void)
    " {4 t2 I! y( R! ]  \* t! G" l8 V
  2. {         " a, ~; k  V1 `$ h6 \4 q
  3.         unsigned char i ;         
    2 c; N6 b6 Y+ @4 h  ?' O1 j; ?
  4.         delay_init();                     //延时函数初始化          7 A9 Q* f0 K3 [4 [+ Q6 I
  5.         uart_init(115200);                 //串口初始化为115200# O4 u1 x; W0 t$ x
  6.         uart2_init(9600)        ;1 S* U3 Z: _0 d  k1 Y, q+ E
  7.          
    ! t% f' Q. x2 p% h
  8.   TIM3_Int_Init(499,7199);//50ms           
    & E) d+ {5 P% p+ w8 K/ @
  9.         , c9 q( Q, T5 _: p( u
  10.         LED_Init();                                  //初始化与LED连接的硬件接口         
    3 \$ @/ t+ G& P3 Q
  11.         KEY_Init();" q8 _2 f  m6 m" X: X7 q  [
  12.          
    2 @% r2 U' t$ w( m
  13.         led_gsm =0 ; ligh =1;//上电初始化$ j8 \; s! C! }8 c5 ]
  14.         Lcd_GPIO_init();  //初始化lcd 接口
    ) f: J+ ?: u* ^4 Y2 o$ N, G% H& m# j
  15.         Lcd_Init();                 //初始化函数
    & S- Z2 k' k9 [8 N
  16.         delay_ms(200);
    - Y0 ~) B3 L- y. O4 G) n$ s/ A5 F
  17.         ligh =0;//关闭led8 H; |, t- V; h5 M
  18.         Lcd_Puts(0,0,(u8 *)Lin0_No);//显示                                
    7 z7 n, K! n3 P0 |* ?0 n
  19.         Lcd_Puts(0,1,(u8 *)Lin1_Ea);//显示
    ( o3 c; e1 O6 _( c* x2 J8 [, N( ~9 G
  20.          ; Z" {  W  a. Y# I0 Q
  21.         i=60;
    0 @  b  I& t* r2 |6 o
  22.         while(i--) delay_ms(100);//延时8 ]. h# L/ N' d1 C8 j- l2 Q
  23. 9 u! |7 {3 Z, y
  24.         UART_SendStr(USART1 ,"AT+CMGF=1\r\n",11); //设置字符集0 t8 z( e  ]3 l0 {
  25.         i=7;& m1 L/ g) l1 p7 O
  26.         while(i--) delay_ms(100);//延时
    4 }  K  u' z, \  \& g" E
  27.         UART_SendStr(USART1 ,"AT+CSCS="GSM"\r\n",15);//设置文本1 P$ w4 V: K+ L- |, l6 j% W
  28.         i=7;
    ( [7 `. p- L. ^# y4 _0 J
  29.         while(i--) delay_ms(100);//延时
    / Z4 k* ^5 M( b+ n, p' T" \

  30. - d2 X5 O" `) ]! B; d5 W3 G* f. G( r
  31.         UART_SendStr(USART1 , "AT+CMGDA="DEL ALL"\r\n",20); //删除所有短信' S" y: b9 a: B) T8 ~) c8 X4 A
  32.         for(i=0;i<5;i++)
    ) L& n* `) l. @& [( z- R: \
  33.         delay_ms(100);          //延时有助于稳定
    ; b2 t1 M/ H' a, T) V
  34.         
    / V" V* T, k- Z7 z
  35.   led_gsm = 1;
    : r5 P# y2 _) C
  36.         while(1)- O4 {1 o: J5 h+ \$ ~0 \
  37.         {        
    6 Y2 I, p" @2 u; ~" Z) d
  38.                 key_scan();        / k+ `3 f8 A  p! @; H, y0 e
  39.                 if(disFlag ==1)        //定时更新显示2 c! ~+ }+ z& I
  40.                 {, V( D! a5 j) T8 J# P* q
  41.                         disFlag =0;3 c$ z0 p' P6 ^5 p
  42.             if(sysmode_GPS==1)                //gps有效
    0 }  d) T7 ~0 g! s* [& b! w# {
  43.       {
    7 O4 A2 r3 y, Q: l
  44. //        sysmode_GPS=0;        
    " W7 l; y( w9 r: r- u! N
  45.                                 dealGps();
      j3 C- C- N- M2 K6 H$ K
  46.                                 if(disNum==0)
    1 l! m* b1 a  P# o5 }2 ]3 Q$ {* q( G
  47.                                 {
    ) Z) U& N1 N+ [1 ]' |3 i6 t
  48.                                         Lcd_Puts(0,0,(u8 *)Lin0_No);//显示                                / b1 e- K/ ~1 Z5 I3 c" L- _
  49.                                         Lcd_Puts(0,1,(u8 *)Lin1_Ea);//显示                                
    - W& ^- D: P; S0 ]3 @
  50.                                 }  i% p  T$ s" G9 _
  51.                                 else
    5 j9 V! \5 T# A! b# Z4 y
  52.                                 {
    " Z& `# V1 U9 @  ^1 l+ U1 B2 I
  53.                                         Lcd_Puts(0,0,(u8 *)dis0);//显示                                
    4 w& t  f: }( `6 ?# t
  54.                                         Lcd_Puts(0,1,(u8 *)dis1);//显示                                                        , B, I5 s3 Z* Q) D! `+ y
  55.                                 }        
    6 q! q7 O# N( ]: l( @
  56.                         }                                        & v/ I2 \* u/ {" o% K. r
  57.                 }  r' V  g( V3 p* L3 t/ i
  58.                 1 ?5 ~$ s# B' c1 E4 P# Q
  59.     if(key_m==0)        //发送按键按下
    ; |  @' U$ e, B/ E, U$ f$ U
  60.     {& H$ X# M5 W4 S
  61.                         delay_ms(10);, B; @: R& B9 p
  62.                         if(key_m==0)        % Q) [" y0 O( n2 S: d
  63.                         {                        
    6 y& Q+ X% n: o$ ]0 h1 h. T' Y
  64.                                 led_gsm =  0; " ]- g, h! r! S  h: F/ ?* J$ `8 ^
  65.                                 UART_SendStr(USART1 ,"AT+CMGF=1\r\n",11); //设置字符集* w; B) ~2 k1 Z3 V$ T0 E
  66.                                 i=3;
    8 S# b# r) g: t- v" K$ O
  67.                                 while(i--) delay_ms(100);//延时
    4 P7 X2 A/ w: |* {
  68.                                 UART_SendStr(USART1 ,"AT+CSCS="GSM"\r\n",15);//设置文本
    9 p6 Z! t  A5 x% Y1 f* c$ R
  69.                                 i=3;
    5 ]: S: S! F9 s- x0 D: k
  70.                                 while(i--) delay_ms(100);//延时/ A, G6 [/ n8 `5 Q+ z

  71.   R& @" {$ H1 U
  72.                                 UART_SendStr(USART1 ,"AT+CMGS="+8618105140357"\r\n",26); //测试号码                                          H& j9 d. {2 m% T* I
  73. //                  UART_SendStr(USART1 ,"AT+CMGS="+8615296556420"\r\n",26); //发送短信号码
    % h) d8 D6 x/ F# P2 d2 z6 i% M
  74.                                 6 L7 F7 J) x4 \+ T
  75.                                 i=3;( f. z3 C* y8 D
  76.                                 while(i--) delay_ms(100);//延时
    2 \8 j9 K+ R& f( i* j
  77.                                 if(sysmode_GPS==1)                //gps有效2 W. l3 i4 s- C" O( l, v  j
  78.                                 {
    1 \; \, G" i) J
  79.                                         sysmode_GPS=0;                        
    " H/ Y+ x1 x1 d" s# d8 P
  80.                                         dealGps();
    # I2 e8 L3 k3 d1 S; M6 g7 c( r
  81.                                         UART_SendStr(USART1 ,Lin0_No,12); //发送纬度
    5 m$ W# q# W/ X' ~* h" |5 H9 E* V
  82.                                         UART_SendStr(USART1 ,Lin1_Ea,12); //发送经度( ^7 P& ^( s0 N( x! B2 B% S5 r
  83.                                 }
    5 d0 X( @% R* U' w3 q" S: n
  84.                                 else
    : O/ ?( `: K4 e( ?, L+ V
  85.                                 {, P. M2 A7 r, x# ]  B
  86.                                         UART_SendStr(USART1 ,"gps linking...",14); //gps无信号/ D( J1 o) |. W
  87.                                 }, {: Y& H) f) ~$ a7 w0 l% e
  88.                                 delay_ms(200);
    ; `: ?( m# v) m+ c% y) K; j) V( _
  89.                                 UART_SendStr(USART1 ,( char *)Crtl_Z, 1);        //发送+ e* J6 h, [5 ^- n
  90.                                 i=30;5 i- C8 L  {0 B; M
  91.                                 while(i--) delay_ms(100);//延时发送
    1 G+ }1 O. f1 _5 ~5 A
  92.                                 led_gsm = 1;6 D! z4 w; @5 u$ L
  93.                         }# a. q* ^5 C+ L; C+ x. |
  94.                 }
    6 ]0 T& L: j. s
  95.                 5 D  H8 I  \5 U* D
  96.                 if(readFlag==1)    //读取短信息标志
    ) I# J* i# R  z' B1 E1 @
  97.           {            
    ' G# {, ?; T  X  {
  98.                         readFlag=0;         //读取标志清零8 U0 E* u7 f$ h
  99.                         readMesIng = 1;//读取短信过程中
    ! V4 B, [, B; ~0 z. k
  100.                         timeCount++ ;
    4 I0 O4 c4 X- H
  101.                         if((stepNum == 0)&&(timeCount>=4))        //定时读取短信% T8 b3 x/ q. x0 p4 Y: J
  102.                         {                                        + l: F: `+ l* p/ g
  103.                                 UART_SendStr(USART1 , "AT+CMGF=1\r\n",11);   //设置字符集2 `5 L0 n  E" H& p! F
  104.                                 timeCount = 0;//延时设置量        ' j2 |7 u& a; c) k5 _8 m
  105.                                 stepNum++;//进入操作过程1
    0 o/ B2 H+ b# D7 t* E
  106.                         }                        2 Q( e, u# _+ l. a/ i8 p& U6 g7 m9 Z
  107.                         else if((stepNum == 1)&&(timeCount>=4))        //定时读取短信
    1 i5 @- G) _% c3 _0 L' S
  108.                         {' x# t: }* a9 k6 i5 u, T
  109.                                 for(i=0;i<SIZEBUF;i++)
    8 C4 P1 ~6 @  e, Z9 w0 f0 \# T! p
  110.                                 {
    . d1 S, }8 ^# R: r
  111.                                         timebuf<i>='0';   //清空timebuf
    * I+ w( H2 s% V; u) k& |
  112.                                 }                                       
    0 y1 i: l- c1 v7 V+ `" x
  113.                                 UART_SendStr(USART1 ,"AT+CMGR=1\r\n",11);        
    1 O& P$ j1 S7 Y/ C3 _9 M4 ^
  114.                                 timeCount = 0;//延时设置量        
    6 M$ [7 L* j: d, x
  115.                                 stepNum++;//进入操作过程1* C+ {+ y2 b( C5 g3 _0 K, r: W
  116.                         }
    % b9 N( A7 Y" Z7 U
  117.                         else if((stepNum == 2)&&(timeCount >= 4))        //定时读取短信
    2 y. m/ R9 b5 ?$ Z; Q
  118.                         {        8 I7 Q2 [  r% _- }" z
  119.                                 rebackMesFlag=INIT;        
    0 m: G" a* p# n! ^* M6 S
  120.                                 for(i=0;i<(SIZEBUF-3);i++)5 j/ G' `2 H- @7 [, \/ K. s+ C
  121.                                 {
    6 l3 h2 E' W# C/ h
  122.                                         if((timebuf<i>=='G')&&(timebuf[i+1]=='E')&&(timebuf[i+2]=='T'))        //查询是否接收到GET
    + _2 i$ F9 j' p& z( q, g  B: c. S
  123.                                         {
    2 y: F/ U- [/ ^; ?( {
  124.                                                 rebackMesFlag=OPEN_01;        //状态标识打开
    - {8 y( j6 f: Q0 O; E$ _8 O9 T
  125.                                                 break ;8 [# ]$ e/ z" c: F" p. `( S9 u' C0 K
  126.                                         }
    & r4 Y/ @& S6 B1 h. j! J) n# ~8 I
  127.                                         if((timebuf<i>=='+')&&(timebuf[i+1]=='8')&&(timebuf[i+2]=='6'))//查询短信息中的号码: e1 j% f. s9 Z4 Y' C/ n5 B
  128.                                         {
    : \6 X$ v: T, [4 x5 L7 X
  129.                                                 led_gsm = 0;
    ' [- R. B; m" |  w4 l
  130.                                                 rebackMesFlag = SOMEONE; //有人发送短信 9 f) G+ ]% P( l+ Z5 M; F  ~) s! W4 k( `
  131.                                                 AT_CMGS[9]=timebuf[i+0]; //提取号码8 v( s) @& p" b( ^! W3 t9 v
  132.                                                 AT_CMGS[10]=timebuf[i+1];
    / y7 j# p0 G3 u- \) e
  133.                                                 AT_CMGS[11]=timebuf[i+2];( e0 \2 o  w6 T' z2 y. G2 x* {. c
  134.                                                 AT_CMGS[12]=timebuf[i+3];
    9 i9 i$ ?5 @! c0 X
  135.                                                 AT_CMGS[13]=timebuf[i+4];
    6 D3 ~$ L+ d; ?
  136.                                                 AT_CMGS[14]=timebuf[i+5];% q- L- X( t+ B" f: p9 S" R, ~
  137.                                                 AT_CMGS[15]=timebuf[i+6];
    " g& L) Y+ y5 o- t7 \5 m# X
  138.                                                 AT_CMGS[16]=timebuf[i+7];
    6 y4 N( {, X; I0 w9 g
  139.                                                 AT_CMGS[17]=timebuf[i+8];
    $ z9 ?( w3 m# s1 l
  140.                                                 AT_CMGS[18]=timebuf[i+9];* W" N- p: V+ j! W' b
  141.                                                 AT_CMGS[19]=timebuf[i+10];% m' M; N2 j. o/ _
  142.                                                 AT_CMGS[20]=timebuf[i+11];         + F. C6 b- a. t) j8 u3 g
  143.                                                 AT_CMGS[21]=timebuf[i+12];
    4 Z7 A7 n8 W4 ]; z( l, Z- t
  144.                                                 AT_CMGS[22]=timebuf[i+13];
    2 F3 S1 v2 P$ o1 H
  145.                                         }
    " B  ]# O" f% U& j- m3 x
  146.                                 }# p( d6 Q: l: {% b, z
  147.                                 AT_CMGS[23]='"';         //整理字符串 ' ]) w; A! O: b, T" a5 d
  148.                                 AT_CMGS[24]=0x0d;
    3 j, H' ?9 K* r
  149.                                 AT_CMGS[25]=0x0a;
    8 [2 S9 z3 O' k8 i8 _9 G
  150.         6 k+ ?5 U: S2 V7 O# D
  151.                                 if(rebackMesFlag != INIT); P8 y5 p7 q1 b" m
  152.                                 {                6 O: F! n5 k3 X: D; B) Y
  153.                                         UART_SendStr(USART1 ,"AT+CMGDA="DEL ALL"\r\n",20);//删除所有短信                                                                                                                        
    . I; Y! p3 I3 O6 x1 d5 K+ s
  154.                                         for(i=0;i<5;i++)' \+ T: P1 O# p: ~) ?
  155.                                         delay_ms(100);          //延时有助于稳定
    ; T9 L4 G) |6 I- j
  156.                                                         
    " C" X" x1 u" _  h7 }- L
  157.                                         UART_SendStr(USART1 ,"AT+CMGF=1\r\n",11);   //设置字符集- ?! `9 V2 u, b5 W- ^0 r
  158.                                         for(i=0;i<3;i++)
    " k! _6 ]# R3 r. x1 ?
  159.                                         delay_ms(100);          //延时有助于稳定# @( C! D5 b3 L7 H
  160.                                 
    % v$ G8 `/ E/ j* p/ h+ Z( V8 C
  161.                                         UART_SendStr(USART1 ,"AT+CSCS="GSM"\r\n",15); //设置干什么、$ |; r: e7 l/ |! U) r
  162.                                         for(i=0;i<3;i++)
    ! S" w1 P9 S" l- j  k5 ?, ?
  163.                                         delay_ms(100);          //延时有助于稳定
    ) R# d  }  X+ U2 v! E2 o  y3 D
  164.                                                                
    + e% X" Q" s- M/ a9 c$ l
  165.                                    UART_SendStr(USART1 , ( char *)AT_CMGS,26);//准备发送短信3 i/ @" M# K& b- B
  166.                                         for(i=0;i<2;i++)
    0 F8 `! l) D& q% r( Y2 @% y" v# T
  167.                                         delay_ms(100);          //延时有助于稳定
    ' ]0 b: d+ @) E: g1 N8 Q- P
  168.         
    ! \0 ~2 i4 ~+ }1 q' w- c
  169.                                         if(rebackMesFlag==OPEN_01)
      n9 ~' c/ Z7 F, s% T
  170.                                         {
    7 ~4 f3 c2 g8 ^
  171.                                                 UART_SendStr(USART1 ,Lin0_No,12); //发送纬度
    3 d" A2 s2 O5 e) ~0 A
  172.                                                 UART_SendStr(USART1 ,Lin1_Ea,12); //发送经度                                                                                       
    , d2 `1 W* Z7 k5 M0 r$ i: z; A0 m
  173.                                         }
    ( j, S7 i9 f( q6 c( U% n& @- o
  174.                                         else
    . @: r$ C3 d  v1 q
  175.                                         {
    5 [4 |/ l. m3 _9 C3 l" r) W
  176.                                                 UART_SendStr(USART1 ,"CMD_ERR",7); //发送短信息命令错误
    * k# X, }+ \# n, y* v& ~5 c& h& I
  177.                                         }
    9 d$ H5 N. w& I( u$ b( s# D1 A
  178.                                         delay_ms(100);  1 ]! {5 \# ]2 V- Y# K2 z
  179.                             UART_SendStr(USART1 ,(char *)Crtl_Z, 1);        //发送0 u6 o8 v7 R: C: l/ h1 e# u$ N
  180.                                         for(i=0;i<20;i++)  n, {( E  h' D* y. D
  181.                                         delay_ms(100);          //延时有助于稳定        3 Q# o. d  ?4 W! s# S
  182.                                 }1 h' N+ S! J9 C
  183.                                 timeCount = 0;//延时设置量        
    ( q+ K$ t* s) u- F! y- p
  184.                                 stepNum++        ;//进入操作过程1
    5 j1 f( h8 r; {0 b4 E: }+ Q
  185.                         }
    6 }2 l. D3 K' g  r
  186.                         else if((stepNum == 3)&&(timeCount >= 4))        //定时读取短信: T; L- _: B7 ^0 _' u
  187.                         {
    5 \" F2 D/ \0 o, n5 L1 e9 F
  188.                                 clearMesFlag++;
    2 }  J* c0 ?! h# D) M6 M' i
  189.                                 if(clearMesFlag>10)4 i, V9 ?- F2 W# _  H
  190.                                 {
    + i9 q6 Z) X5 K( W
  191.                                   clearMesFlag = 0;
    & W8 W2 h) s8 u# T( }
  192.                                         UART_SendStr(USART1 ,"AT+CMGDA="DEL ALL"\r\n",20);//删除所有短信
    1 y" O6 J$ u- n, x
  193.                                 }
    5 B( m# L& G. |. \
  194.                                 timeCount = 0;//延时设置量        
    6 `! u$ k$ p$ l, r9 _2 [4 m3 F, W
  195.                                 stepNum = 0        ;//进入操作过程1                                                        
    % n; Q7 ^6 f, K3 W( W
  196.                                 led_gsm=1;          //关闭指示灯/ l( o) f- K1 t; X4 m! i
  197.                                 readMesIng = 0;//读取短信过程中
    6 u* s' A: h4 P, ?7 E0 I$ I
  198.                         }                                                                                    
    2 d& T% X3 ^: \8 T+ \( i1 I2 {
  199.                  }5 Z% |3 C: u, I3 M9 ~
  200.                                        
    0 R! o4 l+ v2 L; A
  201.         }                                                                                            6 `3 \/ B( T5 |. J8 N& I
  202. }
    : y+ S6 }0 s: L( t, E: O
  203. </i></i></i>
复制代码
4 B$ w: o$ O) K" b
赞 收藏 评论0 发布时间:2022-5-11 13:45

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版