————————————–此示例包括所有源程序以及原理图————————————–
最终结果
博主大约需要五天时间才能完成硬件设计和软件设计
这
原理图 PDSPRJ 和源程序 C 在本文末尾(完整)
———————————————全文26幅图表,包括流程图,共计11657字——————————————-
1. 设计任务
设计一种基于单片机控制的城市道路交叉通信号灯控制系统。需要以下功能:
1.系统有两种状态,设置状态和显示状态,使用键盘在两种状态之间切换。默认设置开机;
2、当系统处于显示状态时,四个交叉数码管从设定时间(或默认)倒计时时间开始倒计时;
3、设置状态时,使用KEY1~KEY3键盘设置每个路口直行的倒计时时间,设置路口数码管闪烁显示,各路口的通过时间可以不相等,其中KEY2为正1键,KEY3为负1键,特殊情况为KEY1键;
4、显示状态时,交通信号灯模块四块LED板数码管倒计时;每组LED板的交通信号灯用于交通指示;如果LED板上有三个绿灯(左转、直行、右转),则数码管显示通过时间,否则数码管显示等待时间;在显示过程中,按状态构建键重新进入设置状态。
5.注意一些不可预测的情况和紧急情况(例如,夜间状态,人多时需要按下按钮过人行道,事故情况等)。
1 号交叉路口的直线时间:10 秒;
2 号交叉路口的直线时间:10 秒;
3 号交叉路口的直线时间:10 秒;
4 号交叉路口的直线时间:10 秒;
黄灯控制时间:5秒
2. 设计报告 1 设计说明 1.1 功能分析 1.1.1 整体系统功能分析
单片机控制的城市道路交叉通信号灯控制系统需要基于真实交叉路口的交通信号灯进行仿真。
需要呈现的整体功能是:
车辆驾驶支持和调度:交通信号灯控制系统需要清晰的信号指示(交通信号灯和倒计时显示),提供清晰的交通规则和驾驶顺序,并为驾驶者提供清晰的指导。
人行横道保障和调度:交通信号灯控制系统需要考虑车辆的通行,还需要充分考虑行人的安全和调度,设置行人信号和过马路时间。
交通车辆和行人安全:交通信号灯控制系统需要降低交通事故风险,确保道路交通车辆和行人的安全,避免因系统错误而引发的交通事故。
需要具备的具体功能有:
显示状态功能、设置状态功能和紧急状态功能,接下来对具体功能进行分析和说明。
1.1.2 显示状态功能分析
要求:交通信号灯模块四块LED板数码管倒计时,LED板各组交通信号灯进行交通指示;如果LED板上有绿灯(左转、直行、右转),则数码管显示通过时间,否则数码管显示等待时间;在显示过程中按状态键重新进入设置状态。
并且还需要结合每个路口的绿灯通行时间来控制显示系统,以满足车辆、行人和交通安全的功能要求。
车辆在每个路口的直线时间为10秒TG(绿灯时间),警告时间TY(黄灯时间)为5秒,红灯时间TR为等待其他三个路口通过的排队时间
根据上面的公式,红灯时间TR=45秒,从中我们得到车辆在每个路口显示信号灯时的红、黄、绿时间。
对于人行道交通信号灯,从分析中可以看出,当车辆在交叉路口通过(直转和左转),然后右侧人行道通过时,行人的绿灯通行时间为车辆的绿灯通行时间+黄灯警告时间=15秒, 而且红灯也一致,车辆的排队时间为45秒。
然后利用4个路口的全交通行为,分析每个路口的信号灯显示状态函数
表1 交叉路口信号灯显示状态示意图
注意:因为在现实生活中,车辆停在交叉路口信号灯的对面路口,驾驶员看着对面路口的信号灯和倒计时,所以路口对路口的车辆亮绿灯,路口红灯亮等待车辆。
1.1.3 设置状态函数分析
要求:设置状态时,使用KEY1~KEY5键盘设置每个路口直通的倒计时时间,设置路口数码管显示,每个路口的通行时间可以不相等,其中KEY1为开始键,KEY2为暂停/设置键,KEY3为加1键, KEY4 是负 1 键,KEY5 是紧急按钮。
1.1.4 应急功能分析
要求:在紧急状态下,考虑一些不可预测的情况和紧急情况,例如交通事故或救护车需要通过,此时,交通管制办公室需要控制该路口的交通信号灯系统,因此需要紧急按钮来控制所有路口信号灯。下
表描述了设置和紧急功能
表2 Key功能表
1.2 方案比较
根据第1.1节的功能需求分析,明确了各板的功能和要求:车载LED数码管倒计时显示板、车载信号灯显示板、行人信号灯显示板、键盘输入板,然后对每块板进行分析,比较几种可能的设计方案,并分析其优缺点、开发可行性、 经济可行性和整体可行性。
1.2.1 车载LED数码管倒计时显示板
要求:可控制LED数码管4个路口的8位段码和2位码,显示1、2、3、4、5、6、7、8、9位,配合信号灯实现倒计时。
表3 车载LED数码管显示板方案对照表
注:开发可行性、经济可行性、整体可行性得分为“⁕”,“⁕”越多越好。
1.2.2 车载信号灯显示板
要求:可控制四个路口的交通信号灯显示,实现亮红灯、黄灯、绿灯功能,配合LED数码管实现交通控制。
表4 车载信号灯显示牌方案对照表
注:开发可行性、经济可行性、整体可行性得分为“⁕”,“⁕”越多越好。
1.2.3 行人信号灯显示板
要求:可控制四个路口的行人交通信号灯显示,实现亮红绿灯功能,通过车辆的信号灯显示实现行人交通控制。
表5 行人信号灯显示板方案对照表
注:开发可行性、经济可行性、整体可行性得分为“⁕”,“⁕”越多越好。
1.2.4 键盘输入板
要求:可以使用KEY1~KEY5键盘设置每个路口直通的倒计时时间,设置路口数码管显示,每个路口的通过时间可以不相等,其中KEY1为开始键,KEY2为暂停/设置键,KEY3为加1键,KEY4为减1键,KEY5为紧急按钮。
表5 键盘板方案对比表
注:开发可行性、经济可行性、整体可行性得分为“⁕”,“⁕”越多越好。
1.2.5 整体方案选择
综上所述,基于单片机控制的城市道路交叉通信号灯控制系统采用以下设计方案:
表6 整体系统板设计
1.3 原理分析与控制系统设计 1.3.1 原理分析
根据上一节的方案选择,设计了整个系统的每块板块,同时,在1.1节中也详细描述了需要具备的功能,基于单片机控制的城市道路交叉通信号灯控制系统,如上一节表6所示, 然后分析具体方案原理。
1.3.2 硬件设计
在硬件方面,对车载LED数码管倒计时显示板、车载信号灯显示板、行人信号灯显示板、键盘输入板四块芯板的硬件设计进行了说明。
表7 核心硬件设计说明
1.3.3 软件设计
在基于单片机控制的城市道路交叉通信号灯控制系统中,采用C语言程序对系统进行编程,对于软件,具体涉及整体逻辑控制、寄存器配置、锁存器配置、I/O端口配置。
同时,如果整个系统工作,则涉及到各个板块之间的协调,因此软件程序也需要分不同部分进行设计。
(1)主程序流程图
这里在主程序初始化定时器/计数器寄存器,设置初始化按钮状态,在一个主循环中,不断检测是否有按键状态变化,然后进入城市道路交叉口红绿灯控制系统,本系统包含更详细的定时逻辑,道路交通信号灯显示,人行道交通信号灯显示, 最后是LED数码管显示方案。
(2)城市道路交叉通信号灯控制程序
这里城市道路交叉口的交通信号灯控制程序是在主程序中调用的模块程序,用于判断交叉口的整体计时逻辑并判断每个交叉口的状态,并使用一个叫做miao的计时器来表示当前系统的时间,并不断判断交叉口的状态, 如果进入相应的交叉路口状态,LED四路口的数码管立即配置显示时间,控制车辆的交通信号灯状态,控制人行道的交通信号灯控制。
注:这里以北路口的绿灯状态+黄灯状态+结束状态为例,其余三个路口的流程与北路口的配置基本相同,这里就不再赘述了。
(3)道路交通信号灯控制程序
道路交通信号灯控制程序由上层【城市道路交叉通信号灯控制程序】控制,每个交叉路口的交通信号灯状态由light_status车辆的交通信号灯状态标志表示,通过开关判断状态,输入相应的配置程序。
注意这里道路的交通信号灯配置,对应于每个交叉路口信号灯的引脚配置
道路交通信号灯北绿 北黄东绿东黄南绿绿南绿0x05 0x03 0x08 0x08 0x09 0x09 0x09 0x09 ucharcodelight_L 0x24 0x24 0xA4 0x64 0x14 0x0C 0x22 0x21 ucharcodelight_H绿
(4)关键判断程序
注意:这里是KEY1开机定时器、KEY3加1秒、KEY5紧急的例子,暂停/设置减去1秒的步骤与上述步骤基本相同,这里就不重复了。
3、实验仪器设备
表8 实验设备表
4. 设计结果及设计总结 1.设计结果展示 1.1 系统功能测试与分析 (1)默认状态功能测试与分析
单片机加载编译后的HEX程序,加载点击运行,默认为设置状态,默认倒计时四个路口及车行道、行人交通信号灯显示,10秒、15秒、30秒、45秒,默认为北路口绿灯交通。
(2)启动状态功能测试与分析
点击KEY1按钮开始运行系统,可以看到路口的红绿灯、LED倒计时显示、路口的行人红绿灯都按照设计正常运行。这里的测试时间是 60 秒的循环,每个十字路口 15 秒,绿灯 10 秒,黄灯 5 秒。
经过四轮非重复测试,系统可准确、有序运行,满足功能设计要求、车辆行车保障与调度、人行横道保障与调度、交通车辆行人安全等要求。
(3)暂停/设定状态的功能测试与分析
点击KEY2按钮暂停运行系统,可以看到每个路口的交通信号灯暂停,LED显示屏暂停倒计时,行人路通信号灯暂停。
在各个十字路口进行了四轮暂停测试后,系统能够准确暂停。
(4) 时间加 1/时间减 1 功能测试
点击KEY2暂停/设置按钮后,再点击KEY3时间加1按钮,可以增加一秒对应的LED显示屏暂停倒计时时间,此时每个路口的倒计时也会增加一秒,再次点击开始按钮,系统在增加一秒后会根据状态继续运行。
经过四个交叉点的时间加一测试后,系统可以根据要求的时间准确加一个,这里由于篇幅限制,只显示北交叉点加1,其他交叉点可以准确加1,这里就不重复了。
同样,对于KEY4时间减去1个按钮,也进行了测试,根据功能要求,四个交叉点的测试是正常的。
经过测试,时间加1/时间减1功能可以正常运行,这与之前的功能设计和分析是一致的。
(5)应急功能测试
按下KEY5紧急按钮,路口进入紧急状态,所有路口的显示屏和信号灯熄灭,人行道红灯亮起,交警控制,这个按钮只能在非常紧急的情况下正常使用。
1.2 定时误差测试与分析 (1)数码管扫描时间的延迟差
经过测试,通过系统运行状态,随机截图,可以看出LED数码管的倒计时可以正常显示,没有因扫描时间延迟而造成的时间,说明设计的数码管扫描时间的延迟差小于人眼可以捕捉到的最小延迟, 并且对系统的整体功能几乎没有影响,因此数码管扫描时间的延迟差异可以忽略不计。
(2)交集状态轮回刷新的时序误差
根据功能设计,四个交叉口的一轮交通时间为15s+15s+15s+15s=60秒,根据理论设计,每个交叉口状态结束后,将恢复到原来的状态,即:北交叉口绿灯10秒,东交叉口红灯15秒, 南路口红灯30秒,西路口红灯倒计时45秒。
因此,进行了4小时系统测试,并使用秒表进行计时,结果显示,4小时后,路口在东路口处于8秒红灯倒计时状态。
因此,定时误差为:10s+5s+(15s-8s)=22s
由于误差在3%以内,因此可以接收到交集状态轮回的时序误差。
2. 工作经历 2.1 主要任务经验
交通信号灯控制系统的设计很复杂,需要考虑多状态切换、倒计时功能、键盘输入和 LED 数字管显示。在实施过程中,我遇到了一些挑战,也学到了一些经验。我学会了如何使用微控制器来控制硬件设备,通过学习和理解各种芯片(如74HC573锁存器)的功能和各种接口,我能够正确连接和控制LED数码管、车辆信号灯和行人灯等设备。这让我对微控制器控制技术有了更深入的了解。通过编写代码,可以根据系统状态和键盘输入来控制LED数码管的显示和倒计时功能。我还学到了一些关于如何使用硬件和软件进行协作的技巧。在设计过程中,需要考虑到单片机的I/O资源限制,合理分配和利用有限的资源,实现对各个功能模块的控制。同时,我还学会了如何调试和测试软硬件,以保证系统的稳定性和可靠性。不仅加深了我对单片机控制的理解,也提高了我的解题能力和动手实践能力,这期间大功课的完成,为我以后在单片机开发领域的学习和工作打下了坚实的基础。
2.2 实验课程经验
在单片机的基础实验中,我学习了许多实验项目,包括红绿灯、流光灯、单数码管、八位数码管显示、独立按键、矩阵键盘、外部中断、10秒秒表、时、分、秒及串口通讯等。这些实验不仅让我掌握了MCU的基础知识和应用技能,还提高了我的动手能力和解决问题的能力。
通过这些实验的学习,我对单片机的内部结构和工作原理有了深入的了解,掌握了常用芯片和模块的使用,提高了自己的编程能力和硬件设计能力。同时,这些实验也让我更加意识到,实践是检验理论的唯一标准。
硬件设计、软件设计、功能分析、模块设计、程序编写调试等,感谢张老师的教导,在MCU课程的学习中给了我很大的启发和帮助。
附录 附录 A:参考文献
[1] 吴玉生.基于单片机的智能交通信号灯控制系统仿真设计[J].电子世界,2018(21):118-119+122.DOI:10.19353/ki.dzsj.2018.21.068
[2]郭玉秀.基于单片机的交叉路通信号灯设计与仿真[J].现代制造技术与装备,2018(08):66-68.DOI:10.16107/ki.mmte.2018.0724
[3]于曦臣.基于AT89C51微控制器的数字交通信号灯设计[J].科技信息,2017,15(27):39-40.DOI:10.16661/ki.1672-3791.2017.27.039
[4] 丹海英, 杨聪. 基于单片机控制的交叉路通信号灯设计与分析[J].电子检测,2017(13):9+8.DOI:10.16520/ki.1000-8519.2017.13.003
附录B:原理图
附录 C:源程序
#include
#include
#define uchar unsigned char
#define uint unsigned int
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //显示的段码
// 北1 北2 南1 南2 西1 西2 东1 东2
uchar code wei[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; // 两个并排的显示 十位 | 个位
// 车行道红绿灯 北绿 北黄 东绿 东黄 南绿 南黄 西绿 西黄
uchar code light_H[] = {0x21,0x22,0x0C,0x14,0x64,0xA4,0x24,0x24};
uchar code light_L[] = {0x09,0x09,0x09,0x09,0x08,0x08,0x03,0x05};
sbit J_duan=P3^0;
sbit J_wei=P3^1;
sbit N_ren=P2^4;
sbit E_ren=P2^5;
sbit S_ren=P2^6;
sbit W_ren=P2^7;
bit key_state;
sbit K1=P3^2; // 3.2引脚--按键 赋值为K1
sbit K2=P3^3; // 3.3引脚--按键 赋值为K2
sbit K3=P3^5; // 3.5引脚--按键 赋值为K3
sbit K4=P3^6; // 3.6引脚--按键 赋值为K4
sbit K5=P3^7; // 3.7引脚--按键 赋值为K5
uint Timer_count=0;
uint green_time = 10, yellow_time = 5; // 我设置的每个路口10秒绿灯,5秒黄灯
uint miao = 0, N_miao = 0, S_miao = 0, W_miao = 0, E_miao = 0, my_time=0 ,xianshi_allow =1;
// 延时函数
void DelayMS(uint x)
{
uchar i;
while(x--)
{
for(i=0;i=(0*green_time+0*yellow_time+my_time) & miao=(1*green_time+0*yellow_time+my_time) & miao=(1*green_time+1*yellow_time+my_time) & miao=(2*green_time+1*yellow_time+my_time) & miao=(2*green_time+2*yellow_time+my_time) & miao=(3*green_time+2*yellow_time+my_time) & miao=(3*green_time+3*yellow_time+my_time) & miao=(4*green_time+3*yellow_time+my_time) & miao<(4*green_time+4*yellow_time+my_time)) // 西黄灯
{
N_miao = 4*green_time+4*yellow_time+my_time - miao;
E_miao = 5*green_time+5*yellow_time+my_time - miao;
S_miao = 6*green_time+6*yellow_time+my_time - miao;
W_miao = 4*green_time+4*yellow_time+my_time - miao; // 西计时
light_show(8);
N_ren = 1;
E_ren = 0;
S_ren = 0;
W_ren = 0;
}
else if(miao==(4*green_time + 4*yellow_time+my_time)) // 所有路口通过清零
{
miao = 0; // 秒清零
}
}
void main()
{
P0=0x00;
TMOD=0X01;
TL0=(65536-50000)%256;
TH0=(65536-50000)/256;
TR0=0; // 关闭中断
ET0=0;
EA=0;
key_state=1; // 初始化按钮状态为0
while(1)
{
if(key_state != K1) // 按键检测 -- 开启中断 -- 开始
{
DelayMS(5); //消抖
key_state=K1; // 按下按键 key_state = K1 = 0
if(key_state ==0)
{
xianshi_allow = 1;
TR0=1;
ET0=1;
EA=1;
}
}
else if(key_state != K2) // 按键检测 -- 暂停
{
DelayMS(5); //消抖
key_state=K2; // 按下按键 key_state = K2 = 0
if(key_state ==0)
{
xianshi_allow = 1;
TR0=0;
ET0=0;
EA=0;
}
}
else if(key_state != K3) // 按键检测 -- 增1
{
DelayMS(100); //消抖
key_state=K3; // 按下按键 key_state = K3 = 0
if(key_state ==0)
{
my_time++;
}
}
else if(key_state != K4) // 按键检测 -- 减1
{
DelayMS(100); //消抖
key_state=K4; // 按下按键 key_state = K4 = 0
if(key_state ==0)
{
my_time--;
}
}
else if(key_state != K5) // 按键检测 -- 紧急事件 -- 全红灯
{
DelayMS(5); //消抖
key_state=K5; // 按下按键 key_state = K5 = 0
if(key_state ==0)
{
TR0=0;
ET0=0;
EA=0;
xianshi_allow = 0; // 全部不显示
P1 = P2= 0x00;
J_wei=1;J_wei=0;
}
}
if(xianshi_allow == 1)
{
Xianshi(); // 计时
show(N_miao/10,0);
show(N_miao,1);
show(E_miao/10,2);
show(E_miao,3);
show(S_miao/10,4);
show(S_miao,5);
show(W_miao/10,6);
show(W_miao,7);
}
}
}
—————————————— 2024.6.5 更新——————————————
源代码和原理图在 Gitee 存储库中开源
如果对您有帮助,请给博主竖起大拇指
如果对您有用,请收藏 ⭐
~~~
2023年12月20日
渝北仙桃数据谷