求一种STM32单片机交通灯控制系统设计方案

发布时间:2023-08-22  

一、功能简介

本项目使用Proteus8.12仿真STM32单片机控制器,使用数码管、按键、交通信号灯模块等。


系统运行后,交通灯系统开始运行,数码管显示初始时间,默认南北绿灯5S,东西红灯8S,绿灯过后南北黄灯3秒;然后切换东西绿灯5S,南北红灯8S,绿灯过后南北黄灯3秒;如此循环。可使用K1键进入红绿灯时间设置,K2和K3进行加减调节,设定好后,K4键确定并继续运行。在运行过程中,可通过K2键禁止通行,此时东南西北方向红灯亮,K3键允许南北通行,此时南北绿灯亮,东西红灯亮。K4键允许东西通行,此时南北红灯亮,东西绿灯亮。此时可按下K1键返回交通灯自动控制模式运行。


主要功能如下:

(1)东西南北红黄绿灯控制;

(2)交通灯时间设置;

(3)数码管显示;

(4)突发状况交通灯控制。


二、软件设计

/*******************************************************************************

  • 函 数 名 : TIM2_IRQHandler

  • 函数功能 : TIM2中断函数

  • 输 入 : 无

  • 输 出 : 无

*******************************************************************************/

void TIM2_IRQHandler(void)

{

static u8 i=0;

if(TIM_GetITStatus(TIM2,TIM_IT_Update))

{

i++;

if(i>=100)//间隔1S

{

i=0;

sys_ctrl.sec++;

if(sys_ctrl.led_sta==0)//南北绿灯,东西红灯时间

{

sys_ctrl.nbled_time=sys_ctrl.gled_time-sys_ctrl.sec;

sys_ctrl.dxled_time=sys_ctrl.rled_time-sys_ctrl.sec;

//LED

NB_GLED=1;NB_YLED=0;NB_RLED=0;

DX_GLED=0;DX_YLED=0;DX_RLED=1;

if(sys_ctrl.sec>=sys_ctrl.gled_time)

{

sys_ctrl.sec=0;

sys_ctrl.led_sta=1;

sys_ctrl.nbled_time=YLED_TIME-sys_ctrl.sec;

sys_ctrl.dxled_time=YLED_TIME-sys_ctrl.sec;

//LED灯

NB_GLED=0;NB_YLED=1;NB_RLED=0;

DX_GLED=0;DX_YLED=0;DX_RLED=1;

}

}

else if(sys_ctrl.led_sta==1)//南北黄灯,东西红灯时间

{

sys_ctrl.nbled_time=YLED_TIME-sys_ctrl.sec;

sys_ctrl.dxled_time=YLED_TIME-sys_ctrl.sec;

if(sys_ctrl.sec>=YLED_TIME)

{

sys_ctrl.sec=0;

sys_ctrl.led_sta=2;

sys_ctrl.nbled_time=sys_ctrl.rled_time-sys_ctrl.sec;

sys_ctrl.dxled_time=sys_ctrl.gled_time-sys_ctrl.sec;

//LED灯

NB_GLED=0;NB_YLED=0;NB_RLED=1;

DX_GLED=1;DX_YLED=0;DX_RLED=0;

}

}

else if(sys_ctrl.led_sta==2)//南北红灯,东西绿灯时间

{

sys_ctrl.nbled_time=sys_ctrl.rled_time-sys_ctrl.sec;

sys_ctrl.dxled_time=sys_ctrl.gled_time-sys_ctrl.sec;

if(sys_ctrl.sec>=sys_ctrl.gled_time)

{

sys_ctrl.sec=0;

sys_ctrl.led_sta=3;

sys_ctrl.nbled_time=YLED_TIME-sys_ctrl.sec;

sys_ctrl.dxled_time=YLED_TIME-sys_ctrl.sec;

//LED灯

NB_GLED=0;NB_YLED=0;NB_RLED=1;

DX_GLED=0;DX_YLED=1;DX_RLED=0;

}

}

else if(sys_ctrl.led_sta==3)//南北红灯,东西黄灯时间

{

sys_ctrl.nbled_time=YLED_TIME-sys_ctrl.sec;

sys_ctrl.dxled_time=YLED_TIME-sys_ctrl.sec;

if(sys_ctrl.sec>=YLED_TIME)

{

sys_ctrl.sec=0;

sys_ctrl.led_sta=0;

sys_ctrl.nbled_time=sys_ctrl.gled_time-sys_ctrl.sec;

sys_ctrl.dxled_time=sys_ctrl.rled_time-sys_ctrl.sec;

//LED灯

NB_GLED=1;NB_YLED=0;NB_RLED=0;

DX_GLED=0;DX_YLED=0;DX_RLED=1;

}

}

}

}

TIM_ClearITPendingBit(TIM2,TIM_IT_Update);

}

//系统数据显示

void sys_data_show(void)

{

u8 buf[8];

//正常显示

while(sys_ctrl.mode==0)

{

buf[0]=gsmg_code[sys_ctrl.nbled_time/10];

buf[1]=gsmg_code[sys_ctrl.nbled_time%10];

buf[2]=gsmg_code[sys_ctrl.nbled_time/10];

buf[3]=gsmg_code[sys_ctrl.nbled_time%10];

buf[4]=gsmg_code[sys_ctrl.dxled_time/10];

buf[5]=gsmg_code[sys_ctrl.dxled_time%10];

buf[6]=gsmg_code[sys_ctrl.dxled_time/10];

buf[7]=gsmg_code[sys_ctrl.dxled_time%10];

smg_display(buf,1);

break;

}

//时间设置模式显示

while(sys_ctrl.mode==1)

{

buf[0]=gsmg_code[sys_ctrl.gled_time/10];

buf[1]=gsmg_code[sys_ctrl.gled_time%10];

buf[2]=gsmg_code[sys_ctrl.gled_time/10];

buf[3]=gsmg_code[sys_ctrl.gled_time%10];

buf[4]=gsmg_code[sys_ctrl.rled_time/10];

buf[5]=gsmg_code[sys_ctrl.rled_time%10];

buf[6]=gsmg_code[sys_ctrl.rled_time/10];

buf[7]=gsmg_code[sys_ctrl.rled_time%10];

smg_display(buf,1);

break;

}

//禁止通行显示、//南北通行显示、//东西通行显示

while(sys_ctrl.mode==2 || sys_ctrl.mode==3 || sys_ctrl.mode==4)

{

buf[0]=0x40;

buf[1]=0x40;

buf[2]=0x40;

buf[3]=0x40;

buf[4]=0x40;

buf[5]=0x40;

buf[6]=0x40;

buf[7]=0x40;

smg_display(buf,1);

break;

}

}

//系统数据设置

void sys_data_set(void)

{

u8 key=0;

key=KEY_Scan(0);

if(sys_ctrl.mode==0)

{

//时间设置

if(key==KEY1_PRESS)

{

sys_ctrl.mode=1;

TIM_Cmd(TIM2,DISABLE);//关闭定时器

}

}

//非时间设置模式

if(sys_ctrl.mode!=1)

{

if(key==KEY1_PRESS)

{

sys_ctrl.mode=0;

TIM_Cmd(TIM2,ENABLE);//打开定时器

}

//禁止通行

else if(key==KEY2_PRESS)

{

sys_ctrl.mode=2;

TIM_Cmd(TIM2,DISABLE);//关闭定时器

//LED灯

NB_GLED=0;NB_YLED=0;NB_RLED=1;

DX_GLED=0;DX_YLED=0;DX_RLED=1;

}

//南北通行

else if(key==KEY3_PRESS)

{

sys_ctrl.mode=3;

TIM_Cmd(TIM2,DISABLE);//关闭定时器

//LED灯

NB_GLED=1;NB_YLED=0;NB_RLED=0;

DX_GLED=0;DX_YLED=0;DX_RLED=1;

}

//东西通行

else if(key==KEY4_PRESS)

{

sys_ctrl.mode=4;

TIM_Cmd(TIM2,DISABLE);//关闭定时器

//LED灯

NB_GLED=0;NB_YLED=0;NB_RLED=1;

DX_GLED=1;DX_YLED=0;DX_RLED=0;

}

}

//时间设置模式

if(sys_ctrl.mode==1)

{

if(key==KEY2_PRESS)//加

{

sys_ctrl.gled_time++;

if(sys_ctrl.gled_time>90)sys_ctrl.gled_time=0;

sys_ctrl.rled_time=sys_ctrl.gled_time+YLED_TIME;

}

else if(key==KEY3_PRESS)//减

{

sys_ctrl.gled_time--;

if(sys_ctrl.gled_time<0)sys_ctrl.gled_time=90;

sys_ctrl.rled_time=sys_ctrl.gled_time+YLED_TIME;

}

else if(key==KEY4_PRESS)//确定

{

sys_ctrl.mode=0;

TIM_Cmd(TIM2,ENABLE);//打开定时器

}

}

}

//应用控制系统

void appdemo_show(void)

{

LED_Init();

KEY_Init();

smg_init();

SMG_DATAPORT(0);

sys_parm_init();//系统参数初始化

TIM2_Init(500-1,79);//定时10ms

while(1)

{

sys_data_show();//系统数据显示

sys_data_set();//系统数据设置

}

}

三、实验现象

图片

图片

图片

图片

图片

图片


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    AT89S51单片机对十字路口交通信号灯的控制设计;一、技术要求 某十字路口,如下图所示,设计一个交通灯信号控制器,指挥交通车的通行。要求如下: 1)东西通道和南北通道交替通行,东西......
    警通过按键电路输入拟控制的信号灯与时间后,由单片机编码打包并通过Zigbee模块发送到交通灯控制模块。其中,CN3065用以系统校时和时间提示,Zigbee模块采用cc2430。 图2  无线手持设备硬件拓扑图 2.2、交通灯......
    基于51单片机实现LED模拟交通灯;具体功能实现: 南北红灯亮,东西绿灯亮;南北绿灯亮,东西红灯亮;在红绿灯转换过程中,黄灯闪烁5次。 使用器件: 若干电阻、4只LED红灯、4只LED绿灯、4只......
    各位对各个LED进行控制,从而实现对LED的定时选通。 1.5、交通灯显示模块 交通灯显示模块由单片机的P1口进行控制,用32个发光二极管模拟此交叉口的车道交通灯(交叉口4个方向的直行绿灯、左转......
    单片机学习从入门到入土?这3个关键点导致!;今天跟大家分享下我们无际单片机编程学员最近问的比较多的3个问题,这3个问题也是当初我在学习单片机过程中碰到的,并且踩过坑。 今天我就来分享下这3个问......
    入门的学员,没有必要去深挖模拟电路。模拟电路相对比较复杂,现在很多都集成到芯片使用了,再单片机开发中很少用到模拟电路。 学习单片机编程的开始就去深挖模拟电路,就是增加你的学习负担,增加学习的疲惫感,导致最终放弃单片机......
    ,就是除以256后的整数部分。 低字节为TL0=(65536-X)%256,减去高字节后余下的部分。 代码实现 //名称: LED模拟交通灯 #include #define uint unsigned......
    单片机如何使用?51单片机C语言编程实例有哪些?;单片机如何使用,我们要知道单片机在哪里使用? 单片机是很多电子产品的核心器件,它具有一定的逻辑判断和事件处理能力的芯片。 可以对单片机编程......
    单片机编程简单吗?arduino为什么不适合大学生?;rduino本质也是一个单片机,它的编程语言基本和单片机一样都是通过c语言。 但是为什么很多人觉得单片机编程会比arduino难很多呢? 原因......
    AT89C52单片机为控制器的多功能交通灯控制系统;汽车数量越来越多,而现在的红绿灯处的交通灯模式采用的是定时控制,由于车流量是随时变化的,当此时没有车通过,而相......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>