
交通灯2
简介
51单片机,交通灯电路,STC-8H8K
简介:51单片机,交通灯电路,STC-8H8K开源协议
:GPL 3.0
描述
一、设计要求:
1、用单片机stc89C52 设计一个交通灯系统,并用数码管显示时间,LED指示通行。
2、设计电路图,pcb图等
3、数码管用三极管驱动。
4、按键功能:禁行、东西通行、南北通行、时间加、时间减、切换、确定。
二、电路主要组成:
1、单片机最小系统
2、8段数码管
3、红黄绿LED
4、数码管的三极管驱动电路
三、主要功能:
1、采用四方向数码管设计,更加符合真实的交通信号灯设计。
2、左侧按键从上到下依次为:设置时间、时间加、时间减、紧急模式。
3、紧急模式:当救护车、救火车等通过时,按下“紧急模式”按键,包括四个方向全部亮红灯,允许东西方向通行、允许南北方向通行、全部绿灯。
4、设定时间时,第一次按下“设置时间”键,设定东西方向的倒计时时间,再次按下“设置时间”键,则设定南北方向的倒计时时间,再次按下则退出设置状态,开始运行。
编码:
#include "2.h"
#define uchar unsigned char
sbit BR=P1^0;sbit BY=P1^1;sbit BG=P1^4;
sbit XG=P1^5;sbit XY=P1^6;sbit XR=P1^7;
sbit NR=P3^4;sbit NG=P3^2;sbit NY=P3^3;
sbit DR=P3^7;sbit DY=P3^6;sbit DG=P3^5;
sbit DX1=P0^1;sbit DX2=P0^0;sbit BN1=P0^2;sbit BN2=P0^3;
sbit key1=P4^1;sbit key2=P4^2;
uchar shu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar a;
uchar DXyellowstate=0;
uchar DXyellowcounter=0;
uchar NByellowstate=0;
uchar NByellowcounter=0;
void Delay5ms(void) //@11.0592MHz
{
unsigned char data i, j;
i = 54;
j = 199;
do
{
while (--j);
} while (--i);
}
void GPIO()
{
P0M0=0xff;//1111 1110
P0M1=0x00;//0000 0000
P1M0=0x00;
P1M1=0x00;
P2M0=0xff;
P2M1=0x00;
P3M0=0x00;
P3M1=0x03;
P4M0=0x00;
P4M1=0x00;
}
void key()
{
if(key1==0)
{
DX2=DX1=1;
BN1=BN2=0;
P2=0xc9;
BG=BY=BR=DG=DY=DR=XG=XY=XR=NG=NY=NR=1;
BG=NG=DR=XR=0;
while(key1==0);BG=NG=DR=XR=1;
}
else if(key2==0)
{
BN1=BN2=1;
DX1=DX2=0;
P2=0xb6;//1011 0110
BG=BY=BR=DG=DY=DR=XG=XY=XR=NG=NY=NR=1;
BR=NR=DG=XG=0;
while(key2==0);BR=NR=DG=XG=1;
}
else;
}
void shuang(unsigned char x,m)
{
BN2=1;BN1=1;
P2=shu[x/10];
BN2=0;
Delay5ms();
BN2=1;
P2=shu[x%10];
BN1=0;
Delay5ms();
BN1=1;
/////////////////////
DX2=1;DX1=1;
P2=shu[m/10];
DX2=0;
Delay5ms();
DX2=1;
P2=shu[m%10];
DX1=0;
Delay5ms();
DX1=1;
}
void dingshi()
{
unsigned char nb,dx,s;
for(nb=33;nb>0;nb--)
{
for(s=0;s<=70;s++)//一秒等于1000000微秒,这里是70而不是100是因为运行到定时器时是有延时的
{
if(nb>3)
{
dx=nb-3;
BR=NR=DG=XG=0;
}
else
{
dx=nb;
DG=XG=1;
BR=NR=DY=XY=0;
if(DXyellowcounter<35) //当DXyellowcounter小于一半
{
if(DXyellowcounter<35) //再次判断
{
DY = DXyellowstate; //使得两路黄灯等于DXyellowstate=0
XY = DXyellowstate;
}
else
{
DY = !DXyellowstate; //if大于或等于一半对两路黄灯进行取反=1
XY = !DXyellowstate;
}
DXyellowcounter++; //DXyellowcounter+1
}
else //if大于或等于一半
{
DXyellowcounter=0; //重置DXyellowcounter=0
DXyellowstate=!DXyellowstate;
}
/****************************************************************************
根据DXyellowcounter的值来控制DY和XY引脚的状态,当DXyellowcounter小于35时,
DY和XY等于DXyellowstate;当DXyellowcounter大于等于35时,DY和XY取反。
并且每次循环DXyellowcounter会自增,当DXyellowcounter达到70时会重置为0,
并对DXyellowstate取反。
****************************************************************************/
}
while(TF0==0);
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TF0=0;
shuang(nb,dx);
key();
}
BR=NR=DY=XY=DG=XG=1;
}
//////////////////////////////////////////////
for(dx=33;dx>0;dx--)
{
for(s=0;s<=70;s++)
{
if(dx>3)
{
nb=dx-3;
DR=XR=NG=BG=0;
}
else if(dx<=3)
{
nb=dx;
NG=BG=1;
XR=DR=BY=NY=0;
if(NByellowcounter<35)
{
if(NByellowcounter<35)
{
BY = NByellowstate;
NY = NByellowstate;
}
else
{
BY = !NByellowstate;
NY = !NByellowstate;
}
NByellowcounter++;
}
else
{
NByellowcounter=0;
NByellowstate=!NByellowstate;
}
}
while(TF0==0);
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TF0=0;
shuang(nb,dx);
key();
}
DR=XR=NY=BY=NG=BG=1;
}
}
void main()
{
GPIO();
TMOD=0x01; //1报备:使用定时器模式1(16位不自动重装,溢出时定时器1将从0开始计数0)
TH0=(65536-10000)/256; //2设置初值装入初值高八位
TL0=(65536-10000)%256; // 装入初值低八位
TR0=1; //启动定时器0
ET0=1;
key1=key2=1;
while(1)
{
dingshi();
}
}
设计图
BOM
ID | Name | Designator | Footprint | Quantity |
---|---|---|---|---|
1 | LED-TH-3mm_G | BG,DG,NG,XG | LED0805-RD | 4 |
2 | LED-TH-3mm_R | BR,DR,NR,XR | LED0805-RD | 4 |
3 | SEG-TH_0.56×2 | BSHU,DSHU,NSHU,XSHU | LED-SEG-TH_10P-L25.0-W19.0-P2.54-S15.24-BL | 4 |
4 | 204-10UYC/S530-A3-L | BY,DY,NY,XY | LED0805-RD | 4 |
5 | 0.1u | C1,C3 | RAD-0.1 | 2 |

评论