一.硬件方案/ ^, |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
/ 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
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
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- int main(void)
" {4 t2 I! y( R! ] \* t! G" l8 V - { " a, ~; k V1 `$ h6 \4 q
- unsigned char i ;
2 c; N6 b6 Y+ @4 h ?' O1 j; ? - delay_init(); //延时函数初始化 7 A9 Q* f0 K3 [4 [+ Q6 I
- uart_init(115200); //串口初始化为115200# O4 u1 x; W0 t$ x
- uart2_init(9600) ;1 S* U3 Z: _0 d k1 Y, q+ E
-
! t% f' Q. x2 p% h - TIM3_Int_Init(499,7199);//50ms
& E) d+ {5 P% p+ w8 K/ @ - , c9 q( Q, T5 _: p( u
- LED_Init(); //初始化与LED连接的硬件接口
3 \$ @/ t+ G& P3 Q - KEY_Init();" q8 _2 f m6 m" X: X7 q [
-
2 @% r2 U' t$ w( m - led_gsm =0 ; ligh =1;//上电初始化$ j8 \; s! C! }8 c5 ]
- Lcd_GPIO_init(); //初始化lcd 接口
) f: J+ ?: u* ^4 Y2 o$ N, G% H& m# j - Lcd_Init(); //初始化函数
& S- Z2 k' k9 [8 N - delay_ms(200);
- Y0 ~) B3 L- y. O4 G) n$ s/ A5 F - ligh =0;//关闭led8 H; |, t- V; h5 M
- Lcd_Puts(0,0,(u8 *)Lin0_No);//显示
7 z7 n, K! n3 P0 |* ?0 n - Lcd_Puts(0,1,(u8 *)Lin1_Ea);//显示
( o3 c; e1 O6 _( c* x2 J8 [, N( ~9 G - ; Z" { W a. Y# I0 Q
- i=60;
0 @ b I& t* r2 |6 o - while(i--) delay_ms(100);//延时8 ]. h# L/ N' d1 C8 j- l2 Q
- 9 u! |7 {3 Z, y
- UART_SendStr(USART1 ,"AT+CMGF=1\r\n",11); //设置字符集0 t8 z( e ]3 l0 {
- i=7;& m1 L/ g) l1 p7 O
- while(i--) delay_ms(100);//延时
4 } K u' z, \ \& g" E - UART_SendStr(USART1 ,"AT+CSCS="GSM"\r\n",15);//设置文本1 P$ w4 V: K+ L- |, l6 j% W
- i=7;
( [7 `. p- L. ^# y4 _0 J - while(i--) delay_ms(100);//延时
/ Z4 k* ^5 M( b+ n, p' T" \
- d2 X5 O" `) ]! B; d5 W3 G* f. G( r- UART_SendStr(USART1 , "AT+CMGDA="DEL ALL"\r\n",20); //删除所有短信' S" y: b9 a: B) T8 ~) c8 X4 A
- for(i=0;i<5;i++)
) L& n* `) l. @& [( z- R: \ - delay_ms(100); //延时有助于稳定
; b2 t1 M/ H' a, T) V -
/ V" V* T, k- Z7 z - led_gsm = 1;
: r5 P# y2 _) C - while(1)- O4 {1 o: J5 h+ \$ ~0 \
- {
6 Y2 I, p" @2 u; ~" Z) d - key_scan(); / k+ `3 f8 A p! @; H, y0 e
- if(disFlag ==1) //定时更新显示2 c! ~+ }+ z& I
- {, V( D! a5 j) T8 J# P* q
- disFlag =0;3 c$ z0 p' P6 ^5 p
- if(sysmode_GPS==1) //gps有效
0 } d) T7 ~0 g! s* [& b! w# { - {
7 O4 A2 r3 y, Q: l - // sysmode_GPS=0;
" W7 l; y( w9 r: r- u! N - dealGps();
j3 C- C- N- M2 K6 H$ K - if(disNum==0)
1 l! m* b1 a P# o5 }2 ]3 Q$ {* q( G - {
) Z) U& N1 N+ [1 ]' |3 i6 t - Lcd_Puts(0,0,(u8 *)Lin0_No);//显示 / b1 e- K/ ~1 Z5 I3 c" L- _
- Lcd_Puts(0,1,(u8 *)Lin1_Ea);//显示
- W& ^- D: P; S0 ]3 @ - } i% p T$ s" G9 _
- else
5 j9 V! \5 T# A! b# Z4 y - {
" Z& `# V1 U9 @ ^1 l+ U1 B2 I - Lcd_Puts(0,0,(u8 *)dis0);//显示
4 w& t f: }( `6 ?# t - Lcd_Puts(0,1,(u8 *)dis1);//显示 , B, I5 s3 Z* Q) D! `+ y
- }
6 q! q7 O# N( ]: l( @ - } & v/ I2 \* u/ {" o% K. r
- } r' V g( V3 p* L3 t/ i
- 1 ?5 ~$ s# B' c1 E4 P# Q
- if(key_m==0) //发送按键按下
; | @' U$ e, B/ E, U$ f$ U - {& H$ X# M5 W4 S
- delay_ms(10);, B; @: R& B9 p
- if(key_m==0) % Q) [" y0 O( n2 S: d
- {
6 y& Q+ X% n: o$ ]0 h1 h. T' Y - led_gsm = 0; " ]- g, h! r! S h: F/ ?* J$ `8 ^
- UART_SendStr(USART1 ,"AT+CMGF=1\r\n",11); //设置字符集* w; B) ~2 k1 Z3 V$ T0 E
- i=3;
8 S# b# r) g: t- v" K$ O - while(i--) delay_ms(100);//延时
4 P7 X2 A/ w: |* { - UART_SendStr(USART1 ,"AT+CSCS="GSM"\r\n",15);//设置文本
9 p6 Z! t A5 x% Y1 f* c$ R - i=3;
5 ]: S: S! F9 s- x0 D: k - while(i--) delay_ms(100);//延时/ A, G6 [/ n8 `5 Q+ z
R& @" {$ H1 U- UART_SendStr(USART1 ,"AT+CMGS="+8618105140357"\r\n",26); //测试号码 H& j9 d. {2 m% T* I
- // UART_SendStr(USART1 ,"AT+CMGS="+8615296556420"\r\n",26); //发送短信号码
% h) d8 D6 x/ F# P2 d2 z6 i% M - 6 L7 F7 J) x4 \+ T
- i=3;( f. z3 C* y8 D
- while(i--) delay_ms(100);//延时
2 \8 j9 K+ R& f( i* j - if(sysmode_GPS==1) //gps有效2 W. l3 i4 s- C" O( l, v j
- {
1 \; \, G" i) J - sysmode_GPS=0;
" H/ Y+ x1 x1 d" s# d8 P - dealGps();
# I2 e8 L3 k3 d1 S; M6 g7 c( r - UART_SendStr(USART1 ,Lin0_No,12); //发送纬度
5 m$ W# q# W/ X' ~* h" |5 H9 E* V - UART_SendStr(USART1 ,Lin1_Ea,12); //发送经度( ^7 P& ^( s0 N( x! B2 B% S5 r
- }
5 d0 X( @% R* U' w3 q" S: n - else
: O/ ?( `: K4 e( ?, L+ V - {, P. M2 A7 r, x# ] B
- UART_SendStr(USART1 ,"gps linking...",14); //gps无信号/ D( J1 o) |. W
- }, {: Y& H) f) ~$ a7 w0 l% e
- delay_ms(200);
; `: ?( m# v) m+ c% y) K; j) V( _ - UART_SendStr(USART1 ,( char *)Crtl_Z, 1); //发送+ e* J6 h, [5 ^- n
- i=30;5 i- C8 L {0 B; M
- while(i--) delay_ms(100);//延时发送
1 G+ }1 O. f1 _5 ~5 A - led_gsm = 1;6 D! z4 w; @5 u$ L
- }# a. q* ^5 C+ L; C+ x. |
- }
6 ]0 T& L: j. s - 5 D H8 I \5 U* D
- if(readFlag==1) //读取短信息标志
) I# J* i# R z' B1 E1 @ - {
' G# {, ?; T X { - readFlag=0; //读取标志清零8 U0 E* u7 f$ h
- readMesIng = 1;//读取短信过程中
! V4 B, [, B; ~0 z. k - timeCount++ ;
4 I0 O4 c4 X- H - if((stepNum == 0)&&(timeCount>=4)) //定时读取短信% T8 b3 x/ q. x0 p4 Y: J
- { + l: F: `+ l* p/ g
- UART_SendStr(USART1 , "AT+CMGF=1\r\n",11); //设置字符集2 `5 L0 n E" H& p! F
- timeCount = 0;//延时设置量 ' j2 |7 u& a; c) k5 _8 m
- stepNum++;//进入操作过程1
0 o/ B2 H+ b# D7 t* E - } 2 Q( e, u# _+ l. a/ i8 p& U6 g7 m9 Z
- else if((stepNum == 1)&&(timeCount>=4)) //定时读取短信
1 i5 @- G) _% c3 _0 L' S - {' x# t: }* a9 k6 i5 u, T
- for(i=0;i<SIZEBUF;i++)
8 C4 P1 ~6 @ e, Z9 w0 f0 \# T! p - {
. d1 S, }8 ^# R: r - timebuf<i>='0'; //清空timebuf
* I+ w( H2 s% V; u) k& | - }
0 y1 i: l- c1 v7 V+ `" x - UART_SendStr(USART1 ,"AT+CMGR=1\r\n",11);
1 O& P$ j1 S7 Y/ C3 _9 M4 ^ - timeCount = 0;//延时设置量
6 M$ [7 L* j: d, x - stepNum++;//进入操作过程1* C+ {+ y2 b( C5 g3 _0 K, r: W
- }
% b9 N( A7 Y" Z7 U - else if((stepNum == 2)&&(timeCount >= 4)) //定时读取短信
2 y. m/ R9 b5 ?$ Z; Q - { 8 I7 Q2 [ r% _- }" z
- rebackMesFlag=INIT;
0 m: G" a* p# n! ^* M6 S - for(i=0;i<(SIZEBUF-3);i++)5 j/ G' `2 H- @7 [, \/ K. s+ C
- {
6 l3 h2 E' W# C/ h - if((timebuf<i>=='G')&&(timebuf[i+1]=='E')&&(timebuf[i+2]=='T')) //查询是否接收到GET
+ _2 i$ F9 j' p& z( q, g B: c. S - {
2 y: F/ U- [/ ^; ?( { - rebackMesFlag=OPEN_01; //状态标识打开
- {8 y( j6 f: Q0 O; E$ _8 O9 T - break ;8 [# ]$ e/ z" c: F" p. `( S9 u' C0 K
- }
& r4 Y/ @& S6 B1 h. j! J) n# ~8 I - if((timebuf<i>=='+')&&(timebuf[i+1]=='8')&&(timebuf[i+2]=='6'))//查询短信息中的号码: e1 j% f. s9 Z4 Y' C/ n5 B
- {
: \6 X$ v: T, [4 x5 L7 X - led_gsm = 0;
' [- R. B; m" | w4 l - rebackMesFlag = SOMEONE; //有人发送短信 9 f) G+ ]% P( l+ Z5 M; F ~) s! W4 k( `
- AT_CMGS[9]=timebuf[i+0]; //提取号码8 v( s) @& p" b( ^! W3 t9 v
- AT_CMGS[10]=timebuf[i+1];
/ y7 j# p0 G3 u- \) e - AT_CMGS[11]=timebuf[i+2];( e0 \2 o w6 T' z2 y. G2 x* {. c
- AT_CMGS[12]=timebuf[i+3];
9 i9 i$ ?5 @! c0 X - AT_CMGS[13]=timebuf[i+4];
6 D3 ~$ L+ d; ? - AT_CMGS[14]=timebuf[i+5];% q- L- X( t+ B" f: p9 S" R, ~
- AT_CMGS[15]=timebuf[i+6];
" g& L) Y+ y5 o- t7 \5 m# X - AT_CMGS[16]=timebuf[i+7];
6 y4 N( {, X; I0 w9 g - AT_CMGS[17]=timebuf[i+8];
$ z9 ?( w3 m# s1 l - AT_CMGS[18]=timebuf[i+9];* W" N- p: V+ j! W' b
- AT_CMGS[19]=timebuf[i+10];% m' M; N2 j. o/ _
- AT_CMGS[20]=timebuf[i+11]; + F. C6 b- a. t) j8 u3 g
- AT_CMGS[21]=timebuf[i+12];
4 Z7 A7 n8 W4 ]; z( l, Z- t - AT_CMGS[22]=timebuf[i+13];
2 F3 S1 v2 P$ o1 H - }
" B ]# O" f% U& j- m3 x - }# p( d6 Q: l: {% b, z
- AT_CMGS[23]='"'; //整理字符串 ' ]) w; A! O: b, T" a5 d
- AT_CMGS[24]=0x0d;
3 j, H' ?9 K* r - AT_CMGS[25]=0x0a;
8 [2 S9 z3 O' k8 i8 _9 G - 6 k+ ?5 U: S2 V7 O# D
- if(rebackMesFlag != INIT); P8 y5 p7 q1 b" m
- { 6 O: F! n5 k3 X: D; B) Y
- UART_SendStr(USART1 ,"AT+CMGDA="DEL ALL"\r\n",20);//删除所有短信
. I; Y! p3 I3 O6 x1 d5 K+ s - for(i=0;i<5;i++)' \+ T: P1 O# p: ~) ?
- delay_ms(100); //延时有助于稳定
; T9 L4 G) |6 I- j -
" C" X" x1 u" _ h7 }- L - UART_SendStr(USART1 ,"AT+CMGF=1\r\n",11); //设置字符集- ?! `9 V2 u, b5 W- ^0 r
- for(i=0;i<3;i++)
" k! _6 ]# R3 r. x1 ? - delay_ms(100); //延时有助于稳定# @( C! D5 b3 L7 H
-
% v$ G8 `/ E/ j* p/ h+ Z( V8 C - UART_SendStr(USART1 ,"AT+CSCS="GSM"\r\n",15); //设置干什么、$ |; r: e7 l/ |! U) r
- for(i=0;i<3;i++)
! S" w1 P9 S" l- j k5 ?, ? - delay_ms(100); //延时有助于稳定
) R# d } X+ U2 v! E2 o y3 D -
+ e% X" Q" s- M/ a9 c$ l - UART_SendStr(USART1 , ( char *)AT_CMGS,26);//准备发送短信3 i/ @" M# K& b- B
- for(i=0;i<2;i++)
0 F8 `! l) D& q% r( Y2 @% y" v# T - delay_ms(100); //延时有助于稳定
' ]0 b: d+ @) E: g1 N8 Q- P -
! \0 ~2 i4 ~+ }1 q' w- c - if(rebackMesFlag==OPEN_01)
n9 ~' c/ Z7 F, s% T - {
7 ~4 f3 c2 g8 ^ - UART_SendStr(USART1 ,Lin0_No,12); //发送纬度
3 d" A2 s2 O5 e) ~0 A - UART_SendStr(USART1 ,Lin1_Ea,12); //发送经度
, d2 `1 W* Z7 k5 M0 r$ i: z; A0 m - }
( j, S7 i9 f( q6 c( U% n& @- o - else
. @: r$ C3 d v1 q - {
5 [4 |/ l. m3 _9 C3 l" r) W - UART_SendStr(USART1 ,"CMD_ERR",7); //发送短信息命令错误
* k# X, }+ \# n, y* v& ~5 c& h& I - }
9 d$ H5 N. w& I( u$ b( s# D1 A - delay_ms(100); 1 ]! {5 \# ]2 V- Y# K2 z
- UART_SendStr(USART1 ,(char *)Crtl_Z, 1); //发送0 u6 o8 v7 R: C: l/ h1 e# u$ N
- for(i=0;i<20;i++) n, {( E h' D* y. D
- delay_ms(100); //延时有助于稳定 3 Q# o. d ?4 W! s# S
- }1 h' N+ S! J9 C
- timeCount = 0;//延时设置量
( q+ K$ t* s) u- F! y- p - stepNum++ ;//进入操作过程1
5 j1 f( h8 r; {0 b4 E: }+ Q - }
6 }2 l. D3 K' g r - else if((stepNum == 3)&&(timeCount >= 4)) //定时读取短信: T; L- _: B7 ^0 _' u
- {
5 \" F2 D/ \0 o, n5 L1 e9 F - clearMesFlag++;
2 } J* c0 ?! h# D) M6 M' i - if(clearMesFlag>10)4 i, V9 ?- F2 W# _ H
- {
+ i9 q6 Z) X5 K( W - clearMesFlag = 0;
& W8 W2 h) s8 u# T( } - UART_SendStr(USART1 ,"AT+CMGDA="DEL ALL"\r\n",20);//删除所有短信
1 y" O6 J$ u- n, x - }
5 B( m# L& G. |. \ - timeCount = 0;//延时设置量
6 `! u$ k$ p$ l, r9 _2 [4 m3 F, W - stepNum = 0 ;//进入操作过程1
% n; Q7 ^6 f, K3 W( W - led_gsm=1; //关闭指示灯/ l( o) f- K1 t; X4 m! i
- readMesIng = 0;//读取短信过程中
6 u* s' A: h4 P, ?7 E0 I$ I - }
2 d& T% X3 ^: \8 T+ \( i1 I2 { - }5 Z% |3 C: u, I3 M9 ~
-
0 R! o4 l+ v2 L; A - } 6 `3 \/ B( T5 |. J8 N& I
- }
: y+ S6 }0 s: L( t, E: O - </i></i></i>
复制代码 4 B$ w: o$ O) K" b
|