Altium Designer畫的交通燈原理圖和PCB圖如下:(51hei附件中可下載工程文件)
014956xhzbhf929f22h4ih.png (37.55 KB, 下載次數: 20)
下載附件
2018-7-1 02:56 上傳
015002sajm3mvr5mqfz9ac.png (13.1 KB, 下載次數: 22)
下載附件
2018-7-1 02:56 上傳
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (9.37 KB, 下載次數: 24)
下載附件
2018-7-1 02:57 上傳
0.png (13.11 KB, 下載次數: 17)
下載附件
2018-7-1 02:57 上傳
0.png (10.53 KB, 下載次數: 24)
下載附件
2018-7-1 02:58 上傳
單片機源程序如下:
- /* 以單片機位核心設計一個交通燈,要求單片機頻率設為11.0592MHz。
- 分為主干道和次干道。主干道直行方向綠燈亮通行50s(后三秒直行方向綠燈閃爍),接下來三秒直行方向黃燈閃爍,然后主干道直行方向燈變紅燈,
- 左拐方向燈變綠燈,左拐持續時間為20s(后三秒左拐綠燈閃爍),接下來三秒左拐黃燈閃爍,然后主干道直行燈和左拐燈變紅燈,同時次干道由紅燈
- 變成綠燈,直行時間持續20s,左拐持續時間15s,重復與主干道的類似的過程,然后再重復上述過程并持續下去,直行和左拐用LED點陣顯示,剩余
- 時間用LED數碼管顯示。還有突發事件應急處理的按鍵,當按下時,某一路通車,其余路變成紅燈(主干道和支干道共用紅黃綠燈)。
- P1.0~P1.5 LED燈接口
- P0.0~P0.7和P2.0,P2.1 兩位一體共陽數碼管接口
- P3.0~P3.3 兩片74HC595接口
- P1.6,P1.7,P3.6,P3.7 按鍵接口*/
- #include<reg52.h>
- #include"config.h"
- #include"uart.h"
- #include<intrins.h>
- #define NOP() _nop_()
- /*燈代碼定義*/
- sbit RE_ST=P1^0;
- sbit YE_ST=P1^1;
- sbit GR_ST=P1^2;
- sbit RE_LE=P1^3;
- sbit YE_LE=P1^4;
- sbit GR_LE=P1^5;
- //突發事件應急處理按鍵
- sbit sw1 = P1^6;
- sbit sw2 = P1^7;
- sbit sw3 = P3^6;
- sbit sw4 = P3^7;
- bit flag=1;
- bit flag_l=1; //直行狀態標志位
- bit flag_s=1; //左拐狀態標志位
- //74HC595管腳定義
- sbit MOSIO1=P3^1;
- sbit R_CLK1=P3^0;
- sbit S_CLK1=P3^2;
- unsigned int i;
- unsigned int a,b,d;
- unsigned char DSY_BUFF[] = {0,0};
- unsigned char code DSY_CODE[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數碼管段碼定義
- unsigned char code tab[]={0xE7,0xC3,0x81,0x81,0xE7,0xE7,0xE7,0xE7}; //直行箭頭段碼定義
- unsigned char code tab3[]={0xFF,0xEF,0xCF,0x00,0x00,0xCF,0xEF,0xFF}; // 左拐箭頭段碼定義
- unsigned char code tab1[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
- unsigned char tab2[]={0,0,0,0,0,0,0,0};
- void delay(unsigned int x);
- void HC595SendData(unsigned int SendVal);
- void HC595SendData1(unsigned int SendVal1);
- void SCan(); //按鍵調用
- void main()
- {
- TMOD = 0X11;
- ET0 = 1;
- TH0 = (65536-50000)/256; //50ms
- TL0 = (65536-50000)%256;
- TH1=(65536-2000)/256;
- TL1=(65536-2000)%256; //1.0ms
- ET1=1; //定時器/計數器1中斷允許
- EA=1; //總中斷允許
- TR1=1;
- TR0 = 1;
- while(1)
- {
- if(flag)
- {
- if(b<=50)
- flag_l=0; //主干道直行綠燈亮50s
- GR_ST =0;
- if((b>=48)&(b<=50)&((a==10)|(a==0))) //主干道直行綠燈3秒閃
- {
- GR_ST=!GR_ST;
- delay(400);
- flag_l=0;
- }
- if((b>=51)&(b<=53)&((a==10)|(a==0))) //主干道直行黃燈3秒閃
- {
- GR_ST=1;
- YE_ST=!YE_ST;
- delay(300);
- flag_l=0;
- }
- if((b>=54)&(b<=73)) //主干道左拐綠燈亮20s
- {
- GR_ST=1;
- flag_l=1;
- flag_s=0;
- YE_ST = 1;
- delay(500);
- RE_ST = 0;
- GR_LE= 0;
- }
- if((b>=71)&(b<=73)&((a==10)|(a==0))) //主干道左拐綠燈3秒閃
- {
- GR_LE=!GR_LE;
- delay(300);
- flag_s=0;
- }
- if((b>=74)&(b<=76)&((a==10)|(a==0))) //主干道左拐黃燈3秒閃
- {
- GR_LE=1;
- YE_LE= !YE_LE;
- delay(300);
- flag_s=0;
- }
- if((b>=77)&(b<=93)) //主干道左拐紅燈和直行紅燈變亮,次干道直行綠燈變亮持續20s
- {
- RE_ST=1;
- flag_s=1;
- RE_LE=0;
- YE_LE = 1;
- flag_l=0;
- GR_ST=0;
- } //次干道直行綠燈3秒閃爍
- if((b >=94)&(b<=96)&((a==10)|(a==0)))
- {
- GR_ST=!GR_ST;
- delay(400);
- flag_l=0;
- }
- if((b>=97)&(b<=99)&((a==10)|(a==0))) //次干道直行黃燈3秒閃爍
- {
- GR_ST=1;
- YE_ST=!YE_ST;
- delay(300);
- flag_l=0;
- }
- if((b>=100)&(b<=111)) //次干道直行紅燈亮,左拐綠燈亮15s
- {
- flag_l=1;
- GR_ST=1;
- flag_s=0;
- YE_ST = 1;
- delay(500);
- RE_ST = 0;
- GR_LE= 0;
-
- }
- if((b>=112)&(b<=114)&((a==10)|(a==0))) //次干道左拐綠燈3秒閃
- {
- GR_LE=!GR_LE;
- delay(300);
- flag_s=0;
- }
- if((b>=115)&(b<=117)&((a==10)|(a==0))) //次干道左拐黃燈3秒閃
- {
- GR_LE=1;
- YE_LE= !YE_LE;
- delay(200);
- flag_s=0;
- }
- if(b>=118) //次干道左拐紅燈和直行紅燈變亮,主干道直行綠燈變亮持續50s
- {
- flag_s=1;
- flag_l=0;
- b=0;
- RE_ST=1;
- YE_LE= 1;
- RE_LE=0;
- GR_ST=0;
- }
- }
- SCan();
- }
- }
- void SCan()
- {
- if(sw1==0) //按下主干道直行方向通車,其余方向變紅燈
- {
- delay(20);
- if(sw1==0)
- {
- while(!sw1);
- delay(20);
- GR_ST=0;
- RE_LE=0;
- GR_LE=1;
- RE_LE=1;
- }
- }
- if(sw2==0) //按下主干道左拐方向通車,其余方向變紅燈
- {
- delay(20);
- if(sw2==0)
- {
- while(!sw2);
- delay(20);
- GR_LE=0;
- RE_ST=0;
- GR_ST=1;
- RE_LE=1;
- }
- }
- if(sw3==0) //按下次干道直行方向通車,其余方向變紅燈
- {
- delay(20);
- if(sw3==0)
- {
- while(!sw3);
- delay(20);
- GR_ST=0;
- RE_LE=0;
- GR_LE=1;
- RE_ST=1;
- }
- }
- if(sw4==0) //按下次干道左拐方向通車,其余方向變紅燈
- {
- delay(20);
- if(sw4==0)
- {
- while(!sw4);
- delay(20);
- flag=0;
- GR_LE=0;
- RE_ST=0;
- GR_ST=1;
- RE_LE=1;
- }
- }
- }
- void OST() interrupt 1
- {
- TH0 = (65536-50000)/256;
- TL0 = (65536-50000)%256;
- a++;
- if(a==20) //1s
- {
- a = 0;
- b++;
- if(b<=50)
- {
- d = 50-b;
- }
-
- if((b>=54)&(b<=73))
- {
- d=73-b;
-
- }
- if((b>=77)&(b<=96))
- {
- d=96-b;
-
- }
- if((b>=100)&(b<=114))
- {
- d=114-b;
- }
- }
- if(b==0)
- d=50;
- if(b==53)
- d=20;
- if(b==76)
- d=20;
- if(b==99)
- d = 15;
- DSY_BUFF[0] = d/10;
- DSY_BUFF[1] = d%10;
- }
- void Display_Scan() interrupt 3 //顯示程序
- {
- unsigned char z;
- TH1=(65536-2000)/256;
- TL1=(65536-2000)%256;
- P2=0x01<<z;
- P0 = DSY_CODE[DSY_BUFF[z]];
- z=(++z)%2;
- if(!flag_l) //LED點陣直行箭頭顯示
- {
- flag_s=1;
- tab2[i] =~tab[i];
- SW_74HC5951 = 0;
- UARTNO(tab1+i,1);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
交通燈.rar
(1.02 MB, 下載次數: 47)
2018-7-1 02:58 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|