|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机原理及应用课程设计论文-交通信号灯模拟控制系统 2 u* J# i% X" X6 _" N9 ^
单片机源程序如下:
9 S3 x1 U" P' K; ?8 D1 l, r
1 A0 a( [+ s, b% o4 x/**************************************************************************************6 F2 ^6 ?$ R% q9 E# V
* 交通灯实验 *
8 g# @$ V5 T# `. D4 h2 c u4 O实现现象:模仿交通灯运作
7 c; |. K% D8 v$ B! k" G注意事项:无 # M' x/ h- h+ |* i; O% b
***************************************************************************************/
- b/ @1 ^2 k2 M+ V# ?7 F$ t# q6 D# _) H
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
- \( M% W. m/ b9 r% ?% l4 I5 {4 s0 y% [' ?1 o
void delay();
1 |, L6 x! q% F+ q. Bvoid display();
Q4 M3 }7 q4 |; O/ Qvoid TrafficStart();1 P N7 D! F; x9 s, ]1 i* b
void TrafficStop();
; s* s, ]) ~. Z; ?9 E' O1 rvoid ledInit();( s5 L; J4 L7 J2 F* H/ O/ M( n
void changeNSpass();$ n" U7 {' O# p5 X F0 p
void changeEWpass();& h( @$ v! @, h2 Y
* ?, J& O" e/ ]6 y8 Y; j
typedef unsigned int u16; //对数据类型进行声明定义8 w$ g& X0 Q" Y4 T' D
typedef char u8;
3 C3 [0 F3 u, \/ h: Y3 i; f. p2 a9 r
2 t- S% \- Q6 V$ cu8 code table[]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8,
8 G& Y. {% \8 e: Q 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e};
0 m7 N; m# b7 uu8 code stop[]={0xbf}; //1011 1111 4 J. t( ?( S, _9 ?8 Q
$ w: t6 ]( {: _# w% W& J4 U' ]u8 time1=3; //东西方向 第一位数字
# {1 H/ q0 o' I8 S. g7 w8 `' nu8 time2=0; //东西方向 第二位数字- {% y" j( R( K! a5 X2 D( e
* d* I$ v9 Q6 m! R
u8 time3=2; //南北方向 第一位数字
0 F9 [1 ]; d$ \u8 time4=5; //南北方向 第一位数字
# T, ]( l5 U H$ g: `: r/ F0 o1 Y8 a& v! r7 P
u8 change=0; //东西方向状态改变,初始为0 0为红灯 1为绿灯 2为黄灯
1 ]% u% C3 x7 s% ou8 change1=2; //南北方向状态改变,初始为2 0为红灯 1为绿灯 2为黄灯
: v4 |$ ~1 j2 u' z# z0 Q1 j5 a0 g$ p% f+ N- I& y
u8 ledset=0; //紧急状态标志位,0为允许紧急状态启动
# v- C) S/ a1 [2 g# W' Du8 templed=2; //LED灯临时记录,初始为2 0为绿灯 1为黄灯 2为红灯5 v) t' Q8 v6 W* C7 I
u8 templed1=5; //LED灯临时记录,初始为5 3为绿灯 4为黄灯 5为红灯
& |+ i. A, u. F A
' e2 \9 u( j& H0 D6 hu8 count=0; //紧急状态按键计数
7 g6 g3 p1 d% J$ e2 p1 b `4 r# q* p3 H. du8 count1=0; //方向转变计数8 G$ ^# B- `, W+ \% u- m* o2 B1 G
H; F0 Z+ ~; F( T/ k+ {. asbit led0=P1^0; //将P1^0口定义为led0 绿色1' ^, {- c3 f0 }) ?0 _0 {
sbit led1=P1^1; //将P1^1口定义为led1 黄色1
, N" O; X, r! O5 t8 [: J' ssbit led2=P1^2; //将P1^2口定义为led2 红色1
3 z- a! e! A8 _3 Vsbit led3=P1^3; //将P1^0口定义为led3 绿色2
" O' S4 W' X) |sbit led4=P1^4; //将P1^1口定义为led4 黄色2: j6 c# W$ X. |/ E) `, L% S# q8 N3 F
sbit led5=P1^5; //将P1^2口定义为led5 红色2
C. Y& }: s S. L( F4 p
6 j- d: ?; c" [sbit CK1 = P2^3; //东西方向第一位数码管: M: X( m( D1 c4 b$ j x# X& [+ O
sbit CK2 = P2^2; //东西方向第二位数码管
! W, f8 r: A- j2 p% j
; z/ F6 |8 L0 o( v D0 r+ hsbit CK3 = P2^1; //南北方向第一位数码管6 S7 }( @" C0 F
sbit CK4 = P2^0; //南北方向第二位数码管
8 a' r% \& I8 [* I9 q8 S
9 }3 K9 N8 m# M: U- S# Dsbit key2 = P3^0;
' c& w& L1 X: j) Q3 Rsbit key3 = P3^1;/ }( Q7 X q! ?" D% {( z4 ^
sbit key4 = P3^2;$ o4 F& O) y& _, ~% f
- D8 \. M$ o) R2 I, M# `; w
void delay(u16 i)
' m+ S# W2 \/ K# X% _{* T4 h9 W7 [4 z
while(i--);
; I. J2 H4 N P( h) ^, F} } I& e- Q: v; X
) E6 N. N' I. A3 Wvoid display(u8 time1,u8 time2,u8 time3,u8 time4);
3 f A, A# r8 M7 H7 I/*******************************************************************************/ T& \2 q$ `2 D9 R/ ^4 c$ [
* 函 数 名 : Timer1Init
: I7 a) {" v' h3 {* 函数功能 : 定时器1初始化/ U' \. q# o% E; c! M' z! ]/ s
* 输 入 : 无
+ R% x/ j. B7 U" f6 f/ S. C2 r* S* 输 出 : 无
: i1 {! S' S9 q5 C2 T( A4 X% ]2 i*******************************************************************************/
+ O' }, U1 q$ P: svoid Timer1Init()
1 _/ m% s7 {% k* g3 ?- P{ a$ G1 W7 Q+ o) P
TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
- f3 y4 V5 h0 W1 x( @" N* o
% e; Y$ ~5 p) F$ |) B% ] TH1=0X3c; //给定时器赋初值,定时50ms
0 ]" }. A3 {8 D2 H: o( _ TL1=0Xb0; " D7 s: |9 f0 E' J. ]
ET1=1;//打开定时器1中断允许( @# d% ]0 v+ a% w' ]7 }) C5 W
EA=1;//打开总中断: K. Z! F9 c% p9 \
TR1=1;//打开定时器 & C. j, g6 k6 B P5 M
}
# P4 G: A$ L6 K3 g" p6 V0 @' C! u: {7 x7 a7 R1 H, i _ U. l( e
/*******************************************************************************5 B V+ ] B/ A% B9 r0 A! N
* 函 数 名 : main7 T; Z8 h' A8 L8 _
* 函数功能 : 主函数% Y* ?4 A" \8 C4 _9 I8 [( O
* 输 入 : 无
, P# o4 E- n! S' Q5 ^% G* 输 出 : 无- [5 j3 M" ?$ I/ C1 d- ^* ]
*******************************************************************************/
7 R$ [2 z; C9 Q c* K9 xvoid main()
# ~. o7 A- h, O; B- Q/ t& L6 V& l: Z P: x{ % x; G6 r- ^- \; P$ f6 O0 Y9 e+ ~
CK1=0;
9 W: N- H# T4 x* r3 x- w" m CK2=0;. j5 c' c# F' Y- N4 G* S
led2=0;
# V6 z' a# w! @! w2 L( Q+ Q' J led3=0;2 K- `. F1 Y4 P$ _9 l: r0 c! c
Timer1Init(); //定时器1初始化- b+ G1 z# [5 V% {3 _ L
while(1)/ B+ Z2 H k t5 K6 T1 e
{
/ O( Z; R. l/ z6 H//*******************************************************************************
: i. Q. m' I* I if(key3==0&&count%2==0){ //当按下key3并且状态为运行状态时有效
/ |, w b( N% t: V3 o- ^ delay(1000);& [9 P2 r% A' s# ^
if(key3==0&&count%2==0)
/ ^! u' e: n P# I. o: V { 4 D" G" c; H3 N3 v( |4 b
TR1=0; //关闭定时器,防止切换时仍然计时" I2 W) A; j- f5 `
count1++;
5 q+ f. s% h9 ^: I8 \9 y5 ^ if(count1%2==1){ //(非红灯状态下允许执行)
' }+ ~. p& @' c8 I/ U TR1=1; //打开定时器7 d5 {" w( S1 m0 J4 @( D9 d
changeEWpass();
3 l/ O$ Y& O+ n' }/ y$ k9 E }
2 x2 F& G4 l7 @2 f1 e6 } if(count1%2==0){
6 \! r8 {+ o# n z* j9 I) M, L TR1=1;
( [7 R% ]4 u {' v1 v' l r changeNSpass();* t1 Z. S) p5 Q3 ^
}
9 ~# ?' r2 p0 p) g- }6 A }
% }6 G& p$ n3 x0 g2 b while(!key3);
) s- e8 t5 Q! j }" @5 ~; Q) e# ^5 N
//*******************************************************************************# y! W$ t3 Q I" U
if(key2==0){
) P/ w; c O3 p$ F, J delay(1000);
3 y# ]6 o; X* A2 ~( @$ J6 f( f if(key2==0)5 h- F0 Z D) x) c6 o' k! i
{
4 s$ o: K6 L3 i( G8 L$ h count++;& r' q1 ?: b2 i' w
}7 [7 n; v2 [- B
while(!key2);, h- M) a' k) I4 w% E$ k
}
' N0 h6 U: m9 C4 {6 H( W* p7 f. ?. {9 ^9 d0 a/ [# W% t3 K' v
if(count%2==0){ //为0则将状态恢复为运行状态
2 B6 B8 ]- M: d( \) z+ K; g if(ledset==0){ //判断上次是否为紧急状态
/ B+ }7 d; P1 P+ I, k ledset=1;
9 f- j2 T* e3 L2 f! ]6 b ledInit();: [+ e- N7 H; h8 `
templed=2; //东西方向初始化为红灯,由于执行了ledInit()会改变它的值,所以需要初始化,防止上个数值再次被利用(实际上只需要非0或1就行)
9 T! P2 f+ V# |4 Z6 u: g! q templed1=5; //南北方向初始化为红灯,由于执行了ledInit()会改变它的值,所以需要初始化,防止上个数值再次被利用(实际上只需要非3或4就行)
! Z# `! f7 e# ? c+ G9 t }" i& N% d0 c# r' v @0 a
TrafficStart(); //正常状态下while会死循环该语句,该语句为动态显示数字函数" Q- H2 |5 A0 `% T% E; x
}: L% f. `" g9 y k- a: r
if(count%2==1){ //为1将状态修改为紧急状态5 x) N3 a/ ?5 \( s9 D. Q4 o: Y
ledset=0; " ]* @1 h N0 |0 E O
TrafficStop();
2 B+ z* [" a7 I0 A) s& C }
0 [9 q" _3 d, ]; h8 R# j$ q" m5 Y! A* S( G V
} i! p2 R2 l; H3 c7 g1 K' t: [2 C' m
}
8 h- ?7 ~: F6 |: S% D3 i% }% h- w) z! {- a; w# i8 j& l" X
/*******************************************************************************( d% _- n- {8 B8 y/ R
* 函 数 名 : void Timer1() interrupt 3
+ `5 z/ K! u% ?/ ]" G* 函数功能 : 定时器1中断函数
* d2 i9 u" S5 o6 q4 @: o9 [% q( w* 输 入 : 无0 E- V# b3 m4 h" J
* 输 出 : 无5 N. n. D7 p8 J' L
*******************************************************************************/. _* [6 `4 ]- {. N+ _6 s9 y
void Timer1() interrupt 35 ^ j5 g) |2 M' [6 M
{
) |+ Y2 M$ u3 \* @6 v, K static u16 i; A y0 S- @8 \! c
TH1=0X3c; //给定时器赋初值,定时50ms
6 B' ^$ V' l3 G! [/ \: ` TL1=0Xb0;
. P0 @4 H. s2 T Z0 i i++;
( `, [1 K. h& T o if(i==20) //i等20时为1秒/ M9 n7 }4 w0 b0 o3 w7 `
{
( S9 z8 ^( v3 [ i=0;
; v2 n+ n# v9 d6 S7 Q //-------------------------------------东西 方向-------------------------------------& D; d- m+ K! k" u' Q- {
time2--;
! `8 O# n9 A+ H) }; K9 [ if(time2==-1&&time1!=0){ & H7 ^8 M$ P! [. ^0 x! Q
time1--;8 f& T. Q( l9 s4 q
time2=9;" W! ^+ @% p, Y. T( f
}( R1 x7 G& a" G/ w l; s5 i
if((time2==0&&time1==0)){6 @1 G: p! m6 a$ _' O5 @0 s
if(change==0){ //东西方向 如果为红灯% ~. D, \/ [# y5 A$ U; j6 t
change=1; //下次为绿灯/ }$ K4 O# V$ x! u/ D! W
time1=5;
. m) c9 r# j/ x6 r' ~7 V3 g& A time2=0;6 d+ A; c) D" w' {4 y- i
led2=1;
/ b$ p7 m$ R7 a- `" W led1=1;
1 P7 Y% D( ` Q# O' y led0=0; //绿灯亮
- N6 k4 X% S4 N' z9 y5 R count1++; //红灯转绿灯时计数加1,否则执行方向转变时按键会无效(闪一下而不变向)* Z) a. W2 n1 ?) e4 f; h
}
; S' s0 J$ q0 H2 K& k* c: e# O else if(change==1){ //东西方向 如果为绿灯* ^& q/ z2 p) D- A7 v' v
change=2; //下次为黄灯) S" C* m2 W% E+ [/ e7 w! x4 y
time1=1;; F7 H, t9 j7 J1 J; ?" s4 v$ g, V
time2=0;& \# f5 S6 m, b$ [, M' s
led2=1;
; b9 z/ `. m' g' G: U led1=0;
( s4 F" ?8 D$ J i- v% v, n6 a led0=1;8 }$ q( x- Q4 O/ U6 n0 c% E7 w
}; g" I. m. C$ _
else if(change==2){ //东西方向 如果为黄灯; Q1 v0 J+ g/ `4 u! p
change=0; //下次为红灯# J6 ^9 ^- r+ }
time1=3;
0 z( T$ j5 i6 D/ z/ K1 Y, o. U time2=0;
, h' J# t! O# J' b5 b3 Y- i led2=0;
- Z8 g0 P; Q: V' ]; B& F2 P. D led1=1;8 e* ]8 t& H' A- f: Y9 F
led0=1;
* R1 t) ~6 e/ y( p4 R9 e
6 |; D) ~" T5 E+ K7 R! d. ]0 ~ }
; L" Z% Y% `! v% B6 A: h# m1 q }& V5 T" _) A! @/ \- Q2 z
//-------------------------------------南北 方向-------------------------------------( K* J0 ?; q+ Q) o; o' A
time4--;
, \5 F( d* O) Q, O2 | if(time4==-1&&time3!=0){) {# M0 h9 g' y1 v; D% K
time3--;4 i0 t5 `9 p: X0 ^2 t$ {/ {: J/ v
time4=9;) H5 O. P. b- I1 q8 w+ b' q3 U% G8 t( N& a
6 }9 E* y8 m4 k7 s
}
1 y# R( l+ l' x$ x6 s- O if(time4==0&&time3==0){
" h, } |9 ~) ^ if(change1==2){ //南北方向 如果为绿灯, E1 O7 l# |; a3 M
change1=1; //下次为黄灯# v" x- v7 z7 {: W
time3=0;1 `$ `6 b( K& I! R) ~, U
time4=5;3 u ?+ f9 A D# f b6 F3 c& ^
led3=1;
/ b0 v3 T. _( k* q3 }% {8 s3 U" O led4=0;# o/ ^, |" Z' V2 Y" U3 E7 Q
led5=1;
7 W8 W6 C# j" b5 J: F }5 [ x5 H w2 h$ F
else if(change1==1){ //南北方向 如果为黄灯" k1 {4 Z1 t* j
change1=0; //下次为红灯
7 @/ i2 M( O- U time3=6;
4 p6 y' h" v4 m. j0 @( R time4=0;
. K! O5 Y+ @+ R$ l) C n led3=1;9 g% \, ^4 z# V l; M
led4=1;
1 n. F7 ?$ T) C led5=0;
" H5 \4 h* J: K8 Q }
# C3 i# b: H, |3 ~7 } else if(change1==0){ //南北方向 如果为红灯; k# Q) g7 C }; M
change1=2; //下次为绿灯6 W+ E e+ Z2 p' u9 {8 F6 b5 f7 ]
time3=2;
; k. H! ^ p. f- w time4=5;3 m4 n6 I. j' M) d
led3=0;" t! P3 b- Q2 F# x
led4=1;
1 c$ Q% U2 m1 o6 c# O/ q led5=1;
* n3 z8 X/ g6 f1 l* p count1++; //红灯转绿灯时计数加1,否则执行方向转变时按键会无效(闪一下而不变向)4 u: J8 _& t! N4 _: K( q! K6 }
1 ]3 }# g! h3 M, _3 s" L% L4 S }' ]; Y: T, E$ }7 M" t4 Q N) a3 K
}+ o; T2 `. D% r/ Q ^1 e
//------------------------------------------------------------------------------------/ [$ H5 f- x* j& A# j
}1 K% S% _. M* c( u
}% d, y& [# {; M a# e
5 N. n0 t- ]3 q% S" L W# o2 kvoid display(u8 time1,u8 time2,u8 time3,u8 time4) //显示程序
+ `2 a5 e3 p. v& E$ h{ ) Y1 Z J2 L' B- W
P0=table[time1];
* e( D. c. m. `) J0 }" j CK1=0;
, V, t- U; }$ a A8 x0 t* B3 ~5 M delay(100);
$ S3 R# @3 B6 Z CK1=1;. ?, a" X) s+ x8 c6 ^
# a3 F& Q9 Q: @5 s
P0=table[time2];! Y2 Q( G$ V* z& s+ K& ]$ k# ^
CK2=0;
. J7 I- V ~; ^: p8 Y B. M delay(100);
0 r5 V% Y5 h: N CK2=1;, B- _4 S, V& Z, @- K' X* a
2 M/ j7 k! Q( Q- y( a; @ P0=table[time3];. ^ ]# O7 A0 u! K
CK3=0;
7 D% @& Z' @" J. H8 w: @, z delay(100);
# Y5 c1 }$ ?9 T+ h CK3=1;0 S2 z) p+ T9 W G0 `
9 d* J/ J. T2 `& c+ ]
P0=table[time4];
" S) z$ ] C% i w& k, d CK4=0;
( \$ o9 o5 w1 {# W delay(100);
+ ?+ g& G- W: G CK4=1;: P* ^# w) N/ ~9 D" Q6 q. C
}5 T& J4 F' J: g# B9 k' Z5 e( C
1 \ k$ A, A6 B0 U+ I( X
void TrafficStart()
( d' ?9 _7 P- ^" h! V{
- |0 c5 O9 ^4 s- P TR1=1;//打开定时器
: f! W0 Q% ^2 T; n display(time1,time2,time3,time4);
4 [. K6 n' _0 D' l2 \( y" L: u6 Q}
! x/ Q! T+ D; |& {4 u/ Z0 l* h4 W; W6 ?/ w1 a
void TrafficStop()% l) s* W+ Y6 W8 g
{
" d7 l* X1 @' _5 F* g TR1=0;//关闭定时器' Y- V0 J7 \8 a8 j+ F; o
CK1=CK2=CK3=CK4=0;1 g( I S$ l- Q$ I
P0=stop[0];: W% x0 z1 K% h& u0 x
if(led0==0){$ o4 h: N( Z, m3 ~
templed=0; //记录当前灯状态 东西方向$ P, d y/ w) ^& P! r7 Z' ?' L! \# n
led0=1; //将原来灯熄灭
$ U& p8 T) k" e% T7 K; Y2 h6 S led2=0; //亮红灯
, ^: X/ @& I: J4 K5 y! } }
( E) D; n1 p5 u; S if(led1==0){
# p: p- a$ f; _+ [# ~" y" ~5 g templed=1;
! S; Z" w5 `+ U8 W led1=1;) w3 Z7 N2 D% E2 K$ }6 ^2 R
led2=0;
) V v; i" i5 V6 x0 G/ z }% T8 E |( p0 k0 e- y! M/ s# P
if(led3==0){
+ d5 {. g7 U5 n/ |% E templed1=3; //记录当前灯状态 南北方向
5 T, h9 B( W) K, r# F. d led3=1;7 s8 H% X" D* {5 G7 V
led5=0;
! {# O. ^5 l8 j- u8 R4 z* _ }
{: W2 n/ E8 }# D! k if(led4==0){ p/ o/ F4 Q* _5 {! O
templed1=4;4 r6 q6 ^. G; [; R& A' ^
led4=1;; ^5 N( }' O( |& c# r ~" |
led5=0;8 J9 S1 ~; U& w$ _: R* o, `" F
}
' }, g8 J/ M) m) _- ~# n- l) @} N+ Q0 l u/ T
8 v* y- L9 g5 j4 H' J1 s$ uvoid ledInit()
: Z$ y6 L4 r& V4 E* C. f{
. ?5 E3 m5 Z. S8 ] if(templed==0){ //恢复紧急状态前时的灯状态 东西方向( [9 K; O3 h% ^3 j, ?. _
led2=1; //熄灭其他灯9 H- Q6 o# `9 ?, y
led1=1; //熄灭其他灯
6 A% R# g; h; o. z- S T led0=0; //恢复灯的状态4 z! u: v! S/ d" t' V
}; d( X, @; h0 l5 h' u2 L/ A7 i
if(templed==1){
: M# j# |1 K0 n& i# g7 J# m& v led2=1;. v5 Z! G+ w0 u# O: I' K
led1=0;* r* ^+ W* S/ C
led0=1;
; W8 w) \+ i* k/ s, P }
/ J3 A5 I5 u% [- B( z if(templed1==3){ //恢复紧急状态前时的灯状态 南北方向/ e& X5 S' N& w/ E- e
led5=1; //熄灭其他灯! h/ j2 H# ~( F
led4=1; //熄灭其他灯, U# ~- N5 J' V# v0 x( H! G0 ?9 b
led3=0; //恢复灯的状态- m' v H' p4 p
}5 k) R8 O& t' O$ q8 v, X) O4 |! g* n
if(templed1==4){# \+ R1 W, _" S* k1 Y6 H8 j
led5=1;
8 c) n1 e7 n' C; `$ k led4=0;
8 N( E# O8 I1 s/ ]……………………
$ n, a4 K. S* n! o& |# g6 c
# R7 I2 V7 ?: u. ~ p* k9 z…………限于本文篇幅 余下代码请从eda365.com下载附件…………1 Z2 j! h( V! S0 Q: @
* R! R( Q; {1 \$ C
) D; D8 M. S8 h" _0 d0 `
2 z1 B3 ]& s; I! f- U8 P3 o, y& f' o# f& B
|
|