|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机八路抢答器proteus仿真图及C语言源代码
. T( k3 k- x7 \# g, r
0 ]: k# B0 Y- S- N1 h: f. ?2 e& l7 n ~& T" n0 I+ b) l
单片机c语言源代码如下:
* }5 J c% v" r5 c" U9 B O/ p//名称:八路抢答器( o( ~8 L6 N0 u" t
//功能:主持人按下按键开始抢答,此时抢答灯闪烁1 }% J. M4 B3 s2 w, F2 L u* f
//十秒内抢答,如果没有抢答的则直接复位# _# E0 T3 j8 q0 l/ z
//如果有人抢答成功,则其他人抢答无效,60s内答完超过60s自动复位
w- |! r1 @$ g" x" Q/ K//回答期间抢答灯常亮,回答的人方灯闪烁,直到回答完毕,灯常亮表明回答有效7 ^- Z! g7 _9 |8 V3 O
//如果超过60s自动复位,回答结束主持人打开按键,复位。
8 b Z$ ^5 W" \#include<reg51.H>' O+ _9 N! x$ k
. w, f5 Y( t# C
( F- D: s! W* i jsbit Presenter=P2^0;% R! G- m$ u n4 y {1 S$ o
sbit K=P3^2;7 X0 \: a3 Y1 g$ c4 J
bit Presenter_flag=0,flag;//主持人按键标志位,仅允许一个数据通过标志位
8 C Y+ h& P6 N0 }9 hunsigned char Timer=0,i; //时间标志$ R6 D1 G5 h; n
unsigned char ren=0xff;, y0 ^ o9 ?0 Z) h
bit x=0;! W7 @: U8 | M8 o# H) C, n* }
void System_Init();- h5 t* W' H, z
void System_Rest();- w' A- X/ N9 m2 i0 G q
void main()9 t# g% w" }1 Z7 s+ ?6 b; |; I) Q, N0 H
{9 q O8 T% B! u: }9 J5 F( c
System_Init();& K1 r# \7 w% C
while(1)6 W% a2 r: q2 x0 N- P
{
9 u/ Y5 O! F( C" N" m3 ^, l5 u% ? if(Presenter_flag) //主持人按键按下时开始系统4 c r5 m3 c) P( k1 E1 o& o6 H3 P
{ / J6 G8 b; q+ d k8 {" I1 t# h! l
K=1;# M& r5 L$ X* f$ ^) S: _ d
if(K==1) //主持人按键起开) ]+ d- u4 |1 h
{break;+ l U* {" o; E1 I$ i
Presenter_flag=0;
' H7 K5 O/ M/ f% Q9 l, z z }
2 d% c9 Q7 I* \) b }
+ \3 B/ z5 b' r8 }$ ?/ Q6 m else
3 K3 O7 C! I8 B8 [& D& g" A System_Rest();
' H% u9 a6 O! ]) u: r; i; G }
4 _0 F/ G* Y' U- ?: T; b& n ~}
4 |3 w! T: C+ T8 lvoid System_Init()6 J& W# M; k4 K
{7 I' J0 ?7 N% Y2 W# u! z
EA=1; //打开中断
+ Z' T& Y1 x1 F2 l- x: i EX0=1;
6 q: S. H5 C1 g8 u9 g7 [) |- u IT0=1;
" {: r" y/ p6 b8 o+ H3 ~ TMOD=0x01;
7 }" A; W* ^- @3 i. L- U ET0=1;
8 x. S5 V# `: b0 Q$ B# ], Z; ? TH0=(65535-50000)/256; //50ms! H& [. [3 m7 ]$ A1 p+ p' }
TL0=(65535-50000)%256;
# I* x& d% Q/ k6 ^* n+ f* i. X& v: c Presenter=0;, I; {5 g9 x, H; a( n: E+ W
TR0=0;: g2 K1 p* v+ Y+ N4 Y
}" |& Q4 o3 R/ V; H0 G" E2 a
void System_Rest(); g" m9 O! {8 C9 J' I
{
4 q$ G2 t' Z- j# Y+ ~ P0=0xff; //复位设置:在主持人按键起开或者,抢答时间超过10s或者答题时间超过60s
& N0 M) ~: s2 {" o4 @ P1=0xff;
% Q3 x3 b) S( S1 Y! p. v! d TR0=0;
4 I- g: R' t* G+ }) C( v8 u" } Presenter=0;) ^3 W5 j/ b3 w" \: B
flag=1;+ F9 e1 c3 `. x% H" U1 g
i=0;
( z4 @" f, F1 m5 B, K7 R, f Timer=0;
. `# S A: r" P5 d t6 S0 u# I}8 [" g/ {$ G" Z `3 [
void into() interrupt 02 i# U" z4 m, {) n( L( Z
{! k* u) ], c* K6 H
Presenter_flag=1;//主持人按键按下# X8 n3 x% K$ f4 h* ?% l
TR0=1;4 x, ~% e* T' g# N: T9 y1 i1 q3 Y
}* j, {4 s9 p: o. _
void Timer0() interrupt 1' [2 O- i7 S `
{
* _2 J1 M. M; u( v% g TH0=(65535-50000)/256;
9 |, c2 C$ X4 O TL0=(65535-50000)%256;+ E i# d" W7 o
i++;" D9 P0 p% V/ ~ U
if(i==20) //1s钟
, _# K1 F- x; r9 q z- q$ } {
t; P( g5 X/ h0 L7 ] i=0;9 z4 X$ Q+ @1 v) i6 W
Timer++;( s- m# [# R, N5 d
P1=0xff;/ \2 a8 t' e9 h/ X% T1 `7 k
if((Timer<10)&&(P1==0xff)&&(flag==1)) //10s抢答时间,10s内如果无人抢答则复位) t5 ?9 K* v4 @. M
{
7 q$ v- Y$ r" f6 y3 o Presenter=~Presenter; //抢答指示灯闪烁
; q* P" q) j2 h3 W: o/ h }
! T. I' z5 O7 r4 E" J- n else if((Timer>=10)&&(P1==0xff)&&(flag==1))
/ p0 V! m9 H5 d8 F7 M$ g7 n {7 w) U. G5 e# Q% I; d" v# t3 }
Presenter_flag=0;
2 V/ t+ G7 ? G* O9 x% b/ J Timer=0;' {( r& H; F6 n5 @/ ~* R
i=0;
5 `6 u) f2 [' s4 j# {8 H }
& \" Z. W2 Q; ]. ~( F" ~ P1=0xff;
& ^: `7 \2 X, ~3 r9 [ if((Timer<=60)&&(P1!=0xff)&&(flag==1)) //答题时间,60s没答完则复位
' j& j5 Q6 W5 N' A1 q* [( ? {# _1 a* s# L1 v) R4 l
ren=P1;
1 }0 C' r4 ~6 U# j* d/ x Presenter=1;4 v$ o5 a a4 |0 M" e* i
flag=0;
. ~0 m8 x) [. \5 v% L }' m# T4 b( u/ e$ a
if(flag==0)( |, X& d9 g6 A4 N( i$ M, H8 u
{
6 k! i& O1 v* }) }$ c: [) h) o if(x==0)& d- G+ w2 B" c# J& _: j" s) C
{x=1 0=0xff;}0 Q- W9 `& A q3 B
else if(x==1)
. {+ g7 H* o+ Y, {8 y {x=0 0=ren;}5 L# K* x! J4 N7 s+ s4 n
}
( L! s/ F; Z- r; y if((flag==0)&&(P1==0xff))1 C# F3 B$ P& T. b
{P0=ren;TR0=0;flag=1;}
& u* t4 P2 F% Y! K5 z: w if((Timer>60)&&(P1!=0xff))+ H8 ?+ Z% L/ U6 F# j2 M
& x5 N* H1 {' P4 b7 @& e7 O# h: `- A, ?2 U1 a7 j$ j
; c& l ]; ^+ r) R
# U: v6 ]. c7 S# Q. z8 G3 N& |# }% R' N
…………限于本文篇幅 余下代码请从论坛下载附件…………
- i" ]5 M) p7 u' ]) |4 K, i0 Z8 a) E$ z' _1 T& z! S0 J
, P \! p6 @% J% R8 Q9 c
|
|