#include<reg51.H> // 對單片機的口進行了定義
#define uint unsigned int
#define uchar unsigned char
uchar code a[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//段碼組合,共陽極
uchar code b[4]={0x01,0x02,0x04,0x08}; //位碼組合
uchar code c[4]={0xcc,0xd4,0x78,0xb8};/P1 綠紅、黃紅、紅綠、紅黃/
//12MHz
//*************************************************************************************
uchar NB=25,DX=30,NBG=25,DXG=15,H=5; /數碼管顯示值設置/
uchar i,k=0,cnt=0,j=0;
sbit K0=P3^4; /支干道通行/
sbit K1=P3^5; /主干道通行/
sbit K4=P3^6; /返回/
sbit K3=P3^2; /設置時間/
sbit K2=P3^3; /緊急剎車/
void delay(uchar t); /定義延時程序/
void key(); /定義鍵盤程序/
void display(); /定義顯示程序/
void settime(); /定義時間設置顯示程序/
//程序初始********************
void init(void)
{
TMOD=0x01; /使用定時器0模式一/
TH0=0x3c; /(65536-5000)/256/
TL0=0xb0; /(65536-5000)%256/
IT0=1; //開中斷
ET0=1;
TR0=1;
EA=1;
EX0=1;
EX1=1;
P1=c[k]; //開啟交通燈
}
//中斷0處理程序**************
void int0(void) interrupt 0 // 通行時間設置
{
EA=0;
P1=0xd8; /紅燈全亮/
for(;?
{
settime();
if(K1==0) /*P3^6=0設置主干道通行時間*/
{
delay(40);
if(K1==0)
{
while(!K1)
{settime();}
DXG++; /*主干道通行時間加1*/
if(DXG==100)
DXG=0;
}
}
if(K0==0) /*P3^5=0設置支干道通行時間*/
{
delay(40);
if(K0==0)
{
while(!K0)
{settime();}
NBG++; /*支干道通行時間加1*/
if(NBG==100)
NBG=0;
}
}
if(K4==0) /*P3^7=0返回*/
{
delay(40);
if(K4==0)
{
while(!K4)
{
}
k=0;P1=c[k];
NB=NBG,DX=NBG+H;
display();
EA=1;
break;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
}
//***************中斷1處理程序
void int1(void) interrupt 2 //緊急情況
{
/*東西南北紅燈亮*/
1
EA=0;
TR0=!TR0; /停止計數/
for(;? /主支干道顯示全為0/
{
P1=0xd8,
P0=a[0];
P2=b[0];
delay(20);
P2=b[1];
delay(20);
P2=b[2];
delay(20);
P2=b[3];
delay(20);
if(K4==0) /*返回*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
delay(20);
EA=1;
P1=c[k]; /返回緊急前狀態開始計數/
TR0=!TR0; /重啟計數/
break;
}
}
}
void time1(void) interrupt 1 /交通燈控制程序/
{
TH0=0x3c; /定時50ms/
TL0=0xb0;
cnt++;
if(cnt>=20) /每2050ms=1s自減一*/
{
NB–;
DX–;
cnt=0;
if(NB0||DX0)
{
k++;
if(k>3) /k取0,1,2,3/
k=0;
switch(k)
{
case 0:NB=NBG,DX=NBG+H;j=0;P1=c[k];break; /*主干道通行顯示綠紅*/
case 1:NB=H;j=1;P1=c[k];break; /*主干道黃燈閃爍*/
case 2:NB=DXG+H,DX=DXG;j=0;P1=c[k];break; /*支干道通行顯示紅綠*/
case 3:DX=H;j=2;P1=c[k];break; /*支干道黃燈閃爍*/
1
2
3
4
5
6
7
}
}
}
}
void delay(uchar t) //延時程序延時0.1*nms
{
uchar i;
do
{
for(i=0;i<20;i++)
;;;
1
2
3
} while(t–);
}
void settime()
{
P2=b[0],P0=a[(NBG+H)%10]; /*顯示主干道通行時間 */
delay(20);
P2=b[1],P0=a[(NBG+H)/10];
delay(20);
P2=b[2],P0=a[(DXG+H)%10]; /*顯示支干道通行時間*/
delay(20);
P2=b[3],P0=a[(DXG+H)/10];
delay(20);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
}
void key() //鍵盤程序用KO K1模擬一道有車一道無車
{
if(K1==0) /*主干道有車支干道無車*/
{
delay(40);
if(K1==0)
{
while(!K1)
{
display();
}
k=0,P1=c[k];cnt=0;
NB=NBG, DX=NBG+H;
display();
}
}
if(K0==0) /*支干道有車主干道無車*/
{
delay(40);
if(K0==0)
{
while(!K0)
{
display();
}
k=2,P1=c[k];cnt=0;
NB=DXG+H,DX=DXG;
display();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
}
}
void display() //顯示程序
{
P2=b[0],P0=a[NB%10]; /由k的不同值進入確定顯示數值/
delay(20);
P2=b[1],P0=a[NB/10];
delay(20);
P2=b[2],P0=a[DX%10];
delay(20);
P2=b[3],P0=a[DX/10];
delay(20);
}
void main(void)
{ //主程序
init();
for(;?
{
display();
key();
//黃燈閃爍程序
while(j==1) /主干道黃燈閃爍/
{
P1=0xdc; /*給黃燈一高電平黃燈滅*/
for(i=83;i>0;i--){display();} /*執行for循環延時*/
P1=c[k]; /*再給黃燈一低電平黃燈亮*/
for(i=83;i>0;i--){display();}
1
2
3
4
5
6
7
8
9
}
while(j==2)
{ /*支干道黃燈閃爍*/
P1=0xf8;
for(i=83;i>0;i--){display();}
P1=c[k];
for(i=83;i>0;i--){display();}
1
2
3
4
5
6
7
8
9
10
11
}
}
}
|