1914基于单片机的十字路口红绿灯控制器(仿真,程序,报告)【毕设课设】

一、系统概述

本系统基于单片机设计,用于控制十字路口的红绿灯信号。系统具备多种功能,包括红绿灯转换时的黄灯闪烁、主干道与辅干道的通行时间控制、手动/自动/特殊情况三种模式的切换、特殊情况下的红灯全亮以及自动模式下的倒计时显示,以及夜间模式的黄灯常亮。

二、硬件设计

  1. 单片机选型:选用合适的单片机作为主控芯片,如STC89C52等,具备足够的IO口和定时器资源。

  2. LED灯连接:红绿黄LED灯分别连接至单片机的P1口,通过控制P1口的电平状态实现LED灯的点亮和熄灭。

  3. 按键连接:使用单片机的P3口连接按键,实现手动、自动和特殊情况三种模式的切换。

  4. LED数码管连接:LED数码管连接至单片机的其他IO口,用于显示倒计时时间。

三、软件设计

  1. 初始化程序:初始化单片机的IO口、定时器等资源。

  2. 黄灯闪烁程序:利用延时函数实现黄灯闪烁三次,每次闪烁时间为2秒,总时间为6秒。

  3. 通行时间控制程序:设置主干道和辅干道的通行时间,利用定时器中断实现计时,并控制相应的LED灯状态。

  4. 模式切换程序:通过检测P3口的按键状态实现手动、自动和特殊情况三种模式的切换。

  5. 特殊情况处理程序:在特殊情况下,将所有路口的红灯点亮,其他灯熄灭。

  6. 倒计时显示程序:在自动模式下,利用定时器中断和LED数码管显示当前状态的倒计时时间。

  7. 夜间模式程序:在夜间模式下,使四个路口的黄灯常亮。

四、功能实现

  1. 功能1实现:在红绿灯转换时,先点亮黄灯并闪烁三次,然后切换至下一状态的灯。

  2. 功能2实现:设置主干道和辅干道的通行时间,以及单独左转信号的时长,并通过控制LED灯的状态实现通行信号的变化。

  3. 功能3实现:通过按键检测实现手动、自动和特殊情况三种模式的切换,并在不同模式下执行相应的控制逻辑。

  4. 功能4实现:在特殊情况下,将所有路口的红灯点亮,为紧急车辆(如120、110)提供通行。

  5. 功能5实现:在自动模式下,利用定时器中断和LED数码管显示当前状态的倒计时时间。

  6. 功能6实现:在夜间模式下,将四个路口的黄灯常亮,以提供足够的照明。

五、系统测试与调试

完成硬件制作和软件编程后,对系统进行全面的测试和调试,确保各项功能正常工作,并优化性能。

六、总结与展望

本文介绍了一种基于单片机的十字路口红绿灯控制器的设计方案。通过合理的硬件设计和软件编程,实现了多种功能,提高了交通管理的效率和安全性。未来,可以进一步优化算法和电路设计,提高系统的响应速度和稳定性,以适应更复杂的交通场景。

include <reg52.h>

#define uchar unsigned char	
#define uint  unsigned int	  


sbit wela = P2^7;  		// 数码管位选
sbit dula = P2^6;		// 数码管段选

// 下面是八个交通灯对应的位定义
sbit 	LED1_blue   = P1^0;
sbit 	LED1_red    = P1^1;
sbit 	LED1_green  = P1^2;
sbit 	LED1_yellow = P1^3;
sbit 	LED2_blue   = P1^4;
sbit 	LED2_red    = P1^5;
sbit 	LED2_green  = P1^6;
sbit 	LED2_yellow = P1^7;

// 按键位定义
sbit	key_auto 	= P3^0;	// 自动
sbit	key_step 	= P3^1;	// 手动
sbit	key_emerg 	= P3^2;	// 紧急情况 110/120通过
sbit	key_night   = P3^6;// 夜间模式


uint cnt = 0;	// 记录定时器定时了多少毫秒
uint sec = 0;	// 记录定时器计时了多少秒

uchar light_num = 0;

// 四位八段共阴极数码管数字显示编码
uchar code table[]={
//"0" "1"  "2"  "3"
0x3f,0x06,0x5b,0x4f,
//"4" "5"  "6"  "7"
0x66,0x6d,0x7d,0x07,
//"8" "9"  "A"  "B"
0x7f,0x6f,0x77,0x7c,
//"C" "D"  "E"  "F"
0x39,0x5e,0x79,0x71
};


uchar code light[]={
// 主G辅R      主G辅R    主Y辅R
    0xdb,       0xde,     0xd7,
// 主R辅G      主R辅B    主R辅R
    0xbd,       0xed,     0x7d,
	0xdf,       0xee,     0xdd
};

/*************函数声明********************/
void delay_ms(uint);
void system_Init();
void Display_R_time(uchar);
void Display_C_time(uchar);
void key_scan();

void main()
{
    system_Init();

    while(1)
	{
		key_scan();
	}
}


// 毫秒级延时
void delay_ms(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=123;y>0;y--);

}

// 系统初始化
void system_Init()
{
    wela=0;		// 关闭位选
	dula=0;		// 关闭段选
	TMOD=0x01;  // 定时器0方式1 16位
	TH0=0x4c; 	// 定时器装初值 50ms(11.05926MHz  TH0=0x4c TL0=0x00)
	TL0=0x00;	// (12MHz 的初值是 TH0=0x3c TL0=0xb0)
	EA=1;		// 开总中断
	ET0=1;		// 开定时器0中断
	TR0=1;		// 允许中断溢出
}

// 显示横向的(即辅干道)倒计时
void Display_R_time(uchar time)
{
    uchar time_tens, time_ones;

    time_tens = time / 10;	// 提取倒计时时间的十位数
    time_ones = time % 10;	// 提取倒计时时间的个位数


	// 下面对两位数倒计时时间进行显示(数码管)
    P0=0xff;
	wela=1;
	P0=0xbf;    
	wela=0;
	dula=1;
	P0=table[time_tens];
	dula=0;
	delay_ms(1); 			
	
	P0=0xff;
	wela=1;
	P0=0x7f;    
	wela=0;	
	dula=1;
	P0=table[time_ones];
	dula=0;
	delay_ms(1);
}


// 显示竖向的(即主干道)倒计时
void Display_C_time(uchar time)
{
    uchar time_tens, time_ones;  

    time_tens = time / 10;
    time_ones = time % 10;
	
	P0=0xff;
	wela=1;
	P0=0xfb;       
	wela=0;	
	dula=1;
	P0=table[time_tens];
	dula=0;
...部分代码

资料下载地址:

https://docs.qq.com/doc/p/ffc421513a628b30450ae742547c0b850456d7c8

 

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于Arduino单片机十字路口红绿灯智能控制代码,可以根据实际情况进行修改: ``` const int red1 = 8; //第一个红灯引脚 const int yellow1 = 9; //第一个黄灯引脚 const int green1 = 10; //第一个绿灯引脚 const int red2 = 11; //第二个红灯引脚 const int yellow2 = 12; //第二个黄灯引脚 const int green2 = 13; //第二个绿灯引脚 const int button = 2; //按钮引脚 const int buzzer = 3; //蜂鸣器引脚 void setup() { pinMode(red1, OUTPUT); pinMode(yellow1, OUTPUT); pinMode(green1, OUTPUT); pinMode(red2, OUTPUT); pinMode(yellow2, OUTPUT); pinMode(green2, OUTPUT); pinMode(button, INPUT); pinMode(buzzer, OUTPUT); } void loop() { int buttonState = digitalRead(button); //读取按钮状态 if (buttonState == HIGH) //如果按钮被按下 { digitalWrite(buzzer, HIGH); //蜂鸣器响起 delay(2000); //延迟2秒钟 digitalWrite(buzzer, LOW); //蜂鸣器停止响 digitalWrite(green1, HIGH); //第一个绿灯亮 digitalWrite(red2, HIGH); //第二个红灯亮 delay(5000); //延迟5秒钟 digitalWrite(yellow1, HIGH); //第一个黄灯亮 delay(2000); //延迟2秒钟 digitalWrite(green1, LOW); //第一个绿灯灭 digitalWrite(yellow1, LOW); //第一个黄灯灭 digitalWrite(red1, HIGH); //第一个红灯亮 digitalWrite(yellow2, HIGH); //第二个黄灯亮 delay(2000); //延迟2秒钟 digitalWrite(red2, LOW); //第二个红灯灭 digitalWrite(yellow2, LOW); //第二个黄灯灭 digitalWrite(green2, HIGH); //第二个绿灯亮 delay(5000); //延迟5秒钟 digitalWrite(yellow2, HIGH); //第二个黄灯亮 delay(2000); //延迟2秒钟 digitalWrite(green2, LOW); //第二个绿灯灭 digitalWrite(yellow2, LOW); //第二个黄灯灭 digitalWrite(red2, HIGH); //第二个红灯亮 digitalWrite(yellow1, HIGH); //第一个黄灯亮 delay(2000); //延迟2秒钟 digitalWrite(red1, LOW); //第一个红灯灭 digitalWrite(yellow1, LOW); //第一个黄灯灭 } } ``` 注:以上代码仅供参考,具体应根据实际情况进行修改和完善。同时,为了保障交通安全,请在实际应用中慎重考虑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值