|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机原理及应用课程设计论文-交通信号灯模拟控制系统 8 r/ I; f, J9 u, X5 h! o9 a5 d- M
单片机源程序如下:
2 `' z2 r7 v3 _
$ ]' H/ }3 j' ~5 `4 @0 A/**************************************************************************************( p, Y, l7 K1 D$ g( X+ y; G( x! I
* 交通灯实验 *( |$ M( m4 j9 e3 w o% s5 G. t
实现现象:模仿交通灯运作
* h& a! P9 G' n9 Y注意事项:无 ) K. K9 W* O- j P; F
***************************************************************************************/' T: X3 h; I5 ]7 _1 Q& E( ]
' P. I9 E# ` E# I( B* I q& X/ B+ X#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器! c( h1 R9 e: Y( P+ E5 F8 Z
7 w. {8 l2 X/ Y3 @3 u9 g! g
void delay();8 c+ {- |" B& e" O9 p8 I
void display();0 Z9 \7 T% T- r5 L8 a
void TrafficStart();
! G. p4 [! x# N! _% @; }+ tvoid TrafficStop();/ k& V8 D4 N: L% o4 L* h+ v
void ledInit();
" O n% u% \; \. ~( a& C/ w zvoid changeNSpass();
0 D3 Z+ z" u1 wvoid changeEWpass();
/ j. v4 l/ M2 m: T/ j$ r m! m( D4 p' [
typedef unsigned int u16; //对数据类型进行声明定义0 ]! \$ \5 `' y
typedef char u8;0 b9 g" ~0 z: d! _, @
) ?# G( M$ f0 u/ w- K/ Ru8 code table[]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, ( [0 s) \% y- }/ b; c* Q! i" E
0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e};
0 t& ~5 ~% F/ T9 W. Q7 e4 `u8 code stop[]={0xbf}; //1011 1111 / s' i1 L- r [
9 ^( U) {/ R) n6 X4 H( z2 t
u8 time1=3; //东西方向 第一位数字
& F3 ]: G+ {- Z! ~! W" Zu8 time2=0; //东西方向 第二位数字
$ q8 M+ n& M0 t0 @5 v; u+ X/ h( j) ^1 D( T$ T8 R/ y; H' ]+ m
u8 time3=2; //南北方向 第一位数字5 l5 R4 j W9 d1 `( E: C
u8 time4=5; //南北方向 第一位数字' m: R, t8 @2 |
, [( _) G1 U+ [9 E6 M4 C2 K. V* au8 change=0; //东西方向状态改变,初始为0 0为红灯 1为绿灯 2为黄灯' R1 E( r: q: `
u8 change1=2; //南北方向状态改变,初始为2 0为红灯 1为绿灯 2为黄灯0 M5 x. M& J( L2 r: Q1 g
; p3 W3 i. T7 m! y/ b
u8 ledset=0; //紧急状态标志位,0为允许紧急状态启动
: a/ V0 E* @# q- H: ~& vu8 templed=2; //LED灯临时记录,初始为2 0为绿灯 1为黄灯 2为红灯0 r, P' E- e0 q
u8 templed1=5; //LED灯临时记录,初始为5 3为绿灯 4为黄灯 5为红灯
4 y8 y- ]! e h4 z" a9 r
* [! P: n- V# z' ]+ L2 Z' s; iu8 count=0; //紧急状态按键计数 - W3 v e' @" D9 K+ P$ P
u8 count1=0; //方向转变计数3 _" w% v( w; n& ^, {0 f
# V1 ^2 }, f: tsbit led0=P1^0; //将P1^0口定义为led0 绿色1
% a9 e/ s% b: k: Z- D6 T R' Q) _5 ksbit led1=P1^1; //将P1^1口定义为led1 黄色19 v9 m" c$ f" t- l
sbit led2=P1^2; //将P1^2口定义为led2 红色1
* D: j9 |, _, g0 u/ jsbit led3=P1^3; //将P1^0口定义为led3 绿色2
2 [: \0 o, k9 `sbit led4=P1^4; //将P1^1口定义为led4 黄色29 m4 I' Q+ A( `
sbit led5=P1^5; //将P1^2口定义为led5 红色29 x: N% B1 l) {+ Y1 q W1 t5 r- E
3 g5 l( n7 e S1 i0 C$ N- Z/ S
sbit CK1 = P2^3; //东西方向第一位数码管
% I7 `' g" Y* S1 Usbit CK2 = P2^2; //东西方向第二位数码管
/ T9 J. l8 j& b) C+ Y' p" [2 ~* L8 I
) G/ U% Q. j7 ?/ Nsbit CK3 = P2^1; //南北方向第一位数码管' m9 [/ d0 H$ ~. R
sbit CK4 = P2^0; //南北方向第二位数码管7 j! k4 L0 { ]( ^) g, f3 C
5 F8 C& u+ V4 e% bsbit key2 = P3^0;
8 G) O# t+ ^, esbit key3 = P3^1;- O. ^6 y N1 k* X
sbit key4 = P3^2;8 a( u7 G3 p, W/ n/ l- q
* j- A6 l; t3 k, P( @1 f7 O8 N
void delay(u16 i)
9 i" c/ R5 O% [{
, E/ x2 O0 w. O6 s' Q while(i--); 2 ?, ]+ s: @2 q* P2 c/ S! w. P, u
}. z% {' f5 n6 |0 W# N8 i9 C
% E+ U2 L: Y; K. H' q
void display(u8 time1,u8 time2,u8 time3,u8 time4);' b# ?; q) s/ w0 s: B2 _) P! P* O
/*******************************************************************************; `: U1 y% T, o7 b/ f) t2 J' h
* 函 数 名 : Timer1Init! D0 P5 [1 G# w
* 函数功能 : 定时器1初始化
4 A# s o% K$ E" m3 o7 u5 ]3 L* 输 入 : 无; D( G _2 X- q$ P& w9 D
* 输 出 : 无) w q, i) M' @! l
*******************************************************************************/
( F6 E9 [. w0 @# \- nvoid Timer1Init() p* [! _& W: O' W, Q8 l! L
{2 n Q% ~: |3 e" h! c# s
TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。1 w& [1 M2 Z% X( W; ^" l
7 y9 L7 k4 S2 ^2 i8 G1 S/ e# P TH1=0X3c; //给定时器赋初值,定时50ms
% Z- d( V0 z# s+ ^- i TL1=0Xb0;
' S, S" R& ]2 j- t2 ~$ a# O) x ET1=1;//打开定时器1中断允许
/ o, A( l: V& K& Z5 x EA=1;//打开总中断/ I/ v8 W2 ]8 q" Q- d; K
TR1=1;//打开定时器 1 `, ]" q% _4 O
}, L2 Q9 ], T7 V/ @8 @8 h
3 G1 b1 K9 P; n) t/*******************************************************************************
6 P2 C' ?, R0 Z8 s3 Y* 函 数 名 : main
* z/ N/ C, D( I6 M8 y* 函数功能 : 主函数4 ^/ j+ O7 z& [8 B
* 输 入 : 无# V9 c0 P! H. ?3 P! S
* 输 出 : 无3 F9 k9 u1 S$ x. D& S
*******************************************************************************/6 @: z6 N: R3 C1 x' V# h
void main()+ U7 Q Q/ i7 j+ d& ]
{
( H4 F" ]& G' U! Z6 C CK1=0;
1 S1 b1 H C8 l9 F3 }" X CK2=0;
2 y6 v$ Q o! F led2=0;
3 ~5 g6 T' f' ?- G led3=0;! K3 b# ?$ u0 z$ E
Timer1Init(); //定时器1初始化
* K# H$ Q& `1 o/ \ `) b while(1) {+ n* ?0 s/ |9 k. a5 @. q
{
; D! o, ^. d$ D6 x9 v//*******************************************************************************% n. l' D% ~$ }$ B+ h0 J- S4 o
if(key3==0&&count%2==0){ //当按下key3并且状态为运行状态时有效4 V) [' c% q) B7 X& R* y
delay(1000);9 U. |+ @. z- [, _0 e
if(key3==0&&count%2==0)5 E& K/ q$ u0 A' t& @3 j/ _( [
{ : @ R* a! i5 s
TR1=0; //关闭定时器,防止切换时仍然计时5 Q5 u* t- j! Y. E4 A# O
count1++;" I. V: Y$ s7 t, b/ W3 W; @! W. Q
if(count1%2==1){ //(非红灯状态下允许执行)
* l( j5 Z% D3 _4 [ TR1=1; //打开定时器% H* C, [; J) i! m+ T# L
changeEWpass();" c' e7 v& T" _+ S0 j3 z
}. H! b% U# q+ e# R0 F
if(count1%2==0){
/ ?+ S" ?* o3 V7 I TR1=1;1 X) F& ?" ?9 @9 i& h7 T1 H
changeNSpass();
. \" D9 x" ]* z- [% r }
+ y( x, @$ D0 E, R# J2 V5 ]" u3 B }
3 ^/ ?; q4 A$ ? X0 f: @6 W while(!key3);
# v, w- A/ T0 J0 O }# Q" V8 } t" I5 L" R8 ^
//*******************************************************************************' a) Q" b4 M" g5 z. Q
if(key2==0){
" I( B% ]+ d3 V& R2 K/ g: p delay(1000);+ \4 S, s; {: a2 Y- Z
if(key2==0)
9 n T& R3 i+ N7 ?+ d/ t {
" s: p6 @% V( V6 _' U9 v. u2 [ count++;. S% [# h) ^5 D7 L7 N
}0 J- q- Z" M- |% z; N
while(!key2);
' u! v9 K2 U' J; r }* ]' p* x+ D! U+ S1 G
6 Q3 K8 Q, [) D4 Q( f
if(count%2==0){ //为0则将状态恢复为运行状态
% N2 K2 f) E: W, x8 X% \ if(ledset==0){ //判断上次是否为紧急状态
8 _. q: P+ i2 L9 r ledset=1; * ?$ u* G% v# _4 }: F' @
ledInit();" ~1 |3 b' D* t4 x( K
templed=2; //东西方向初始化为红灯,由于执行了ledInit()会改变它的值,所以需要初始化,防止上个数值再次被利用(实际上只需要非0或1就行). N1 D# X7 Y9 R* ^
templed1=5; //南北方向初始化为红灯,由于执行了ledInit()会改变它的值,所以需要初始化,防止上个数值再次被利用(实际上只需要非3或4就行)
6 U' b2 z6 D! ]- M) q }
! o" Z+ O6 S" R3 E8 q+ h" P TrafficStart(); //正常状态下while会死循环该语句,该语句为动态显示数字函数
4 S+ U: G" V' a Q& K9 S }
! w6 p, }9 o7 u! A if(count%2==1){ //为1将状态修改为紧急状态
- E; p3 C, c0 M/ X8 I/ c ledset=0; 4 C, l( P& B: W4 _( n; k
TrafficStop();2 a2 \8 r, n5 y
}: h. z; p* w9 S* V3 h) U7 {/ F
Q! W8 w' j! ]4 ~8 A! Z } " [+ C1 f+ M9 `, P' J5 B
}
% }# o" R" i" d5 G: {
- R: J! O7 \! e, j+ p J8 K/ V/*******************************************************************************! l, c& {' R$ Q. T% G
* 函 数 名 : void Timer1() interrupt 3$ Z; J, H9 F) X
* 函数功能 : 定时器1中断函数
/ @& ]2 V! e! g2 F6 ^! a+ n* 输 入 : 无
5 c# _# Z& q2 `$ k# T* 输 出 : 无7 p- S9 I D) ~$ S% C
*******************************************************************************/
0 [/ A5 J3 w! ~; Z$ Z3 X3 nvoid Timer1() interrupt 3
+ [% M8 z V7 @# l' o* ]* X' Z1 t{
& H( c8 |5 _0 M static u16 i;
+ ~5 i \0 i* J8 G, p- u TH1=0X3c; //给定时器赋初值,定时50ms
1 E; o2 o2 h( X0 z0 x6 u# v TL1=0Xb0;! z7 R, T3 \* G: u
i++;
# e, c1 T j' _ if(i==20) //i等20时为1秒
+ ?! Z- J; X# m" p; ]0 [& F: W {
" Y) j$ \$ u: x. e+ v( ] i=0;( h2 H6 Z V( i& L; U( s) D
//-------------------------------------东西 方向-------------------------------------( u1 f, {; J7 w- b8 I) y
time2--;
, Y/ P3 y. I# ~4 i8 [6 i if(time2==-1&&time1!=0){
# H! I$ J* f9 j6 v( U/ i. ? time1--;
! a7 G [' {. J( d time2=9;/ i9 x3 H) }3 C [: [
}3 W3 Y) I: l' a& G) |
if((time2==0&&time1==0)){
1 z) @% h6 R8 ^# X: m3 x if(change==0){ //东西方向 如果为红灯
9 P1 }6 @) M, m! V( Q9 U! v! o change=1; //下次为绿灯; O, i9 {/ N: {( \8 ^ j: X! |
time1=5; }+ `3 n: b9 ]" R6 V
time2=0;! z: [7 y7 F3 m) q0 ?
led2=1;$ }( s# u/ h) E0 m4 q% d
led1=1;; q+ t' i1 c- @+ C
led0=0; //绿灯亮
9 W% A0 K2 J, M2 L8 m count1++; //红灯转绿灯时计数加1,否则执行方向转变时按键会无效(闪一下而不变向)) T( |+ `2 D! V3 J2 u3 M1 W
}8 U( {) J- `0 U" `
else if(change==1){ //东西方向 如果为绿灯) a+ D6 I: a4 e$ P1 i: c
change=2; //下次为黄灯
9 ?$ j/ ~: o3 V, j, N! ~" K3 z time1=1;, `& `. m2 ~. b @
time2=0;
' g1 |' I5 N% U3 J0 \ led2=1;; C4 u# K, ]/ P4 l$ O: C; d
led1=0;) P, \; F! p8 ]! e4 S$ t1 q1 m
led0=1;
- i6 O" n5 Y1 P% j3 Y$ @7 b6 [" Q }
0 x( M% @9 [7 q. {4 R. l' r9 u" I else if(change==2){ //东西方向 如果为黄灯
5 |" W7 ] a: _, ~3 ~1 r* }5 R: c, o change=0; //下次为红灯+ @8 q: W/ x' C7 |4 L& w
time1=3;
$ K" k5 e3 G; G9 F& w' b7 [9 M, y, B! u time2=0;
: y, B' j$ v1 ]$ B6 ~1 @# W( V0 _ led2=0;( h1 r& z+ G! x/ X
led1=1;7 }/ v- z( T9 i0 l1 d
led0=1;
5 u* ^7 f+ X" Y: h6 ]: Z% }' \$ _( P. S4 C2 S9 A
}
: f. r0 a0 ?# r' r7 Q2 c. U }
: G$ i- x1 i- X* g //-------------------------------------南北 方向-------------------------------------; T( j1 o6 G. W
time4--;% {" `, k; o( x: ~
if(time4==-1&&time3!=0){
. ~1 U& C! F- R) v- r { time3--;8 X2 g2 L. O9 s' x+ U5 X5 `& j9 S! e
time4=9;! y- ^& M# }) v2 G+ R% a* k2 p
) L2 U% c; s) ]* u }
" p3 S, u% y* B9 [* [- m% D0 m+ c if(time4==0&&time3==0){( T% c2 I7 r4 f6 v2 o- n
if(change1==2){ //南北方向 如果为绿灯
5 \9 M/ `4 d- ?1 x) B" o2 a change1=1; //下次为黄灯8 x7 L9 ^: `+ o& q, z% G1 n4 ]4 g
time3=0;) Y" F1 D+ X5 \
time4=5;6 [4 ^) H2 O% |
led3=1;. s4 g$ Z8 b* W8 }8 R; ^5 a
led4=0;
0 u; }" E- z- w: L) o led5=1; 9 L7 E6 ]. s$ Q: C6 v" d3 U5 `8 P
}
: ?; p, o6 G* z. \8 G- _ X4 y else if(change1==1){ //南北方向 如果为黄灯& b- k; m0 w9 t7 w$ A
change1=0; //下次为红灯7 P5 q* ~: X0 N b) v
time3=6;& y" H4 c5 b0 y- b
time4=0;6 \/ l( D% ^5 e, E7 R* [* q2 Y/ q
led3=1;9 F0 c( i$ a& j4 r. `. Z3 }5 Q
led4=1;: D2 I! p; t# l1 B
led5=0;
& u) `1 n8 V0 A# |( l3 D }
4 P6 s# v* ?* U* W; s2 q5 t else if(change1==0){ //南北方向 如果为红灯- [6 k8 M" R* l l
change1=2; //下次为绿灯1 I* m: Y% O7 m1 _ G8 e# v; P
time3=2;
; _1 r4 }# V4 k1 V time4=5;; L8 T3 \1 i0 X, S |
led3=0;
^. G; U+ t; ~% j led4=1;+ @( S# a5 D D6 B( L
led5=1;
0 P" v8 {/ M' y3 p1 f0 K9 T count1++; //红灯转绿灯时计数加1,否则执行方向转变时按键会无效(闪一下而不变向)
" {' H0 `, h% d7 ^+ x0 E% B+ z* d' v0 z4 j# k c( n; e
}) a" i3 t/ U! O% C+ |
}
. e- L* O( }3 ?//------------------------------------------------------------------------------------% H* R1 h" l, b+ V# t h, s( U2 z
} W6 u, V$ N9 n/ b% e8 p/ q
}
' n! N9 B# [; H6 ]+ |" k8 ]* z( @" V( h1 I- d" o, Y
void display(u8 time1,u8 time2,u8 time3,u8 time4) //显示程序
7 L2 l) `+ w* }& }{
, ~* R! p; V- A. d5 l7 z P0=table[time1];7 _" G# [: D+ V) W! x# b( E- S
CK1=0;
3 G) F- L, Z3 o/ n$ |# | delay(100);
: r/ [. M; ~! q" K8 |4 o+ n3 L CK1=1;- q6 S6 c' d' S/ ]0 {9 i* p
0 ]! K* r7 R' U4 ~ P0=table[time2];5 x* |0 L! I o4 M
CK2=0;
; B) S2 o- V+ J7 f6 V delay(100);7 f) J4 Q. y, O# L; ~8 g: c; T
CK2=1;* C' o! S2 {9 [! o
6 j+ s$ `3 d& O) e8 x P0=table[time3];1 |- d, _( R6 u! ]. w
CK3=0;- R$ `- g$ x g# ]* D l$ |2 I0 m
delay(100);
: x) [% m6 O$ N$ d% B. P* R+ u CK3=1;
+ v2 q, F' a) Y$ ^! N
6 I* W) Z, Z4 g P0=table[time4];& j4 ?! G0 X3 `0 v; X: ~
CK4=0;
8 F) K5 N+ L& Q8 U) b% y delay(100);
0 J9 H3 d( T, c$ O% J! u CK4=1;2 T4 s# V& p2 Z) c# h( I
}" `% [" y8 `" S: O$ m* X4 L
1 D R) u1 F3 V$ W" t- M8 W6 x
void TrafficStart()
, e: X9 n8 o8 Y5 u{* q; o/ K L. ?' L1 h* W* J: m) |- F. R
TR1=1;//打开定时器9 R% K7 h* E) [( o8 l6 x- G) e
display(time1,time2,time3,time4); z4 a$ F+ Y5 k* L% I/ @
}" C- ~* V: F; c8 U
. o0 t' {+ O! O" L
void TrafficStop()
0 d+ W5 V0 r q- H7 A{
+ I8 C- A4 m: M TR1=0;//关闭定时器
2 c @. o! o: F, q" v4 S CK1=CK2=CK3=CK4=0;* S* `0 r3 Z+ V# T8 m) j
P0=stop[0];
6 O5 b1 V8 X+ @+ i" p3 m if(led0==0){# T6 o i6 f1 s' l7 K2 F! `
templed=0; //记录当前灯状态 东西方向* a* R: p4 H% c1 H; i+ B
led0=1; //将原来灯熄灭
/ X! i5 T3 O: b6 } M led2=0; //亮红灯
% Z- M1 e1 _0 _4 j) h9 v; @' ^ }
0 E$ P5 P3 S/ F2 _" W& b% {" M if(led1==0){0 U$ B# _% Z/ D* s; ~. \/ x# `- n/ ?# T
templed=1;
$ q! h0 V2 j. U" v6 b led1=1;- t1 M9 g9 y8 B8 s' ?
led2=0;
& e4 J, ]3 M: A* t }
2 R* N* L# Y* U( l1 C if(led3==0){7 V% ]: q7 w2 W, S" r- i
templed1=3; //记录当前灯状态 南北方向
& U8 |( n: [' b; K9 R led3=1;
9 A1 |& R) V2 Q: `) z led5=0;
, V0 W1 @' h, h( L% m9 l }
9 [& {6 b& T# m0 R; b if(led4==0){
/ W, l; b- `- M" C4 e templed1=4;
% L% q: D X# U. R# i led4=1;* o ^% G3 H ]0 E7 H3 c5 t; Z
led5=0;
- x8 J R( j/ v' ^& F }4 |+ E; L' K: ^
}
' C' U$ V8 G" s: ~$ g; |5 X. k# h! @4 T6 f8 f, D6 Y
void ledInit()
8 b/ k; @$ k0 S( o; r% G{1 C2 I; s( b- G; {
if(templed==0){ //恢复紧急状态前时的灯状态 东西方向! o+ M+ x! i" O. F
led2=1; //熄灭其他灯9 J9 N& Q- E* N% N( ^( h/ Y
led1=1; //熄灭其他灯( r" p' N% v# `! q/ F
led0=0; //恢复灯的状态
9 l: o2 m, s& d8 ~) f5 O }
+ Y2 h& W, I2 H+ { if(templed==1){
9 T; {, e7 a" t3 H' y9 s1 H led2=1;
1 _2 s+ W6 ^% p/ _# g1 o9 B led1=0;
1 U. V. _& V' F, V! |! V led0=1;9 U0 i: k9 v2 k! d- l
}% h+ l; B6 \& F
if(templed1==3){ //恢复紧急状态前时的灯状态 南北方向, b( y" a. o! r7 A9 e$ j; |
led5=1; //熄灭其他灯
/ f, J4 l3 y* m7 R1 e led4=1; //熄灭其他灯1 m* a- F4 m9 b S
led3=0; //恢复灯的状态
9 r( D E$ e n- y }5 r1 ^* A! ]% m! p2 T5 C
if(templed1==4){
: k5 a( o# Z. `4 }, U9 v$ x6 e+ A led5=1;
- S5 P7 \4 k/ S3 s7 X led4=0;
1 C {1 C m* o! X8 E" b" s……………………, U' H( ?6 K6 c: O9 {
- A# A( l4 f/ B9 @& i/ r) h, ~
…………限于本文篇幅 余下代码请从eda365.com下载附件…………" C! x3 ~1 I- p8 ^
6 L6 d3 G3 o- w/ F% C$ e3 O0 L
( C9 ?$ E) l+ j& o! o* R6 _8 Q4 o* e$ R' Z) ~; O
|
|