本次设计的功能如下:
设计任务
在十字路口的东西、南北方向各装有红、黄、绿指示灯,设计一个交通灯实时控制系统。并在Proteus中仿真运行。
2.功能 要求:
1)东西向和南北向通行时间分别为20s和35s
2)由绿灯变为红灯的5s内,绿灯灭黄灯亮
3)2位七段码做时间能倒计时显示
且有夜间模式。
功能演示视频如下:
51单片机交通灯功能演示
代码讲解视频如下:
51单片机交通灯讲解
目录
1.51单片机交通灯的课题意义
2.智能交通灯的国内外研究现状
3.设计原理
1 2 节有点长,需要代码的同学直接移步至第三节即可!!!
51单片机交通灯的课题意义
交通灯是城市道路交通中的重要组成部分,它通过不同颜色的信号指示车辆和行人的通行状态,提高交通流畅性和交通安全性。在现代社会,随着车辆数量的不断增加和交通流量的日益复杂化,设计和控制一套高效可靠的交通灯系统成为一个重要的课题。基于51单片机的交通灯课题具有以下重要意义:
1.交通安全性:交通灯作为道路交通管理的重要工具之一,可以通过精确的控制来保障交通的安全性。通过51单片机技术,我们可以实现对交通灯颜色和时间的精确控制,以确保交通流量的合理分配和道路的通行安全。
2.交通流畅性:合理的交通灯控制可以优化交通流畅性,减少车辆拥堵和行人等待时间。通过对交通流量的实时监测和处理,51单片机可以根据道路情况动态调整交通灯信号,确保交通的高效运行。
3.资源利用效率:交通灯的合理控制可以减少能源的浪费和交通设施的磨损。通过51单片机的精确控制,可以根据实际需求调整交通灯的亮灭时间,避免不必要的能源消耗,延长交通设备的使用寿命。
4.科技创新:基于51单片机技术的交通灯设计和控制是现代科技的创新应用之一。通过这个课题,学生可以掌握51单片机的编程和电路设计技巧,培养创新思维和实践能力,为未来的科技领域打下坚实的基础。
总之,基于51单片机的交通灯课题在提高交通安全性、优化交通流畅性、节约资源和促进科技创新等方面具有重要意义。同时,这个课题还可以培养学生的实践能力和创新意识,为他们未来的发展奠定坚实的基础。
智能交通灯是应用人工智能技术的一种交通信号灯系统,可以根据交通流量、道路情况和车辆需求等信息进行智能调节和优化,以提高交通流畅性和交通安全性。以下是智能交通灯在国内外的研究现状:
国内研究现状:
1. 实时交通流量监测:国内研究者通过传感器、摄像头等技术获取实时交通流量信息,例如通过车辆轨迹追踪,边缘计算和图像处理等技术,实现智能交通灯的实时交通流量监测,并根据监测结果进行优化调整。
2. 基于深度学习的交通流量预测:国内研究者利用深度学习算法,通过历史数据和实时数据的训练,可以准确地预测交通流量的变化趋势,进而实现智能交通灯的动态调节和优化。
3. 车辆识别与分类:国内研究者利用计算机视觉和机器学习技术进行车辆的实时识别和分类,可以通过交通灯系统实时获取车辆信息,并根据不同类别的车辆需求进行智能优化和调度。
国外研究现状:
1. 基于无线传感器网络的智能交通灯:国外研究者利用无线传感器网络和通信技术,可以实现车辆和交通灯之间的实时通信和联动,从而实现更高效的交通流调节和优化。
2. 混合智能优化算法:国外研究者将遗传算法、模拟退火算法等智能优化算法应用于交通灯调度,通过优化交通灯的时间配比和相位控制,以实现最佳的交通流畅性和通行效率。
3. 自适应交通灯控制算法:国外研究者提出了多种自适应交通灯控制算法,通过实时数据的获取和处理,可以根据交通流量和车辆需求等动态调整交通灯的时序和配时,以提高交通的效率和安全性。
综上所述,国内外对智能交通灯的研究主要集中在实时交通流量监测、交通流量预测、车辆识别分类、无线传感器网络、智能优化算法和自适应控制算法等方面。这些研究为智能交通灯的设计和优化提供了重要的理论和技术基础,并在实际应用中取得了一定的成果和效益。未来,随着人工智能技术的不断发展和应用,智能交通灯将能够更好地适应和应对不断变化的交通需求和挑战。
设计思路在代码里面已经讲的很详细了,就不多赘述。直接给出代码:
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
//数码管控制端口
sbit LSA=P2^2;
sbit LSB=P2^1;
sbit LSC=P2^3;
sbit LSD=P2^4;
sbit k2=P3^2;//按键控制
sbit k3=P3^3;
sbit led1=P1^0;//南北 绿
sbit led2=P1^1;//南北 黄
sbit led3=P1^2; //南北 红
sbit led4=P1^3;//东西 绿
sbit led5=P1^4;//东西 黄
sbit led6=P1^5; //东西 红
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
u8 sum2,sum1=0;
u16 i,j;
u16 js;//计数变量
u8 aa,bb; //中间变量
u8 nbshi,dxshi,moshi; //时间中间标记
u8 nbshi1,dxshi1,moshi1; //时间中间标记1
u8 huangshi=5;//黄灯时间
u8 nbzlshi=30; //南北各灯时间 直行 绿灯
u8 nbzhshi=20; //南北各灯时间 直行 红灯
u8 dxzlshi=15; //东西各灯时间 直行 绿灯
u8 dxzhshi=35; //东西各灯时间 直行 红灯
u8 dxhshi,nbhshi; //南北 东西红灯时间 中间变量
bit INT1_0; //中断标志
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 数 名 : Timer0Init
* 函数功能 : 定时器0初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer0Init()
{
TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
void hlhdeng(u8 deng)
{
switch(deng)
{
case 0x00: //东西直行 绿灯
if(sum1==0)
led1=1; // 绿 // 南北 灯
led2=1; //黄
led3=0; //红
if(sum1==0)
led4=0; // 绿 //东西 灯
led5=1; // 黄
led6=1; //红
break;
case 0x01: //东西直行 黄灯
if(sum1==0)
led1=1; // 绿 // 南北 灯
led2=1; //黄
led3=0; //红
if(sum1==0)
led4=1; // 绿 //东西 灯
led5=0; // 黄
led6=1; //红
break;
case 0x02: // 南北 直行 绿
if(sum1==0)
led1=0; // 绿 // 南北 灯
led2=1; //黄
led3=1; //红
if(sum1==0)
led4=1; // 绿 //东西 灯
led5=1; // 黄
led6=0; //红
break;
case 0x03: // 南北 直行 黄
if(sum1==0)
led1=1; // 绿 // 南北 灯
led2=0; //黄
led3=1; //红
if(sum1==0)
led4=1; // 绿 //东西 灯
led5=1; // 黄
led6=0; //红
break;
}
}
/*******************************************************************************
* 函 数 名 : DigDisplay
* 函数功能 : 数码管动态扫描函数,循环扫描8个数码管显示
*******************************************************************************/
void smg(u8 nbshi,u8 dxshi)
{
LSA=1; LSB=1;LSC=0; LSD=1;
aa=nbshi/10;
P0=smgduan[aa]; //显示南北方向时间的十位
delay(50);
LSA=1; LSB=1;LSC=1; LSD=0;
bb=nbshi%10;
P0=smgduan[bb]; //显示南北方向时间的个位
delay(50);
LSA=0; LSB=1;LSC=1; LSD=1;
aa=dxshi/10;
P0=smgduan[aa]; //显示东西方向时间的十位
delay(50);
LSA=1; LSB=0;LSC=1; LSD=1;
bb=dxshi%10;
P0=smgduan[bb]; //显示东西方向时间的个位
delay(50);
}
void nbzh(u8 nbshi,u8 dxshi,u8 moshi) //南北直行 黄
{
hlhdeng(moshi); //4种
smg(nbshi,dxshi); //南北 东西
}
/*******************************************************************************
* 函 数 名 : Int1Init()
* 函数功能 : 设置外部中断1
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Int0Init()
{
//设置INT0
IT0=1;//跳变沿出发方式(下降沿)
EX0=1;//打开INT0的中断允许。
EA=1;//打开总中断
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
Timer0Init();//定时器中断初始化
Int0Init(); // 外部中断0初始化
nbshi=nbzhshi; //南北红灯时间
dxshi=dxzlshi; //东西 绿灯
while(1)
{
if(INT1_0==0) //非夜间模式 正常运行
{
nbzh(nbshi,dxshi,moshi);
js++;
if(js>=200)
{
js=0;
if(moshi==0 && dxshi<5) //东西直行 绿灯
{
sum1=1;
led4=!led4;
}
if(moshi==2 && nbshi<5) //南北 绿
{
sum1=1;
led1=!led1;
}
}
}
else //夜间模式 黄灯常量
{
led1=1;
led2=!led2;
led3=1;
led4=1;
led5=!led5;
led6=1;
moshi=0; //模式重新归为0
j=0;
LSA=1; LSB=1;LSC=1; LSD=1; //数码管灭
delay(50000); //延时500ms
}
}
}
/*******************************************************************************
* 函 数 名 : void Timer0() interrupt 1
* 函数功能 : 定时器0中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer0() interrupt 1
{
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
i++;
if(i==1000) //1s进入一次
{
i=0;
if(moshi==0) //东西直行 绿灯
{
if(j==0) //第一次进入
{
j=1;
nbshi=nbzhshi; //南北红灯时间
dxshi=dxzlshi; //东西 绿灯
}
else
{
nbshi--;
dxshi--;
if(dxshi==0) //东西绿灯时间减完了
{
//dxshi--;
dxshi=huangshi;//东西黄灯时间
moshi++;
sum1=0;
}
}
}
else if(moshi==1) //东西 黄
{
nbshi--;
dxshi--;
if(dxshi==0) //东西黄灯时间减完了
{
moshi++;
//dxshi--;
nbshi=nbzlshi; //南北 绿灯时间
dxshi=dxzhshi; //东西红灯
}
}
else if(moshi==2) //南北 绿
{
nbshi--;
dxshi--;
if(nbshi==0) //南北绿灯时间减完了
{
moshi++;
//dxshi--;
sum1=0;
nbshi=huangshi;
}
}
else if(moshi==3) //南北 黄
{
nbshi--;
dxshi--;
if(nbshi==0) //南北黄灯时间减完了
{
moshi=0;
//dxshi--;
j=0;
nbshi=nbzhshi; //南北红灯时间
dxshi=dxzlshi; //东西 绿灯
}
}
}
}
/*******************************************************************************
* 函 数 名 : Int0() interrupt 0
* 函数功能 : 外部中断0的中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Int0() interrupt 0 //外部中断0的中断函数
{
delay(1000); //延时消抖
if(k2==0)
{
INT1_0=!INT1_0;
}
}