简介
本此课程设计交通灯系统利用单片机AT89C51作为核心元件,实现了通过信号灯对路面状况的智能控制。系统具有结构简单、可靠性高、成本低、实时性好、安装维护方便等优点,有广泛的应用前景。
交通灯控制器设计主要功能是用单片机控制LED灯模拟指示。模拟东西南北方向的十字路口交通灯信号控制情况。本模拟系统由单片机硬/软件系统,用keil和proteus软件来实现两位8段数码管和LED灯显示系统,较好的模拟了交通路面的控制。
用到的元器件: 51单片机、button、三种led灯、8255A芯片、RESPACK-8、74LS04、两位数码管等
基本功能
1.主干道计时60秒,次干道计时45秒,左转计时15秒,时间到则切换红绿灯;
2.红绿灯不变期间,在七段数码管上显示每秒倒计时;
3.绿灯计时结束后,同方向的黄灯闪烁三秒直至计时到0。
4.期间人行道通行情况随道路的通行状况而改变
5.设置紧急模式:模式一道路全部禁行;模式二道路允许缓慢通行;模式三只允许南北直行;模式四只允许东西直行;模式五只允许南北左转;模式六只允许东西左转。
功能详解
当南北主干道通车时绿灯亮,而东西次干道干道红灯亮,此时南北人行道绿灯亮,东西红灯亮;当60s通车时间到后,主干道绿灯熄灭,黄灯闪烁三秒,3s之后南北左转的绿灯亮起,人行道及东西方向全部红灯;15s后切换为东西次干道通车。此时主干道左转绿灯熄灭,红灯亮,而次干道红灯熄灭,绿灯亮,次干道开始通车;45s通车时间到后,次干道绿灯熄灭,黄灯闪烁三秒,3s之后东西次干道左转绿灯亮起,人行道及东西方向全部红灯;15s后切换为南北主干道通车。此时次干道左转绿灯熄灭,红灯亮,而主干道红灯熄灭,绿灯亮。按照上述如此不断循环。
方案设计
电路模块分布
基本功能程序图
源程序
#include<reg51.h>
#include<intrins.h>
#include<absacc.h>
#define uint unsigned int
#define uchar unsigned char
#define PA XBYTE[0x7F00] //PA端口地址
#define PB XBYTE[0x7F01]
#define PC XBYTE[0x7F02]
#define COM XBYTE[0x7F03]
uchar temp,aa,nn;
sbit shi=P3^0;
sbit ge=P3^1; /*对要使用的单片机各个口进行定义*/
bit flag=0;
sbit key1=P2^0;
sbit key2=P2^1;
sbit key3=P2^2;
sbit key4=P2^3;
sbit key5=P2^4;
sbit key6=P3^3;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}; /*将数字0123456789的16进制数定义成数组用以显示*/
//定义所有函数
void delay(uint z);
void disp(uint n);
void xint0();
void xint1();
void timer0();
void nb_flash(void);
void dx_flash(void);
void nanbei();
void dongxi();
void nanbeizuo();
void dongxizuo();
void dongxizuogreen();
void nanbeizuogreen();
void dongxigreen();
void nanbeigreen();
void allred();
void allyellow();
//主函数
void main()
{
uint num;
num=0;
aa=0;
COM =0x82; //PA口输出,PB口输入,PC口输出
TMOD=0x01; //定时器工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1; //开启总中断
ET0=1; //开启定时器中断
TR0=1; //开启定时器0
EX0=1; //外部中断0允许标志
IT0=0; //外部中断0电平触发
EX1=1; //外部中断1允许标志
IT1=0; //外部中断1电平触发
while(1){
nanbei();
nb_flash();
nanbeizuo();
dongxi();
dx_flash();
dongxizuo();
}
}
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void timer0() interrupt 1 //定时器0中断
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
if(aa==18)
{
aa=0;
flag=1;
}
}
void disp(uint n) //数码管显示函数
{
while(!flag)
{
ge=0;
PC=table[n%10];
delay(50);
shi=1;ge=1;
shi=0;
PC=table[n/10];
delay(50);
shi=1;ge=1;
}
if(flag==1)
flag=0;
}
void nanbei() //南北绿灯东西红灯及数码管显示
{ //南北通行
uint num;
num=60;
disp(num);
while(num<=60&&num>0)
{ PA=0xd8;
num--;
P1=0xe1;
disp(num);
}
}
void nanbeizuo() //南北方向左转及数码管显示
{ uint num;
num=15;
disp(num);
while(num<=15&&num>0)
{ P1=0xe4;
num--;
PA=0xe9;
disp(num);
}
}
void dongxizuo() //东西方向左转及数码管显示
{ uint num;
num=15;
while(num<=15&&num>0)
{ P1=0xe4;
PA=0xea;
disp(num);
num--;
}
}
void dongxi() //东西绿灯南北红灯及数码管显示
{ uint num;
num=45;
disp(num);
while(num<=45&&num>0)
{
PA=0xe4;
P1=0xcc;
disp(num);
num--;
}
}
void nb_flash(void) //南北方向黄灯闪烁及数码管显示
{
uint a;
for(a=3;a>0;a--)
{ PA=0xd8;
disp(a);
P1=0xe2;
delay(100);
P1=0xe0;
}
}
void dx_flash(void) //东西方向黄灯闪烁及数码管显示
{
uint a;
for(a=3;a>0;a--)
{ PA=0xe4;
disp(a);
P1=0xd4;
delay(100);
P1=0xa4;
}
}
void xint0() interrupt 0 //外部中断0
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(key1==0){
if(key1==0)
{
delay(20);
allred();
}
}
if(key2==0){
if(key2==0)
{
delay(20);
allyellow();
}
}
if(key3==0){
if(key3==0)
{
delay(20);
nanbeigreen();
}
}
if(key4==0){
if(key4==0)
{
delay(20);
dongxigreen();
}
}
if(key5==0){
if(key5==0)
{
delay(20);
nanbeizuogreen();
}
}
}
void allred() //南北东西方向全部红灯
{
P1=0xe4;
PC=0x00;
PA=0xe8;
return;
}
void allyellow() //南北东西方向全部黄灯
{
P1=0xd2;
PC=0x00;
PA=0x00;
return;
}
void nanbeizuogreen() //南北方向左转绿灯
{
P1=0xe4;
PC=0x00;
PA=0xe9;
return;
}
void dongxizuogreen() //东西方向左转绿灯
{
P1=0xe4;
PC=0x00;
PA=0xea;
return;
}
void nanbeigreen() //南北方向绿灯
{
P1=0xe1;
PC=0x00;
PA=0xe8;
return;
}
void dongxigreen() //东西方向绿灯
{
P1=0xcc;
PC=0x00;
PA=0xe8;
return;
}
void xint1() interrupt 2 //外部中断1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
dongxizuogreen();
}
运行结果:
源代码+Proteus仿真图+实验报告:https://download.csdn.net/download/weixin_43889532/12505623
有问题请在评论区留言!