Proteus 8 51单片机交通灯控制模拟

文章目录


前言

随着各种陆路交通运输工具的飞速发展,交通灯也在我们的日常生活中,发挥了越来越大的作用。本试验通过单片机控制LED以及数码管,来模拟现实生活中的交通灯工作情形。

模拟试验中,南北方向的红绿灯分别用LED1LED2表示,东西方向的红绿灯用LED5

和LED6表示,用数码管显示倒计时时间。交通灯的控制可以分为自动控制方式和人工控制方式:正常情况下,交通灯处于自动控制方式,此时东西方向和南北方向的交通灯轮流导通;特殊情况下,可以通过人工控制方式延长南北方向或东西方向交通灯的导通时间。

设计要求如下:

设计三个按键K1K2K3K1为“自动”方式,K2位“南北”方向交通导通,K3为“东西”方向交通导通

用四个LED模拟交通灯:LED1为南北方向“红”灯;LED2为南北方向“绿”灯;LED5为东西方向“红”灯;LED6为东西方向“绿”灯

系统开始上电后,系统处于自动控制方式:

A.系统上电后,首先是南北方向交通导通,LED1灭、LED2亮、LED5亮、LED6灭,数码管从60秒开始计时,每隔1秒减1

B.倒计时到10秒时,南北方向绿灯(LED2)开始闪烁,闪烁间隔为0.5秒(亮、灭各0.5秒)

C.60秒倒计时结束之后,东西方向交通导通:LED1亮、LED2灭、LED5灭、LED6亮;数码管重新开始从60秒倒计时,每隔1秒减1

D.倒计时到10秒时,东西方向绿灯(LED6)开始闪烁,闪烁间隔为0.5秒(亮、灭各0.5秒)

E.60秒倒计时结束之后,操作同步骤A

在自动控制方式过程中,若按键K2K3按下,则系统进入人工控制方式:

A.若K2键按下,则强制南北方向交通导通。此时若系统处于东西方向交通导通状态,则数码管从10秒开始倒计时,操作同步骤3 D,倒计时完成后进入南北交通导通状态,数码管显示“9999”,不递减

B.若K3键按下,则强制东西方向交通导通。此时若系统处于南北方向交通导通状态,则数码管从10秒开始倒计时,操作同步骤3 B,倒计时完成后进入东西交通导通状态,数码管显示“9999” ,不递减

在人工控制状态下,按下K1键进入自动控制状态:

A.若系统处于东西方向交通导通状态,则数码管从10秒开始倒计时,操作同步骤3 D,倒计时完成后进入南北交通导通状态,从步骤3 A进入自动控制状态。

B.若系统处于南北方向交通导通状态,则数码管从10秒开始倒计时,操作同步骤3 B,倒计时完成后进入东西交通导通状态,从步骤3 C进入自动控制状态。

一、如何在Proteus中快速找到目标元件

这就需要熟悉元件的英文名称,可以看下下面链接的博客,对找元件有很用处。

http://t.csdnimg.cn/PAwi3

然后就是绘制原理图了

二、编写51代码

(部分)代码如下:

Delay.c 和Delay.h

//Delay.c

void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

//Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int xms);

#endif

二、数码管的代码

//Nixie.c
#include <REGX52.H>
#include "Delay.h"

//共阴0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
//共阳数码管段码表  0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
unsigned char NixieTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};


/**
  * @brief  数码管扫描显示
  * @param  Location 要显示的位置,范围:1~8
  * @param  Number 要显示的数字,范围:段码表索引范围
  * @retval 无
  */
void Nixie_Show(unsigned char Location,Number)
{
	switch(Location)		//位码输出
	{
		case 1:P2_4=0;P2_5=1;P2_6=1;P2_7=1;break;
		case 2:P2_4=1;P2_5=0;P2_6=1;P2_7=1;break;
		case 3:P2_4=1;P2_5=1;P2_6=0;P2_7=1;break;
		case 4:P2_4=1;P2_5=1;P2_6=1;P2_7=0;break;
	}
	P0=NixieTable[Number];	//段码输出
	Delay(10);
	P0=0x00;				//段码清0,消影
}


//Nixie.h
#ifndef __NIXIE_H__
#define __NIXIE_H__


void Nixie_Show(unsigned char Location,Number);
#endif

 三、定时器的代码

//Timer0.c
#include <REGX52.H>

/**
  * @brief  定时器0初始化,1毫秒@12.000MHz
  * @param  无
  * @retval 无
  */
void Timer0_Init(void)
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 =(65536-50000)%256;		//设置定时初值
	TH0 = (65536-50000)/256;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;
	EA=1;
	PT0=0;
}

/*定时器中断函数模板
void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	T0Count++;
	if(T0Count>=1000)
	{
		T0Count=0;
		
	}
}
*/


//Timer0.h
#ifndef __TIMER0_H__
#define __TIMER0_H__

void Timer0_Init(void);

#endif

 四、按键KEY的代码

//Key.c
#include <REGX52.H>
#include "Delay.h"

unsigned char Key_KeyNumber;

/**
  * @brief  获取按键键码
  * @param  无
  * @retval 按下按键的键码,范围:0,1~4,0表示无按键按下
  */
unsigned char Key(void)
{
	unsigned char Temp=0;
	Temp=Key_KeyNumber;
	Key_KeyNumber=0;
	return Temp;
}

/**
  * @brief  获取当前按键的状态,无消抖及松手检测
  * @param  无
  * @retval 按下按键的键码,范围:0,1~4,0表示无按键按下
  */
unsigned char Key_GetState()
{
	unsigned char KeyNumber=0;
	
	if(P3_0==0){KeyNumber=1;}
	if(P3_1==0){KeyNumber=2;}
	if(P3_2==0){KeyNumber=3;}
	return KeyNumber;
}

/**
  * @brief  按键驱动函数,在中断中调用
  * @param  无
  * @retval 无
  */
void Key_Loop(void)
{
	static unsigned char NowState,LastState;
	LastState=NowState;				//按键状态更新
	NowState=Key_GetState();		//获取当前按键状态
	//如果上个时间点按键按下,这个时间点未按下,则是松手瞬间,以此避免消抖和松手检测
	if(LastState==1 && NowState==0)
	{
		Key_KeyNumber=1;
	}
	if(LastState==2 && NowState==0)
	{
		Key_KeyNumber=2;
	}
	if(LastState==3 && NowState==0)
	{
		Key_KeyNumber=3;
	}
}


//Key.h

#ifndef __KEY_H__
#define __KEY_H__

unsigned char Key(void);
void Key_Loop(void);

#endif

三、 效果视频


交通灯仿真视频

总结

一次51单片机的实训,重新学习了Proteus如何查找对应的元件,并学习51单片机定时器的初始化、数码管的位选、段选、消影、按键的检测和消抖。尤其是数码管,得知道是共阳的还是共阴的

我选的数码管是共阴数码管。(想要代码和Proteus工程可以去工房购买  )

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
### 回答1: 51单片机可以通过控制LED灯的亮灭来实现交通灯的效果。以下是一个简单的交通灯程序: 1. 定义三个LED灯分别表示红灯、黄灯和绿灯。 2. 程序初始化时,将红灯亮起。 3. 等待一段时间后,将红灯熄灭,绿灯亮起。 4. 等待一段时间后,将绿灯熄灭,黄灯亮起。 5. 等待一段时间后,将黄灯熄灭,红灯亮起。 6. 重复步骤3-5,循环进行。 以下是一个简单的51单片机交通灯程序的示例代码: ```c #include <reg51.h> sbit red = P1^0; // 红灯 sbit yellow = P1^1; // 黄灯 sbit green = P1^2; // 绿灯 void delay(unsigned int t); // 延时函数 void main() { while(1) { red = 1; // 红灯亮起 yellow = 0; green = 0; delay(5000); // 等待5秒 green = 1; // 绿灯亮起 red = 0; delay(5000); // 等待5秒 yellow = 1; // 黄灯亮起 green = 0; delay(2000); // 等待2秒 red = 1; // 红灯亮起 yellow = 0; delay(5000); // 等待5秒 } } void delay(unsigned int t) // 延时函数 { unsigned int i, j; for(i = t; i > 0; i--) for(j = 112; j > 0; j--); } ``` 这个程序中,红灯亮起5秒钟,然后熄灭,绿灯亮起5秒钟,然后熄灭,黄灯亮起2秒钟,然后熄灭,红灯再次亮起5秒钟,循环进行。 ### 回答2: 实现交通灯的主要步骤如下: 首先,我们需要连接51单片机和LED灯。可以使用杜邦线将单片机的IO口与LED灯的正极连接,将LED灯的负极与单片机的地线连接。 然后,我们需要编写代码来控制交通灯。代码的基本思路是通过控制IO口的高低电平来控制LED灯的亮灭。 首先定义不同状态下的灯的亮灭规则。例如,绿灯亮时,其他灯都是灭的;红灯亮时,其他灯也是灭的;黄灯亮时,其他灯仍然是灭的。 接着,我们可以使用定时器来控制各个状态的时间。例如,设定绿灯亮的时间为30秒,红灯亮的时间为20秒,黄灯亮的时间为5秒。 在主循环中,根据不同时间段的延时,通过改变IO口的电平状态来控制LED灯的亮灭。例如,当绿灯亮时,设置绿灯对应的IO口为高电平,其他灯对应的IO口为低电平。 最后,通过将51单片机与电源连接,上电后程序开始运行,即可实现交通灯的功能。 需要注意的是,为了提高交通灯的可靠性和可扩展性,可以采取一些其他措施,例如在IO口上使用限流电阻、驱动电路等。另外,还可以结合传感器等外部硬件设备,以更好地实现交通信号控制系统。 ### 回答3: 51单片机实现交通灯的方法如下: 首先,我们需要准备一个51单片机开发板以及相应的编程软件和下载工具。 其次,我们需要连接单片机与交通灯的电路,其中包括几个LED灯和相应的电阻。 然后,我们编写一个程序,在程序中定义好各个LED灯的引脚,并设置它们的输出模式。 接着,在程序中设置一个循环,来控制交通灯的变化过程。可以使用if语句或者switch语句来控制不同的状态。 在循环中,按照交通灯的时序规律,设置不同的状态,比如绿灯亮、黄灯亮、红灯亮等。 通过设置不同的延时,可以控制交通灯的亮灭时间模拟真实的交通灯变化过程。 最后,将程序下载到单片机中,连接电源,交通灯即可开始工作。 需要注意的是,交通灯的具体规律和时序可以根据实际需求进行调整和扩展。同时,为了保证交通安全,还可以加入其他的传感器或者控制模块,实现更复杂的交通控制系统。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值