基于51单片机智能化交通红绿灯堵车流量红外设计
1、系统功能介绍
-
系统构成:
- 本设计由STC89C52单片机电路+LED灯指示电路+红外避障传感器电路+lcd1602显示+电源电路组成。
-
系统功能:
- 1、道路为东西南北走向的十字路口,每条马路各有2套红绿灯,即红、黄、绿。
- 2、系统正常模式下,均为红灯亮10秒,然后黄灯亮3秒,然后绿灯亮10秒,并依次循环。(同一时刻,每套红绿灯系统只有1个灯亮)
- 3、在南北方向的马路增加1路红外避障检测,如果南北绿灯情况下,检测到车辆过多以5个位例,达到5个,绿灯延时10s,对应东西红灯相应延时10s。保证南北绿灯时间延长,通车多,防止堵车。
- 4、在东西方向的马路增加1路红外避障检测,如果东西绿灯情况下,检测到车辆过多以5个位例,达到5个,绿灯延时10s,对应南北红灯相应延时10s。保证东西绿灯时间延长,通车多,防止堵车。
- 5、每次绿灯,人数过多只能延时一次,否则影响另一方向车道行驶,延时10s后,继续正常红绿灯处理。
- 6、增加1602显示东西南北灯显示参数,以及车流量参数。
-
可根据本篇文章完成毕业设计的开题报告、任务书、设计等
2、资料下载
- 资料下载链接:https://download.csdn.net/download/qq_39020934/89810110?
- 更多设计视频:https://space.bilibili.com/3537120073353692
3、系统电路介绍
3.1、STC89C52单片机核心系统电路设计
- STC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但是做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。
STC89C52主要特性如下:
- (1)8K字节程序存储空间;
- (2)512字节数据存储空间;
- (3)内带4K字节EEPROM存储空间;
- (4)可直接使用串口下载
单片机最小系统电路图如下图所示
实物图:
3.2、LED信号指示灯电路设计
- LED灯即发光二极管,它是半导体二极管的一种,可以把电能转化成光能。发光二极管与普通二极管一样是由一个PN结组成,也具有单向导电性。在电路中,电阻的作用是限流,保护LED灯。只要单片机的控制引脚拉低,则LED灯亮,否则,LED灯不亮。
电路原理图:
实物图:
3.3、LCD1602液晶显示模块电路设计
- LCD显示器分为字段显示和字符显示两种。其中字段显示与LED显示相似,只要送对应的信号到相应的管脚就能显示。字符显示是根据需要显示基本字符。本设计采用的是字符型显示。系统中采用LCD1602作为显示器件输出信息。与传统的LED数码管显示器件相比,液晶显示模块具有体积小、功耗低、显示内容丰富等优点,而且不需要外加驱动电路,现在液晶显示模块已经是单片机应用设计中最常用的显示器件了。LCD1602可以显示2行16个汉字。
电路原理图:
实物图:
3.3、E18-D80NK红外避障传感器模块电路设计
- E18-D80NK-N 这是一种集发射与接收于一体的光电传感器,发射光经过调制后发出,接收头对反射光进行解调输出。有效的避免了可见光的干扰。透镜的使用,也使得这款传感器最远可以检测 80 厘米距离的问题(由于红外光的特性,不同颜色的物体,能探测的最大距离也有不同;白色物体最远,黑色物体最近)。
- 检测障碍物的距离可以根据要求通过尾部的电位器旋钮进行调节。该传感器具有探测距离远、受可见光干扰小、价格便宜、易于装配、使用方便等特点,可以广泛应用于机器人避障、流水线计件等众多场合。应用案例:生产线货物自动计数设备、多功能提醒器、走迷宫机器人等。
模块接线方式:
- (1) VCC接5V电源
- (2)trig(控制端)接单片机I/O口
- (3)echo(接收端)接单片机I/O口
- (4)GND接地线
电路原理图:
实物图:
4、程序设计
4.1、系统初始化
void DeviceInit()
{
EX0=1; //允许外部中断0中断
EX1=1; //允许外部中断0中断
IT0 = 1; //外部中断0负跳变中断
IT1 = 1; //外部中断0负跳变中断
EA=1; //开总中断
Init_Timer0(); //定时器0初始化
LCD_Init(); //初始化液晶
DelayMs(20); //延时有助于稳定
LCD_Clear(); //清屏
sprintf(dis0,"|R%02d Y%02d G%02d l%02d",ns_red_Num,ns_yel_Num,ns_gre_Num,PluNum1); //打印数据
LCD_Write_String(0,0,dis0); //显示
sprintf(dis0,"-R%02d Y%02d G%02d r%02d",ew_red_Num,ew_yel_Num,ew_gre_Num,PluNum2);
LCD_Write_String(0,1,dis0); //显示
}
4.2、LCD1602显示函数
/*******************************************
函数名称:LocateXY
功 能:向液晶输入显示字符位置的坐标信息
参 数:x--位置的列坐标
y--位置的行坐标
返回值 :无
********************************************/
void LocateXY(uchar x,uchar y)
{
uchar temp;
temp = x&0x0f;
y &= 0x01;
if(y) temp |= 0x40; //如果在第2行
temp |= 0x80;
LcdWriteCommand(temp,1);
}
/*******************************************
函数名称:Disp1Char
功 能:在某个位置显示一个字符
参 数:x--位置的列坐标
y--位置的行坐标
data--显示的字符数据
返回值 :无
********************************************/
void Disp1Char(uchar x,uchar y,uchar data1)
{
LocateXY( x, y );
LcdWriteData( data1 );
}
4.3、延时函数
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}