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

【经验分享】基于STM32的红绿灯设计

[复制链接]
STMCU小助手 发布时间:2022-5-24 18:31
基于protrus8设计电路原理图" ^3 t7 o2 U) w- t- q
1 z' H- @) w  j5 p- |
6M[RO_XHPCS)~6P89$}ZBFL.png
  J, ]  r. I- N) K
1 Z' E1 X0 |1 s" w& L7 \$ m先要思考明白十字路口红绿灯的逻辑
$ q( p: T0 ?5 f' X" p1 q9 ~  @% m1 b) L6 E" r: J3 k
东西是一样的,南北是一样的。
0 j6 X' ^! W6 d% r
( `0 w# L8 u$ n5 w7 D/ K7 z0 G- v东西红灯,南北就是绿灯,反之一样的,弄明白这些写代码就有思路了3 I- H( {  \) B+ S' _5 f
& }3 j/ s$ c" `1 X6 W' S1 b8 Y2 X
中间的两个数码管是模拟真实红绿灯倒计时的用的,放置4个也行,但是为了方便观看就放一个了0 Y( [) v. J( M1 a. v

6 }; L, O, X6 r4 K* ?下面放几张运行效果图,方便大家思考,我设计的是红绿灯都是倒计时30秒,黄灯倒计时3秒( R5 \; y8 i- K: l/ l# y8 f
, J8 ?! l- \/ t4 V! F4 v
`XYTS4`4U7LSM3HSRHZ%TBS.png
# S8 P: v9 H) l# i$ S) w `%{3RB5D1ZYL4IGZ45]3{E0.png * `* g/ g$ Z8 J) p
% `. D) x- m$ n& M7 u! u  x
4V0KYU1KTRBUN~[HD[(TXGF.png
, B- ?$ R" Y- u, B8 d3 g9 n6 e0 \$ n9 w8 x5 I

1 Z/ j; I/ y3 j! v* S/ d代码: Z- n5 D# d) x2 f5 Z, F) _! r
+ a. z5 d# e# `' \/ L9 v, l
(注释在里面要好好思考,化为己用)8 \/ k: X, L5 S9 f0 F$ C

. u% Q" u% Z1 N& D8 g3 M& h2 P(这个小项目的代码稍微有点多,采用的是模块化编程,所以自己写程序的时侯要仔细,再认真理解,不要搞错了)
# i! y5 {- [  Q& H4 p# S" ]0 S5 {) ]! {$ s/ [0 {! G
主函数 main.c
  1. #include "stm32f10x.h"
    $ L& ?8 d' O1 F4 R
  2. #include "smg.h"& k9 ?4 l# P# N- z0 R
  3. #include "Delay.h"
    7 ]# @+ W8 {# a" \2 d9 w: g5 j0 E; g
  4. #include "led.h"5 e# o1 `3 G  B5 w! E9 E
  5. 0 g, v! u# G3 f; b8 |' a! B
  6. uint16_t table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
    ( I) p# g( P+ o! ?5 T
  7. uint16_t disp[2];
    9 i% G# _5 g" [5 X- Z. a
  8. uint16_t temp,i;
    ( }  ?) @7 G: ?/ W# s) K+ ?; i

  9. ! ^! B$ F0 o" s2 Z& P4 ^
  10. void zxm_Init(void)                                                        //字形码函数
    3 f3 c9 @/ u, d2 h
  11. {
    $ @' G- V  w+ s
  12.                         SMG_Init();                                                                //数码管初始化
    / \- h+ H. q& q! b: A" O! O
  13.                         disp[1] = table[i/10];                                //数码管显示十位数字的字形码
    ) Z* `' Q% q$ d1 G
  14.                         disp[0] = table[i%10];                                //数码管显示个位数字的字形码
    ; ^  W3 ]3 M0 A. M# |$ _7 _
  15.                         temp = (disp[1]<<8)|(disp[0]&0x0ff);        //十位数的字形码左移8位,然后与个位数的字形码合并
    1 J& g. `( m5 C
  16.                         GPIO_Write(GPIOC,temp);
    ) ]* _6 n+ P5 y( q7 u1 ]- w; r" L
  17.                         Delay(100);3 ]5 H' `: ~4 l+ d' j
  18. }        
    . [1 G' x/ {( y
  19. 2 _: Z; E+ |$ L- p: }/ B
  20. int main(void)3 @7 h) f. C% l
  21. {
    : J9 W; u7 U( U% k. \3 E* \/ {
  22.         LED_Init();                        //led初始化% Z9 J6 d' ]' |+ l" w: G5 R
  23. & p; O; B' g! K: u% \8 m
  24.         while(1)5 S7 y7 t+ c$ q! f1 o2 f
  25.         {
    * F7 K$ j6 ]  d3 {: A, n
  26.                 for(i=30;i>0;i--)                        //数码管从30开始自减,到0结束5 x- ?& [6 x9 p& e- |+ ]
  27.                 {. `* w8 @3 X' f3 X; x/ \# \
  28.                         LED1_ON();                                        //东西红灯亮- ]7 l. C8 f+ C) J$ L
  29.                         LED6_ON();                                        //南北绿灯亮
    " R0 U9 H$ E9 d$ k' k
  30.                         zxm_Init();5 H$ [: G, X) E) k$ b2 K; E, I7 ?
  31.                 }
    4 J3 g! g/ Y5 x' U; _% S
  32.                 for(i=3;i>0;i--)                        //上一个循环结束进入下一个,黄灯开始倒计时9 Q; ^# u4 N" W
  33.                 {4 l7 {: U( J; `4 P- S
  34.                                 LED1_OFF();                                //东西红灯灭
    5 c+ u, L% @6 A: f- d3 m5 h3 ~  G  t" P
  35.                                 LED6_OFF();                                //南北绿灯灭
    + e9 G9 ^+ d! b% `- [% l3 O' a0 w
  36.                                 LED2_ON();                                //东西黄灯亮8 {# O9 P) @* O8 \
  37.                                 LED5_ON();                                //南北黄灯亮
    ! u+ u2 [& p* d) B5 a1 Q  {
  38.                                 zxm_Init();
    ; `; Z4 N- F  ]' N& b+ b
  39.                 }9 |6 L4 Y) y& P6 U3 N
  40.                 for(i=30;i>0;i--)
    , D7 H! j: f# q9 S  t& c7 U
  41.                 {% {4 t7 @0 z1 Q" k) t- r' }# @
  42.                         LED2_OFF();                                        //东西黄灯灭
    0 D& n( P3 L" G6 v7 @' g9 ^  a
  43.                         LED5_OFF();                                        //南北黄灯灭
    ) \9 X2 e! B5 q& E
  44.                         LED3_ON();                                        //东西绿灯亮
    / L6 G2 S+ P, S: K
  45.                         LED4_ON();                                        //南北红灯亮;  f  s$ s/ z# I8 C
  46.                         zxm_Init();
    ; Q. `8 M) i3 c% L) B% h3 g" e
  47.                 }* w/ R/ Q( I5 j# q  ~1 G" `$ D& B0 i
  48.                 for(i=3;i>0;i--)
    , ]" l" M- F' U8 w7 o) X, \( z
  49.                 {" U- a# j1 x& c' K$ }( t6 Q
  50.                         LED3_OFF();                                        //东西绿灯灭
    2 ]4 N6 k) n/ C; e& p
  51.                         LED4_OFF();                                        //南北红灯灭
    - u% p& o& Q) K/ X! K2 ~8 C
  52.                         LED2_ON();                                        //东西黄灯亮  ~- S5 b/ c/ G
  53.                         LED5_ON();                                        //南北黄灯亮
    . @4 q0 G9 ?8 K! }. o8 d
  54.                         zxm_Init();# n8 {7 P$ Q4 \9 q/ t  h
  55.                 }/ \) \4 l; L5 E
  56.                 LED2_OFF();                                        //东西黄灯灭! H% H1 g% d4 _
  57.                 LED5_OFF();                                        //南北黄灯灭
    * x5 t6 g7 j* L  C
  58.                 / b5 W  d& J- I) K
  59.                 //这样就结束了一个完整的循环,最后把黄灯灭掉,让程序一直在while里循环; v$ q! p& N5 J7 d
  60.         }
    - c: ~4 t# B5 L- |) F
  61. }
复制代码
9 l9 T, j3 d. ~2 R- Z, k0 M
数码管函数
4 v% |/ g% ^& h+ d  i% O# T
7 s# |8 u3 Q: k' x7 P) Q- `; Z/ O( Fsmg.c
; F' K9 x( j7 q! Y) B8 e. w% N. {0 v5 m; q- b: i
  1. #include "stm32f10x.h"
    % b, [% }$ n! Y+ ~1 u" l0 C1 ]5 Q
  2. #include "smg.h"" q' e+ I. ~+ \& z2 v# o0 Y- t
  3. & v6 e* m5 z* W* p2 _3 c: T- @
  4. void SMG_Init(void)/ @0 u3 F7 A# e) p' d( Y& D  E
  5. {
    / M( K7 p8 `. X" |2 O+ T* q  D
  6.         GPIO_InitTypeDef  GPIO_InitStructure;
    * G% `. |: k5 Q/ l( Y
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);         //使能GPIOC时钟
    * l" y' ^. Z  T' b5 w$ Z8 c( U2 v
  8.         GPIO_InitStructure.GPIO_Pin = 0xffff;                            //引脚配置
    : A; W. M7 Q1 d0 X
  9.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;           //配置引脚为推挽输出. }: t. m/ g& Z! F8 f- e8 k
  10.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //GPIOB速度为50MHz
    # K$ z/ M1 r0 F% q
  11.     GPIO_Init(GPIOC, &GPIO_InitStructure);                                //初始化! `, {  `4 D- h3 x& p
  12.         4 J! a7 j9 H; R  P
  13. }
复制代码

0 o: @- N5 a" X. Q7 ~( z9 ?smg.h
  1. #ifndef __SMG_H0 u/ @- A7 ^- u& ?
  2. #define __SMG_H
    # t1 g. n0 b/ c$ |3 ^
  3. ( o  p9 C1 n; ^9 g9 u5 }, Y8 \
  4. void SMG_Init(void);
    " W* J9 X: @! o0 L
  5. #endif
复制代码

) A4 U: H+ m$ V- ]: z) MLED灯函数
7 r3 d: \8 d* ?) H) x+ _# B8 V' K: `7 b/ O
led.c

" S2 Q2 O1 R- ~  q" A- j( D! f: m# `) p$ b$ W( p& F
  1. #include "stm32f10x.h", \/ z8 o7 E- \+ c4 o( p
  2. #include "led.h". ^% g6 Y  h9 H/ q
  3. ; K  B* L4 c& ?+ x8 N" c7 t& z, T
  4. void LED_Init(void)
    9 x; q0 P7 J; m4 T1 F% r
  5. {
    . c! l- i6 K5 Q# z1 h/ j$ i% W- f
  6.         GPIO_InitTypeDef  GPIO_InitStructure;
    7 ^& }9 g' b) T2 H5 W; [
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         ' r$ @, D6 X. J6 e$ ~
  8.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2                             
    8 j1 p- z  U  u& D- }
  9.                                     |GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;                        
    . c( ?0 f0 r! o+ V3 s3 L5 c
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   8 F( J$ [+ J1 ?+ I
  11.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
    - L- g2 S- X6 s5 x
  12.     GPIO_Init(GPIOB, &GPIO_InitStructure);                                ' m& V- [2 }& C$ v9 S
  13.         
      b' U' k9 h( U7 ?6 t

  14. 9 y5 u3 @( h, }5 |7 E' e  U
  15. }
    ' o/ [! j3 f& Y, A4 y+ j& m; K
  16. void LED1_ON(void)
    ) T+ d7 `9 W6 U2 p' b
  17. {& a$ F: Q  L, \2 n' h
  18.         GPIO_SetBits(GPIOB,GPIO_Pin_0);. C$ w4 A8 `" j$ O2 w) W
  19. }
    1 q2 `# u5 C0 ?5 ?/ A: ^
  20. void LED1_OFF(void)3 B0 s# X% B6 {6 @# b
  21. {
    , t% }: o$ K8 x$ Z/ x- C
  22.         GPIO_ResetBits(GPIOB,GPIO_Pin_0);
    ) F. Z5 k8 o" H; g6 ^
  23. }* R) T0 H7 J$ ^. V* B4 O
  24. void LED2_ON(void)
    * U! @9 u( b; ]; Y# o5 S# T
  25. {
    , s8 _5 V1 g9 J  H/ y4 ~- j
  26.         GPIO_SetBits(GPIOB,GPIO_Pin_1);9 |2 K0 ^. _" V' T/ b9 O! E4 }
  27. }
    " B/ O$ o! F* @/ ~) w3 }
  28. void LED2_OFF(void)' k! S) D* ?, L
  29. {! b1 D( R/ {( |$ u1 n
  30.         GPIO_ResetBits(GPIOB,GPIO_Pin_1);# Y" l; l- ?# t2 C- l2 o0 y+ p
  31. }
    8 q/ r. g  [$ H. W/ _
  32. void LED3_ON(void)9 O& G, l2 T) j/ M7 Z( V& M
  33. {
    : W8 ^5 u" |5 c6 s
  34.         GPIO_SetBits(GPIOB,GPIO_Pin_2);* ?& J. T* J3 \6 ~' E9 y
  35. }
    ) h& _* w9 D8 O9 ?3 i9 R* a- A
  36. void LED3_OFF(void)
    3 y2 w* p! F7 t# z
  37. {3 N9 W) m$ E/ S" J. u8 B& I
  38.         GPIO_ResetBits(GPIOB,GPIO_Pin_2);
    + U5 J8 A) T7 n6 ~+ r5 z- c
  39. }
      w* ?( O3 [8 A" O$ m
  40. void LED4_ON(void)
    ' y9 A% e  i# ^
  41. {
    * a* Q  a- ~- [1 m9 i7 X
  42.         GPIO_SetBits(GPIOB,GPIO_Pin_3);6 t, Q: Z9 ~' x- ~3 c& O
  43. }
      x/ a' W) z; x1 Z
  44. void LED4_OFF(void), d4 u0 e8 u1 W/ L3 G. ]. x6 ]& P
  45. {/ Q" |% H/ M+ a' o1 y- F: c. k% F
  46.         GPIO_ResetBits(GPIOB,GPIO_Pin_3);; F& ^, e: Z9 ^! z( v3 g
  47. }7 R% y$ h) I, D9 r- g1 R: _1 ^1 W% i
  48. void LED5_ON(void)
    3 p6 Y) K0 E" H
  49. {
    2 y% Z. }; W- M5 l8 j
  50.         GPIO_SetBits(GPIOB,GPIO_Pin_4);
    . U4 t- p% V$ M/ D" w, X5 Z! Y1 _. _6 L) {
  51. }0 j3 a  U/ a$ s9 |8 \
  52. void LED5_OFF(void)
    # G5 O% n) O' w# \+ `8 P% `" ^
  53. {- m( z2 e, j- X/ Q9 }
  54.         GPIO_ResetBits(GPIOB,GPIO_Pin_4);
    7 l2 M- b/ K6 Y' }: h7 P
  55. }
    , z% v! P/ {  ?5 \# {2 b7 S
  56. void LED6_ON(void)
    " @% D/ R, t) X: w6 Y2 P
  57. {8 U7 W* F) r7 d3 `
  58.         GPIO_SetBits(GPIOB,GPIO_Pin_5);+ ~5 {! q2 K0 x$ h
  59. }5 R& O$ o. y. _* V  P
  60. void LED6_OFF(void)' ?* o) M- d$ Z0 z8 V7 g3 O  M) R
  61. {, z& a% O; e; s2 Z$ k! b+ `
  62.         GPIO_ResetBits(GPIOB,GPIO_Pin_5);2 `* V: `" c  I8 ^& J3 r- \' g
  63. }
    . e3 L* ~. x1 C- J2 n  m* M# x
复制代码

" p. ~, Y# m, h% Dled.h
6 b4 v+ q6 S: u: u& ?( H
& Y" Q2 J9 ?' c4 [: e
  1. #ifndef __LED_H
    - a  y* X% n; Z
  2. #define __LED_H' W  @. f! q! H( A
  3. - K, o7 j0 @" a, ?2 t% o
  4. void LED_Init(void);
    ' n2 T! b  c% m, O7 B6 N  W
  5. & S) e9 _. R: ]# a) Q0 I
  6. void LED1_ON(void);: t5 h2 m# `9 g7 [1 |- C2 E
  7. void LED1_OFF(void);. T( C- a0 ?9 {7 _9 h
  8. void LED2_ON(void);
    * ?$ I' J6 ]% b, Z# C
  9. void LED2_OFF(void);
    ) K% I% F( B* s% u
  10. void LED3_ON(void);" a  r) N% G0 B% I! f; H
  11. void LED3_OFF(void);
    1 s7 F: T" ~7 M! `* q& }
  12. void LED4_ON(void);
    4 ?) H( e" c+ E
  13. void LED4_OFF(void);) d2 \: m2 Y8 m* ^- m! u+ w5 }
  14. void LED5_ON(void);
    0 _' E7 U2 m' J, C$ X4 f' T
  15. void LED5_OFF(void);) a/ P0 M: e7 m# \* {0 b
  16. void LED6_ON(void);
    ! f4 \' J' e; K) N  a& q
  17. void LED6_OFF(void);
    7 P0 @  A0 Z1 Z: A. p
  18. #endif
复制代码
% R+ v: x* P# f* X
延时函数: b" Q/ g! u3 e* Q

3 R/ d- j! U! I5 \6 u: i3 bDelay.c
) z2 a) \& w6 H' n" a
9 ?, }$ D9 A8 q0 d
  1. #include "stm32f10x.h"* U, W' N6 m- Q+ d* E
  2. 3 Y6 n( }" M/ L0 C3 w; G
  3. void Delay(unsigned int count)                                                 " N* a. J, n$ M! e9 T
  4. {
    " {% J; D* p% L
  5.         unsigned int i;' H# j/ x; S; G) G- g; k2 {+ B
  6.         for(;count!=0;count--)
    $ G6 Z' Q: I- z
  7.         {
    , X& S% z6 p* {6 I, o
  8.                 i=5000;
    9 `  d, u8 p/ l0 G% @
  9.                 while(i--);
    # g( }: Q# }4 }4 z7 P0 a. W
  10.         }        - g6 P4 {) R2 M* z6 Y5 E  \. T
  11. }' I) c8 m& O2 m# i# p+ h
复制代码
% Z( w$ M2 l  t! H% n1 W7 E
Delay.h
. k# a( V0 a) H# Q; z: h( ~
/ S4 p2 o" `1 _7 f: V: A- _
  1. #ifndef __DELAY_H  V$ @: y! d8 M* e
  2. #define __DELAY_H
    9 w, B; o7 y. W4 p
  3. ' _: U) `* |# U, H, \) X# }* V+ u
  4. void Delay(unsigned int count);$ f/ @( D6 _( b6 ]0 N
  5. #endif
复制代码

! E/ ?& [0 Q% \& K9 x# W
$ ]( M- f2 t4 K0 s& G
7 A. ?* d8 ^2 \& [3 B# p3 U" y7 R
4 K+ d! D, P; @0 W! Y
8 q3 z' d+ f; M: W' F7 l& @5 W/ A
赞 收藏 评论0 发布时间:2022-5-24 18:31

举报

0个回答

所属标签

相似技术帖

官网相关资源

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