|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机原理及应用课程设计论文-交通信号灯模拟控制系统 " f! W0 E3 L3 a: i/ L
单片机源程序如下:5 n9 D7 c2 V- o, d! F+ b6 S" |
0 M. j% S0 Y. v$ d. s0 C
/**************************************************************************************
2 u& I. e) D+ }1 q/ X& w* 交通灯实验 *. z. X0 z( b6 q+ D V2 B
实现现象:模仿交通灯运作7 m1 V: ?8 l- K0 S9 A# z4 D H2 [) Y
注意事项:无
) A! J# N8 t) |) C7 s- b( _***************************************************************************************/" c: r0 ?3 P2 P; N
3 J3 l) K2 z# e6 }0 c, [
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器' x3 U! D& {: h7 T' \; u( p2 P
5 |2 p; H: T- Q; L4 R& `& S6 wvoid delay();
; B6 z% I0 N7 B3 m" e* _" @void display();, u* i5 Z1 b1 Q
void TrafficStart();
- b2 L1 t7 K5 f- @6 Dvoid TrafficStop();
# k) o- Q2 m& Q E" K( @# Hvoid ledInit();) m6 V# l4 P( Z9 l( A* B
void changeNSpass();! c1 V5 s3 t8 Q- i& {
void changeEWpass(); ~9 E. A- w# y0 R" p* I
( l/ |& c- C9 Q A$ ^
typedef unsigned int u16; //对数据类型进行声明定义* V" G* [7 K2 B# p
typedef char u8;
7 ]# Q3 p6 n; e7 J# e0 s8 M& r2 |( ^( P2 T" A' _$ v- d, \
u8 code table[]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 1 l0 s8 @5 D. s( e3 L+ b( G% J( F
0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e};
% s1 A8 R! I" ^/ s/ lu8 code stop[]={0xbf}; //1011 1111 1 h R( h6 \: N2 m! o. W! e
1 C( {* P, o. U- _
u8 time1=3; //东西方向 第一位数字2 Y2 `% Y8 H. [5 u' ?/ |0 D
u8 time2=0; //东西方向 第二位数字
- `6 w* W8 O* W9 Z2 I
8 S$ p- H( w" j. c; E3 hu8 time3=2; //南北方向 第一位数字9 w H+ P; g+ t5 A" F/ r* U3 n
u8 time4=5; //南北方向 第一位数字
- x: W# M- p, i; Q# S3 w. L% @ C! L' h9 a, i+ x. r
u8 change=0; //东西方向状态改变,初始为0 0为红灯 1为绿灯 2为黄灯
5 w8 c. g# ?% ]( k* h6 @u8 change1=2; //南北方向状态改变,初始为2 0为红灯 1为绿灯 2为黄灯. B2 z/ g4 K& h8 i. P
6 [, s6 ~; X4 }0 E7 q$ A, [u8 ledset=0; //紧急状态标志位,0为允许紧急状态启动
! ?' h# T3 ]( ]$ R( V, ]: a; Fu8 templed=2; //LED灯临时记录,初始为2 0为绿灯 1为黄灯 2为红灯
" v5 X8 m8 K- ]2 C; }! [u8 templed1=5; //LED灯临时记录,初始为5 3为绿灯 4为黄灯 5为红灯/ X5 t+ C9 e7 C Y7 o9 g ?& _9 d2 h% ]
2 [* i3 a# f$ `$ H# [6 i( B
u8 count=0; //紧急状态按键计数 , U7 c6 G1 y4 F0 a# t2 q7 g+ N/ N! }
u8 count1=0; //方向转变计数( \% h$ I. g& y! U0 D; y
. u: f R3 p3 o# [
sbit led0=P1^0; //将P1^0口定义为led0 绿色1
: u3 k9 q$ N( W( E' lsbit led1=P1^1; //将P1^1口定义为led1 黄色1
- e% i; ?7 H2 Bsbit led2=P1^2; //将P1^2口定义为led2 红色10 S9 [( }4 ~0 w# X! ~9 f5 n
sbit led3=P1^3; //将P1^0口定义为led3 绿色2# v, R/ A% D# m- s9 a
sbit led4=P1^4; //将P1^1口定义为led4 黄色2- o; \+ Q6 W! G& h2 f* ?5 {& O
sbit led5=P1^5; //将P1^2口定义为led5 红色2- k% Q/ O; X3 F' S! l
/ L/ l$ i; |2 c2 H0 j/ Q! F8 E
sbit CK1 = P2^3; //东西方向第一位数码管5 W3 M F3 k# f- R) f
sbit CK2 = P2^2; //东西方向第二位数码管5 k8 k: z1 V. D, M) g7 w
* d" |) ]7 F* H7 |sbit CK3 = P2^1; //南北方向第一位数码管
4 H- J7 d* P; ~$ V9 ?; m) Esbit CK4 = P2^0; //南北方向第二位数码管
0 M8 x/ c; c) x7 Z, ^* s
1 T9 h. E/ i; Nsbit key2 = P3^0;
5 G4 e5 ?( ^3 I# I5 jsbit key3 = P3^1;
1 \! @1 b9 ^9 E6 Dsbit key4 = P3^2; K1 o9 y& P& a. ~) T
8 W# @4 g; H/ n7 K9 x4 _8 p1 Cvoid delay(u16 i)* a1 w/ ~4 x( ]9 N: y8 A; V
{7 N4 q' ]/ X$ z+ K) }% E5 e
while(i--);
$ a7 g( Z6 {4 g' I8 s}
! g' h/ Q0 J+ ^* u: T
X6 g4 h! G4 ]! tvoid display(u8 time1,u8 time2,u8 time3,u8 time4);
0 _& s* @% ?2 O3 J d D/*******************************************************************************
) `7 e6 _- b7 i$ M) s; H* 函 数 名 : Timer1Init
9 R; D3 u" g9 }$ [4 w* 函数功能 : 定时器1初始化
) D7 \" {" l. x/ Z+ o! `* 输 入 : 无4 i9 M0 `& F8 p
* 输 出 : 无
7 L, g4 F A, `*******************************************************************************/" w6 `" [0 [8 W% }$ X
void Timer1Init()2 ]7 s+ A+ n# D2 t* B3 g; V: j
{$ ?* t" e" j( P: R$ K
TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。0 P3 W" ]5 a$ \. L& ?& N* ]3 t: h
- {+ \, T9 k. P7 F/ `! w TH1=0X3c; //给定时器赋初值,定时50ms6 V# Y! x5 d8 b6 e# h
TL1=0Xb0; : q. K4 b/ g; E& B
ET1=1;//打开定时器1中断允许
. M# Q, z& O8 X5 v# F EA=1;//打开总中断$ p8 \ C, A0 q9 U
TR1=1;//打开定时器
- f% W5 x+ u" Y+ \/ f7 ]. j}
; F( r+ v. N/ _
^% Q1 W( w. k! k/*******************************************************************************' s# h1 {& p& N( D1 ^0 n/ b
* 函 数 名 : main% v. B8 E* R# M4 j3 ^) B
* 函数功能 : 主函数
( `0 U# Q, @: Q2 a O* 输 入 : 无! Z$ {4 u: x. o
* 输 出 : 无& X( c% h% A, ~* J! L1 m
*******************************************************************************/! g8 b8 T5 g4 {2 J7 D- m
void main()* G- t; [& r1 u4 a
{
# s1 Y8 |$ Y# ~, i CK1=0;7 q! t0 X* h+ ~$ {! A* Y+ V
CK2=0;
8 } r h, u; `- T led2=0;
% |5 w9 A# F# n led3=0;
, ^! y6 B x& `- D* F Timer1Init(); //定时器1初始化3 Z) g6 }3 P; F( i; E
while(1)
! V; o; @4 o% W5 Z1 e {$ n, Y0 P! h% q5 F, D8 {! ]% v
//*******************************************************************************! D9 A& l! ]* g9 o Z r
if(key3==0&&count%2==0){ //当按下key3并且状态为运行状态时有效
l, s1 I$ c, [' q$ U8 W delay(1000);
) l; ]- `& i$ H; b9 s H$ G# D if(key3==0&&count%2==0)
# U- [7 \+ ?- j9 e$ w5 Q' l* ] { % n; F! I" E V7 N' f9 P
TR1=0; //关闭定时器,防止切换时仍然计时
* l# r6 N( r* `% v- I9 k; s count1++;1 |6 ^% h8 a$ X( |/ S6 {- B3 p# A
if(count1%2==1){ //(非红灯状态下允许执行)
# k+ @% q4 }: x; A TR1=1; //打开定时器1 {: c% ]7 Q) u# C: k1 g
changeEWpass();
( }" E2 h* x# A }
9 v! n( j, ~: Y if(count1%2==0){5 ^3 f& A7 j; A; |
TR1=1;. P. e9 V& A- ]6 A" w. |, N5 ~
changeNSpass();
7 n9 W! ]# D( O* D }4 C7 r, q0 S' |' B+ I
}
, l5 G1 _2 m! y# k3 q$ w% k while(!key3);, k1 p2 p. G0 R i
}8 ~( u, F/ C% U7 d4 w4 a% L- v
//*******************************************************************************
3 T3 z: l3 }' V' A7 E M, h if(key2==0){( C+ P5 n4 i8 z7 ~( U
delay(1000);
* ?* g* m% Q+ l% l! Q, g1 G if(key2==0)
. H& T/ u. O9 k* _ {) W/ t! \, @8 c8 O5 W/ M. Q( b
count++;
, t' H- @: G: r/ d, o }( N6 T9 b( Q9 f& \
while(!key2);+ ?. d; k( s* D! S$ i- l
}
L. H% \# \, D! k0 t Y+ P9 d2 B
if(count%2==0){ //为0则将状态恢复为运行状态
% A; l( {; s# X/ a if(ledset==0){ //判断上次是否为紧急状态/ G) P1 V% o& t& c( x
ledset=1; S! o) u o( @" I5 b
ledInit();
. n( i: t% l1 Y6 ^( K templed=2; //东西方向初始化为红灯,由于执行了ledInit()会改变它的值,所以需要初始化,防止上个数值再次被利用(实际上只需要非0或1就行)( `5 f/ ~" l7 r" @0 l, ]
templed1=5; //南北方向初始化为红灯,由于执行了ledInit()会改变它的值,所以需要初始化,防止上个数值再次被利用(实际上只需要非3或4就行)" E6 u/ \# y6 ]2 ~
}) Y; ~: e! O. _( F0 D# O) q. N+ f9 y
TrafficStart(); //正常状态下while会死循环该语句,该语句为动态显示数字函数
P9 D4 {% Z* V# G+ l }
( n! V3 h2 } {" A% x/ }% e if(count%2==1){ //为1将状态修改为紧急状态# ~) |( X1 V8 p% D0 [. Y. `9 \
ledset=0; ! E! {; j/ o0 e6 Z" f
TrafficStop();
" n' F/ T: K: t* t }
' e/ V0 G* \: T1 @* B/ K" t8 M$ v" J1 x) u/ t# X! Q
} 9 Q, k6 q1 h' G; b+ s
}! X5 M5 O m \
7 i+ F+ G7 Z9 w3 `
/*******************************************************************************% j% A8 ?' k# D1 }
* 函 数 名 : void Timer1() interrupt 3
3 {3 V6 C5 q: i* 函数功能 : 定时器1中断函数
C* K! b, j) E! e" U# v0 J* 输 入 : 无9 Z9 l- D, Y, O0 h) m
* 输 出 : 无
8 a# F6 t% T( `# ]% W; |% |*******************************************************************************/) Z$ _) b$ }- _+ B" c' d
void Timer1() interrupt 35 V( r5 t* F; W
{
d5 v* o, _' [: R- |6 V9 D& P static u16 i;3 I2 X& S1 U# ~ ~
TH1=0X3c; //给定时器赋初值,定时50ms
2 ]% u8 w6 E7 a7 Z TL1=0Xb0;
N$ I6 W, z0 V" } i++;
# b9 C: u) R% B; x% D1 P if(i==20) //i等20时为1秒4 X* x- M& f- G5 H, C9 D( ?5 S% h
{. A+ ]6 M5 o7 B/ N) B3 b9 h9 y
i=0;
, x z i4 G" w( i, h //-------------------------------------东西 方向-------------------------------------/ Z5 b! [4 k8 @- e2 c
time2--;. g3 s3 S- }7 n* T. k
if(time2==-1&&time1!=0){
5 |% T! M2 @4 u/ ]# N1 f8 e time1--;
1 C" ?, Q5 a- D% q8 w; E) v time2=9;
6 v; K! R; E) _: R1 ^9 A }% p5 [6 c( G% }4 B# l/ O! Q
if((time2==0&&time1==0)){
1 E: g( w) B+ \' D9 T if(change==0){ //东西方向 如果为红灯- K) O4 f- K6 A: V7 N9 w
change=1; //下次为绿灯" [' B) N( }% ~6 G( \
time1=5;
5 ^ P) f1 o( I, R- A time2=0;
' U) @8 S# l7 j. ? led2=1;- U7 W H8 u( q0 _, G: P0 g
led1=1;9 Q; }) l) r5 ^. B+ B# L
led0=0; //绿灯亮$ A- x; u2 h( A4 A! F
count1++; //红灯转绿灯时计数加1,否则执行方向转变时按键会无效(闪一下而不变向)
# t0 {% D/ n6 e' K9 ?0 Q8 L }
- U6 y8 R5 o4 R# i2 @4 K else if(change==1){ //东西方向 如果为绿灯
4 k1 S# t8 |( j$ ] change=2; //下次为黄灯
0 }; N: H. p& \. f! n time1=1; V" G1 O) P k4 n
time2=0;
$ i& ]' W# G/ w0 i$ g* }, X3 s led2=1;
( ]3 M5 Y% w1 ?" i led1=0;
& _9 S' D* G1 R: V led0=1;
" x3 }9 }! M0 Z& c& I6 f2 o: L, A }
' w8 K' p! `# k1 ?% _0 _ else if(change==2){ //东西方向 如果为黄灯; X/ u( Z7 Q4 e1 X, h
change=0; //下次为红灯9 a4 ^+ T3 g: ^8 |/ {! O: Y# x7 r
time1=3;4 N! q$ U' H# D( d/ l+ N2 C
time2=0;( U9 j! {8 U$ z2 J# z( Y {
led2=0;
; B) _. x: f: m led1=1;% q- L* W$ o% D/ v7 }7 x9 _
led0=1;. i1 W8 q# i' s) y" G9 W4 l, G
" z/ u+ O' b8 x. y7 \* ` }( X6 `6 W. f/ ]$ L6 l
}
# ~" n1 r4 e5 y1 k3 ~ //-------------------------------------南北 方向-------------------------------------
; L9 J! X) ^8 T3 S, w. E J) J time4--;
! t3 u$ {' b8 S6 @3 o3 a# V" T$ _ if(time4==-1&&time3!=0){
+ H- o& j+ f9 \ time3--;+ I0 k' Q( T' U5 v) X
time4=9;
9 n1 _$ ?9 [3 p# Q1 [5 C/ x7 E' W/ V8 U( T) I% |" B6 X
}) S& b* }, T% u$ ?7 ^
if(time4==0&&time3==0){1 m6 c4 `7 l0 M3 s
if(change1==2){ //南北方向 如果为绿灯
! t7 D7 A+ X. t) e# I, k/ Q change1=1; //下次为黄灯4 H* S' l1 J; x& Q( {- L! T3 e4 m& g
time3=0;6 \) J8 O+ t: D* u
time4=5;
6 Q1 G. b M" E X, X- G8 @ led3=1;* } {! ?6 Y: V: O1 X
led4=0;$ Q& L: Y# x" ?9 o L& t
led5=1;
7 i4 K" d3 C% g, y j" \ }
! E3 V4 J# y; B w8 I7 U( ^ else if(change1==1){ //南北方向 如果为黄灯) f, S' }4 l( t4 h' m
change1=0; //下次为红灯; }# ]! `) A' P1 ?2 y: b
time3=6;
9 u9 ?& Y2 Y4 Z: s time4=0;
$ m" \* n! \* O. U+ C led3=1;. R* Z+ A) x4 O) [1 D m: [
led4=1;' N! [8 W( k+ V# b5 `$ j/ b; v
led5=0;
6 |" O- v& S4 o4 B } K; a, Q; U, E; d. a4 x( V
else if(change1==0){ //南北方向 如果为红灯1 [! g) F8 }; y& H' W, B& P* l
change1=2; //下次为绿灯, Q1 r2 {* B2 h0 c
time3=2;
# h% @9 F2 k7 U& a! D n3 d U# ^ time4=5;9 f' F) E j0 C9 N. o9 } i
led3=0;' f. J+ `# P8 o6 H, f
led4=1;* ]3 m- k! P4 d/ q. S5 F) t
led5=1;, N" t1 e+ `3 J6 |# V( G1 Y5 k
count1++; //红灯转绿灯时计数加1,否则执行方向转变时按键会无效(闪一下而不变向)1 Z' w" n. N$ @2 P. t0 D2 \
- H) c s, G6 ?% I }8 z% z+ J3 K% b- ?0 S. H
}- A/ R& z$ L5 Q7 _/ ^* Z2 G3 w
//------------------------------------------------------------------------------------
T/ s7 q, o+ U# A5 d }$ ?7 O2 H9 {0 g; V, e* V
}
; k1 |! Y, k2 Q& ^7 y& x4 `( z( n% D: G; ?! p5 q
void display(u8 time1,u8 time2,u8 time3,u8 time4) //显示程序: Y, q, s9 y+ Y; k7 `3 e0 k/ g! _
{ 1 {7 C$ a& G% T, s; U* {2 g
P0=table[time1];$ C* K. }, D# ]' T) K+ _ b; [0 N; F
CK1=0;
1 j8 \2 C* l Q8 B: U' ~/ ` r delay(100);
' }" _ O# p9 T$ g/ ?* A2 U% }! e CK1=1;
( L6 n/ A: ]2 c7 C
5 l( q' C( L7 u9 H+ E2 ~2 U* f P0=table[time2];
$ S% V1 u) N8 v/ O' F7 k/ Z CK2=0;& [6 ]' A& ^$ L, R4 R# ^; A o
delay(100);6 m! b0 w& t7 Z# s1 V& S" w6 S
CK2=1;
9 t2 y; n9 n# V3 @2 L6 }3 d! F: ^
! \$ e, g7 u( [ P0=table[time3];
2 z2 N' s- e c* j, i CK3=0;& | z1 a% \. |" @9 y
delay(100);* n" n6 p, w( h8 p$ F& A
CK3=1;+ n1 }9 x& w6 O* M
# `5 I: M$ W# O$ ~1 T# I P0=table[time4];
: y* V2 b! b3 Y! P( j' G$ h CK4=0;
6 V) }' F- ~/ u- q1 D delay(100);
) N( S5 i e+ E2 y* t CK4=1;" }. s& B0 L8 t2 ?; ` `
}
3 @, {- R* S4 n0 j, r# N8 [( }* L, Y ^0 z( X5 C, V* r
void TrafficStart()
5 f& i! w- z% K+ T{
_1 i# [. t4 G( B( p+ k6 ]' a( W TR1=1;//打开定时器$ W5 v& R3 p! U/ v8 o- h
display(time1,time2,time3,time4);/ @) j$ z" p; D& ~# x
}( D/ F. f$ K w, H
- p2 O( ^; K' a$ vvoid TrafficStop()
6 t. O# `$ V! K{ 7 d7 ~( ]" M5 V( I# L, ?( w l
TR1=0;//关闭定时器
' O; `3 H% ?8 i+ V7 I+ ~( [$ V* w CK1=CK2=CK3=CK4=0;- a g/ R ^- l2 q, W
P0=stop[0];
9 c% R/ Z8 T8 M! ~ O6 k if(led0==0){- Y4 V+ B9 w2 v
templed=0; //记录当前灯状态 东西方向
( i( u( s, k; E$ n2 _/ K, J" O led0=1; //将原来灯熄灭+ n5 V9 {& Q' i1 f$ p7 R/ ~
led2=0; //亮红灯
8 Z/ m8 V7 W2 F }, v1 M4 t( C( r9 i. c
if(led1==0){( U; ~% C6 W, }5 R
templed=1;
$ g5 t7 m) Q" S9 P! Z: o" Z R, F, V led1=1;
$ i7 ?5 @' X9 J$ c. t: E5 q led2=0;2 o: W! p5 a) s9 Q8 d9 W+ p- M7 Q
}
8 j+ Q9 A9 H1 Q" ` if(led3==0){
) g! S# a* W* I' B9 Y ^: m# g templed1=3; //记录当前灯状态 南北方向
6 f3 F4 a& A' i! E- }9 ] led3=1;
* S7 a" @+ q9 G0 ]( k led5=0;$ R% J0 q" O. J
}% S6 S) m* j7 N3 ~) E4 D" d2 u
if(led4==0){2 K/ K4 V/ z/ m- a" z
templed1=4;! a% l7 o- a& H0 W
led4=1;
- y5 }' k) E; I: x led5=0;% }7 Z+ v) f& C& |' ?
}
: C6 K: `4 r1 h+ ~4 t}. o& d; |/ M2 j3 p
# l: z3 K- R" Bvoid ledInit()
4 x! x4 E1 F% j5 @{" o; c) O$ q5 Q% H1 i. h! l
if(templed==0){ //恢复紧急状态前时的灯状态 东西方向3 h6 x+ j* @4 h8 ^* Y
led2=1; //熄灭其他灯0 z* ]( p9 h0 `$ _% p
led1=1; //熄灭其他灯, |8 d& c7 ?- U4 M
led0=0; //恢复灯的状态$ e7 N3 m6 b' z, r' P$ y
}2 p: S7 t/ Z6 H$ A- ^3 M
if(templed==1){+ w0 I7 K% B, A5 b7 q
led2=1;; S3 x) q, f8 Q2 j8 H3 N9 u+ W; R( d
led1=0;
) M9 _, q3 a. P( q1 A' X- I* F) y led0=1;$ K8 Z+ ]5 _3 o0 j
}0 ]# k" l$ F R; @: r3 a
if(templed1==3){ //恢复紧急状态前时的灯状态 南北方向
) c4 M5 i# H+ B7 I: U! d- { led5=1; //熄灭其他灯! p/ L& u9 D( e, ^/ K8 Z7 D
led4=1; //熄灭其他灯! A1 V& N" i& |# z {7 B
led3=0; //恢复灯的状态! l& u/ j% s1 H( l" {2 a/ q
}
+ a) V I" Y+ @! |; ]) { if(templed1==4){2 j' [, u& K9 v0 @$ |! I" @! b
led5=1;/ J4 l8 i F2 E6 \
led4=0;4 a1 K5 K3 c# `$ S" _( g
……………………/ J6 Q, R, \- j& K7 t
* i, E5 c# ~7 x/ x( f, |. ?+ d' s…………限于本文篇幅 余下代码请从eda365.com下载附件…………
& o" ~( x. @8 z7 _
0 c# j( _0 g) ]( E- i! X" d$ r9 |4 `5 D$ t
. y5 G; H2 |! d2 F5 E8 C0 o
& [! h o% a/ t' F$ s6 x |
|