超级交通灯proteus仿真,立体实物,行人道上的红绿灯第二轮,发代码,大家点评
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg51.h>
- sbit P3_5=P3^5;
- sbit shi=P3^6; //十位
- sbit ge=P3^7; //个位
- sbit fm=P3^4;
- sbit hw1=P3^3;
- sbit LED1=P1^0; //南红北绿
- sbit LED2=P1^1; //南北黄
- sbit LED3=P1^2; //南绿北红
- sbit LED4=P1^3; //东红西绿
- sbit LED5=P1^4; //东西黄
- sbit LED6=P1^5; //东绿西红
- sbit k2=P1^6;
- sbit sw=P1^7;
- sbit led1=P3^1; //电机启动为0
- sbit led2=P3^2;
- sbit k1=P3^0;
- sbit P2_0=P2^0;
- sbit P2_1=P2^1;
- sbit P2_2=P2^2;
- sbit P2_3=P2^3;
- sbit P2_4=P2^4;
- sbit P2_5=P2^5;
- sbit P2_6=P2^6;
- sbit P2_7=P2^7;
- sbit P0_0=P0^0;
- sbit P0_1=P0^1;
- sbit P0_2=P0^2;
- sbit P0_3=P0^3;
- sbit P0_4=P0^4;
- sbit P0_5=P0^5;
- sbit P0_6=P0^6;
- sbit P0_7=P0^7;
- unsigned char count=0; //计数50ms
- unsigned char miaoa; //东西方向
- unsigned char miaob; //南北方向
- unsigned char DY=1; //标志第一个方式
- unsigned char DX=1;
- unsigned char DZ=0;
- unsigned char DB=0;
- unsigned int c=0;
- unsigned int b=0;
- unsigned char miao; //加减时间
- void disp1();
- void disp2();
- void delay(unsigned int t) //延时函数
- {
- unsigned int a;
- for(a=0;a<t;a++);
- }
-
- void timer_1() interrupt 3 //定时器T1的中断函数,工作方式1下50ms产生中断,执行该中断函数
- {
- TH1=(65536-50000)/256; //重新设置T1计数初值高8位
- TL1=(65536-50000)%256; //重新设置T1计数初值低8位
- count++; //50ms计数器加1
- }
- //void hongwai1()
- //{
- // bit flag;
- // flag=0; //灯灭
- //
- // if(hw1==1&&flag==0)
- // {
- // fm=0;
- // delay(50000);
- // flag=1;
- // }
- // else if(hw1==0&&flag==1)
- // {
- // fm=1;
- // delay(50000);
- // flag=0;
- // }
- //}
- void shumaguan()
- {
- if(DX==1) //方式1
- {
- if(DY==1)
- {
- // hongwai1();
- P0_0=1;
- P0_1=0;
- P0_2=0;
- P0_3=1;
- switch(c) //切换闲忙时间范围
- {
- case 0:miaoa=15+miao;miaob=12+miao;break; //忙
- case 1:miaoa=25+miao;miaob=22+miao;break; //不忙
- case 2:miaoa=35+miao;miaob=32+miao;break; //闲
- default:break;
- }
- DY=0;
- }
- if(count==20)
- {
- miaoa--;
- miaob--;
- count=0; //50ms计数清零
- }
- if(miaoa<10&&miaob<7)
- {
- disp1();
- }
- if(DZ==0)
- {
- LED6=1; //灭东绿西红,亮东西黄灯
- LED3=1;
- LED1=0; //南红北绿,东红西绿
- LED4=0;
- LED2=1;
- LED5=1;
-
-
- if(miaoa==3&&miaob==0)
- {
- miaob=3; //东西方向减为0
- LED1=1; //灭南红北绿,南北亮黄
- LED4=1;
- DZ=1;
- }
- }
- if(DZ==1)
- {
- LED1=1; //灭南红北绿,南北亮黄
- LED4=1;
- if(count<10)
- {
-
- LED2=0; // 南北红灯亮,东西黄灯灭
- LED5=0;
- }
- else {
-
- LED2=1;
- LED5=1 ;
- }}
- if(miaoa==-1&&miaob==-1) //东西南北都减为0
- {
- DX=0;
- DZ=0;
- //DY置0,准备方式2
- }
- }
- else if(DX==0)
- { //方式2启动
- if(DY==0)
- {
- // hongwai1();
- P0_0=0;
- P0_1=1;
- P0_2=1;
- P0_3=0;
- switch(c) //切换闲忙时间范围
- {
- case 0:miaoa=12+miao;miaob=15+miao;break; //忙
- case 1:miaoa=22+miao;miaob=25+miao;break; //不忙
- case 2:miaoa=32+miao;miaob=35+miao;break; //闲
- default:break;
- }
- DY=1;
- }
- if(count==20)
- {
- miaoa--;
- miaob--;
- count=0;
- }
- if(miaob<10&&miaoa<7)
- {
- disp2() ;
- }
- if(DB==0)
- {
- LED1=1; //灭南红北绿,南北亮黄
- LED4=1;
- LED3=0; //南绿北红,东绿西红
- LED6=0;
- LED2=1;
- LED5=1 ;
-
- if(miaob==3&&miaoa==0)
- {
- miaoa=3;
- LED6=1;
- LED3=1; //灭东绿西红,亮东西黄灯
- DB=1 ;
- }
- }
- if(DB==1)
- {
- LED6=1; //灭东绿西红,亮东西黄灯
- LED3=1;
- if(count<10)
- {
- LED2=0; // 南北红灯亮,东西黄灯灭
- LED5=0;
- }
- else {LED2=1;
- LED5=1 ;
- }}
- if(miaob==-1&&miaoa==-1)
- {
- DX=1;
- DB=0; //转为方式1
- }
- }
- }
- void disp() //显示函数
- {
- unsigned char led1[]={0,1,0,1,0,1,0,1,0,1};
- unsigned char led2[]={0,0,1,1,0,0,1,1,0,0};
- unsigned char led3[]={0,0,0,0,1,1,1,1,0,0};
- unsigned char led4[]={0,0,0,0,0,0,0,0,1,1};
- P2_7=led4[miaoa/10%10]; //显示十位 西东
- P2_6=led3[miaoa/10%10];
- P2_5=led2[miaoa/10%10];
- P2_4=led1[miaoa/10%10];
- P2_3=led4[miaob/10%10]; //南北
- P2_2=led3[miaob/10%10];
- P2_1=led2[miaob/10%10];
- P2_0=led1[miaob/10%10];
- shi=0;
- delay(5);
- shi=1;
- P2_7=led4[miaoa%10]; //显示十位 西东
- P2_6=led3[miaoa%10];
- P2_5=led2[miaoa%10];
- P2_4=led1[miaoa%10];
- P2_3=led4[miaob%10]; //南北
- P2_2=led3[miaob%10];
- P2_1=led2[miaob%10];
- P2_0=led1[miaob%10];
- ge=0;
- delay(5);
- ge=1;
- }
- void disp1()
- {
- unsigned char led1[]={0,1,0,1,0,1,0,1,0,1};
- unsigned char led2[]={0,0,1,1,0,0,1,1,0,0};
- unsigned char led3[]={0,0,0,0,1,1,1,1,0,0};
- unsigned char led4[]={0,0,0,0,0,0,0,0,1,1};
- P0_7=led4[miaoa]; //显示十位 西东
- P0_6=led3[miaoa];
- P0_5=led2[miaoa];
- P0_4=led1[miaoa];
- P3_5=0;
- delay(5);
- P3_5=1;
-
-
- }
- void disp2()
- {
- unsigned char led1[]={0,1,0,1,0,1,0,1,0,1};
- unsigned char led2[]={0,0,1,1,0,0,1,1,0,0};
- unsigned char led3[]={0,0,0,0,1,1,1,1,0,0};
- unsigned char led4[]={0,0,0,0,0,0,0,0,1,1};
- P0_7=led4[miaob]; //南北
- P0_6=led3[miaob];
- P0_5=led2[miaob];
- P0_4=led1[miaob];
- P3_5=0;
- delay(5);
- P3_5=1;
- }
- void main()
- {
- TMOD=0x10;
- TH1=(65536-50000)/256; //设置T1计数初值高八位
- TL0=(65536-50000)%256; //设置T1计数初值低八位
- EA=1;
- while(1)
- {
- while(!sw)
- {
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
超级交通灯(proteus仿真).rar
(224.99 KB, 下载次数: 34)
|