超級交通燈proteus仿真,立體實物,行人道上的紅綠燈第二輪,發代碼,大家點評
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.jpg (154.46 KB, 下載次數: 83)
下載附件
2017-12-13 23:45 上傳
0.png (6.33 KB, 下載次數: 72)
下載附件
2017-12-13 23:45 上傳
單片機源程序如下:
- #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)
2017-8-28 21:19 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|