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

目录

最终效果

一、设计任务

二、设计报告

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.rhkb.cn/news/221578.html

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

相关文章

高通平台开发系列讲解(SIM卡篇)SIM软件架构介绍

文章目录 一、SIM软件架构二、MMG SDI Task三、GSTK Task四、Simlock Task沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍SIM的相关组件。 SIM软件架构: SIM软件架构指的是与SIM卡(Subscriber Identity Module,订阅者身份模块)相关的软件系统设计和…

Web请求与响应

目录 Postman Postman简介 Postman的使用 请求 简单参数 实体参数 数组参数 集合参数 日期参数 Json参数 路径参数 响应 ResponseBody 统一响应结果 Postman Postman简介 postman是一款功能强大的网页调试与发送网页http请求的Chrome插件&#xff0c;常用于进行…

Python 爬虫之下载视频(一)

爬取某平台视频 文章目录 爬取某平台视频前言一、大致内容二、基本思路三、代码编写1.引入库2.前期准备3.获取视频标题和地址3.下载保存视频 总结 前言 今天写个从好K视频平台爬取正在播放的视频&#xff0c;并下载保存到本地。 注意&#xff1a;建议大家先看看我之前的比较简…

u盘加密软件合辑丨u盘怎么上锁某个文件夹

毫无疑问&#xff0c;U盘是我们生活中最常使用的移动储存设备&#xff0c;常见的U盘普遍没有使用限制&#xff0c;任何人都可以浏览其中的数据&#xff0c;这就可能导致数据泄密和隐私泄露&#xff0c;那么普通U盘怎么变成加密U盘呢&#xff1f; 一、上锁某个U盘文件夹 可以将…

【线性代数】两个向量组等价,其中一个向量组线性无关,另一个向量组也是线性无关吗?

一、问题 两个向量组等价,其中一个向量组线性无关,另一个向量组也是线性无关吗? 二、答案 不一定,当两个向量组中的向量个数也相同时,结论才成立.若向量个数不相同,结论不成立. 例如&#xff1a; 向量组一&#xff1a;(1,0),(0,1) 向量组二&#xff1a;(1,0),(0,1),(1,1) 两…

【大数据实训】python石油大数据可视化(八)

2014到2020年石油加工产品产量数据处理分析 一、任务描述 石油是工业的命脉。 一直到2020年&#xff0c;我国原油产量基本处于平稳的状态&#xff0c;大部分原油来自国外进口&#xff1b;中国原油加工产量在华东、东北地区占比较大&#xff0c;华南地区相对较少。原油的加工…

去掉乘法运算的加法移位神经网络架构

[CVPR 2020] AdderNet: Do We Really Need Multiplications in Deep Learning? 代码&#xff1a;https://github.com/huawei-noah/AdderNet/tree/master 核心贡献 用filter与input feature之间的L1-范数距离作为“卷积层”的输出为了提升模型性能&#xff0c;提出全精度梯度…

CSS自适应分辨率 amfe-flexible 和 postcss-pxtorem:大屏高宽自适应问题

前言 继上篇《CSS自适应分辨率 amfe-flexible 和 postcss-pxtorem》。 发现一个有趣的问题&#xff0c;文件 rem.js 中按照宽度设置自适应&#xff0c;适用于大多数页面&#xff0c;但当遇到大屏就不那么合适了。 问题 使用宽度&#xff0c;注意代码第2 和 4 行&#xff1a;…

补题与周总结:leetcode第 376 场周赛

文章目录 复盘与一周总结2967. 使数组成为等数数组的最小代价&#xff08;中位数贪心 回文数判断&#xff09;2968. 执行操作使频率分数最大&#xff08;中位数贪心 前缀和 滑窗&#xff09; 复盘与一周总结 wa穿了第3题&#xff0c;赛时其实想到了思路&#xff1a;中位数贪心…

C#上位机与欧姆龙PLC的通信03----创建项目工程

1、创建仿真PLC 这是一款CP1H-X40DR-A的PLC&#xff0c;呆会后面创建工程的时候需要与这个类型的PLC类型一致&#xff0c;否则程序下载不到PLC上。 2、创建虚拟串口 首先安装&#xff0c;这个用来创建虚拟串口来模拟真实的串口&#xff0c;也就是上位机上有那种COM口&#xf…

【SplaTAM】基于RGB-D类型SplaTAM的定位与重建

SplaTAM ubuntu配置与运行记录 1. 资料收集2. 环境配置与运行注意问题3. 在线运行 近期各种定会涌现出一种新的基于高斯的方法&#xff0c;备受关注&#xff0c;这里我们也来学习下sota效果的slam用于定位和重建。 1. 资料收集 coda link3D Gaussians 2.1 Dynamic 3D Gaussian…

百度侯震宇:AI原生与大模型将从三个层面重构云计算

12月20日&#xff0c;2023百度云智大会智算大会在北京举办&#xff0c;大会以「大模型重构云计算&#xff0c;Cloud for AI」为主题&#xff0c;深度聚焦大模型引发的云计算变革。 百度智能云表示&#xff0c;为满足大模型落地需求&#xff0c;正在基于「云智一体」战略重构…

linux 驱动——私有数据

文章目录 linux 驱动中的私有数据container_of驱动程序数据结构定义 应用程序模块使用 linux 驱动中的私有数据 前面的程序中&#xff0c;都只申请了一个从设备号&#xff0c;这里使用 alloc_chrdev_region 分配两个设备号&#xff0c;这两个设备共用 ops 方法。 所以需要在 …

企业网络常用技术-快速生成树RSTP原理与配置

STP协议虽然能够解决环路问题&#xff0c;但是收敛速度慢&#xff0c;影响了用户通信质量。如果STP网络的拓扑结构频繁变化&#xff0c;网络也会频繁失去连通性&#xff0c;从而导致用户通信频繁中断。IEEE于2001年发布的802.1w标准定义了快速生成树协议RSTP&#xff08;Rapid …

【C++高阶(八)】单例模式特殊类的设计

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 单例模式 1. 前言2. 设计一个不能被拷贝/继承的…

3d游戏公司选择云电脑进行云办公有哪些优势

随着游戏行业的不断发展&#xff0c;很多的游戏制作公司也遇到了很多的难题&#xff0c;比如硬件更换成本高、团队协同难以及效率低下等问题&#xff0c;那么如何解决游戏行业面临的这些行业痛点&#xff0c;以及游戏制作公司选择云电脑进行云办公有哪些优势&#xff1f;一起来…

麒麟V10 ARM 离线生成RabbitMQ docker镜像并上传Harbor私有仓库

第一步在外网主机执行&#xff1a; docker pull arm64v8/rabbitmq:3.8.9-management 将下载的镜像打包给离线主机集群使用 在指定目录下执行打包命令&#xff1a; 执行&#xff1a; docker save -o rabbitmq_arm3.8.9.tar arm64v8/rabbitmq:3.8.9-management 如果懒得打包…

A01、关于jvm执行子系统

1、Class 类文件结构 1.1、Java跨平台的基础 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码&#xff08;ByteCode&#xff09;是构成平台无关性的基石&#xff0c;也是语言无关性的基础。Java虚拟机不和包括Java在内的任何语言绑定&#xff0c;它只与 “…

OpenCV消除高亮illuminationChange函数的使用

学更好的别人&#xff0c; 做更好的自己。 ——《微卡智享》 本文长度为1129字&#xff0c;预计阅读4分钟 导语 上一篇《OpenCV极坐标变换函数warpPolar的使用》中介绍了极坐标变换的使用&#xff0c;文中提到过因为手机拍的照片&#xff0c;部分地方反光厉害。OpenCV本身也有一…

FFmepeg——视频处理工具安装以及简单命令学习。

FFmpeg 是一个免费、开源且高度可定制的多媒体处理工具&#xff0c;它是一个强大的跨平台框架&#xff0c;用于处理音频、视频、多媒体流和图像。FFmpeg 的主要功能包括解码、编码、转码、流处理、多路复用、分离、合并、过滤等&#xff0c;支持多种音视频格式&#xff0c;包括…