|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机原理及应用课程设计论文-交通信号灯模拟控制系统 ) j+ J3 p+ Z) U5 f3 c
单片机源程序如下:; V6 q% }+ K4 U5 `, N6 C e
) z% g+ Q! \! ]& J
/**************************************************************************************
! V3 F+ g* ]7 g9 Q* 交通灯实验 *
( S! b/ F: Y! s+ R# U实现现象:模仿交通灯运作* @9 a/ J( ?: t: d$ s. r& x9 @
注意事项:无 6 ?3 @+ z- D) c* }/ \/ p# S
***************************************************************************************/
2 C" R/ t/ G' U
& v. g, R0 F4 o! H#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
% `1 b( Z, J. c
& B4 j3 {6 ], P* cvoid delay();
5 X. J1 d. k0 P/ M" J$ gvoid display();
, y. j1 s- b, T( i6 C0 ` Rvoid TrafficStart();
. n, F; p) h! P `% Mvoid TrafficStop();
0 V; F3 H5 U6 z4 ^/ svoid ledInit();: s3 Q5 V& l4 ]3 h
void changeNSpass();
* i6 z; p [8 h0 ^# \void changeEWpass();
& C* f+ \: r* R1 p# I( q
4 D7 F! u ~' q8 Etypedef unsigned int u16; //对数据类型进行声明定义
3 E9 T R- I6 Gtypedef char u8;8 v; W! R( V; C- E
2 a) Y7 T( r6 O+ R: ~" h6 Y
u8 code table[]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, % b& _. D+ B: c5 t# a
0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e};9 a: R) q6 r( _2 ~" I& f3 _9 ?( j. A
u8 code stop[]={0xbf}; //1011 1111 $ Z: v3 Y3 s) \9 P
+ q T" ^) R3 E8 x" {u8 time1=3; //东西方向 第一位数字: Y) n4 ^5 E' w1 F
u8 time2=0; //东西方向 第二位数字# U1 b; `( }. U/ m/ m) @
7 {, w ]0 h4 y/ Q
u8 time3=2; //南北方向 第一位数字
; m; ~* E, n: Zu8 time4=5; //南北方向 第一位数字
- D) H m% f% I) C3 L; {7 H: s, S2 ^ v1 Y8 d& _
u8 change=0; //东西方向状态改变,初始为0 0为红灯 1为绿灯 2为黄灯
- [7 H M$ d R( {7 F) r: G6 K* Fu8 change1=2; //南北方向状态改变,初始为2 0为红灯 1为绿灯 2为黄灯
# ]3 E% F3 _( q) C4 ]6 O' O/ I1 G' z8 v S6 M" m
u8 ledset=0; //紧急状态标志位,0为允许紧急状态启动
! F' p5 C1 E( _u8 templed=2; //LED灯临时记录,初始为2 0为绿灯 1为黄灯 2为红灯% Y# [+ x% } `; w0 L2 U
u8 templed1=5; //LED灯临时记录,初始为5 3为绿灯 4为黄灯 5为红灯! }( z8 `' ^; S
: c) S* e9 h% n* a2 G
u8 count=0; //紧急状态按键计数
, L$ m* e/ T! Z8 y. j) Bu8 count1=0; //方向转变计数
& N9 A6 L# n H4 \$ ^. I+ K
+ Q- S- W( }& Wsbit led0=P1^0; //将P1^0口定义为led0 绿色1
) t* C( O0 {5 H- E" |5 l }+ e4 [sbit led1=P1^1; //将P1^1口定义为led1 黄色1
- g! D# k; K, M8 z$ r+ `( msbit led2=P1^2; //将P1^2口定义为led2 红色1
$ V9 ^3 I# ~; ?! l1 p+ i0 bsbit led3=P1^3; //将P1^0口定义为led3 绿色2
5 L) k$ }1 H! f. p" c( I( asbit led4=P1^4; //将P1^1口定义为led4 黄色2, g* L: A5 w' w$ _1 p( n
sbit led5=P1^5; //将P1^2口定义为led5 红色2
% ^3 v; o) h4 V9 `/ \
7 O( k5 }4 x0 V# Ysbit CK1 = P2^3; //东西方向第一位数码管
: h# w2 L% y; h* I& L0 d4 Ysbit CK2 = P2^2; //东西方向第二位数码管
9 @9 ?/ k% o, H0 @
7 y- f' g r, R& |+ ysbit CK3 = P2^1; //南北方向第一位数码管
6 l5 n/ @4 A1 o/ p/ ^# Fsbit CK4 = P2^0; //南北方向第二位数码管6 K, m2 @6 A2 E5 N: y# @, G
- V! X; e9 i% G% v
sbit key2 = P3^0;
|5 B K5 r( u) Zsbit key3 = P3^1;$ B0 x# A/ |; h6 ]
sbit key4 = P3^2;, M1 d h0 _2 Z/ o
, T2 |3 f, f) T9 e3 U f5 N( [( Fvoid delay(u16 i)
# \" |5 K5 n. `{0 `3 F# }2 G, I' a" n! ^
while(i--);
G8 X1 D0 y2 ^; A" y}
0 v) I0 j3 k' a* d) _+ I9 }* y4 {3 e0 i) |. Y9 o3 o/ _( J
void display(u8 time1,u8 time2,u8 time3,u8 time4);
- e" i# c6 ^! f& z8 d/ ^8 O5 U k/*******************************************************************************
# b) ?+ p6 O: P! a0 e. J* 函 数 名 : Timer1Init. W/ [3 Q L/ I
* 函数功能 : 定时器1初始化
: L% b' g- N9 v A* 输 入 : 无6 j- z H. ]& z1 I% w q% n9 T
* 输 出 : 无, c/ e* | ?" @: S. ?' \
*******************************************************************************/
" m; t; x! e! \( ^void Timer1Init()8 H& W- H3 i- A8 x+ \) t2 I( g
{
/ l, K- N2 o5 B; u1 R- B TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
- f- D5 }9 q8 Q& c `7 X+ Z0 _( z" a( l3 W9 o# r" F
TH1=0X3c; //给定时器赋初值,定时50ms
K* d8 Y2 }2 T( y H+ r TL1=0Xb0; + V2 `7 R5 A2 V; _- W
ET1=1;//打开定时器1中断允许
E( S0 O" T8 T+ I! j0 ^ EA=1;//打开总中断$ e# ?* n% n t: p+ Q
TR1=1;//打开定时器 0 u( B9 L1 r m, m8 ?8 k
}" K; W' w8 v+ L: {
/ g+ Z ?# P& R7 {; s+ E* `7 l/*******************************************************************************
! r) r7 Z1 L% _* 函 数 名 : main
( _/ p) g! G0 U6 d5 S6 p; P: V* 函数功能 : 主函数6 ]+ r0 ~2 R& v$ p! s6 I$ Z
* 输 入 : 无
0 |. P6 z5 e0 K0 _9 N% f; {* 输 出 : 无
" h, d2 c4 g# b% v5 m1 m3 t1 a, f*******************************************************************************/
6 L8 G3 y5 T$ |0 Mvoid main()
' W) l1 J9 d" E4 B3 S9 j% E# O{
h g& |! B' S2 `! W4 k CK1=0;& u s1 V# W4 Q( a* _; f
CK2=0;
# J( e; w* H5 y; ? led2=0;! _6 b6 ~+ p; v$ p
led3=0;
( M! U- J* y1 b; j7 a1 n$ c+ o Timer1Init(); //定时器1初始化' G. _- j4 g* n) S W+ z6 r; F; Q2 F
while(1)
+ X- [" d2 z+ X! |+ V {
# {* K; R3 g' U% f//*******************************************************************************
( q8 ~/ v+ e7 i if(key3==0&&count%2==0){ //当按下key3并且状态为运行状态时有效4 m' j5 D, W- }$ l: l' h* D
delay(1000);
2 c% F" R! j, p* g; L M if(key3==0&&count%2==0)
3 \0 y2 e3 n$ [0 c4 f8 i {
, m& T2 z. @* F1 B5 J% G4 Q TR1=0; //关闭定时器,防止切换时仍然计时
" Z0 D$ n+ n( _3 y `" a; d w count1++;
7 c% F/ I# U$ `+ Z, c1 E* r( B# V3 k( f: [ if(count1%2==1){ //(非红灯状态下允许执行)1 m; C' f: a D- E
TR1=1; //打开定时器
, X9 a( x, j) E* v5 O2 I changeEWpass();& O* l" t; P+ i) m C7 }
}
% K4 w; b6 x. n i; d4 z4 Z5 n0 Z if(count1%2==0){
4 K+ N- T$ t& D5 { TR1=1;6 P% n" k, i3 G+ r( l3 e& q
changeNSpass();
7 l( H" d6 R, }7 V$ q }* b$ @( M! u1 N$ J( \' }$ j1 U! _
}
# G( \8 j% K K& X while(!key3);0 k* B& i* r5 V w) i/ M( x7 D
}4 Z# y0 L& R, O1 [: n
//*******************************************************************************! R/ w5 K( ~$ B5 u/ v* r: p
if(key2==0){+ F7 X+ b' j# l2 Q" |+ P
delay(1000);$ R. ?1 b2 E5 l6 e
if(key2==0)* d* m" W9 W% T4 s2 E% H8 v
{
) E, `! D8 ?* x& ], e$ _ count++;
# N. i6 f: ?4 a/ m1 |, V7 b }
, B# ]1 o: t& Y$ @ while(!key2);
3 N; Y0 @& ^' F# W0 f }" w$ g+ w8 S5 @) n( b6 p
$ H" O+ `+ P/ c if(count%2==0){ //为0则将状态恢复为运行状态
# ?; L+ D- M; h/ E. S9 P if(ledset==0){ //判断上次是否为紧急状态0 \4 I: j7 [: n+ O0 {! ?
ledset=1;
/ x& F3 c r9 u7 D c5 p4 U ledInit();
7 a6 q: _3 |$ M9 G: I templed=2; //东西方向初始化为红灯,由于执行了ledInit()会改变它的值,所以需要初始化,防止上个数值再次被利用(实际上只需要非0或1就行)+ q7 L4 a7 p+ P
templed1=5; //南北方向初始化为红灯,由于执行了ledInit()会改变它的值,所以需要初始化,防止上个数值再次被利用(实际上只需要非3或4就行)
/ G5 ^ C' \0 f' ~; }/ a U }# @3 Q+ j, Y+ W9 q i8 ^3 P
TrafficStart(); //正常状态下while会死循环该语句,该语句为动态显示数字函数+ B: b3 ^5 K3 N' A; E! U
}
% H8 I' u' {2 m4 |. A( D5 C7 H9 y if(count%2==1){ //为1将状态修改为紧急状态+ z7 Q/ j; H+ P7 g; G
ledset=0; 4 R I/ l# o% j' U9 l. a
TrafficStop();7 j7 Y/ u8 {( Y' s1 c
}( |8 M/ O6 M. O8 U* L% U% h X
3 b6 I" [7 A& f6 }, b } 0 ^) G" ]( G0 W- R0 |& `1 l
}
$ I' Z6 b! r6 S2 @# G p& e {; M' N" H9 e8 z! ]- Z
/*******************************************************************************
, y2 l+ N2 [4 L/ _6 P. A8 |# \- g* 函 数 名 : void Timer1() interrupt 3
8 b+ B; \; S) a$ Q! A4 K7 e* 函数功能 : 定时器1中断函数1 f% h( U0 `- g% o0 G+ F
* 输 入 : 无) x ~% X; N, t D
* 输 出 : 无
5 m& B! T' N; y; z*******************************************************************************/
& o$ l. q: a& {, Uvoid Timer1() interrupt 3
% b9 e8 U% ^' R0 z5 j{
& i9 [9 V2 y6 ]" M2 T( L static u16 i;
1 h- u) l' G- [ TH1=0X3c; //给定时器赋初值,定时50ms
) w# z* {: } e% f TL1=0Xb0;# u6 b7 c6 o7 Y3 V: w5 g, s; [
i++;
) f! h/ m$ F* W8 D if(i==20) //i等20时为1秒
1 Y6 F: h( e9 _3 ]' E: u# Y& ] {6 u3 d1 L6 s; ~- l5 W2 A
i=0;
3 |0 |- a2 @* x) B2 C //-------------------------------------东西 方向-------------------------------------1 K, b7 Z2 j- \( ^+ }2 [
time2--;! E* w* M( s' m( {# M. K& j4 g6 w
if(time2==-1&&time1!=0){ ) t' D* ?8 b8 M B. a! J8 n1 z1 L
time1--;7 c" c1 m4 W- W; @+ ~
time2=9;
7 @1 \$ h) f1 K& b8 V$ z* G- ] }
# R4 k& R- P! P2 n if((time2==0&&time1==0)){3 Y% a @9 O5 ^, k; E
if(change==0){ //东西方向 如果为红灯% ^; H- \! E/ B0 {
change=1; //下次为绿灯
9 ~9 y8 e4 H. _" O7 W2 G2 f time1=5;
. z+ D2 i) z3 g- U time2=0;" W% E8 P1 I' _8 N, r4 _& Z0 \$ @ d
led2=1;5 P3 o( F# V# ~5 D
led1=1;
( j% A# `0 l F led0=0; //绿灯亮' @$ f8 A; s" [* [ W* W
count1++; //红灯转绿灯时计数加1,否则执行方向转变时按键会无效(闪一下而不变向)
f/ `& V! M$ k) X. p5 s. _ }. e4 V- m' V2 q# E
else if(change==1){ //东西方向 如果为绿灯) w" N- N1 O- U5 }& R' C- Z
change=2; //下次为黄灯
5 B$ Z3 o# m2 j/ m/ H. ~. F5 Z+ o time1=1;) f0 A. A' ?4 \! ]
time2=0;
. D% B- j; o* f' I F led2=1;
9 |& r: ^2 [% \) Y/ l3 W) B led1=0;* }1 C: q; q1 _9 r' A8 M* a) s& S
led0=1;- q, i. J* f* g D$ P" Q U9 G
}
* ?' h0 N# L7 W: D$ f+ y# { else if(change==2){ //东西方向 如果为黄灯 k3 T( B# |) I1 C4 j
change=0; //下次为红灯
: W8 v! w" [9 G" Z7 o1 @9 R4 M time1=3;
9 w$ N4 J/ Z+ p* @* X- G time2=0;" D/ n# a8 T3 v# t
led2=0;
# D+ Z2 w$ k% M2 C led1=1;" u+ E& }8 G2 K: i$ O" x; P9 P! h
led0=1;
6 D5 S) L; G' Q& b( |* S, n8 u) t7 a- V$ D
}
. R" t! |2 ~: Q8 x4 [ }
: H6 b# j: t3 @) H; q; n //-------------------------------------南北 方向-------------------------------------
- h+ Y3 T+ p! b time4--;8 Y+ X J l. G+ R) G
if(time4==-1&&time3!=0){
# y7 w6 A( j$ {1 R/ _ time3--;
/ s3 M' }% c4 y& Y" Q5 ~1 r* o: Q% Q time4=9;. u- S2 ~) T- A3 X2 C% R4 E
( n& f( i. X7 S# u9 r. F0 i
}5 t( A6 S. Z% e- ?: v1 m% M" M
if(time4==0&&time3==0){
3 V' V" F# A+ X( K5 t$ g if(change1==2){ //南北方向 如果为绿灯
8 P/ T* t) y4 p$ I; ~ change1=1; //下次为黄灯- k9 Z1 v6 a ^0 i2 n" T4 ]
time3=0;
4 }7 O6 _& a* [7 K1 k' R time4=5;0 T" G' ^2 @7 x) u
led3=1;
# ?0 P. |& C* R! |' r8 C8 m: k led4=0;& y+ O! s. y, A- {# z
led5=1; 5 j1 V( b2 V1 \; a
}
* h8 m' f( B8 u: Q else if(change1==1){ //南北方向 如果为黄灯
) }0 d" _& y t change1=0; //下次为红灯
" L7 ^& R* v. j* P9 M3 O' {- }: i time3=6;
7 y" e! }( K& u" j time4=0;
& r4 Z2 J( H3 W led3=1;" K: W \9 T& A: z5 j# E
led4=1;, w7 m, h" q7 P* H8 @0 L3 n+ k
led5=0;! q7 s" v# w2 {! r& e" M4 g
}6 B( }! u$ G; w8 Z, W9 q- m
else if(change1==0){ //南北方向 如果为红灯( L5 y. i3 b: c" `& l/ I6 U
change1=2; //下次为绿灯 c6 C2 a* q1 ?& \% c
time3=2;
4 ^( k4 `) G3 y8 ` T4 K5 l/ L time4=5;( d/ y1 c. R4 p4 W9 y9 p
led3=0;; I) }2 i. l1 ]
led4=1;/ W, B1 T: j7 J" U: x: q
led5=1;' B% I5 `! C, d7 |, v% x
count1++; //红灯转绿灯时计数加1,否则执行方向转变时按键会无效(闪一下而不变向)4 c! d! q& I) _8 o4 p2 q
8 p! {& p- o6 f1 u }
4 u' a; u9 k( ~7 F9 a8 R5 G }
+ W6 n. c- k3 G/ i E1 e. W//------------------------------------------------------------------------------------
6 j" j1 C5 i7 E1 g4 j# e/ m9 q! _ }
# r1 _: q4 c9 T$ L# O}
1 k7 _! h+ v) w2 W) A7 ~( L7 k5 m }
void display(u8 time1,u8 time2,u8 time3,u8 time4) //显示程序
" B1 k: a( e& X. N{
' `! F; T( I" f L) ]4 ] P0=table[time1];
: A# F2 P- P% U8 J CK1=0;0 h; Q9 s1 t: C# ?' Z/ H
delay(100);7 j* o, `/ d' e: N+ z- _
CK1=1;& C& I0 [- j. U; z0 P; c! g! ^3 a
1 a {, s# i4 ?
P0=table[time2];1 ?) j# a& C# G/ P5 ?) ~
CK2=0;/ t$ ?( R3 l5 x8 a+ q* o$ U
delay(100);
9 j) A0 H3 O# N* n" E CK2=1;
# o7 G5 k% H5 H1 w+ d+ |" q1 h n$ K$ _, \: \
P0=table[time3];
: u1 j/ b8 ~; ] CK3=0;
u% G. ]4 H2 }0 m' f4 T8 X- _ delay(100);+ c* r9 x2 z: \( D
CK3=1;
. Y/ ^, a& b, y" P" Q" f
: f- ?0 A3 i! r1 H3 i/ T P0=table[time4];
9 ~+ M8 K, W o3 H, y/ Y6 W CK4=0;3 l: J+ m: V6 [: T8 Z. Z: O
delay(100);2 T4 X% U9 [( j9 ~* z& g- P
CK4=1;
, T; g0 L2 \! S7 F m}1 S1 j& B$ ?% i9 D3 k' |+ z! _
, G6 S9 v6 p0 ^) m! v" K' k. lvoid TrafficStart()+ w& g" m2 I2 T. X+ Z% W& V9 t
{
4 w' |5 g* V3 l+ v8 k+ y5 m! g& F TR1=1;//打开定时器% F0 [- S' O! I. }! v1 q/ A
display(time1,time2,time3,time4);# G( k. `+ A4 R, @6 E' [9 k
}
! L& Y2 ]$ E0 `! j3 O, N/ L
6 E1 D- G; O7 b+ [6 a7 a1 n/ g* wvoid TrafficStop()3 A/ g. |+ ^/ T! O% f+ \
{
+ o5 T( k2 E1 {6 j9 t. u TR1=0;//关闭定时器
! |& e# N7 U& K$ c2 s3 t ~0 r% C CK1=CK2=CK3=CK4=0;, f$ X% x# `/ R7 x0 U5 x; z$ `6 F
P0=stop[0];
! m! q8 U0 V9 u$ o M1 W if(led0==0){/ D% M2 E8 k, g3 O! q( C
templed=0; //记录当前灯状态 东西方向
* u& S/ `) A1 p( C1 b; C- F7 R1 s+ E# O5 o led0=1; //将原来灯熄灭
4 h) B7 W E7 e+ K led2=0; //亮红灯9 A6 i4 r- A' ?' P" _5 ?
}$ l! ^! S% l( g% }
if(led1==0){
' z ^/ X7 b" w6 L8 |6 x3 C+ x8 Z+ J templed=1;
% ^# U: i/ \; M' u0 U; P& x X led1=1;9 Y/ J3 f3 T3 j
led2=0;
4 l1 P; V/ Q, u+ j- l% F, X }
( }% |' Q1 Q6 P S9 x if(led3==0){3 c8 a+ X; h3 B7 W* l( o
templed1=3; //记录当前灯状态 南北方向
9 i2 y* E, M' z led3=1;
( f" l4 L. q9 } led5=0;
5 j3 {% ?) Y$ k% F }/ b9 ~1 e7 D% f! L' o; k# f
if(led4==0){
9 @' p) e! n* M templed1=4;7 B& y9 b+ c8 |( X! V5 _* y) }
led4=1;
2 v$ N# o& T2 G! \+ E5 j" `) \ led5=0;) f* z" ]$ u- n
}
' M) j. ~/ B, M2 I2 P, ^}; |3 E7 B! C- Y+ ]3 q
N' Y9 O/ z( @' `* N: x# [
void ledInit()
' w# z& @) I7 r/ X# A& ?6 j2 {{3 w1 [0 [1 o7 @3 R1 o: g
if(templed==0){ //恢复紧急状态前时的灯状态 东西方向
; `0 K5 T- j% l1 n% n! Q led2=1; //熄灭其他灯% I; J7 b* s* M! n" V0 l
led1=1; //熄灭其他灯
! f; k0 x3 L! I( @0 R led0=0; //恢复灯的状态% D/ q* }/ ? H' J9 t
}
9 c: E4 q4 R8 {( z& } if(templed==1){% | b4 D ^5 R) A) s2 k) O
led2=1;9 s; d% \& l B) Z; @
led1=0;
, @2 d" f8 g! S led0=1;
1 } g9 Z! Q# d& p }4 `/ j- b3 H$ R
if(templed1==3){ //恢复紧急状态前时的灯状态 南北方向' N! f3 R7 x' w8 i: D, ?" C
led5=1; //熄灭其他灯
3 O' V0 K- j3 | led4=1; //熄灭其他灯5 i0 h4 h/ F' c' V& Q; b
led3=0; //恢复灯的状态3 L9 a- r: p: b: c [) x
}
- Q+ N6 f, j# P2 P E' f Z* G if(templed1==4){
4 S+ O/ ]3 X- V$ A9 R led5=1;4 n8 |8 n- o" J' l' I5 t% n
led4=0;7 Z3 F5 C- d# v) @9 V( \
…………………… U" e! o# I* D. X
& E( V. c/ \ F$ t, N% f
…………限于本文篇幅 余下代码请从eda365.com下载附件…………
( M8 I Q: ^; Y+ p" p" O
! ]3 W% I8 f$ R* A' u) d- v" L& M" H, j/ ~4 C1 X0 ~! u& N
5 M3 C4 g8 ^: u2 }+ n, p
4 N; z- v, @" H |
|