|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机原理及应用课程设计论文-交通信号灯模拟控制系统 % k6 |) \4 L+ |- M. g \" B
单片机源程序如下:
! U4 f' s3 M8 {" I4 L
6 n O( `/ E9 P' z/**************************************************************************************) n: P* J4 }# r; G: ?: D" K) B' ]
* 交通灯实验 *
% W0 Z0 P3 w6 N实现现象:模仿交通灯运作
2 M+ A' ]$ {( a3 {注意事项:无
- {2 x. U5 j9 A& i9 @8 t9 Q. y***************************************************************************************/
3 U3 R+ v2 y6 S: x _5 a- b1 t& ]8 j; g8 W6 Z; t3 X
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
9 ]3 x% k" t5 X" |& X) ?- C6 Z/ M
2 e. f5 P# U' p5 M$ ~void delay();+ C @% d9 L' Z3 y6 j! I
void display();
7 [. O' O! D* L/ cvoid TrafficStart();
" o: u- C. G4 z; f( n2 W0 Kvoid TrafficStop();1 u- `! C( U6 q7 }% T4 e* U; A, ^
void ledInit();8 D( j0 V# L5 v& L1 O
void changeNSpass();
3 y |" A/ A; |1 X3 Avoid changeEWpass();& o$ Z% j' ~4 D- u+ X' x$ `
@+ |7 |; C# N$ y: R
typedef unsigned int u16; //对数据类型进行声明定义- r9 B: C1 h; s2 r* r- ?" e5 Y
typedef char u8;
; x% o$ Z: z; b) C1 z; Q9 ]! M3 _, ~. v8 l0 F% H9 p8 ^* _
u8 code table[]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 4 B5 R- F. o1 C8 \8 ?
0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e};: V C6 ` [2 I, U7 S. w- n0 V
u8 code stop[]={0xbf}; //1011 1111
b1 X! q/ c; w6 J; e% D2 o
8 w+ f0 z1 w8 ~# ku8 time1=3; //东西方向 第一位数字
: K% L+ K4 ~" c3 r, Ku8 time2=0; //东西方向 第二位数字
( [4 f2 G' h3 ]" l+ m
+ ~6 L# h. C/ \# i. eu8 time3=2; //南北方向 第一位数字
( @4 r" h. u# n8 @9 o' cu8 time4=5; //南北方向 第一位数字+ |/ B z, h3 n2 ^5 d
" j( j, G) S' M( L& c) p' Ou8 change=0; //东西方向状态改变,初始为0 0为红灯 1为绿灯 2为黄灯
8 _% A( |- C3 ?4 @) Ou8 change1=2; //南北方向状态改变,初始为2 0为红灯 1为绿灯 2为黄灯
1 N- P M- V: n9 X% V
+ B9 B* b9 J4 Eu8 ledset=0; //紧急状态标志位,0为允许紧急状态启动% ~2 |" E& b; B7 t, F
u8 templed=2; //LED灯临时记录,初始为2 0为绿灯 1为黄灯 2为红灯7 O0 O8 I$ U: ~4 A
u8 templed1=5; //LED灯临时记录,初始为5 3为绿灯 4为黄灯 5为红灯; ~2 l. C2 ?) t2 H/ c! t/ A9 \/ x& F
5 S k4 ^1 q0 C7 k
u8 count=0; //紧急状态按键计数
3 W+ Q' P0 \% N% D0 ^/ vu8 count1=0; //方向转变计数
& X/ B' q6 s0 t3 E6 b* w, U
) a/ I: p: J! k/ Csbit led0=P1^0; //将P1^0口定义为led0 绿色1. w- C$ r# L- o% R8 }
sbit led1=P1^1; //将P1^1口定义为led1 黄色1
" R# I# N) f \* e/ S+ N9 \sbit led2=P1^2; //将P1^2口定义为led2 红色1
' B8 N/ m" \2 P9 Jsbit led3=P1^3; //将P1^0口定义为led3 绿色2$ h2 ~! s, K- O# c7 [9 l# w
sbit led4=P1^4; //将P1^1口定义为led4 黄色2
# u2 s) y6 v; J, t: ^- U6 u/ Csbit led5=P1^5; //将P1^2口定义为led5 红色2 f$ L& M9 i2 e7 k6 K# W* C
3 Z$ I4 v4 e& x% I; M* x( }1 \sbit CK1 = P2^3; //东西方向第一位数码管+ X; G% f7 o) d d
sbit CK2 = P2^2; //东西方向第二位数码管
5 B) Z& W+ E% {5 o; R
5 p+ L8 n! h) F% b9 osbit CK3 = P2^1; //南北方向第一位数码管
- _% M8 V( Y4 r2 z- i( n6 Dsbit CK4 = P2^0; //南北方向第二位数码管+ V b# J; u4 {# d' I! T5 y6 }
* R* Q) a( V9 o1 k( X ]sbit key2 = P3^0;7 D8 x* H: l5 s5 f+ O# f2 D* S
sbit key3 = P3^1;
4 y; a3 B9 R( b9 Vsbit key4 = P3^2;. t$ F# ^& r2 D* W' G
1 A2 t' n) c* q9 h6 ?- [; |void delay(u16 i)0 o' W% Q1 i# M8 Z
{. A, ^$ N5 C0 A
while(i--);
3 Z9 _* I/ \; ^4 I}
8 S$ |+ p6 p; O
- {* w* b- D- m' `7 D- ovoid display(u8 time1,u8 time2,u8 time3,u8 time4);2 b! j4 h, F" A F i# W: e1 _+ B
/*******************************************************************************4 ~# g9 W1 ^( j% z
* 函 数 名 : Timer1Init
; P/ K% P& Q6 f- e# f% j* 函数功能 : 定时器1初始化
F% V0 V& t/ @. l& R( d! e. t* 输 入 : 无
( D) Y) [5 d) A7 G: B; m* 输 出 : 无
+ S9 V) Y6 L6 {2 V" f+ v*******************************************************************************/+ X3 S0 o( |9 C, p. b+ F5 {4 m
void Timer1Init()
0 {% s# C* L% d7 L* N{
7 t# l) ^0 \) q6 \/ i TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
s: V9 X6 |) f+ ~2 w" z4 ^
- N1 `& H. O! i6 m TH1=0X3c; //给定时器赋初值,定时50ms. F# `1 f3 @3 E
TL1=0Xb0;
% Z0 D4 t& U7 w! Y" k( Y ET1=1;//打开定时器1中断允许' Z+ f/ p$ O2 ?2 a
EA=1;//打开总中断3 U: u& n3 ` {- }5 U+ `, q
TR1=1;//打开定时器 3 C8 f. v8 M- H* R) c. }* V# b
}
; M: o* H$ N* u( z3 Q0 b# U9 a5 {+ q' [3 w9 V$ M2 u
/*******************************************************************************
( ]5 e, b v, L3 |9 e* 函 数 名 : main
" H! G, M G& h |- N* 函数功能 : 主函数 ~" Z5 c; g9 A; W9 k
* 输 入 : 无+ n. j3 G- i# j" {& C# q
* 输 出 : 无9 c7 |( j9 A' C0 c7 {8 q
*******************************************************************************/
& T4 @4 p B( k" n S; N9 nvoid main()
$ `8 s% S6 B6 j6 x+ K& T{
9 L- D% [' s8 }5 c N CK1=0;+ j/ g' q. z' M- a7 e
CK2=0;- V Q; x4 }. |6 _
led2=0;
8 o9 L6 X9 Q! t. k& p0 H led3=0;
9 S/ Y/ u& t, o) N0 L0 m6 A' e7 [ Timer1Init(); //定时器1初始化
; f* o9 v- u3 Y/ [ while(1)0 Q7 d5 G0 m, D n C
{
+ s3 ?" n" }" L. W' Q//*******************************************************************************
% L9 l4 L+ g6 S$ V4 q3 v9 q* d4 q if(key3==0&&count%2==0){ //当按下key3并且状态为运行状态时有效4 O# m* E L: c$ r" ?
delay(1000);
1 h$ K" D1 R! U, y5 a1 r3 v* ^ if(key3==0&&count%2==0); \8 k8 x6 N) Q' L. s
{ 5 ?- A: x, w8 t3 Y: c5 Q# k: E
TR1=0; //关闭定时器,防止切换时仍然计时! r. ~- q9 G, H! K& J. [
count1++;. t" p6 {9 d# w
if(count1%2==1){ //(非红灯状态下允许执行)
8 h5 O! l; o, n7 U5 K5 B TR1=1; //打开定时器
1 {4 a' _- I6 R: {5 X4 y7 ? changeEWpass();/ F- F' u1 h/ L5 p: p& Z3 @; M3 ]
}
8 ]( o: L( G/ e# S+ S! q- { if(count1%2==0){
. s# i L# w$ [ TR1=1;+ h/ ?7 z$ f+ P7 U
changeNSpass();
# s" {5 ?6 [+ ?( {+ ? }
" m( z% a( e% ]7 b6 I }
+ S2 g1 M/ B5 P: C; e while(!key3);
1 [4 L+ S; A$ x- {! w# T }
l) B' e; |1 w//*******************************************************************************4 C2 z/ n N: r9 C
if(key2==0){
+ v4 a, B1 O2 R) n delay(1000);! X! p: P9 \4 U( H. O5 |' Z
if(key2==0). J( k4 }" Q' \. `& j
{
! a1 `. \# e+ m# R- O" h3 V count++;
4 V$ v7 B* O! t7 Z }0 |4 _ }
; Z: X: S" h+ }$ E2 ]8 l# g D while(!key2);
2 V. P: g4 i5 ^1 O4 W }
! h# q! w6 d ]3 a
5 y$ H; u+ Q. ^8 w5 ?1 T: P; K if(count%2==0){ //为0则将状态恢复为运行状态
V7 ? A, A7 u# ?. O+ q if(ledset==0){ //判断上次是否为紧急状态
4 R6 x2 x) Y, J# G" { ledset=1;
2 r( O& Q3 ]: f& U- h! Y/ \: E* G ledInit();) d- r: W0 I- r7 b1 y
templed=2; //东西方向初始化为红灯,由于执行了ledInit()会改变它的值,所以需要初始化,防止上个数值再次被利用(实际上只需要非0或1就行)
! h5 F0 Q: [" a4 t4 e) R templed1=5; //南北方向初始化为红灯,由于执行了ledInit()会改变它的值,所以需要初始化,防止上个数值再次被利用(实际上只需要非3或4就行)/ p/ W8 O/ q! j2 C/ |
} a( w0 H! i5 F6 M
TrafficStart(); //正常状态下while会死循环该语句,该语句为动态显示数字函数/ F! c5 p+ K5 ^5 @7 U3 V7 R4 @
}
2 r7 Q, J' g2 [ O8 A if(count%2==1){ //为1将状态修改为紧急状态9 m/ m# Y0 {% N7 |* p
ledset=0;
( Z! Z; ?. a/ S; Y% @* @4 @+ e TrafficStop();
' m) }5 s% Z& b5 _ }
$ T3 i3 N' N0 t+ s: u4 u6 w, X/ L1 U" M) | k: D2 H& D. C
}
6 }, \, }: `( ?}
7 S# q" K2 H5 B$ b* V8 s9 p) g4 L9 T% k) a: D( P( u
/*******************************************************************************3 F5 [6 f8 d- O) ^: G+ C% i
* 函 数 名 : void Timer1() interrupt 3: h* M( q% M) o' B
* 函数功能 : 定时器1中断函数# z9 U5 e/ \7 n+ Q/ Y5 p2 o
* 输 入 : 无7 G1 |' Q- k) ~) v, H0 [' [
* 输 出 : 无# u4 N) c) d7 |; G$ n, @8 | H+ J( l0 L# m
*******************************************************************************/
. Q: ]% a/ r$ t9 q" K6 Kvoid Timer1() interrupt 3
) R. Q! Y B& m b6 L{
9 \) ?/ D/ a v, u8 a1 m2 f static u16 i;2 u0 m3 U2 L( y* K) |( s
TH1=0X3c; //给定时器赋初值,定时50ms
/ t+ a _4 C# x TL1=0Xb0;
8 |* t& Q9 h5 d3 D i++;
6 j7 y* ]- s3 P7 o- s# J if(i==20) //i等20时为1秒6 C' s+ S+ r& ] }. ~5 D
{* E: D2 P! N4 B8 m- _! Q
i=0;5 X2 M+ ]7 b- l1 W
//-------------------------------------东西 方向-------------------------------------
9 N, C; R% j+ [( _( D time2--;
2 X% P G; ~/ u/ Q if(time2==-1&&time1!=0){
* }6 y9 u9 w# B time1--;
: Y1 v) o9 |+ f1 B( F' J# N( }: k time2=9;9 y; e( Q2 ^/ {9 V$ o3 b6 z
}/ B p$ U' e ~
if((time2==0&&time1==0)){; r- I$ D% K5 t2 C, P! \; W
if(change==0){ //东西方向 如果为红灯
( x4 h+ k: N |" t+ W$ |% ?- y change=1; //下次为绿灯
# u7 C/ b' R0 s time1=5;( a/ M; G C `" d2 @
time2=0;" z4 l9 C$ N! S6 ~3 k- }
led2=1;$ k* A9 b' C% K' J8 J
led1=1; h& C3 f: e1 W+ Q, O5 C
led0=0; //绿灯亮; M0 r+ C$ B; L) {! G
count1++; //红灯转绿灯时计数加1,否则执行方向转变时按键会无效(闪一下而不变向)
! `$ ?# \. X/ }- P" U9 P }
6 K0 ~# [( S% [' G' T else if(change==1){ //东西方向 如果为绿灯
! D, C C! D, i, w: O change=2; //下次为黄灯
9 v0 C: t: e& p) Q! F time1=1;) L$ n" P. P \) |7 T
time2=0;
4 X% b+ H+ Z8 V: p$ `# @ led2=1;
+ D0 } W: A$ e1 D2 C5 I6 c9 R led1=0;8 G! J2 x2 E) ~2 w" j( Q
led0=1; E6 ^$ {& t8 w$ U
}
% X) @* K5 |8 U2 }$ Z: T else if(change==2){ //东西方向 如果为黄灯
8 [4 }* w% q2 z! [# ` change=0; //下次为红灯' h( V: i2 E ^2 Z& t9 h6 `
time1=3;
% P" G' K9 l' H- H+ N; j$ u time2=0;
/ x/ K+ R8 ]' W* S8 e! [. i' t led2=0;/ S7 A1 C2 ~4 Y' f% s6 N7 n
led1=1;
: W @( X1 ]$ M5 Z* I led0=1;. T2 h# @; L4 A8 l) `! \2 }9 c& F
( }8 e; s0 q% U2 S" i2 _
}* P ~% I- L7 i. }9 D
}
$ t# N, i- a. S //-------------------------------------南北 方向-------------------------------------
5 c" T3 |+ \6 i3 n time4--;$ D5 {' Z J0 q
if(time4==-1&&time3!=0){
" i$ M, O& `' Y. L! v' ?3 ^: X/ g time3--;
8 J! P4 F- i1 u2 N7 w time4=9;, |5 L/ l8 ^2 x
- V, ]# Z @- [. j
}3 s3 u" x! ~! {7 n& b
if(time4==0&&time3==0){
7 v6 y9 P; |3 Y' T8 l1 z6 ]) W if(change1==2){ //南北方向 如果为绿灯/ m3 e5 e) S+ O0 O3 {. ^6 p5 Q/ ]2 G
change1=1; //下次为黄灯8 n( r* X% U( {5 m' t2 @
time3=0;
' A. i) v8 G, R' n! t) y m6 x time4=5;
4 g# x) ^' K- B( \/ e0 ?& M( U$ H led3=1;/ A2 E& N1 D9 L- v0 i( A8 w
led4=0;" J$ W5 [* Y$ z4 z- c, x* I N9 W
led5=1; ( R- ]& z2 n; _, R) k6 a- w
}+ {/ v4 W7 M% Q5 B, M
else if(change1==1){ //南北方向 如果为黄灯
6 w1 X7 O8 q7 ^9 Y8 `: g! U1 W* s change1=0; //下次为红灯+ E) E5 @' p2 {3 ^) R- x
time3=6;- e( c; a& x: I; p& g
time4=0;
1 j* ~' }3 G+ F2 C led3=1;
d" A' M, \6 W# u, O$ y5 a led4=1;, V8 W* d. s2 r, }5 e8 ~, ~
led5=0;
@( }% x4 Y, P5 S }, ]! E) {: }, r1 n' i u
else if(change1==0){ //南北方向 如果为红灯
6 O7 z4 T/ K+ M- U change1=2; //下次为绿灯
7 C: I+ {# n2 W3 _ time3=2;
4 N' g& |- a" s: S time4=5;
0 F9 s( g, X {% v" _& m# A; q led3=0; k$ ?# C: f2 h B. ^2 U$ F" L
led4=1;" F4 M- W3 r! q; Q) a
led5=1;( H7 H5 M# m9 o6 U/ V
count1++; //红灯转绿灯时计数加1,否则执行方向转变时按键会无效(闪一下而不变向)' s$ ]' l7 q, ^, w- ?1 D0 ?
& Y' z$ n' K2 Y }
; ^, V; |0 d I }
; i: F2 R, @# N; ^7 N4 {. Z//------------------------------------------------------------------------------------5 B2 Z, X; t9 |4 I9 C+ g
}# g9 @( r# M4 H$ P2 a
}
. V+ B8 P) u6 m3 T
" m$ _) Q+ ^2 ^7 Ivoid display(u8 time1,u8 time2,u8 time3,u8 time4) //显示程序
* E4 u1 B5 h8 j; k0 R* Q6 W) v' t{
9 `8 l% _$ |" ~4 L; }/ X) ^) _% g P0=table[time1];% _3 u( B) [' x9 e! F. l) S* r
CK1=0;
% M& K2 Q4 B K delay(100);
. \0 t5 n ?, d CK1=1;2 x& D1 x& N% O |0 w
( ]6 y# A/ W/ a) H9 }; o
P0=table[time2];
. d5 X: ~2 X5 R CK2=0;( t; `2 C& t+ c+ R
delay(100);& D/ ~# N9 R6 E% r6 d* o
CK2=1;
1 ~2 y6 f+ z, T. t# Y
7 I3 T, I6 ~5 v) J' W- D" f P0=table[time3];
: w/ P8 N/ e: V& Y CK3=0;
& K _$ G; h! e delay(100);" Y! k/ E4 |; j' Z" H
CK3=1;
, j( h& B! P: E1 L+ l
4 [5 ^9 U, y2 [( S7 m: S P0=table[time4];
G, b0 x: i" @( G CK4=0;$ O( S" J K5 }4 U) s
delay(100);( s5 c# M7 L+ l
CK4=1;2 w/ ?* t: L( _7 v' `+ P) K/ h
}
' K" Y( i0 t5 g! P0 p# [2 b$ o
void TrafficStart(): q' N& f/ J) k) _9 r
{* S, x$ p9 U, n8 s5 `( a" E0 @
TR1=1;//打开定时器
f4 P) \# k3 K" L4 Q$ H3 d display(time1,time2,time3,time4);$ Z9 @9 S! E; t$ L2 g
}
' f6 z. A( K( |* c) u# _
, ?* X3 Q3 S1 Q6 m0 _void TrafficStop()
0 B& m6 i0 q; I3 c2 a6 L* N/ @{ ; w' S0 x+ H/ b8 [- C5 m; h
TR1=0;//关闭定时器
4 z: K# g6 `) P( |4 z& S CK1=CK2=CK3=CK4=0;9 W7 e8 t2 S0 B! P: z2 k$ s5 r+ p
P0=stop[0];
' W0 Z6 r! ~3 I3 E# _ if(led0==0){
) B$ Z5 Y( f' h2 w! W templed=0; //记录当前灯状态 东西方向
1 d4 D1 z7 t$ m0 v0 _7 n led0=1; //将原来灯熄灭
9 `: R M- s# i6 E- Z+ G* [' S( o led2=0; //亮红灯
% r* v4 n& K7 @! f" e* C5 @+ | }
6 [# i. {5 R' j0 x4 g if(led1==0){
0 y$ ~# h/ Z( F" v) @" d& [7 p6 M* K$ Q" J templed=1;
A$ M5 i: l0 C; [ led1=1;
: t1 H( G; y: s- t% u0 P! h led2=0;1 V( Q0 w( O8 l; S
}: x5 C- h6 ~7 [) |. E7 u' D* A: u ]
if(led3==0){5 ]. c( k8 h( v
templed1=3; //记录当前灯状态 南北方向! L) L: q9 X* t! W, j6 B9 c
led3=1;
, {( d1 b, Y( q led5=0;* J! `3 F D& b% \8 G
}6 c/ j( S# G% l( l9 l6 c
if(led4==0){+ r4 l4 j6 G1 E! r
templed1=4;
" T- W% O! {" O$ @* C' y0 p7 r; J led4=1;4 d+ t# l) G3 \9 n) h! e7 G
led5=0;* X& |5 T6 U" @8 U0 l
}
@/ ]2 x1 S7 a$ i: R}
& f4 v' X, ? b. ^( H
, u. j: w ?0 c- ~* D# n: M- j3 @$ bvoid ledInit()
2 M8 ~1 e& J/ W( w+ v N/ }{* v; m' j9 Z" X+ y
if(templed==0){ //恢复紧急状态前时的灯状态 东西方向
" Q4 c) ?* i# U, Q+ q& ~ led2=1; //熄灭其他灯
3 W- c* q. @; o* R \4 ]" }$ z1 e led1=1; //熄灭其他灯/ h: h. F: X) x6 d9 r7 @- d
led0=0; //恢复灯的状态
: M; h. c3 ^! d, l- p2 w! W8 l- _& j9 } }
: f A- `) t Y- i% i3 O if(templed==1){
6 \" b# T, y& w) Y `9 X! u8 h led2=1;6 ^4 v3 ^: D7 O5 V( F8 V
led1=0;8 i9 O7 Q* H! @5 `! J5 S
led0=1;9 A* h: j7 J1 t+ s% h
}% X9 d7 H' v7 t# e/ k1 h) i
if(templed1==3){ //恢复紧急状态前时的灯状态 南北方向8 j" a! B0 k( W1 Q2 o) A8 j$ r
led5=1; //熄灭其他灯( R9 F4 C1 a7 P/ C/ e
led4=1; //熄灭其他灯! }) \# P% t q2 a B
led3=0; //恢复灯的状态/ A% G& {# r2 [3 Z7 M
}
) m( L6 ?" i2 [7 y: g' o; v# e# j if(templed1==4){) [1 o! @& h! X5 j
led5=1;
( x: d- i4 L6 p5 P5 | led4=0;# o' l' N/ n9 i3 S% ?* M
……………………
2 T% f% Y; S9 h$ r: g5 |5 W2 F" P" q1 ~2 A% [4 [
…………限于本文篇幅 余下代码请从eda365.com下载附件…………- z) S7 d% p Z& {! @' S
$ t6 |5 a& A' p5 V9 G* I* V0 W P5 p% r9 D1 t( w D. G! |) ^/ a
8 V S" i0 _* o; O# A+ Y0 A9 `( A1 c) D; j( G
|
|