一.硬件方案
stm32单片机的智能交通灯主要由stm32单片机核心板+74HC245芯片+数码管+LED指示灯+按键等构成。硬件框图如下:

二.设计功能
(1)本设计能模拟基本的交通控制系统,用红绿黄灯表示禁行,通行和等待的信号发生,还能进行倒计时显示。
(2)按键可以控制禁行、深夜模式、复位、东西通行、南北通行、时间加、时间减、切换等功能。
(3)共四个二位阴极数码管,东南西北各一个显示时间,四个数码管的阴极都接到STM32F103C8T6的P1口,阳极接到74HC245芯片上,通过P0口控制74HC245芯片,起到驱动放大作用。
(4)共12个发光二极管,四个路口每个路口各有一个红(禁行)、黄(警告)发光二极管,四个路口的二极管接到PA及PB口,按键接PB口。
三.设计原理图
(1)交通灯控制方案
设在十字路口,分为东西向和南北向,在任一时刻只有一个方向通行,另一方向禁行,持续一定时间,经过短暂的过渡时间,将通行禁行方向对换。其具体状态如下图所示。说明:黑色表示亮,白色表示灭。交通状态从状态1开始变换,直至状态6然后循环至状1,周而复始,即如图(图2-1)所示:直至状态6然后循环至状态1,通过具体的路口交通灯状态的演示分析我们可以把这四个状态归纳如下:


(1)东西方向红灯灭,同时绿灯亮,南北方向黄灯灭,同时红灯亮,倒计时20秒。此状态下,东西向禁止通行,南北向允许通行。
(2)东西方向绿灯灭,同时黄灯亮,南北方向红灯亮,倒计时5秒。此状态下,除了已经正在通行中的其他所以车辆都需等待状态转换。
(3)南北方向红灯灭,同时绿灯亮,东西方向黄灯灭,同时红灯亮,倒计时30秒。此状态下,东西向允许通行,南北向禁止通行。
(4)南北方向绿灯灭,同时黄灯亮,东西方向红灯亮,倒计时5秒。此状态下,除了已经正在通行中的其他所以车辆都需等待状态转换。
(2)原理图主要采用AD软件进行设计,如图:

(2)PCB图如下:

四.软件设计
主程序源码
- int main(void)
- {
- delay_init(); //延时函数初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
- SMG_Init();
- KEY_Init();
- delay_ms(200);
- Green_dx=1; // 开始默认状态,东西绿灯,南北黄灯
- Yellow_nb=1;
- sec_nb=sec_dx+5; //默认南北通行时间比东西多5秒
- TIM2_Int_Init(500-1,7199);//10Khz的计数频率,计数到500为50ms 500*100=50000us=50ms
- TIM3_Int_Init(500-1,7199);//10Khz的计数频率,计数到500为50ms
- //Tout = ((arr+1)*(psc+1))/Tclk ;
- //Tclk:定时器输入频率(单位MHZ)
- //Tout:定时器溢出时间(单位us)
- while(1)
- {
- KeyScan();
- /用于设置时,数码管闪烁
- if(test++ >= 400)test=0;
- if(test < 200)setShanshuo=0;else setShanshuo=1;
-
- if(setFlag==0)//在正常模式下
- {
- DisplayData[3] = smgduan[sec_nb%10];//南北个位段码数据
- DisplayData[2] = smgduan[sec_nb/10];//南北十位段码数据
- DisplayData[1] = smgduan[sec_dx%10];//东西个位段码数据
- DisplayData[0] = smgduan[sec_dx/10];//东西十位段码数据
- }
- else//在设置模式下,相应的数码管闪烁显示
- {
- if(setShanshuo==0)
- {
- DisplayData[3] = smgduan[sec_nb%10];//南北个位段码数据
- DisplayData[2] = smgduan[sec_nb/10];//南北十位段码数据
- DisplayData[1] = smgduan[sec_dx%10];//东西个位段码数据
- DisplayData[0] = smgduan[sec_dx/10];//东西十位段码数据
- }
- else
- {
- if(set==0)//说明在设置东西时间
- {
- DisplayData[1] = 0x00;//数码管熄灭
- DisplayData[0] = 0x00;//数码管熄灭
- }
- else//说明在设置南北时间
- {
- DisplayData[3] = 0x00;//数码管熄灭
- DisplayData[2] = 0x00;//数码管熄灭
- }
- }
- }
- DigDisplay();//显示数据
- }
- }
资料链接:https://pan.baidu.com/s/1DlzOjNwmu-EGqErYrwjjuw?pwd=58fe
提取码:58fe