|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机八路抢答器proteus仿真图及C语言源代码4 M0 L3 d4 N: @! ^
* P* H3 S1 z9 x
! R8 B0 Y3 E( @7 K单片机c语言源代码如下:
z$ j% j. ?9 u2 n; _& M8 D//名称:八路抢答器
4 F- |. T2 _% }6 \//功能:主持人按下按键开始抢答,此时抢答灯闪烁
2 f2 p8 n- k9 ?& d//十秒内抢答,如果没有抢答的则直接复位
. a$ y( w; @/ V& n//如果有人抢答成功,则其他人抢答无效,60s内答完超过60s自动复位% b$ J2 L+ B- {+ x% a) v5 z
//回答期间抢答灯常亮,回答的人方灯闪烁,直到回答完毕,灯常亮表明回答有效
" ?( a* G7 I* e, e+ }7 j//如果超过60s自动复位,回答结束主持人打开按键,复位。( x4 m8 g7 O0 f9 |* ?* |. C
#include<reg51.H>
q7 M( j# k; G9 l& A8 ^8 O u& t1 B! k; W4 B: \- Q: b
: V4 a/ {5 c6 l) O( H4 S% C3 Wsbit Presenter=P2^0;
1 `) H- f1 q( l6 @sbit K=P3^2;& y% Z6 @5 } L9 }
bit Presenter_flag=0,flag;//主持人按键标志位,仅允许一个数据通过标志位/ m4 H' D0 v4 c7 _( Q
unsigned char Timer=0,i; //时间标志& e3 m+ n) t( F! R
unsigned char ren=0xff;- K2 N0 _5 e3 m, {% N# K" e
bit x=0;0 l' c0 x" q c$ Q o" z% L
void System_Init();
( L) L& g! u* Nvoid System_Rest();/ g$ _! M) S4 P* b1 }8 g
void main()4 C$ l7 b1 }, n/ J3 F8 o
{' l% E3 R4 V0 C; W; F7 S- f0 v4 W
System_Init();
$ f$ K Z: w* y% I while(1)2 z/ F5 z3 c# ^8 J% B* q
{9 y6 @. K3 C. a- D: r! _- k
if(Presenter_flag) //主持人按键按下时开始系统 [8 C2 u) M' R: t/ A6 w( [2 H
{ ' F' ?% _: c" e! L( P
K=1;
: w8 Q& t+ J* W if(K==1) //主持人按键起开9 ~: U) a* n! S) C c
{break;/ N; e% }" U# y9 F: j
Presenter_flag=0;
/ P2 a' l" {9 z% W4 }4 E" V }# {8 Z; m% e) Z7 d" U6 U
}2 C- ~5 r0 X! H
else2 O# l: Y) y5 `( J6 j
System_Rest();
; d. s# W6 {; o2 l }0 {) r; k* ^+ I& c9 W
}
2 J- q1 V/ C: ?# rvoid System_Init()
8 L# E) q! }" q( e6 h1 t{
5 M" Y. {! q" V* M+ J& i EA=1; //打开中断/ t' J) S5 `2 p
EX0=1;! l; r; _3 I5 O6 r$ W$ W
IT0=1;7 ]; `% A+ ^+ G0 Y% v" H! Y8 A+ q, `
TMOD=0x01;
0 }" ]- n: g$ ]1 t% {& e ET0=1;0 U0 ?5 G$ F0 q+ @, {
TH0=(65535-50000)/256; //50ms3 q& f9 n9 i. Z% A4 z$ {' ^
TL0=(65535-50000)%256;
" L t& R q2 ]4 U1 ] Presenter=0;
4 g9 B6 ?: p( q TR0=0;
' w, w, ]5 S/ F+ X) T}! s! e, M% f/ g
void System_Rest()9 a2 o5 b8 } `, T B. ~3 c# B8 j, u- ]8 U
{, b7 }+ X: ~; l
P0=0xff; //复位设置:在主持人按键起开或者,抢答时间超过10s或者答题时间超过60s6 F# \7 j9 i' m& P/ d" u
P1=0xff;+ q4 q+ J# a: e4 [8 }
TR0=0;
% F( U: h z0 ?% M- b. G, P Presenter=0;! N. z, k/ d7 B% v' z1 `& ~
flag=1;" S: ^* A$ A8 q$ E2 R' V9 l: l$ q6 |
i=0;/ o& b( |1 J7 S* j
Timer=0;
+ q( T& p" h3 X; c}
- p9 r& k$ ^2 L e3 l5 _/ \4 _void into() interrupt 0
8 O$ l2 m+ M9 Z! w# ]{
0 m3 H7 g( S( u( n) K+ [ Presenter_flag=1;//主持人按键按下3 v& F9 w) `" n/ [
TR0=1;+ y5 {) ]( s5 |
}
! E/ X; @1 E1 Z) r9 Z* nvoid Timer0() interrupt 1; a! W L; Q& z) i \5 u; K
{
M- M% g' V' L TH0=(65535-50000)/256;3 L& i4 j* F2 u8 M# L, W9 V6 p7 j8 T
TL0=(65535-50000)%256;
2 R8 g& b# x& ?. O i++;
8 J; i, E7 d1 k# ` if(i==20) //1s钟) L2 c1 I l$ n+ c7 W
{
& i3 k G# | _1 t i=0;3 D( _) M; r/ p9 I# M9 i
Timer++;0 O7 p/ L: ?# L% [- z8 e
P1=0xff;: `8 D5 u$ N# X$ N) M
if((Timer<10)&&(P1==0xff)&&(flag==1)) //10s抢答时间,10s内如果无人抢答则复位
q9 j4 k# y8 }4 i {8 K+ p3 \" ]. X& h
Presenter=~Presenter; //抢答指示灯闪烁
; H; @# \5 w P) O7 ~) s } }0 l+ @+ y# G. o4 R
else if((Timer>=10)&&(P1==0xff)&&(flag==1))# z7 s8 G' S5 `; } o
{5 Q7 _2 {9 U. Z0 t, ~
Presenter_flag=0;% `- G; F6 K$ C& u1 H
Timer=0;0 G3 e+ s4 l# @. f) H; b% r1 ~7 A
i=0;
+ W7 n6 o7 {' [+ _+ [ }
0 A( ^, Y2 k, \5 g$ ] P1=0xff;
1 ~$ N% o# x1 `% G W if((Timer<=60)&&(P1!=0xff)&&(flag==1)) //答题时间,60s没答完则复位) k6 `9 H9 B: I& u [- m4 H5 r
{( b9 @% |5 N4 \' i/ N* ?" d; ^
ren=P1;7 g7 c) `1 [& _/ a9 @+ E3 ?+ o( x) _. i1 q
Presenter=1;, D7 v% M- D' N+ v1 B
flag=0;) P3 B# _% C) e5 b, i) n7 ?( B) J
}
, O6 K! h8 k$ {' I3 b% D6 W9 T if(flag==0)2 ~( E$ @1 X8 A3 {
{
2 D% k% h0 y6 E' h- @0 e if(x==0)
1 l8 f: F0 C: `, ]/ {( k {x=1 0=0xff;}: [" b( D+ q2 n' o
else if(x==1) ]; Y/ I$ v- ]4 V# i$ p( c
{x=0 0=ren;}& d1 N/ h% f$ D' H7 y3 c& D2 U" j
}% h$ @0 [5 w5 k- A2 A
if((flag==0)&&(P1==0xff))4 C1 e# O5 L& \: j* {; H5 m
{P0=ren;TR0=0;flag=1;}
! Q' [) B* o- M if((Timer>60)&&(P1!=0xff))
# A( |) ?9 h1 K/ s
6 B4 _4 c! p3 j0 L- b( l# [, k8 A( Z1 S( ~" [- {# M, `
& R1 W" O. B" h+ C# ^* ~" p0 E
( `6 x: \, _% g: _. `6 s" l9 ]9 k/ ^
…………限于本文篇幅 余下代码请从论坛下载附件…………
0 a3 l8 a" ^ \, F
5 l0 f0 u0 L$ m& ?2 K
! v6 J8 ?$ T4 G' v, d$ k |
|