Altium Designer画的交通灯原理图和PCB图如下:(51hei附件中可下载工程文件)
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /* 以单片机位核心设计一个交通灯,要求单片机频率设为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)
|