仿真版本:Proteus8.6及以上版本
程序编译:Keil5 C51
编程语言:C语言
设计编号:【M03】
1.? 简介
? 本文提出了一种基于51单片机的智能交通灯设计。该设计在硬件方面主要采用AT89C51单片机作为主控核心,结合独立按键、数码管、LED灯,实现不同的红绿灯切换时间,并且具有倒计时的功能。
2.? 主要功能
a.当主干道通行亮绿灯时,支干道亮红灯,而支干道亮绿灯时,主干道亮红灯。
b.主支干道交替通行,主干道每次放行60s、支干道30s,设计60s和30s计时显示电路。
c.在过程中间,要亮5s的黄灯作为过渡,设置5s计时显示电路。
d.有紧急车辆要求通过时,系统要能禁止东西或南北两条路上所有的车辆通行。
3.? 源程序(Keil5)
本设计采用keil5 C51软件(内附安装包)实现程序设计。如需用keil4打开程序,可自行通过.c和.h文件新建工程即可。
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
/*****定义控制位**********************/
sbit EW_LED2=P2^3; //EW_LED2控制位
sbit EW_LED1=P2^2; //EW_LED1控制位
sbit SN_LED2=P2^1; //SN_LED2控制位
sbit SN_LED1=P2^0; //SN_LED1控制位
sbit SNstraight_Green=P1^3; //南北直行绿灯
sbit EWstraight_Green=P1^0; //东西直行绿灯
sbit SNstraight_Yellow=P1^4; //南北直行黄灯
sbit EWstraight_Yellow=P1^1; //东西直行黄灯
sbit SNstraight_Red=P1^5; //南北直行红灯
sbit EWstraight_Red=P1^2; //东西直行红灯
sbit SNright_Green=P2^7; //南北右拐绿灯
sbit EWright_Green=P1^6; //东西右拐绿灯
sbit SNright_Red=P3^4; //南北右拐红灯
sbit EWright_Red=P2^4; //东西右拐红灯
sbit SNleft_Green=P3^5; //南北左拐绿灯
sbit EWleft_Green=P2^5; //东西左拐绿灯
sbit SNleft_Red=P3^7; //南北左拐红灯
sbit EWleft_Red=P2^6; //东西左拐红灯
sbit SNturn_Yellow=P3^6; //南北转向黄灯
sbit EWturn_Yellow=P1^7; //东西转向黄灯
sbit Time_Button=P3^0; //时间加减按钮判断输入端
sbit QZ_Button=P3^1; //强制通行方向判断输入端
bit Flag_SNstraight_Yellow; //SN直行黄灯标志位
bit Flag_EWstraight_Yellow; //EW直行黄灯标志位
bit Flag_SNturn_Yellow; //SN转向黄灯标志位
bit Flag_EWturn_Yellow; //EW转向黄灯标志位
bit QZ_EW; //EW强制通行标志
bit QZ_SN; //SN强制通行标志
bit QZ_flag; //数码管强制标志
char Time_EW; //东西方向倒计时单元
char Time_SN; //南北方向倒计时单元
uchar EW=30,SN=30,EWL=60,SNL=60; //倒计时时长
uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//0~~~~9段选码
/*********************延时函数**********************/
void Delay(uchar a)
{
while(a--);
}
/*******************显示函数,显示倒计时的值**********************/
void Display(void)
{
char h,l;
h=Time_EW/10; //EW方向计时的十位数
l=Time_EW%10; //EW方向计时的个位数
P0=table[l]; //显示EW计时时间的低位
EW_LED2=1;
Delay(2);
EW_LED2=0;
P0=table[h]; //显示EW计时时间的高位
EW_LED1=1;
Delay(2);
EW_LED1=0;
h=Time_SN/10; //SN方向计时的十位数
l=Time_SN%10; //SN方向计时的个位数
P0=table[l]; //显示SN计时时间的低位
SN_LED2=1;
Delay(2);
SN_LED2=0;
P0=table[h]; //显示SN计时时间的高位
SN_LED1=1;
Delay(2);
SN_LED1=0;
}
/*******************显示函数,强制通行的值**********************/
void Display1(void)
{
P0=table[8];
if(QZ_flag==1)
{
EW_LED2=1;
EW_LED1=1;
SN_LED2=1;
SN_LED1=1;
}
else
{
EW_LED2=0;
EW_LED1=0;
SN_LED2=0;
SN_LED1=0;
}
}
/************************信号灯控制函数******************/
void SN_GOstraight() //SN直行绿灯
{
SNstraight_Green=1;
SNstraight_Yellow=0;
SNstraight_Red=0;
}
void SN_STOPstraight() //SN直行红灯
{
SNstraight_Green=0;
SNstraight_Yellow=0;
SNstraight_Red=1;
}
void EW_GOstraight() //EW直行绿灯
{
EWstraight_Green=1;
EWstraight_Yellow=0;
EWstraight_Red=0;
}
void EW_STOPstraight() //EW直行红灯
{
EWstraight_Green=0;
EWstraight_Yellow=0;
EWstraight_Red=1;
}
void SN_GOturnright() //SN右转绿灯
{
SNright_Green=1;
SNturn_Yellow=0;
SNright_Red=0;
}
void SN_STOPturnright() //SN右转红灯
{
SNright_Green=0;
SNturn_Yellow=0;
SNright_Red=1;
}
void SN_GOturnleft() //SN左转绿灯
{
SNleft_Green=1;
SNturn_Yellow=0;
SNleft_Red=0;
}
void SN_STOPturnleft() //SN左转红灯
{
SNleft_Green=0;
SNturn_Yellow=0;
SNleft_Red=1;
}
void EW_GOturnright() //EW右转绿灯
{
EWright_Green=1;
EWturn_Yellow=0;
EWright_Red=0;
}
void EW_STOPturnright() //EW右转红灯
{
EWright_Green=0;
EWturn_Yellow=0;
EWright_Red=1;
}
void EW_GOturnleft() //EW左转绿灯
{
EWleft_Green=1;
EWturn_Yellow=0;
EWleft_Red=0;
}
void EW_STOPturnleft() //EW左转红灯
{
EWleft_Green=0;
EWturn_Yellow=0;
EWleft_Red=1;
}
4.? 仿真proteus8.6
? 本设计采用proteus8.6软件(内附安装包)实现仿真设计,如下图所示。proteus软件一般存在高低版本兼容问题,该仿真是通过proteus8.6导出的,所以请尽量使用proteus8.6打开文件,低于proteus8.6的版本不能够正常使用,高于proteus8.6的版本除了proteus8.8/8.9理论上可以正常使用。
初始界面:
东西通行:
南北通行:
5.? 设计报告
设计报告主要包括硬件电路、软件设计、仿真调试等等,仅供参考。
6.? 资料清单
设计资料主要包括C程序+仿真+设计报告+使用说明+元件清单+操作视频等。
7.? 资料获取链接
百度网盘下载链接:【M03】百度网盘下载链接
更多单片机仿真设计合集:单片机仿真设计合集
956