一.硬件方案
9 W1 h# }* {5 q: O0 @4 c- V/ m本设计出以STM32单片机为核心的八路抢答器。我们采用了数字显示器LCD1602直接指示,自动锁存显示结果设计思想,它能根据不同的抢答输入信号,经过单片机的控制处理并产生不同的与输入信号相对应的输出信号,最后通过LCD1602显示,即使两组的抢答时间相差几微秒,也可分辨出是哪组优先按下的按键,。% N+ V6 G3 y! u0 I' [' H
主要由STM32F103C8T6单片机+LCD1602液晶显示+5路按键组成;;如图:
/ e3 I- s. y& {& @: e! f/ D2 Q- m( i% q% A# c: g
* X/ G4 k. t8 U4 r
3 |3 m( b0 {/ ~/ _- g X" w+ L9 s
二.设计功能
* n6 l/ @' k: I& W Z. D. L2 x(1)当系统上电后,系统开始计时;当按键按下时,计时停止,显示屏显示当前时间及按键的号数;
1 L# D5 F9 t, U# {* m( Y(2)设置有五个按键,分别为1、2、3、4、5号位,按下时显示对应号数;
/ O4 p7 q: v: v+ H(3)液晶只能显示1个数字。
" o% }( [! ]/ @3 I(4)按下复位按键后,则开始新一轮的抢答。
! C! k0 T8 ]* x: W6 p4 Z7 |- l& D
三.设计原理图
/ Q- Q: X) r) k8 H+ `(1)原理图主要采用AD软件进行设计,如图:8 }) H6 X T6 N8 [
d1 F# y$ R: q1 M
+ A' F/ I% ~' H8 i; g! K* k$ B \6 D" H4 M+ j! P0 ]
(2)PCB图如下:
; ^+ T( O" \6 C# i6 o# z3 F3 M0 D; N4 a2 L, Y' I! a( Y, t C
: A2 q- w' j2 n6 x# r7 H7 B+ d% {
+ T# `2 Z# \: U' Q h四.软件设计1 V# @* g3 u3 @+ g4 t8 S1 _
(1)程序流程图9 f( g" P# Q5 E3 w5 r
Y3 w- f1 S8 N2 F1 m7 H
) X) _; I1 C' O7 U. Z. x# t/ o' g; {; K& i3 L* a8 d% V1 d8 S
(2)主程序源码
4 n1 {$ m0 b! A6 I, n: f; V% C8 |& u8 v/ Q; J2 C
- int main(void)
/ Y7 |: K6 w- N2 n8 m& k4 E - { ( ?7 E8 m8 M$ N) T2 u7 l. x+ u$ z# ?0 b
- delay_init(); //延时函数初始化
3 B! A/ ?3 ?7 c- B - uart_init(9600); //串口初始化为115200
& r% ?$ g7 b( Z, H8 n2 }4 x - // uart2_init(9600) ;
( ^% d& d0 R' w; l - TIM3_Int_Init(499,7199);//50ms - ]: b' h3 t* T' H# O# ]5 s4 G c! I
- 7 J" ?0 Q! F4 B: X: c& M& r
- // LED_Init(); //初始化与LED连接的硬件接口
2 R; f& B, y% R - KEY_Init();
6 y+ l4 \- w& i' \- Z7 p -
, E/ a" d: m! [ - Lcd_GPIO_init();
0 [' e+ r" T ] - Lcd_Init(); 1 W5 p* S/ U/ ?1 R
- , @% l1 q ^7 f- {' w. \, U( t4 z8 x
- while(1)3 x) O" \1 q! {
- {# I. [9 C# e2 p$ V
- if(keyFlag == 0)//按键无任何按下
% M' h2 `' z/ k6 j+ Q5 M3 h - {
. ~ T' T- [0 f/ T1 w - CheckKey(); //按键设置, z5 I# A/ F! P9 X- [
- }
/ t: i6 k0 a- }$ L, G+ l; |$ c2 h -
- E9 o" P8 I" ]3 o" L, X- P! U* a - if(disFlag==1) //显示- z3 \( c! f- j' b4 v k
- {$ s$ _) a6 y' h3 e+ ]* w1 N ]
- disFlag = 0;
. q0 |* d/ R- N' c, u, F: `9 F6 B - if(keyFlag == 0)
& s: r; h& R- [5 k; D - {
! j3 e; I3 ?& x0 X - Dtimes++; 8 r; O- y$ z/ g% E
- sprintf(tab1," N ");//没有人按键
, V3 F& h0 j0 q" h" w, t& H - }0 w* C4 g% N8 ]: a7 ?6 t
- else
# `* p0 |4 n" O. a: Y1 S - {, j) w0 R% d4 z2 b# Z6 c, o/ f: Z) \
- sprintf(tab1," %d ",keyFlag);//显示按键的值7 b( X7 l, ~8 }6 w
- } 0 k: l, _5 P' u& G$ j% B. f6 v2 o
- Lcd_Puts(0,1,(unsigned char *)tab1); //初始化显示 # Z9 p% y6 y' L5 W8 I, X
- sprintf(tab0,"time :%5.1fs ",(float)Dtimes/10); //显示时间
5 H" F; s0 D, @% f% M& F# K - Lcd_Puts(0,0,(unsigned char *)tab0); //初始化显示 ]+ c! c! z# c: F! o5 P
- }
& C8 |0 d5 r `' ]' h - }
, E7 z) j. e' w$ h1 d3 a8 a - } 0 |3 i3 G+ k8 w( \
- 3 j6 f9 l# \+ Z2 W" C8 {% c8 |2 n; c
& |4 A7 l* g4 K0 ^3 `2 e
复制代码
! r% v- a! J7 P8 G' ?" `4 L |