|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机原理及应用课程设计论文-交通信号灯模拟控制系统 8 R: Z# c* l: X( K; o- M
单片机源程序如下:
2 ?8 C, X4 Y/ Z; `4 G
" j! E; Y% ^! n) f. L/**************************************************************************************/ S8 R# m# [2 C# o
* 交通灯实验 *
; l, R2 P9 t( Q- ]$ p1 r6 x1 \实现现象:模仿交通灯运作9 \. J: k" B" Z; m: P% S* y' o
注意事项:无
1 d5 I. w: q3 X2 M$ }***************************************************************************************/ n& N* [, n/ t5 T" k+ l* |+ U# Q
; ]% r$ T8 @" y& @) ?& S#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
+ z. m! S/ t& z& \# ~. ~. u# K
. u' A2 R/ _9 A* [. M! ivoid delay();
- A5 m- x6 ?. H4 mvoid display();1 E4 W/ I4 X& O2 R/ i; w
void TrafficStart();
1 J9 v4 `& b; \ ^8 ivoid TrafficStop();
% @( S# N; ?* G5 E! u+ Kvoid ledInit();
. e* K* ]5 x) `4 ^$ ovoid changeNSpass();
# R8 F5 ?) M+ z8 ?# Svoid changeEWpass();, K: j8 `! \/ w. u% w
# ~# X2 t6 h' a e' G3 U$ etypedef unsigned int u16; //对数据类型进行声明定义/ ?9 S. d7 N8 k: B" I( K5 C
typedef char u8;# b; m/ b% {" |/ w/ e% J% h6 z
) o$ H: B( F- J k1 hu8 code table[]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 6 v1 S( I' J) P$ o7 ]* I a+ G
0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e};5 a! F/ ` F& O, n3 Y: e% e0 U6 s; E
u8 code stop[]={0xbf}; //1011 1111 2 F. x X3 C% i. o% p. o
3 k% e( B( ~/ j8 uu8 time1=3; //东西方向 第一位数字
8 Y, w5 g4 S( t5 u- Ku8 time2=0; //东西方向 第二位数字
, S8 M& e( F" S) ]% X5 @ t) Z2 g" ?$ \8 c
u8 time3=2; //南北方向 第一位数字, c/ f2 u6 V$ ]$ R3 Y, g
u8 time4=5; //南北方向 第一位数字. w- M6 x5 [( @' v
5 V0 |5 W* I4 n# _u8 change=0; //东西方向状态改变,初始为0 0为红灯 1为绿灯 2为黄灯
& j; I! ] z7 r O3 }# E4 I8 X& d5 vu8 change1=2; //南北方向状态改变,初始为2 0为红灯 1为绿灯 2为黄灯8 j( n7 j# j* U" s* d& x8 N2 U. E2 s
) N. ~+ V+ g" I; P3 o/ r, cu8 ledset=0; //紧急状态标志位,0为允许紧急状态启动9 f* s+ o" m. I" v1 _# v6 L! Q. X
u8 templed=2; //LED灯临时记录,初始为2 0为绿灯 1为黄灯 2为红灯6 n& b! Y8 B0 q( H% }( L
u8 templed1=5; //LED灯临时记录,初始为5 3为绿灯 4为黄灯 5为红灯, `: Y/ _+ ?1 E z
/ A+ ?3 J/ N( Q3 wu8 count=0; //紧急状态按键计数
8 A6 ]7 ?/ Z8 X) `; I1 Qu8 count1=0; //方向转变计数% I& \. s; _5 a% X% ]8 P5 z5 H
( M' _; b! J8 T
sbit led0=P1^0; //将P1^0口定义为led0 绿色18 T8 u+ E: x! s; X' W$ ?4 |4 F) }
sbit led1=P1^1; //将P1^1口定义为led1 黄色1
! z/ c, F, a- ?6 U; K0 |5 X1 ?* Lsbit led2=P1^2; //将P1^2口定义为led2 红色1" H; x: f1 b& [# @6 g
sbit led3=P1^3; //将P1^0口定义为led3 绿色2
0 V% k5 p. ?9 B9 `4 N7 bsbit led4=P1^4; //将P1^1口定义为led4 黄色21 c1 [# z8 O0 A* q2 f+ [! y
sbit led5=P1^5; //将P1^2口定义为led5 红色2
" L! N+ K' p$ F8 f0 L+ P; p% d5 B7 v; q& ?
sbit CK1 = P2^3; //东西方向第一位数码管
; I2 ]4 ?3 B% T+ c9 _6 Jsbit CK2 = P2^2; //东西方向第二位数码管
7 k% w; }$ K& R9 C: M; X6 m$ l* Z# D8 c1 C
sbit CK3 = P2^1; //南北方向第一位数码管
8 i0 q+ C+ Y; S- j! B ~2 Qsbit CK4 = P2^0; //南北方向第二位数码管
. r4 D ?/ Y6 d! f4 u$ ^2 V6 q% h6 e- R7 x( c7 ^+ S
sbit key2 = P3^0;0 L C2 v- ~, c% T3 Y" T
sbit key3 = P3^1;
/ l6 V( }7 Z4 a1 ^% bsbit key4 = P3^2;0 E1 ^. @& `2 y6 C, t8 a/ j
$ z: I W& N) L( b4 [7 Pvoid delay(u16 i)
# _# m+ r4 P+ J: k4 x" W7 M$ f! T/ S2 t% y{- h/ c+ v3 a7 n' A+ {* [
while(i--); 5 H4 `& `6 q7 T# i# |* h7 w
}! B1 Z( `, u$ W/ F5 I
0 ^. e" y" q; ~9 F D5 vvoid display(u8 time1,u8 time2,u8 time3,u8 time4);$ s7 j# P4 v6 X! x5 u
/******************************************************************************** s7 t- \& j1 c. ]9 Q7 C
* 函 数 名 : Timer1Init1 J. J' C) Z% A, b+ Z) o. q1 ]
* 函数功能 : 定时器1初始化, k- F+ B( C3 B E6 T8 k+ E
* 输 入 : 无
( C# Y+ n5 _; V% s- N* W" A! k* 输 出 : 无5 T0 S7 f- ]' L1 l/ e
*******************************************************************************/
$ d! u6 X6 x( L' _void Timer1Init()9 Z4 k+ D- U6 x- Z, c6 T
{! F5 ^! x# H- V" m
TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
' G0 X( }8 v1 \3 W6 p7 ?" U3 S, Y' H/ v
TH1=0X3c; //给定时器赋初值,定时50ms; {4 T" K, @* I8 P& k
TL1=0Xb0;
, E0 e6 r" l) S7 Q ET1=1;//打开定时器1中断允许# o0 b4 V+ n: G0 @ b' o
EA=1;//打开总中断
& y# p. X& H, s4 I! f& G TR1=1;//打开定时器 4 D: p, I* A4 z4 c$ o/ u
}/ N& o' ]6 a, A
3 G) f2 v" g# L1 F0 e6 O
/*******************************************************************************
7 V; \, k1 K6 `0 Z" L( G* 函 数 名 : main
4 c: v6 D- x& b* 函数功能 : 主函数
( u9 @2 a. v# N# Q3 b- @* 输 入 : 无+ L0 G/ W# i! V- t
* 输 出 : 无
: E: V Z G7 U: V: ~- o3 T/ o*******************************************************************************/
) P( J! z0 C$ M0 ]8 c9 ^void main()
' a1 T/ _2 I' Z7 k5 L6 J{ 4 @6 E& u1 q6 e @& ?
CK1=0;- Y j; l0 x' A" v# x* P, n
CK2=0;
* H# u. P: S9 ]0 \9 v3 O) e* b led2=0;8 M) A$ b( r" v" H1 |' ~
led3=0;8 ~0 E {7 n! g& O/ k* \( b
Timer1Init(); //定时器1初始化0 @1 D1 w- k1 P9 { w
while(1), ~" ]8 {# D' W+ V k& O. I6 i9 l
{
! |* ~3 T+ F4 u8 `//*******************************************************************************. O( @. F5 M8 @7 ^
if(key3==0&&count%2==0){ //当按下key3并且状态为运行状态时有效
" U E, \! w. v1 s( ~6 | delay(1000);
& i, U; W. E8 M* a# d* u- J# p if(key3==0&&count%2==0)- F3 A/ N$ K0 q
{ " u/ R2 c" i. W7 f* ?
TR1=0; //关闭定时器,防止切换时仍然计时4 F% L+ b* q( N" `2 b# T# ^
count1++;
: b$ y+ t2 j6 |* b0 T& `0 d if(count1%2==1){ //(非红灯状态下允许执行)/ V2 p x6 a' G0 d
TR1=1; //打开定时器
$ g, D0 r9 @0 T2 |. p, a, I+ b7 v changeEWpass();: @4 U2 e: a. [. b" [
}
7 C0 W/ P! M- ~7 S! A+ _5 [1 ~1 N' [ if(count1%2==0){
0 t3 m% y, b* p( N% j TR1=1;4 j5 B Y5 l% A8 V8 q e
changeNSpass();
" d' L, f9 T5 A; g3 {- o* f& w! D }7 G) V# m0 u- a# M% u* H/ ^
}
0 n/ }0 q# Y( G& p/ _ while(!key3);, P, ^2 l n( |0 ?- Y# q9 g1 G$ A
}
8 `. C, ~) Q) d& P//*******************************************************************************
& H( y# W' j4 N# q% ? if(key2==0){
# c0 ~* V# { x$ C: \ delay(1000);
& B3 E( d4 ^# ` if(key2==0)
4 b. P) x+ w" d3 ~9 I# T; F" ` {$ j8 y) D6 t! {: N2 u
count++;
) R* p0 m) R! @0 ~3 ^0 G }
J/ i1 `% K. u7 Y+ q1 [; ^ while(!key2);
% s8 K% O9 M1 q$ ?3 q }
* E% v' [/ ]; H0 C+ O* ~3 `& k4 w- M4 Y3 {: |2 S1 H
if(count%2==0){ //为0则将状态恢复为运行状态
" @! M6 @% D' D1 F( o& T p4 u if(ledset==0){ //判断上次是否为紧急状态0 n) Z3 X. o4 U
ledset=1;
0 l: d5 Y- h" [9 B5 ?6 p; R ledInit();
+ N2 L6 o, e W* Y5 }% ~ templed=2; //东西方向初始化为红灯,由于执行了ledInit()会改变它的值,所以需要初始化,防止上个数值再次被利用(实际上只需要非0或1就行)' h, M4 _. r( I
templed1=5; //南北方向初始化为红灯,由于执行了ledInit()会改变它的值,所以需要初始化,防止上个数值再次被利用(实际上只需要非3或4就行)& u; I' l1 b5 q+ d+ ]' e- X/ }
}0 i) w8 E2 z9 d0 u! n6 R
TrafficStart(); //正常状态下while会死循环该语句,该语句为动态显示数字函数 g; M( h# ~& W$ ~% A) G5 R
}
$ i/ A0 z) z! _& n, \4 R if(count%2==1){ //为1将状态修改为紧急状态8 e; v7 `$ R, o+ ~
ledset=0; 9 s& r* n- t W3 J; b4 L
TrafficStop();
+ d- P6 t* r3 s }
, h3 Z% Q! p3 w/ J8 M }8 L4 E7 k9 t, X3 x
} 2 g, G* D+ v1 l' r7 F
}
: ~1 h; J& w8 }; J" s+ k# C# K, |8 u. @, V! X+ X
/******************************************************************************** Q* r: j# l% @* L9 ]
* 函 数 名 : void Timer1() interrupt 3, g9 F6 S3 K% k, m- `! n6 w* b
* 函数功能 : 定时器1中断函数
& Z6 R+ T# k' V) r. [9 X8 ]7 x* L* 输 入 : 无
% d Z2 k Q1 K: u* 输 出 : 无
F j6 i" l' ^" i& m*******************************************************************************/
; Q5 J: u* a8 F" R6 B7 ^void Timer1() interrupt 39 W* d: y8 q8 a& a+ t9 d
{1 ^0 k# q4 b/ i0 X; s& y+ ^' \* s
static u16 i;; L6 B5 k( e& E4 C2 `; {0 G
TH1=0X3c; //给定时器赋初值,定时50ms- b6 }. v9 l* O! U9 J6 @
TL1=0Xb0;
2 _0 q- G1 u2 o5 b5 O i++;* X3 G" c6 F, E* S
if(i==20) //i等20时为1秒( B# j& t5 S- Y8 O* m4 Z, _
{
x3 z1 D) M4 T+ S1 h i=0;3 ~1 v9 R) x2 @* _( m- e/ F
//-------------------------------------东西 方向-------------------------------------. [9 {3 T3 ^3 z% ^7 [/ s
time2--;
6 ~2 r+ n: U5 e5 @' @ if(time2==-1&&time1!=0){
9 ~- w, Z( S+ Z$ [ A time1--;
9 T4 E6 B. f7 s: b6 M- l% h time2=9;4 m9 H4 {! D0 a& e3 Q5 w, V- m
}( w" M( ~$ U; U0 ?* P
if((time2==0&&time1==0)){" [/ I9 |% T/ ^4 T- P0 M2 K% l: O# _
if(change==0){ //东西方向 如果为红灯
+ H( s' R& x, w6 d# d change=1; //下次为绿灯4 F2 G9 _" }3 r2 P& V
time1=5;
/ l! P; p8 Z0 X7 v" { time2=0;
' j5 G8 @) j' k$ u led2=1;5 W' r- w' h! m
led1=1;
; @' T4 l5 Y7 v3 y; S led0=0; //绿灯亮
; S* b% ~1 t" X" N/ G count1++; //红灯转绿灯时计数加1,否则执行方向转变时按键会无效(闪一下而不变向)
3 E+ U& \* j K i" T; g. X$ t" K }
& k V. m8 B4 D/ B else if(change==1){ //东西方向 如果为绿灯' K3 |6 ]% m9 E. A: x9 e8 ]
change=2; //下次为黄灯/ b7 y! z: t9 p( L
time1=1;
5 c; U4 k8 n$ F4 u time2=0;
5 n: h& Y Y, i: T6 c' d$ o+ j3 Y led2=1;
- K j% `9 v$ `0 ]6 v led1=0;! J( Q4 I; {4 i' y
led0=1;3 j6 |5 W0 o. b8 [! C4 k! j$ b
}9 N& r" f- l1 Y" q( Z
else if(change==2){ //东西方向 如果为黄灯/ c+ l8 R# G9 B6 j9 r3 |* S
change=0; //下次为红灯
7 l( A% I( \( {* d# r. b ^- m9 D8 c time1=3;( G% v/ k* q- |& B
time2=0;
) _. c3 s0 J b; g/ b" U. `! M led2=0;
3 ?: n* C9 u1 t+ y2 ?1 I led1=1;& w" z2 K; G; B" }8 i6 g" ?) N
led0=1;
" z. s3 @3 c9 m' `& L% N; i( d( t8 m; Q4 [* ~! p1 p* h" I
}! R. Y" r0 ^4 q( w( |
}
- @. Y2 i* l& {' u$ C //-------------------------------------南北 方向-------------------------------------
4 h( e+ s# i: @* d+ t$ p time4--;
5 p/ [' [# _% \ { if(time4==-1&&time3!=0){
+ D# t7 w2 M5 d0 a7 H/ w time3--;
8 k6 D; k- g" j. U5 n time4=9;
# U7 ^. z$ l* W* T
& u1 d/ v7 C/ h" s* s7 v; z }! Z6 B, q: s" @: G' T4 v+ M
if(time4==0&&time3==0){
. T& G& f2 |0 u6 `: |. q' ` if(change1==2){ //南北方向 如果为绿灯$ Y2 t- w6 g$ W+ {- v2 p- }
change1=1; //下次为黄灯 Z# [$ `8 j8 v- H
time3=0;7 S' `& ?1 Y. L( |
time4=5;
* M3 M% W7 D7 E1 b0 r1 ~9 L- | led3=1;/ @1 {. R8 a# e: Y! [0 ~9 I( Y
led4=0;- I5 U% j- O3 b
led5=1; 3 _' I" { e) z$ b" T3 a
}
" o- O) H T1 q6 ~! S% V2 x else if(change1==1){ //南北方向 如果为黄灯
0 L# t3 Z6 |! Y change1=0; //下次为红灯
- x% M. e; e; a: Q; r3 t' M time3=6;; N- Q$ U- f6 ?; h o# F4 R8 P% X
time4=0;
$ q) h5 m5 V2 N led3=1;, e i1 M; r P& I& @% q
led4=1;
7 m3 Y: B$ m$ g& W, P7 Y- y0 p led5=0;' z+ x& G( a( g- V0 N
}5 c5 c/ Y$ x1 v) E! v
else if(change1==0){ //南北方向 如果为红灯
9 C; v. g) h5 P$ k change1=2; //下次为绿灯* E8 W: |: H' q
time3=2;! J* A' x0 P' `. G, t* o
time4=5;
7 E p* g. T4 t led3=0;4 z2 F1 {0 `3 D, d! Y5 ^
led4=1;
2 M; h& n/ {' M' O; u. ^ led5=1;3 A+ M) G+ W3 I* n# O
count1++; //红灯转绿灯时计数加1,否则执行方向转变时按键会无效(闪一下而不变向)
2 J5 B3 j9 u5 ~. r; T2 ?
, A( K' C" h8 W* V/ v% Z. Q3 i, F }
7 H0 b: J) p2 f% i: ^# U }
! j% r5 T b( I3 ^2 W//------------------------------------------------------------------------------------
1 k1 E3 v* g' P i8 G! c }; }( u& E0 ?- X* x) l
}
7 J7 D" F6 L$ h$ v( t# F7 o
! d3 x; m: w1 k- _. T/ c- avoid display(u8 time1,u8 time2,u8 time3,u8 time4) //显示程序
4 h2 [+ W9 ]' l! E* O/ P{
% a9 V1 a) c. ^7 `7 s6 ~" h. C P0=table[time1];
4 y! Y8 E L3 ?5 m CK1=0;
- c+ R b2 x% ^5 J8 k. F( e delay(100);
; S" d4 h# O' t, f6 O8 @ CK1=1;8 c& h- D9 C; o" h
3 ?1 u$ E* X3 n9 J
P0=table[time2];
; @7 J7 P5 }) L/ j+ N2 j CK2=0;
0 A' ]3 X" `6 W8 L. w$ S& y delay(100);
/ T! s7 U1 A8 r+ J) [ CK2=1;
4 j" P7 C, @ R3 E
, o! }! D7 m/ ]# m3 b P0=table[time3];2 m, j5 }8 i7 S+ I0 e
CK3=0;
3 l" M" d' P5 A/ ^6 ^ delay(100);
+ P' o0 j* R3 t# T/ N$ r( D1 a CK3=1;, F; Y0 C0 z6 r& e1 |5 ]8 R
+ d" @6 j( z5 L, K: t( `
P0=table[time4];) G5 J/ ^5 N. [# |
CK4=0;
' d0 y8 e# @3 T: x I' g delay(100);
- I( B( b" i2 H, D3 V H4 C CK4=1;
, c9 |' {: b; ?7 z} a) e1 N! D( v: h7 t+ b
0 L1 R) ~8 ^# @ h: M/ n0 p
void TrafficStart()2 J T1 r `% f" O% ]8 Z p
{
/ S7 q& ]: P" L( F t; S9 M/ I TR1=1;//打开定时器- ~' Z, ], a* u; Q1 o/ L
display(time1,time2,time3,time4);
, d3 d/ S; o& H" |7 t( b5 k4 z}5 ]1 O0 ^2 N+ h1 `1 ?
2 Q" D) [# V5 V5 G
void TrafficStop()/ K4 T1 m ^9 r1 ~; _+ B
{ ; G2 t# k9 e+ q# P
TR1=0;//关闭定时器7 {. x! O; u# R5 u) @+ E
CK1=CK2=CK3=CK4=0;1 l1 S' n. w' T9 X
P0=stop[0];. N5 l+ e# a* D3 q& P$ @4 A
if(led0==0){
. C* w+ q0 {1 P templed=0; //记录当前灯状态 东西方向: b+ d' p* o# k
led0=1; //将原来灯熄灭/ D' d4 Z2 X- Z f" `
led2=0; //亮红灯/ e4 S- I) u1 I
}
( J+ o; H! e" T' M if(led1==0){% b/ M- m8 B; m8 X. G* B; Z0 {
templed=1;
( c9 o% }) {5 E* z) y/ P led1=1;
. @4 _0 j& J% z' C led2=0;
; ?3 |3 M, k! ?* q* p }
9 S' i* u# b+ G* m+ o if(led3==0){2 P. S5 a+ w+ N& q
templed1=3; //记录当前灯状态 南北方向% \3 f! o& T, K& L) O) X- W
led3=1;
# y1 j' C# Q4 K) q, Q S) z, k! y/ Y$ V led5=0;- V/ C* r$ O3 C6 i* J0 _
}
4 f& q( U0 Q0 i1 L% F( j" f/ B2 O if(led4==0){) \; S5 `. B9 p9 l( T/ U' n8 k$ n
templed1=4;
: e- c* H' u! a1 x: P, \ led4=1;
( E# }) v. \5 n' d6 g led5=0;; o5 G7 c$ O8 C
}
, a v* ?3 [ l" u; V. E; k}
3 f6 J4 F2 ?- E' Z7 m- K$ k/ i' S
/ R- e4 k. T# ?2 F' \/ |void ledInit()
0 L' R! g: ]6 e( `4 m{
+ h8 U- A9 k9 A1 G5 b. @6 u/ ^ if(templed==0){ //恢复紧急状态前时的灯状态 东西方向 s( {- ~( b) C `
led2=1; //熄灭其他灯* w7 d T. ^* C, d8 k* T1 k8 ?& X
led1=1; //熄灭其他灯: y3 ?" {3 n9 \, p1 N' @
led0=0; //恢复灯的状态 [0 J3 {) c) V8 |( ~, @# s& X& B: ]
}
1 [5 b5 ^) y) D/ r' q5 V if(templed==1){0 f9 y# q* K0 r/ Y3 c
led2=1;
8 q" X, g$ v$ V4 D# J* z# s2 c led1=0;, v N4 _! O8 a; F" u
led0=1;
2 e5 w& O t/ N8 z }4 G3 D0 J# [8 e" ], U! R
if(templed1==3){ //恢复紧急状态前时的灯状态 南北方向
! h+ x! \, A6 D$ p. \" y led5=1; //熄灭其他灯2 ]: G- {: [ W$ Y
led4=1; //熄灭其他灯- t* U0 _! |4 a
led3=0; //恢复灯的状态
0 B3 D' G, q5 {6 ?4 P0 ^ }
: X7 B5 m+ ]2 R; Z6 T1 l if(templed1==4){) f9 ?2 m6 i. g8 s0 Q: ]* H
led5=1;; @' D! `6 {0 M4 j4 K% [
led4=0;# i4 C2 s2 W o" ^
……………………
) Q" [& \9 u# H" ?+ h$ C$ H- G5 T0 |+ y0 ]! d) @/ b
…………限于本文篇幅 余下代码请从eda365.com下载附件…………
, o# P. I% L+ v+ @5 W& t' Y8 f; Y0 |2 ?/ s2 x, u' n0 b
% W7 K& F! f* Y! M- ]8 L( l" i6 W8 v1 ?8 V p. i4 _3 C# O
/ B l7 S7 D# P0 W0 G. m- t4 V |
|