Proteus仿真实例_基于51单片机的交通灯系统(仿真文件+程序)24-51f-10
一.系统概述
交通灯系统使用51单片机进行主控,系统内使用数码管显示各个方向的路灯时间,四个方向上都设置了红绿黄灯,通过按键可以控制交通灯的开启和关闭,还能控制红灯、黄灯全亮以及相应状态进行延时,对于绿灯和黄灯的时间还能通过按键直接进行设置。
二.仿真概述
1. 启动仿真后各个方向的亮灯时间开始进行计时,开始控制
2. 按下启动交通灯按键开始进行计时,
3. 按下红灯全亮按键后所有的红灯都会亮起,此时所有方向禁止通行。
4. 按下黄灯闪烁按键后所有方向的黄灯开始进行闪烁。
5. 按下上方的交通灯时间调节按键就能对红绿灯的时间进行调整。
三.程序设计
#include <REGX52.H>
#include "Key.h"
#include "Timer0.h"
#include "Timer1.h"
#include "Nixie.h"
#include "delay.h"
#include "AT24C02.h"
sbit NBG = P1^0; //南北绿灯
sbit NBY = P1^1; //南北黄灯
sbit NBR = P1^2; //南北红灯
sbit DXG = P1^3; //东西绿灯
sbit DXY = P1^4; //东西黄灯
sbit DXR = P1^5; //东西红灯
unsigned char KeyNum;
unsigned char RunFlag,YellowFlag,DirectionFlag = 0;LoopFlag = 1,Flag,StartFlag;
unsigned char MINISEC = 100,SEC,MINISEC1 = 100,SEC1;
unsigned char North_Count_Down; //北边时间显示器倒计时
unsigned char South_Count_Down; //南边时间显示器倒计时
unsigned char East_Count_Down; //东边时间显示器倒计时
unsigned char West_Count_Down; //西边时间显示器倒计时
unsigned char Time1 = 25,Time2 = 5;
void main()
{
SEC = Time1;
SEC1 = Time2;
Timer0_Init();
Timer1_Init();
while(1)
{
KeyNum = Key();
if(KeyNum == 1) //绿灯和红灯时间+1s
{
Time1++;
SEC = Time1;
}
if(KeyNum == 2) //绿灯和红灯时间-1s
{
Time1--;
SEC = Time1;
}
if(KeyNum == 3) //黄灯和红灯时间+1s
{
Time2++;
SEC1 = Time2;
}
if(KeyNum == 4) //黄灯和红灯时间-1s
{
Time2--;
SEC1 = Time2;
}
if(KeyNum == 5) //启动交通灯
{
StartFlag =! StartFlag;
YellowFlag = 0;
NBR = 1;
DXR = 1;
}
if(KeyNum == 6) //启动交通灯
{
StartFlag = 0;
P1 |= 0x3f;
NBR = 0;
DXR = 0;
}
if(KeyNum == 7) //启动交通灯
{
StartFlag = 0;
YellowFlag = 1;
P1 |= 0x3f;
}
if(KeyNum == 8) //启动交通灯
{
StartFlag = 0;
}
if(YellowFlag)
{
DXY = 0;
NBY = 0;
Delay(1);
DXY = 1;
NBY = 1;
Delay(1);
}
if(StartFlag)
{
if(SEC == Time1 && LoopFlag == 1)
{
RunFlag = 0;
}
if(SEC1 == Time2 && LoopFlag == 0)
{
RunFlag = 1;
}
if(DirectionFlag == 0)
{
if(RunFlag == 0)
{
NBR = 1;
DXY = 1;
DXG = 0;
NBR = 0;
if(SEC <= 5)
{
if(SEC == 5 || SEC == 3 || SEC == 1)
{
DXG = 1;
Delay1(1);
}
if(SEC == 4 || SEC == 2 || SEC == 0)
{
DXG = 0;
Delay1(1);
}
}
if(SEC > 5)
{
DXG = 0;
}
East_Count_Down = SEC;
West_Count_Down = SEC;
South_Count_Down = SEC+Time2;
North_Count_Down = SEC+Time2;
}
if(RunFlag == 1)
{
Flag = 0;
DXG = 1;
NBR = 1;
NBR = 0;
DXY = 0;
East_Count_Down = SEC1 - 1;
West_Count_Down = SEC1 - 1;
South_Count_Down = SEC1 - 1;
North_Count_Down = SEC1 - 1;
}
if(SEC1 == 0 && Flag == 0)
{
NBR = 1;
DXY = 1;
DXG = 1;
NBR = 1;
DirectionFlag = 1;
RunFlag = 0;
}
}
if(DirectionFlag == 1)
{
if(RunFlag == 0)
{
NBY = 1;
DXR = 1;
DXR = 0;
if(SEC <= 5)
{
if(SEC == 5 || SEC == 3 || SEC == 1)
{
NBG = 1;
Delay1(1);
}
if(SEC == 4 || SEC == 2 || SEC == 0)
{
NBG = 0;
Delay1(1);
}
}
else
{
NBG = 0;
}
East_Count_Down = SEC;
West_Count_Down = SEC;
South_Count_Down = SEC+Time2;
North_Count_Down = SEC+Time2;
}
}
}
}
}
作者:小常硬件