找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2654|回复: 2
打印 上一主题 下一主题
收起左侧

基于51单片机的交通灯原理图加代码

[复制链接]
跳转到指定楼层
楼主
#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
}

}

}



2019072118042053.png (416.46 KB, 下载次数: 39)

2019072118042053.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:639511 发表于 2019-11-19 09:10 | 只看该作者
紧急模式灯是怎么亮的
回复

使用道具 举报

板凳
ID:775396 发表于 2020-6-12 11:17 | 只看该作者
请问有Proteus仿真文件吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表