|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机原理及应用课程设计论文-交通信号灯模拟控制系统 : l0 Z" @( W' F
单片机源程序如下:
- N) A J: i! T- f3 q- M$ Y/ X6 C- L% ~4 f8 S7 {$ s" h4 e
/**************************************************************************************
6 A) I+ Y$ d* g6 Z4 M9 i* 交通灯实验 *1 }+ L; |0 C. S( p
实现现象:模仿交通灯运作
# \' @/ z0 Z, r0 e注意事项:无
! w* i3 I1 g" S& l***************************************************************************************/
( y; o2 h" T1 @! r6 o3 b8 n/ r6 [9 Y0 x: h# O) I9 ~
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
9 @; Y9 N( u, I' t+ ]* a' ]1 g$ O' ? n9 o! t9 T
void delay();
' F/ b0 ]! O, p- e/ qvoid display();! z, `, u l% P( X
void TrafficStart();- C0 M1 E" U8 K/ W
void TrafficStop();# g: R0 @$ ^! l7 M
void ledInit();
7 E4 P4 x" f" B4 ivoid changeNSpass();
: i' \ \- m$ I/ Lvoid changeEWpass();5 j8 {4 Q' H. Q1 `. U( ?7 I
+ L5 M" ^4 x5 Y8 o2 W3 i ntypedef unsigned int u16; //对数据类型进行声明定义
- |# [" L8 n/ N) { s" J. a- Ytypedef char u8;
& i I/ u1 g( @7 c
8 i; T) {. j9 b% k: q3 `9 ~u8 code table[]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8,
7 g1 o9 P/ K6 I- W6 R7 w% l9 j4 g 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e};
/ s9 [/ ^1 m1 f6 U, [u8 code stop[]={0xbf}; //1011 1111
: J) ^8 r! U; _6 V) B+ x" i4 x; i2 _
u8 time1=3; //东西方向 第一位数字
) H5 R0 L5 D9 A6 Z4 \& ?' Yu8 time2=0; //东西方向 第二位数字
; N+ k z8 E3 R, k" C- u8 i- I0 c7 G+ @2 Z' J
u8 time3=2; //南北方向 第一位数字
9 @( }( o8 {2 v( c {u8 time4=5; //南北方向 第一位数字; V3 w+ W( N# K* R
- y# ?7 ~0 q$ \! K8 O( A5 u L- Z7 S
u8 change=0; //东西方向状态改变,初始为0 0为红灯 1为绿灯 2为黄灯
7 h8 s7 i3 \' W# c# du8 change1=2; //南北方向状态改变,初始为2 0为红灯 1为绿灯 2为黄灯
, T$ Y$ _+ p$ d1 G/ R9 u! T
/ Q4 m. o3 c* O5 k* _7 H3 a- V2 au8 ledset=0; //紧急状态标志位,0为允许紧急状态启动
+ f: ~' T1 I% k# V- A+ Wu8 templed=2; //LED灯临时记录,初始为2 0为绿灯 1为黄灯 2为红灯% Q, N% d3 a# g
u8 templed1=5; //LED灯临时记录,初始为5 3为绿灯 4为黄灯 5为红灯' z. U! E4 j3 g
5 ~ l$ E% o: n5 u& S$ C2 a' fu8 count=0; //紧急状态按键计数 ( U" V# Z$ \1 ^( z/ }
u8 count1=0; //方向转变计数8 w) W% X1 \0 P
8 m7 f' z1 V9 c1 N" Csbit led0=P1^0; //将P1^0口定义为led0 绿色1- m7 Y4 f# v0 H8 L
sbit led1=P1^1; //将P1^1口定义为led1 黄色1! n* r8 _$ p0 W9 w
sbit led2=P1^2; //将P1^2口定义为led2 红色1
6 U- P, v% A6 z2 n; d/ W" C4 a, [" fsbit led3=P1^3; //将P1^0口定义为led3 绿色28 Z* J4 t3 A2 x7 O# H8 H2 F
sbit led4=P1^4; //将P1^1口定义为led4 黄色2
2 f) B0 g# o- X3 asbit led5=P1^5; //将P1^2口定义为led5 红色25 z4 G$ _# [& p" k: `; N
! v7 k7 q! t* G6 h4 s/ C
sbit CK1 = P2^3; //东西方向第一位数码管
! p3 S; l2 V* ^# ~sbit CK2 = P2^2; //东西方向第二位数码管- O- ^: @1 y& j, l7 a
7 n1 K5 R q t# c
sbit CK3 = P2^1; //南北方向第一位数码管
# G0 c0 Z1 y: R3 bsbit CK4 = P2^0; //南北方向第二位数码管
1 B1 ?: S' p- S% k- N6 e- j
" h9 I* P$ U& E- fsbit key2 = P3^0;
4 a, s C+ h( U/ }, s" K1 Vsbit key3 = P3^1;' F9 g9 ]" R# Q, ]! |. i
sbit key4 = P3^2; b' E- b- J8 b+ L" U& x, `
2 n' x: A& l- M$ y% e8 Svoid delay(u16 i)1 m% T$ f9 W% O; m7 j
{
$ I& _- W. j* u" S7 P while(i--); # h+ F, p5 O: P) C
}( y1 i9 u8 z a: u
4 C; f8 i% s7 }# }5 Z8 ^void display(u8 time1,u8 time2,u8 time3,u8 time4);1 ?8 `* n8 H" G+ @. A
/*******************************************************************************
* B& l+ F6 a& c+ Z( z7 v* 函 数 名 : Timer1Init3 g/ G: L, a2 h: R% s- i# d
* 函数功能 : 定时器1初始化: Q( `. u6 y) P
* 输 入 : 无
9 _+ z) M7 A; u1 A4 L2 I1 }* 输 出 : 无
m2 G J9 Z" B W( M0 S*******************************************************************************/
0 \3 g& z8 A# n2 y' q: Fvoid Timer1Init()6 i" `9 h: P. F. H
{
H# A3 y! R- s! S. i TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
- A+ |2 l, |: p! c. Q6 v+ f- J C8 I( x9 a5 W
TH1=0X3c; //给定时器赋初值,定时50ms
9 m5 e, f! ]1 w; r TL1=0Xb0; # U0 k+ g! N$ Z# ^ Z! }# G. e
ET1=1;//打开定时器1中断允许5 K% }% O' `! G6 M4 X. u
EA=1;//打开总中断
5 s0 X1 x6 K1 Q6 n8 c. O; X" r$ a TR1=1;//打开定时器 6 n: n2 F0 L3 \9 a) f- g" @; U+ a' @8 G
}. t5 w, g5 y# S9 ^+ }9 a
; K: c \+ r0 M3 h/*******************************************************************************
/ ?2 e! }) e$ ]. l$ T3 u' ]* 函 数 名 : main
/ P% Q5 f4 v# A" ~* 函数功能 : 主函数! i) D9 j F5 R! ~# v, W, g
* 输 入 : 无9 i. ^0 e( _/ L6 R+ b M5 J
* 输 出 : 无% f n E N# ~! a% V9 i
*******************************************************************************/
- V( x3 E! n& o* r9 F: \void main()
- X0 M9 D: @! r, @/ v% v{
+ I" V& T: } ^' l, u CK1=0;# q3 a( ~# ?2 b7 h5 C3 o
CK2=0;7 N1 F+ q' m' l' o/ b I
led2=0;
$ k2 F0 D2 e `1 l led3=0;* O& \) \) k$ R \& Z/ ~. [! }' ^
Timer1Init(); //定时器1初始化
R( X, n' h3 Z, ?" a) s while(1)' V9 X/ [0 b( O; W
{
( i$ x! B9 ]4 f& q6 o3 e' x* z//*******************************************************************************
+ L) i! m- G6 z/ i2 q( T+ n if(key3==0&&count%2==0){ //当按下key3并且状态为运行状态时有效/ l2 H0 v' b1 r7 i
delay(1000);! Q' z$ c( ]( U X% D; b
if(key3==0&&count%2==0)
- d! T* M4 @6 F& [7 t { 6 e/ X3 s6 N3 A' D$ s0 J! ^
TR1=0; //关闭定时器,防止切换时仍然计时
' e' w. V0 Q- \+ {: z# ]4 g count1++;' v6 v7 ~' H9 V+ {- d
if(count1%2==1){ //(非红灯状态下允许执行)
7 M- C4 u- |: W3 @0 l TR1=1; //打开定时器% o, U6 a$ Q& T+ m
changeEWpass();
' ~* ^- D! ~5 c9 {) e( @ }
- Z0 E ~' _8 a, a8 g% Q if(count1%2==0){
4 L- M8 f3 E' l" W; E TR1=1;% V! C7 g3 @: S/ X+ j6 p
changeNSpass();
( w7 A6 g- z' R; E3 V* S5 |) { }
8 v6 L% Z- p( R4 l }
. A& d, ]. [, h. A; n* f% i9 r# i while(!key3);
$ Q7 o, J" T# d" A7 C }, `4 X$ j. v; {4 u
//*******************************************************************************+ L- m5 ]$ q/ [9 J/ M- l
if(key2==0){) U$ I9 h# t: p2 r1 L; f
delay(1000);
4 x# t+ `( I& _6 {! T" n3 ~ if(key2==0)( @" Y, A9 {( E' E0 z/ s8 I
{& k' W r; O" Y/ K& V4 m7 ?
count++;
+ e4 L7 |" `% A }
, y Z: k" s* T7 }6 Q/ r" j while(!key2);' P$ z( a/ U2 \+ q
}
. H9 x0 U, W- i& x6 p8 D& b2 C1 k, q* j9 V1 }1 y m
if(count%2==0){ //为0则将状态恢复为运行状态2 R* e# {6 s! \( X
if(ledset==0){ //判断上次是否为紧急状态
w2 l( ]- @( U8 `! S* @$ k ledset=1;
+ h/ w* x4 {% f* j% Y J& X ledInit();* Q8 T% b/ Z* }$ s/ ~- G; c
templed=2; //东西方向初始化为红灯,由于执行了ledInit()会改变它的值,所以需要初始化,防止上个数值再次被利用(实际上只需要非0或1就行)
% E3 u& C. ~+ S9 t, S templed1=5; //南北方向初始化为红灯,由于执行了ledInit()会改变它的值,所以需要初始化,防止上个数值再次被利用(实际上只需要非3或4就行)9 l7 {! T; u$ |4 W! g
}# R7 _# r {- d5 D' U# G6 B+ f
TrafficStart(); //正常状态下while会死循环该语句,该语句为动态显示数字函数2 `6 |( V7 W7 s# M5 y0 A' {% Y& s
}! c/ t# U6 U( A6 e4 _
if(count%2==1){ //为1将状态修改为紧急状态8 r+ p9 F' Z1 }
ledset=0;
7 A1 m; z j) f& v' c' m' J- \ TrafficStop();/ [/ j) m& {$ `
}3 V# _, G! x! T$ k# q5 v; b; P
- w! M7 X# j+ M$ D: i3 Y }
% L+ q! M: ]9 Z8 f( w5 J2 W}
: f6 g4 H5 U' |) G. ~5 @- X( i' r
8 K- t6 Y, y% I! b+ p/*******************************************************************************
( I" I2 }9 f9 |* L* 函 数 名 : void Timer1() interrupt 30 C# A* X, W$ r ?9 A% n
* 函数功能 : 定时器1中断函数
2 N" N! B& `8 h4 P! g* 输 入 : 无
3 _* @/ y+ y: S0 h+ b7 M* o4 D# E* 输 出 : 无
* G& K* H% r# t% M, o. ?*******************************************************************************/
" m! ^3 z6 e+ m# t Pvoid Timer1() interrupt 31 E) _4 c8 ]$ f- _
{3 a7 s3 X8 j ?% k, b3 q
static u16 i;
+ i2 |& a9 ~/ X3 }% M8 }/ @. e TH1=0X3c; //给定时器赋初值,定时50ms
& l1 `& _4 z* h2 \) H5 _+ l TL1=0Xb0;2 F) g" R" R2 \% n$ T! [8 a" v5 M8 g, m
i++;
3 o) U4 x: n0 q& E6 \6 Q% w2 W if(i==20) //i等20时为1秒$ L0 i4 d7 h' C. G) c9 X5 E4 J
{
% _7 R# e( \, `3 T i=0;
$ t6 l# a1 P8 C) N3 j //-------------------------------------东西 方向-------------------------------------5 n+ _" F- {( z: B# {
time2--;/ B E& E' L3 D# Z
if(time2==-1&&time1!=0){ & W/ y8 k5 I% T6 o+ ?. T h* l# e
time1--;) ]) g7 i, K, Y
time2=9;$ h$ t. I3 T9 a$ D/ m9 v
}, L- e: O5 \. T
if((time2==0&&time1==0)){
7 q* h& m" b5 z2 D if(change==0){ //东西方向 如果为红灯
* V$ z8 _/ T+ k' G; [ change=1; //下次为绿灯8 I; e; c+ |; f( }
time1=5;. A% h* u% H& X9 {. m
time2=0;
+ L5 K) i. i6 V/ z led2=1;
q' m. ^, f# e+ {( ` z: | a led1=1;# d K* c; X5 M" V4 q+ j
led0=0; //绿灯亮
0 H6 J) n& L m3 } J" _8 G2 l count1++; //红灯转绿灯时计数加1,否则执行方向转变时按键会无效(闪一下而不变向)) ^) r) l* e& M
}% K0 s* @0 h2 V+ t, N
else if(change==1){ //东西方向 如果为绿灯
% `8 v2 @+ ~3 I7 j* x. m" B$ n! U& }0 C change=2; //下次为黄灯
. X( X- h: R' e6 | time1=1;
0 _9 k- L0 p& e, F% g8 y time2=0;
# @, l. ^5 z, P6 v m( o led2=1;
% |. C5 @9 p& |0 Q, n. [0 x led1=0;/ r) M8 g, Q M' N) d8 `$ S
led0=1;. L- V' p) V. O0 }& i q; c! P5 c+ I
}
3 ~/ z6 F- H, t$ x4 i8 z else if(change==2){ //东西方向 如果为黄灯/ z' }' |. F9 I1 q
change=0; //下次为红灯% S3 o: x' J5 h
time1=3;, R* D5 [# x5 i2 o6 X, [8 o
time2=0;- r" \2 e" ]! |. F* W6 v0 M
led2=0;
, y: Q9 d% w* j/ N led1=1;2 E! A0 s i* }& y( t
led0=1;
% X! `% x& y& ~8 `0 B C
" u# K0 Y0 Y% r r1 i* v k }6 n5 E2 K4 k. ~( X4 y, S ?
}
: t5 k5 g- O# o. M* ^' m4 N //-------------------------------------南北 方向-------------------------------------
" p @; G* ] N v time4--;
' G, X% q9 I0 Y) d$ g if(time4==-1&&time3!=0){
% |: X0 r7 l3 K time3--;3 B" G1 q) u7 M! D# |
time4=9;
' m9 j% n3 A! I. K0 y
) `7 P, a% u( {3 n1 I% M+ ?# H/ n }" d' ]: C4 f( s! N3 j) D/ r3 j
if(time4==0&&time3==0){
5 \+ _* I5 ~+ ]! p+ w& I0 W7 L: M if(change1==2){ //南北方向 如果为绿灯0 q- m: s& R& n+ C
change1=1; //下次为黄灯, S# B4 M$ n, L1 b8 O9 J
time3=0;
: ^+ L, W8 `7 u9 ~( n5 Z { time4=5;
6 Z6 V! g" L1 J- X3 _% U led3=1;
7 w* ]0 d% }! `: g led4=0;
; N8 Y1 L" t. j9 j& U& o0 H led5=1; ! H8 B8 c3 O1 |* @7 y% o
}
4 ^# j' R1 D, [( B else if(change1==1){ //南北方向 如果为黄灯
( w) W6 R( H; ~9 d J change1=0; //下次为红灯* I! W G9 w3 }
time3=6;
$ `" @" A8 |' `' K" w, t9 M time4=0;
6 a* Z( G# ^9 P g! T9 e led3=1;
. \, |& c* g T: ^/ U+ M) s* d3 f led4=1;9 v1 _3 X+ r3 f4 q( ~
led5=0;
9 @' q8 h# n3 g1 L! f" l }% |2 M5 N' c8 F& T# q
else if(change1==0){ //南北方向 如果为红灯1 |, G: T& z, p% D
change1=2; //下次为绿灯' T" t& g! h7 O& G
time3=2;
6 |, r0 K7 F' M, v. |$ i( P2 V( O" U time4=5;5 \+ G; K# k9 i( m
led3=0;
* v8 K3 E% ~# f' n! Q$ i led4=1;6 s/ H( [9 s5 L( V4 F0 Q5 D* r
led5=1;
" E6 _- z B; I count1++; //红灯转绿灯时计数加1,否则执行方向转变时按键会无效(闪一下而不变向)
: `, P: j1 M$ `. b5 W3 I
% z: C( D9 y+ a, m }
. P7 g( y2 B @2 a1 | }
/ v, w3 h* M! |& F8 y( @# w//------------------------------------------------------------------------------------
3 z& W. E; {2 g1 ]; n- ?( V8 W }5 ]1 s7 D; F1 Y( D
}
/ @8 {7 o& m; a! w7 x
* \+ y/ m5 i. a, A- g' lvoid display(u8 time1,u8 time2,u8 time3,u8 time4) //显示程序
# }$ T3 K( X. \* V7 m) h{
# g S; x9 d. l1 X P0=table[time1];* g3 k. h" F% s9 [
CK1=0;! J0 D7 M9 i6 T0 N# n9 C
delay(100);
) P. `/ |: A. I CK1=1;! h5 j0 R" y3 h
/ t; X1 A& T9 _! Q; z: D
P0=table[time2];
4 N- |6 y+ f2 @! ~; U& |+ n1 L CK2=0;( M# q: v4 F1 k3 z. l5 u
delay(100);4 K- E" |$ T( A0 H r
CK2=1;
3 g; i: G/ Z3 s3 r. U
: \. H% {( X; P P0=table[time3];
0 D( B e1 I3 t' B% L" r CK3=0;3 G' _& f! G5 A% h
delay(100);8 T6 i9 ~4 m* Z+ F4 W) @
CK3=1;9 Q! \9 L9 a# D) ]* F0 R
& m: H4 }# y! c6 c S' c: I6 D- R5 a9 j P0=table[time4];( t4 u% ?3 a! r! z7 ?, B
CK4=0;: G* h9 d2 n& o6 u
delay(100);+ _( i1 p' Y d( `3 S
CK4=1;
w9 ^, M+ s! i% N: I: ]* T}
1 h* W2 c; y" V2 ~; W$ Y! B! [! |6 Z+ L/ u: @0 ? T6 [: i+ Z' S
void TrafficStart(): A* X3 q) J. E
{
$ A5 F; M; X5 B; Z. T1 @' I TR1=1;//打开定时器3 s3 X R4 J, R
display(time1,time2,time3,time4);
( o" N- R$ A# x& \7 S, x0 c; n}5 \$ O# e4 ?" S! o0 P3 D
1 j% r' }, X0 Vvoid TrafficStop()
) F6 y) n! X. c" `9 v, [; x8 _{ / |6 [- }! P. q3 u" X0 P
TR1=0;//关闭定时器( G6 t9 l& q* I- j" ?2 S
CK1=CK2=CK3=CK4=0;
0 H+ N3 B0 w8 i4 |+ o' k( }. X( I P0=stop[0];/ S0 [0 z1 Q" ]# A% f& I
if(led0==0){
' ]+ Y/ D) ^' E" x7 q templed=0; //记录当前灯状态 东西方向
& O& h/ s& S' s# N" l led0=1; //将原来灯熄灭. y! b" u/ X! N& {6 C# u# z/ w
led2=0; //亮红灯
! i% R3 P+ s5 r& k2 x }9 w+ W7 ~( a8 d/ t7 k* Z2 u/ d2 n7 b" U
if(led1==0){1 Z4 K( y; w* ~( N% @+ j* M
templed=1;( k. [. J V% O t
led1=1;7 m% g! B3 f& x8 @8 R
led2=0;
$ S) ]" B. w" H7 A! X8 S }0 |1 F5 y' o) Z; `& W; J
if(led3==0){7 O7 e0 ~% y: \# v0 Y
templed1=3; //记录当前灯状态 南北方向
3 W& u4 r% ^0 y, H0 I1 \ led3=1;0 s: V5 ]7 A4 Y, U
led5=0;% E- y9 o ?* }2 a6 c' I; N- W
}! u3 K. x t( j
if(led4==0){
6 p9 E- F* N0 @+ ]$ F templed1=4;/ o3 m% r& P. S9 \
led4=1;
8 O/ y8 P- g. `1 Q N led5=0;
7 `. M! y! M+ e$ ?/ C- b9 T }
& Q* s5 p/ M- n J1 W, G8 b}# z& L6 C# k3 Z8 Q+ `8 ~! ?0 s
2 k) y) o+ z# W* A6 Yvoid ledInit()
2 \! \" F" h! \# [2 R0 J{
/ E) r& R6 ]" ` if(templed==0){ //恢复紧急状态前时的灯状态 东西方向" N7 t6 O$ P1 `& b5 l
led2=1; //熄灭其他灯
e. ?1 O5 E' ^& y( a/ }* h X4 M led1=1; //熄灭其他灯* k: i( W! S+ k8 ~9 p) e
led0=0; //恢复灯的状态9 k7 C- ~6 p' C+ Z
}
9 j& o/ G3 D4 |/ X' ?7 z' e# t if(templed==1){
! c9 W6 J1 @! \ led2=1;
7 s' W m9 R2 L( P led1=0;0 F G/ x C/ x
led0=1;
+ N* _5 Q% O7 a( l+ x% t }
+ {& Q# i& s6 G8 i# U% R if(templed1==3){ //恢复紧急状态前时的灯状态 南北方向
: g4 X* ^1 U' l+ P' E+ n led5=1; //熄灭其他灯* L, }& `0 C. ]
led4=1; //熄灭其他灯$ j1 |+ f# F4 i
led3=0; //恢复灯的状态, ]! j: u9 i0 c4 U
}8 D9 e% ]2 }1 L% S
if(templed1==4){* q& m5 N. s' [+ |0 U0 Q, Y5 _: R
led5=1;1 D- T: b# z1 V/ P
led4=0;
% S4 z" ^& Y% O9 T+ ?7 R……………………: J4 y9 |7 e/ \. Q P3 P& r- G/ D
0 z5 N8 ], {: p: `…………限于本文篇幅 余下代码请从eda365.com下载附件…………8 Q1 O0 T6 J% ]+ ]7 o
! { T% c1 v' `! E
7 @# K9 z$ [& o$ O) z
# Q+ v! O$ T. n2 \* G* p! Y: V
& C/ q- n0 B. m; t& K5 w5 e, N' S |
|