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

发布者:等风来88888最新更新时间:2023-08-22 来源: elecfans关键字:STM32  单片机  交通灯控制系统 手机看文章 扫描二维码
随时随地手机看文章

一、功能简介

本项目使用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();//系统数据设置

}

}

三、实验现象

图片

图片

图片

图片

图片

图片


关键字:STM32  单片机  交通灯控制系统 引用地址:求一种STM32单片机交通灯控制系统设计方案

上一篇:基于STM32多通道ADC综合应用示例
下一篇:如何使用STM32G431芯片做DAC应用

推荐阅读最新更新时间:2024-11-17 15:55

为什么选择AVR单片机
为什么选用AVR单片机? (1) 为什么选用AVR单片机? Flash程序存储器可擦写1000次以上,不再有报废品产生。PIC 有的是OTP,只能烧录一次。AVR程序存储器数据为16位组织,也可按8位理解。PIC是12/14位程序 存储器,作寄存器转移和算术、逻辑运算带来不便。 (2) 为什么选用AVR单片机? 高速度(50ns)、低功耗!硬件应用Harward结构,具有预取指令功能, 使得指令可以在一个时钟周期内执行。PIC要4个时钟周期执行一条指令。MSC-51要12个时钟周期 执行一条指令。 (3) 为什么选用AVR单片机? 超功能精简指令!具有32个通用工作寄存器(相当于8051中的32个累 加器,克服了单一累加
[单片机]
STM32系列第8篇--串口配置步骤
//初始化串口1void My_USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStrue; USART_InitTypeDef USART_InitStrue; NVIC_InitTypeDef NVIC_InitStrue; //串口时钟使能,GPIO时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //GPIO端口模式设置,PA9设置推挽复用,PA10设置浮空模式 GPIO_Init
[单片机]
stm8s103单片机输出PWM波程序
void Timer2_Init(void) { CLK_ICKR|=0x01; while(!(CLK_ICKR&0x02)); CLK_SWR=0xe1; TIM2_PSCR=0x04; TIM2_ARRH=0x01; TIM2_ARRL=0x00; TIM2_CCER1_CC1P=1; TIM2_CCER1_CC1E=1; TIM2_CCMR1_OC1M=0x60; TIM2_CCMR1_CC1S=0; TIM2_CCR1H=0x00; TIM2_CCR1L=0x20; TIM2_IER=0x00; TIM
[单片机]
单片机最小系统与PC机的通信分析
  PC机和多个单片机也可以组成多级控制系统,一般以PC机为后级,多个单片机最小系统为前级。其通信一般由两个独立的模块组成,即单片机通信模块和PC机通信模块。      1.单片机通信模块的设计      51单片机内串行口部分有两个物理上相互独立的数据缓冲器SBUF,但两个缓冲器的地址是一个(99H)。该缓冲器用来发送和接收数据。专用寄存器SCON和PCON控制串行口的工作方式和通信的波特率设定。定时器作为波特率发生器。CPU和SBUF写数据即是发送数据,CPU从SBUF读数据就是接收数据。      单片机51串行口是全双工串行通信口。0串行口控制寄存器是SCON。      SMO和SMl:工作方式选择位,如表所列。
[单片机]
<font color='red'>单片机</font>最小系统与PC机的通信分析
STM32基于库函数版本的系统工作频率与CAN工作波特率设置
1,系统工作频率设置 STM32系统工作频率设置寄存器版和库函数版相差较大。库函数版本系统工作频率通过system_stm32f10x.c 中的SystemInit()函数进行设置,其他的配置主要在stm32f10x_rcc.c文件中。对于系统时钟,默认情况下是在SystemInit函数的SetSysClock()函数中间判断的,而设置是通过宏定义设置的。 static void SetSysClock(void) { #ifdef SYSCLK_FREQ_HSE SetSysClockToHSE(); #elif defined SYSCLK_FREQ_24MHz SetSysClockTo24(); #elif def
[单片机]
<font color='red'>STM32</font>基于库函数版本的系统工作频率与CAN工作波特率设置
51单片机简单的按键(按下LED亮,松开LED灭)
#include reg52.h typedef unsigned char u8; typedef unsigned int u16; sbit l1=P2^3; sbit k1=P3^2; sbit l2=P2^2; sbit k2=P3^3; void delay(u16 i) { while(i--); } void anjian1() { if(k1==0)//判断按键是否被按下 { delay(1000);//消抖 if(k1==0)//消抖之后再次判断是否被按下 l1=~l1;//点亮led灯,led灯默认高电'平 while(!k1);//判断是否断开 } } void anjian
[单片机]
瑞萨MCU技术在中国市场大显身手
日前,第十二届国际集成电路研讨会暨展览会(IIC-China 2007)正式拉开帷幕,吸引了众多顶尖半导体企业的全力投入。作为全球MCU领域排名第一的顶级半导体企业,株式会社瑞萨科技今年已是第四次参与IIC展览会,在深圳站(3月5~6日)和上海站(3月13~14日)亮出最新的MCU技术以及行业解决方案,成为展会上颇受业界注目的耀眼之星。 记者了解到,随着北京奥运的临近,以及受中国消费电子业、IT制造业及汽车产业快速发展的带动,中国MCU市场需求呈爆炸性增长,消费电子成为中国最大MCU应用领域,汽车电子和工业电子有望成为中国MCU市场新的增长点,其中安全系统、马达控制、电力机车、安全与控制以及车载娱乐系统将是16位和32位MCU产品增
[焦点新闻]
基于PIC单片机的CO2焊机数字化控制系统
1 引言 CO2气体保护焊自从上世纪五十年代问世以来,就以高效、节能、低成本等特点受到人们极大的关注,已广泛应用于汽车、造船、航空航天、石油化工机械、农机和动力机械等制造部门 。目前使用的CO2焊机主要有抽头式、晶闸管式和逆变式等几种型式,其中,抽头式焊机在国内仍占有不小的市场份额。近些年来,随着计算机和自动控制技术的快速发展,现代CO2焊机已从传统的分立元件控制向集成化、数字化和智能化控制方向转变,以适应焊接技术不断发展的需要。 本研究用性价比高、抗干扰能力强的PIC单片机来控制抽头式CO2焊机,通过软件实现对焊机送丝速度和工作时序的数字化控制,并使其具有点焊、断续焊、二/四步控制等多种功能,以降低控制电路的复杂性、增
[单片机]
基于PIC<font color='red'>单片机</font>的CO2焊机数字化<font color='red'>控制系统</font>
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved