【超详细】基于单片机控制的十字道路口交通灯控制

目录

最终效果

一、设计任务

二、设计报告

1 设计说明

   1.1功能分析

   1.1.1整体系统功能分析

1.1.2显示状态功能分析

1.1.3设置状态功能分析

1.1.4紧急状态功能分析

1.2方案比选

1.2.1车辆LED数码管倒计时显示板块

1.2.2车辆信号灯显示板块

1.2.3行人信号灯显示板块

1.2.4键盘输入板块

1.2.5整体方案选择

1.3原理分析及控制系统设计

1.3.1原理分析

1.3.2硬件设计

1.3.3软件设计

①主程序流程图

②城市道路十字路口交通灯控制程序

③车行道红绿灯控制程序

④按键判断程序

三、实验仪器设备

四、设计结果和设计总结

1、设计结果展示

1.1系统功能测试与分析

①默认状态功能测试与分析

②开始状态功能测试与分析

③暂停/置位状态功能测试与分析

④时间加1/时间减1功能测试

⑤紧急情况功能测试

1.2计时误差测试与分析

①数码管扫描时延误差

②十字路口状态轮回刷新的计时误差

2、心得体会

2.1大作业心得体会

2.2实验课程心得体会

附录

附A : 参考文献

附B: 原理图

附C:  源程序


--------------------------------------本实验案例包含所有源程序以及原理图--------------------------------------

最终效果

博主大概用五天时间完成硬件设计与软件设计

原理图pdsprj和源程序c在本文末(完整)

---------------------------------------------全文26图含流程图共11657字-------------------------------------------

一、设计任务

设计基于单片机控制的城市道路十字路口交通灯控制系统。要求具有下述功能:

1、系统有两个状态,设置状态和显示状态,利用键盘进行两个状态间的切换。上电默认为设置状态;

2、系统为显示状态时,四个路口数码管从设置的时间(或默认的)倒计时时间开始倒计时;

3、设置状态时,利用KEY1~KEY3键盘设置各路口直行通行倒计时时间,设置的路口数码管闪烁显示,各路口的通行时间可以不相等,其中KEY2为加1键,KEY3为减1键,KEY1为特殊情况按键;

4、显示状态时,交通灯模组的四个LED板的数码管进行倒计时;LED板各组的红绿灯进行交通指示;如果一个LED板上有三个绿灯亮(左转、直行、右转),这时候数码管显示的是通行时间,否则,数码管显示的是等待时间;显示过程中按状态建键可以重新进入设置状态。

5、注意考虑有些不可预知情况和紧急情况(例如,晚上状态,人比较多的时候需要按键过人行道,出现事故情况等)

1号路口直行时间:10秒;

2号路口直行时间:10秒;

3号路口直行时间:10秒;

4号路口直行时间:10秒;

黄灯控制时间:5秒

二、设计报告

1 设计说明

   1.1功能分析
   1.1.1整体系统功能分析

基于单片机控制的城市道路十字路口交通灯控制系统,该系统需要基于现实十字路口的交通灯进行模拟设计。

需要具备的整体功能为:

车辆行驶保障与调度:交通灯控制系统需要明确的信号指示(红绿灯与倒计时显示),提供明确的交通规则和行车顺序,为行车者提供明确的指引。

行人过街保障与调度:交通灯控制系统需要考虑车辆的通行,也需要充分考虑行人的安全和调度,设立行人信号灯和过街时间。

交通车辆行人安全:交通灯控制系统需要降低交通事故的风险,保障道路交通车辆和行人的安全,避免出现由于系统出错而造成的交通事故。

需要具备的具体功能为:

显示状态功能、设置状态功能、紧急状态功能,接下来会对具体功能进行分析说明。

1.1.2显示状态功能分析

需求:交通灯模组的四个LED板的数码管进行倒计时,LED板各组的红绿灯进行交通指示;如果一个LED板上有绿灯亮(左转、直行、右转),这时候数码管显示的是通行时间,否则,数码管显示的是等待时间;显示过程中按状态键可以重新进入设置状态。

并且还需要结合每个路口的绿灯通行时间,进行显示系统控制,达到车辆、行人、交通安全的功能要求。

每个路口车辆直行时间TG(绿灯时间)10秒,警示时间TY(黄灯时间)5秒,红灯时间TR为等待其他三个路口通行的排队时间,具体公式:

根据上述公式得出红灯时间TR=45秒,由此我们得出每个路口车辆显示信号灯红黄绿时间。

对于人行道红绿灯,由分析可知,一个路口的车辆通行(直行和左转)时,随之其右侧的人行道通行,行人的绿灯通行时间为车辆绿灯通行时间+黄灯警示时间=15秒,红灯也随车辆的排队时间一致为45秒。

然后我们以四个路口车辆全通行为一个轮回,对每个路口的信号灯显示状态功能进行分析:

表一 路口信号灯显示状态示意表

注意:由于在实际生活中,车辆是停在路口信号灯的对面路口,司机平视对向路口的信号灯和倒计时,故此路口亮绿灯是对向路口的车辆通行,此路口亮红灯是对向车辆等待。

1.1.3设置状态功能分析

需求:设置状态时,利用KEY1~KEY5键盘设置各路口直行通行倒计时时间,设置的路口数码管显示,各路口的通行时间可以不相等,其中KEY1为开始键,KEY2为暂停/设置键,KEY3为加1键,KEY4为减1键,KEY5为紧急情况按键。

1.1.4紧急状态功能分析

需求:紧急状态时,考虑有些不可预知情况和紧急情况,比如出现了交通事故或者救护车需要通行,这时候需要交管所对此十字路口交通信号灯系统进行控制,于是需要一个紧急按钮对全部路口信号灯进行控制。

设置和紧急状态具体功能如下表所示:

表二 按键功能表

1.2方案比选

根据1.1节的功能需求分析,明确了各个板块的功能以及需求:车辆LED数码管倒计时显示板块、车辆信号灯显示板块、行人信号灯显示板块、键盘输入板块,接下来对每个板块进行分析,对比几种可能的设计方案,分析其优缺点、开发可行性、经济可行性、总体可行性。

1.2.1车辆LED数码管倒计时显示板块

需求:能够控制四个路口的LED数码管8位段码以及2位位码,显示1、2、3、4、5、6、7、8、9数字,配合信号灯实现倒计时。

表三 车辆LED数码管显示板块方案对比表

说明:开发可行性、经济可行性、总体可行性的打分为“⁕”表示,“⁕”个数越多越好,在参考若干文献与查阅资料后,其判断具有一定的主观性。

1.2.2车辆信号灯显示板块

需求:能够控制四个路口的交通红绿灯显示,实现亮红灯、黄灯、绿灯功能,配合LED数码管实现交通管制。

表四 车辆信号灯显示板块方案对比表

说明:开发可行性、经济可行性、总体可行性的打分为“⁕”表示,“⁕”个数越多越好,在参考若干文献与查阅资料后,其判断具有一定的主观性。

1.2.3行人信号灯显示板块

需求:能够控制四个路口的行人红绿灯显示,实现亮红灯、绿灯功能,配合车辆的信号灯显示实现行人的通行控制。

表五 行人信号灯显示板块方案对比表

说明:开发可行性、经济可行性、总体可行性的打分为“⁕”表示,“⁕”个数越多越好,在参考若干文献与查阅资料后,其判断具有一定的主观性。

1.2.4键盘输入板块

需求:能够利用KEY1~KEY5键盘设置各路口直行通行倒计时时间,设置的路口数码管显示,各路口的通行时间可以不相等,其中KEY1为开始键,KEY2为暂停/设置键,KEY3为加1键,KEY4为减1键,KEY5为紧急情况按键。

表五 键盘板块方案对比表

说明:开发可行性、经济可行性、总体可行性的打分为“⁕”表示,“⁕”个数越多越好,在参考若干文献与查阅资料后,其判断具有一定的主观性。

1.2.5整体方案选择

综上,基于单片机控制的城市道路十字路口交通灯控制系统,采用以下设计方案:

表六 整体系统板块设计

1.3原理分析及控制系统设计
1.3.1原理分析

根据上一节的方案选择,对整体系统的各个板块进行设计,同时基于单片机控制的城市道路十字路口交通灯控制系统,需要具备的功能也在1.1节有详细的说明,如上一节的表六所示,接下来对具体的方案原理进行分析。

1.3.2硬件设计

在硬件方面,说明四大核心板块车辆LED数码管倒计时显示板块、车辆信号灯显示板块、行人信号灯显示板块、键盘输入板块的硬件设计。

表七 核心硬件设计说明表

1.3.3软件设计

在基于单片机控制的城市道路十字路口交通灯控制系统中,采用C语言程序对系统进行编程,对于软件来说,具体就涉及整体逻辑控制、寄存器配置、锁存器配置、I/O口配置。

同时,若整个系统工作,涉及各个板块之间的协调工作,故在软件程序方面也需要分板块进行设计。

①主程序流程图

这里在主程序中初始化了定时器/计数器的寄存器,设置了初始化按键状态,在一个主循环中,不断检测有无按键状态改变,然后进入城市道路十字路口交通灯控制系统,这个系统包含更详细的计时逻辑、车行道红绿灯显示人行道红绿灯显示,最后进行LED数码管显示程序。

②城市道路十字路口交通灯控制程序

这里的城市道路十字路口交通灯控制程序,是在主程序中被调用的模块程序,用来对十字路口的整体计时逻辑以及判断各个路口的状态,用一个名为miao的计时器表示现在系统的时间,不断判断路口状态,如果进入对应路口状态,即刻配置LED四个路口的数码管显示时间,控制车辆的红绿灯状态,控制人行道红绿灯控制。

注:这里是以北路口的绿灯状态+黄灯状态+结束状态为例子,其余三个路口的程序与北路口配置基本一致,在此不做赘述。

车行道红绿灯控制程序

车行道的红绿灯控制程序受到上层【城市道路十字路口交通灯控制程序】控制,用一个light_status车辆红绿灯状态标志表示各个路口的信号灯状态,用switch判断状态,并进入对应的配置程序。

注意这里的车行道红绿灯配置,对应各个路口的信号灯引脚配置:

  1. // 车行道红绿灯          北绿 北黄 东绿  东黄 南绿 南黄  西绿 西黄  
  2. uchar code light_H[] = {0x21,0x22,0x0C,0x14,0x64,0xA4,0x24,0x24};  
  3. uchar code light_L[] = {0x09,0x09,0x09,0x09,0x08,0x08,0x03,0x05};  

④按键判断程序

注:这里是以KEY1开启定时器、KEY3加1秒、KEY5紧急情况为例,暂停/设置、减1秒程序与上述程序基本一致,在此不做赘述。

三、实验仪器设备

表八 实验设备表

四、设计结果和设计总结

1、设计结果展示

1.1系统功能测试与分析
①默认状态功能测试与分析

单片机加载编译后的hex程序,加载点击运行,默认为设置状态,并且默认四个路口倒计时和车行道、行人红绿灯显示,10秒、15秒、30秒、45秒,默认为北路口绿灯通行。

②开始状态功能测试与分析

点击KEY1键开始运行系统,可以看到十字路口的各个路口红绿灯、LED倒计时显示屏、行人路口红绿灯,均正常按照设计运行。这里测试时间为四个路口全部通行时间(根据表一路口信号灯显示状态示意表)为60秒一个周期,每个路口15秒,10秒绿灯,5秒黄灯。

经过四轮不重复测试,系统均能准确按顺序运行,且符合功能设计需求,车辆行驶保障与调度、行人过街保障与调度、交通车辆行人安全。

③暂停/置位状态功能测试与分析

点击KEY2键暂停运行系统,可以看到十字路口的各个路口红绿灯暂停、LED显示屏暂停倒计时、行人路口红绿灯暂停。

经过四轮各个路口的暂停测试,系统均能准确暂停。

④时间加1/时间减1功能测试

点击KEY2暂停/设置按键后,再点击KEY3时间加1按键,可以对相应的LED显示屏暂停倒计时时间进行加一秒操作,此时各个路口倒计时也会相应的增加一秒,再次点击开始按键,系统按照加一秒后的状态进行继续运行。

经过对四个路口的时间加一测试,系统均能准确按照需求时间加一,这里由于篇幅限制只对北路口加1进行展示,其他路口均能准确加1,在此不做赘述。

同理,对于KEY4时间减1按键,也进行测试,对于四个路口的测试均按照功能需求正常运行。

经过测试,时间加1/时间减1功能均能正常运行,符合前期的功能设计与分析。

紧急情况功能测试

按下KEY5紧急情况按键,十字路口进入紧急情况,所有路口的显示与信号灯熄灭,人行道亮红灯,由交警进行管制,这个按键只有在非常紧急的情况才能正常使用。

1.2计时误差测试与分析
①数码管扫描时延误差

经过测试,通过在系统运行状态,随机截图,可以看到LED数码管倒计时均能够正常显示,没有出现因为扫描时间延迟造成的时间未显示,说明设计的数码管扫描时延误差小于人肉眼能够捕捉到的最小延迟,对于系统的整体功能几乎没有影响,故数码管扫描时延误差可以忽略不计。

②十字路口状态轮回刷新的计时误差

按照功能设计,四个路口均通行一轮的时间是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秒秒表、时分秒和串口通信等。这些实验不仅让我掌握了单片机的基本知识和应用技巧,还提高了我的动手实践能力和解决问题的能力。

通过这些实验的学习,我深入了解了单片机的内部结构和工作原理,掌握了常见芯片和模块的使用方法,提高了我的编程能力和硬件设计能力。同时,这些实验也让我更加懂得了实践是检验理论的唯一标准的道理。

硬件设计、软件设计、功能分析、模块设计、程序编写与调试等等,感谢张老师的教诲,在单片机课程的学习上给予了我很大的启迪与帮助。

附录

附A : 参考文献

[1]武玉升.基于单片机的智能交通灯控制系统仿真设计[J].电子世界,2018(21):118-119+122.DOI:10.19353/j.cnki.dzsj.2018.21.068.

[2]郭玉秀.基于单片机的十字路口交通灯的设计及仿真[J].现代制造技术与装备,2018(08):66-68.DOI:10.16107/j.cnki.mmte.2018.0724.

[3]于希辰.基于AT89C51单片机的数显交通灯设计[J].科技资讯,2017,15(27):39-40.DOI:10.16661/j.cnki.1672-3791.2017.27.039.

[4]淡海英,杨聪.基于单片机控制的十字路口交通灯设计与分析[J].电子测试,2017(13):9+8.DOI:10.16520/j.cnki.1000-8519.2017.13.003.

附B: 原理图

附C:  源程序

#include<reg51.h>
#include<intrins.h>
#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引脚--按键 赋值为K5uint 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<120;i++);}
}// 显示红绿灯倒计时
void show(uint duanma,uint weima)
{P0=wei[weima];J_wei=1;J_wei=0;P0=table[duanma];J_duan=1;J_duan=0;DelayMS(5);
}// 车行道红绿灯
void light_show(uint light_status)
{switch (light_status){case 1: // 北红灯P1 = light_H[0]; // 将P1口赋值为0x7BP2 = (P2 & 0xF0) | light_L[0]; // 先将P2口低四位清零break;case 2:P1 = light_H[1]; // 将P1口赋值为0x7BP2 = (P2 & 0xF0) | light_L[1]; // 先将P2口低四位清零break;case 3:P1 = light_H[2]; // 将P1口赋值为0x7BP2 = (P2 & 0xF0) | light_L[2]; // 先将P2口低四位清零break;case 4:P1 = light_H[3]; // 将P1口赋值为0x7BP2 = (P2 & 0xF0) | light_L[3]; // 先将P2口低四位清零break;case 5:P1 = light_H[4]; // 将P1口赋值为0x7BP2 = (P2 & 0xF0) | light_L[4]; // 先将P2口低四位清零break;case 6:P1 = light_H[5]; // 将P1口赋值为0x7BP2 = (P2 & 0xF0) | light_L[5]; // 先将P2口低四位清零break;case 7:P1 = light_H[6]; // 将P1口赋值为0x7BP2 = (P2 & 0xF0) | light_L[6]; // 先将P2口低四位清零break;case 8:P1 = light_H[7]; // 将P1口赋值为0x7BP2 = (P2 & 0xF0) | light_L[7]; // 先将P2口低四位清零break;}
}	// 定时器时间
void Timer0_Rountine(void) interrupt 1
{TL0=(65536-50000)%256; // 50msTH0=(65536-50000)/256;Timer_count++; // Timer_count
}// 路口计时
void Xianshi(void)
{if(Timer_count==20) // 1{Timer_count=0; // 定时器清零miao++;}if(miao>=(0*green_time+0*yellow_time+my_time) & miao<(1*green_time+0*yellow_time+my_time))  // 北绿灯{N_miao = 1*green_time+0*yellow_time+my_time - miao; // 北计时E_miao = 1*green_time+1*yellow_time+my_time - miao; S_miao = 2*green_time+2*yellow_time+my_time - miao;W_miao = 3*green_time+3*yellow_time+my_time - miao;light_show(1);N_ren = 0;E_ren = 1;S_ren = 0;W_ren = 0;}else if(miao>=(1*green_time+0*yellow_time+my_time) & miao<(1*green_time+1*yellow_time+my_time))  // 北黄灯{N_miao = 1*green_time+1*yellow_time+my_time - miao; // 北计时E_miao = 1*green_time+1*yellow_time+my_time - miao; S_miao = 2*green_time+2*yellow_time+my_time - miao;W_miao = 3*green_time+3*yellow_time+my_time - miao;light_show(2);N_ren = 0;E_ren = 1;S_ren = 0;W_ren = 0;}else if(miao>=(1*green_time+1*yellow_time+my_time) & miao<(2*green_time+1*yellow_time+my_time))  // 东绿灯{N_miao = 4*green_time+4*yellow_time+my_time - miao; E_miao = 2*green_time+1*yellow_time+my_time - miao; // 东计时S_miao = 2*green_time+2*yellow_time+my_time - miao;W_miao = 3*green_time+3*yellow_time+my_time - miao;light_show(3);N_ren = 0;E_ren = 0;S_ren = 1;W_ren = 0;}else if(miao>=(2*green_time+1*yellow_time+my_time) & miao<(2*green_time+2*yellow_time+my_time))  // 东黄灯{N_miao = 4*green_time+4*yellow_time+my_time - miao;E_miao = 2*green_time+2*yellow_time+my_time - miao; // 东计时S_miao = 2*green_time+2*yellow_time+my_time - miao;W_miao = 3*green_time+3*yellow_time+my_time - miao;light_show(4);N_ren = 0;E_ren = 0;S_ren = 1;W_ren = 0;}else if(miao>=(2*green_time+2*yellow_time+my_time) & miao<(3*green_time+2*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 = 3*green_time+2*yellow_time+my_time - miao; // 南计时W_miao = 3*green_time+3*yellow_time+my_time - miao;light_show(5);N_ren = 0;E_ren = 0;S_ren = 0;W_ren = 1;}else if(miao>=(3*green_time+2*yellow_time+my_time) & miao<(3*green_time+3*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 = 3*green_time+3*yellow_time+my_time - miao; // 南计时W_miao = 3*green_time+3*yellow_time+my_time - miao;light_show(6);N_ren = 0;E_ren = 0;S_ren = 0;W_ren = 1;}else if(miao>=(3*green_time+3*yellow_time+my_time) & miao<(4*green_time+3*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+3*yellow_time+my_time - miao; // 西计时light_show(7);N_ren = 1;E_ren = 0;S_ren = 0;W_ren = 0;}else if(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; // 初始化按钮状态为0while(1){if(key_state != K1) // 按键检测 -- 开启中断 -- 开始{DelayMS(5); //消抖key_state=K1; // 按下按键 key_state = K1 = 0if(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 = 0if(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 = 0if(key_state ==0){my_time++;}}else if(key_state != K4) // 按键检测 -- 减1{DelayMS(100); //消抖key_state=K4; // 按下按键 key_state = K4 = 0if(key_state ==0){my_time--;}}else if(key_state != K5) // 按键检测 -- 紧急事件 -- 全红灯{DelayMS(5); //消抖key_state=K5; // 按下按键 key_state = K5 = 0if(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%10,1);show(E_miao/10,2); show(E_miao%10,3);show(S_miao/10,4); show(S_miao%10,5);show(W_miao/10,6); show(W_miao%10,7);}}
}

如果对你有帮助的话,请给博主点个赞吧👍

如果对你有收获的话,请点个收藏吧⭐

~~~

2023.12.20

渝北仙桃数据谷

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/235265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见可视化大屏编辑器有哪些?

前言&#xff1a; 在当今数字化时代&#xff0c;可视化大屏编辑器成为了数据展示和决策支持的重要工具。大屏编辑器不仅仅是数据的呈现&#xff0c;更是数据背后的故事的讲述者。它通过图表、图形和实时数据的呈现&#xff0c;为用户提供了全面的信息视图&#xff0c;帮助用户更…

Scala下划线用法总结

Scala是一门以java虚拟机&#xff08;JVM&#xff09;为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言。scala 单作为一门语言来看&#xff0c; 非常的简洁高效&#xff0c;在Scala中存在很多让代码更加简洁的语法&#xff0c;下划线“_”便是其中一…

渗透测试和漏洞扫描有什么区别

渗透测试和漏洞扫描是网络安全领域中非常重要的两种技术手段&#xff0c;它们都可以帮助组织或企业发现和修复系统中的漏洞和弱点。然而&#xff0c;这两种技术手段在目的、深度、方法和时间和成本等方面存在显著的区别。 首先我们来了解下渗透测试和漏洞扫描分别是什么&#x…

C# .Net学习笔记—— Expression 表达式目录树

一、什么是表达式目录树 &#xff08;1&#xff09;Expression我们称为是表达式树&#xff0c;是一种数据结构体&#xff0c;用于存储需要计算&#xff0c;运算的一种结构&#xff0c;这种结构可以只是存储&#xff0c;而不进行运算。通常表达式目录树是配合Lambda一起来使用的…

【Redis】四、Redis.conf详解

文章目录 Redis.conf详解单位网络通用 GENERAL快照REPLICATION 复制SECURITY 安全限制 CLIENTSAPPEND ONLY 模式 aof配置 Redis.conf详解 启动的时候&#xff0c;就通过配置文件来启动&#xff01; 工作中&#xff0c;一些小小的配置&#xff0c;可以让你脱颖而出&#xff01;…

openGauss学习笔记-167 openGauss 数据库运维-备份与恢复-导入数据-使用gsql元命令导入数据

文章目录 openGauss学习笔记-167 openGauss 数据库运维-备份与恢复-导入数据-使用gsql元命令导入数据167.1 \copy命令167.2 参数说明167.3 任务示例 openGauss学习笔记-167 openGauss 数据库运维-备份与恢复-导入数据-使用gsql元命令导入数据 gsql工具提供了元命令\copy进行数…

HTML5刷题笔记

在 HTML5 中&#xff0c;onblur 和 onfocus 是&#xff1a;事件属性 onblur 和 onfocus 属于焦点事件&#xff1a; onblur&#xff1a;失去焦点 onfocus&#xff1a;获取焦点 HTML5事件window 事件属性 针对 window 对象触发的事件&#xff1a; onafterprint script 文档…

telnet的交互原理(wireshark分析)

telnet的交互原理&#xff08;wireshark篇&#xff09; telnet的协议类型是tcp&#xff0c;他的密钥用的是明文的&#xff0c;容易被捕获&#xff0c;所以后来的windows基本弃用了telnet服务端但依然保留了客户端。 下面是他的交互抓包&#xff1a; 这里面的前三条运用的是tc…

Go 语言中并发的威力

发挥效率和响应能力 并发是现代软件开发中的一个基本概念&#xff0c;它使程序能够同时执行多个任务&#xff0c;提高效率和响应能力。在本文中&#xff0c;我们将探讨并发在现代软件开发中的重要性&#xff0c;并深入了解 Go 处理并发任务的独特方法。 在现代软件开发中并发…

基于Antd4 和React-hooks的项目开发

基于Antd4 和React-hooks的项目开发 https://github.com/dL-hx/react-cnode 项目依赖使用 react 16.13react-redux 7.xreact-router-dom 5.xredux 4.xantd 4axiosmoment 2.24 (日期格式化)qs 项目视图说明 首页主题详情用户列表用户详情关于 配置按需加载 https://3x.an…

Panoply查看nc文件的时间维

打开的是全球灌溉农田灌溉用水量遥感估算数据集&#xff08;2011-2018&#xff09;&#xff0c;该文件以nc格式储存。nc格式文件就是一个多维的数据库。经纬度占了两维&#xff0c;可能还有时间维度&#xff0c;就是时空谱。 双击打开刚打开时只能看到2018年1月的灌溉数据 打…

软件测试真的看不到前途吗?

看到这个问题和问题后的说明&#xff0c;题主的显性问题就有两个&#xff1a; 1、软件测试有没有前途 2、若从事没有前途的测试&#xff0c;该怎么办&#xff08;真的只能转行么&#xff09;&#xff1f; 一、软件测试有没有前途&#xff1f; 先说结论&#xff1a;如果在2020年…

C++刷题 -- 字符串

C刷题 – 字符串 文章目录 C刷题 -- 字符串1.重复的子字符串 1.重复的子字符串 https://leetcode.cn/problems/repeated-substring-pattern/submissions/490209402/ 暴力解法 第一个for循环用来标定子串的末尾&#xff0c;根据末尾取出子串 第二个while循环用来检查原字符串是…

我在代码随想录|写代码Day6之 454.四数相加II ,三数之和

第一题: 454.四数相加II 题目 解答思路 我们要四数相加等于0一般的思路是暴力破解直接4个for循环,然后通过4个for循环得到答案, 但是这样的时间复杂度是O(n4),会超时然后我们通过将循环拆分,比如将 代码 第二题 : 题目: 代码 class Solution { public:vector<vector<…

后台管理项目多数据源管理方案实战

后台管理项目多数据源管理方案实战 整个权益商城后台本质上是一个访问频率比较低的CRUD管理系统&#xff0c;所以本身不需要考虑微服务拆分的事情。接入微服务体系也只是为了能够调用其他的微服务。 但是&#xff0c;在做电商管理项目时&#xff0c;我们为了简化业务流程&…

图书管理系统jsp + servlet+mysql

图书管理系统 项目使用jsp servletmysql实现&#xff1b; 登陆注册 首页 首页显示图书信息 图书管理 1添加书籍 2查询书籍 3预览书籍 4修改书籍 用户管理 1查询用户 2修改用户 3 删除用户 链接&#xff1a;https://pan.baidu.com/s/1QXK--ypb6OadbmKFlc0jUQ

【Deformable DETR】

最近学习CV中的Transformer有感而发,网上关于Deformable DETR通俗的帖子不是很多,因此想分享一下最近学习的内容。第一次发帖经验不足,文章内可能有许多错误或不恰之处欢迎批评指正。 Abstract DETR消除了目标检任务中的手工设计痕迹,但是存在收敛慢以及Transformer的自注…

macOS系统下载百度网盘的操作流程

第一步 进入百度网盘的官网&#xff0c;链接&#xff1a;百度网盘-免费云盘丨文件共享软件丨超大容量丨存储安全​​​​​​​&#xff0c;选择“客户端下载” 第二步 根据自己的电脑配置选择版本进行下载。芯片的查看路径是系统设置-通用-关于本机 第三步 点击右上角的图标…

自监督学习综述

1.简介 其实自监督学习的核心思想很简单&#xff0c;利用大量的无标签数据训练模型&#xff0c;然后将其作为预训练模型在下游任务上进行微调&#xff08;有标签&#xff09;。在用无标签图像训练模型时主要通过设计辅助任务&#xff0c;用图像自身的信息作为标签训练。常见的…

linux存储管理

固态硬盘SSD SSD的优势 SSD采用电子存储介质进行数据存储和读取的一种技术&#xff0c;拥有极高的存储性能&#xff0c;被认为是存储技术发展的未来新星。 内存直接当成硬盘使用 与传统硬盘相比&#xff0c;SSD固态电子盘具有以下优点 第一&#xff0c;SSD完全的半导体化&…