交通灯设计实验报告(硬件原理图+程序)
- 格式:doc
- 大小:548.00 KB
- 文档页数:33
数字电路课程设计实验报告(一)课程设计题目题目:交通灯控制电路设计(二)实现功能1、设计一个十字路口的交通灯控制电路,要求东西方向车道和南北方向车道两条交叉道路上的车辆交替运行,每次通行时间都设为60秒(数字显示自59到00)。
2、在绿灯转为红灯时,要求黄灯先亮5秒钟(数字显示自04到00),才能变换运行车道;黄灯亮时,要求每秒闪亮一次。
3、东西方向、南北方向车道除了有指示灯外,每一种灯亮的时间都用显示器进行显示(采用倒计时的方法)。
(三)设计原理与参考电路1、分析系统的逻辑功能,画出框图交通灯控制系统原理如下秒脉冲发生器倒计时计时器T4T0信号灯转换器东西方向车道信号灯南北方向车道信号灯图1.交通灯控制系统原理框图2、信号转换表1.控制器工作状态及功能表控制状态信号灯状态车道运行状态S0(00) 东西向绿灯亮东西车道通行,南北车道禁止通行S1(01) 东西向黄灯亮东西车道缓行,南北车道禁止通行S2(11) 东西红灯亮、南北绿灯亮东西车道禁止通行,南北车道通行S3(10) 东西红灯亮、南北黄灯亮东西车道禁止通行,南北车道缓行AGreen=1 东西绿灯亮BGreen=1 南北绿灯亮AYellow=1 东西黄灯亮BYellow=1 南北黄灯亮ARed=1 东西红灯亮BRed=1 南北红灯亮3、方案选用JK触发器,设状态编码为:S0=00,S1=01,S2=11,S3=10,其输出为Q1 Q0 ,则其状态表为:表2. 状态编码与信号灯关系现态次态输出Q1n Q0n Q1n+1Q0n+1AG AY AR BG BY BR0 0 0 1 1 0 0 0 0 10 1 1 1 0 1 0 0 0 11 1 1 0 0 0 1 1 0 01 0 0 0 0 0 1 0 1 03.1 倒计时计数器十字路口除指示灯显示外,还有数字倒计时显示。
具体为:当某方向绿灯亮时,置显示器为某值,然后以每秒减1的计数方式工作,直至减到数字为“04”时绿灯灭,黄灯亮。
交通信号灯控制电路的设计一、设计任务与要求1、任务用红、黄、绿三色发光二极管作为信号灯,设计一个甲乙两条交叉道路上的车辆交替运行,且通行时间都为25s的十字路口交通信号灯,并且由绿灯变为红灯时,黄灯先亮5s,黄灯亮时每秒钟闪亮一次。
2、要求画出电路的组成框图,用中、小规模集成电路进行设计与实现用EAD软件对设计的部分逻辑电路进行仿真,并打印出仿真波形图。
对设计的电路进行组装与调试,最后给出完整的电路图,并写出设计性实验报告。
二、设计原理和系统框图(一)设计原理1、分析系统的逻辑功能,画出其框图交通信号灯控制系统的原理框图如图2所示。
它主要由控制器、定时器、译码器和秒脉冲信号发生器等部分组成。
秒脉冲信号发生器是该系统中定时器和该系统中定时器和控制器的标准时钟信号源,译码器输出两组信号灯的控制信号,经驱动电路后驱动信号灯工作,控制器是系统的主要部分,由它控制定时器和译码器的工作。
图1 交通灯控制电路设计框图图中:Tl:表示甲车道或乙车道绿灯亮的时间间隔为25s,即车辆正常通行的时间间隔。
定时时间到,Tl=1,否则,Tl=0.Ty:表示黄灯亮的时间间隔为5s。
定时时间到,Ty=1,否则,Ty=0。
St:表示定时器到了规定的时间后,由控制器发出状态转换信号。
它一方面控制定时器开始下一个工作状态的定时,另一方面控制着交通信号灯状态转换。
2、画出交通信号灯控制器ASM图(1)甲车道绿灯亮,乙车道红灯亮。
表示甲车道上的车辆允许通行,乙车道禁止通行。
绿灯亮足规定的时间隔TL时控制器发出状态信号ST转到下一工作状态。
(2)乙车道黄灯亮乙车道红灯亮。
表示甲车道上未过停车线的车辆停止通行已过停车线的车辆继续通行乙车道禁止通行。
黄灯亮足规定时间间隔TY时控制器发出状态转换信号ST转到下一工作状态。
(3)甲车道红灯亮乙车道绿灯亮。
表示甲车道禁止通行乙车道上的车辆允许通行绿灯亮足规定的时间间隔TL时 控制器发出状态转换信号ST转到下一工作状态。
单片机交通灯实验报告一、实验目的二、实验原理三、实验器材四、实验步骤五、实验结果六、实验分析与讨论七、实验总结一、实验目的:本次单片机交通灯实验的主要目的是通过使用单片机控制LED灯的亮灭,模拟交通信号灯的运行状态,并能够正确地掌握单片机编程技巧和硬件连接技术。
二、实验原理:本次交通灯实验采用了单片机作为中央处理器,通过编写程序控制LED灯的亮灭来模拟交通信号灯。
在程序中,我们需要使用到延时函数和条件判断语句。
具体来说,在红绿黄三个LED灯之间切换时,需要设定一个时间段,并在该时间段内循环执行红绿黄三个LED灯亮度变化的循环语句。
三、实验器材:1. 单片机开发板一块;2. LED 灯若干;3. 杜邦线若干。
四、实验步骤:1. 将红色 LED 灯连接至 P0 口;2. 将黄色 LED 灯连接至 P1 口;3. 将绿色 LED 灯连接至 P2 口;4. 将单片机开发板与电脑连接,打开 Keil 软件;5. 编写程序,将红色 LED 灯亮起来;6. 编写程序,将黄色 LED 灯亮起来;7. 编写程序,将绿色 LED 灯亮起来;8. 编写程序,模拟交通信号灯的运行状态。
五、实验结果:在完成了上述步骤后,我们成功地模拟出了交通信号灯的运行状态。
具体来说,在程序中我们设定了一个时间段为10s,在这个时间段内,红灯亮 5s,黄灯亮 2s,绿灯亮 3s。
在这个时间段结束后,循环执行该过程。
六、实验分析与讨论:通过本次交通灯实验,我们学习到了如何使用单片机控制LED灯的亮灭,并能够正确地编写程序模拟交通信号灯的运行状态。
在编写过程中需要注意以下几点:1. 在使用延时函数时要注意时间单位和精度;2. 在编写条件判断语句时要注意逻辑结构和语法规范;3. 在硬件连接时要注意杜邦线的颜色对应关系和插口位置。
七、实验总结:本次单片机交通灯实验是一次非常有意义的实践活动。
通过此次实验,我们掌握了单片机编程技巧和硬件连接技术,并能够正确地模拟交通信号灯的运行状态。
一、实验目的1. 理解交通灯控制系统的工作原理。
2. 掌握使用单片机进行交通灯控制系统的设计与实现。
3. 提高动手实践能力和问题解决能力。
二、实验原理交通灯控制系统通常采用单片机作为核心控制单元,通过编程实现对交通灯的红、黄、绿三种灯光状态的切换。
本实验采用单片机(如STC89C52)作为核心控制单元,利用定时器实现灯光的定时切换,并通过LED灯模拟交通灯的灯光状态。
三、实验器材1. 单片机开发板(如STC89C52开发板)2. LED灯(红、黄、绿各一个)3. 电阻(根据LED灯的规格选择)4. 跳线5. 编程器6. 计算机四、实验步骤1. 硬件连接:- 将红、黄、绿LED灯分别连接到单片机的P1.0、P1.1、P1.2端口。
- 将电阻串联在每个LED灯的两端,防止LED灯过载。
- 将跳线连接到单片机的相关引脚,用于编程和调试。
2. 软件编程:- 使用Keil软件编写单片机程序,实现交通灯的控制逻辑。
- 设置定时器,实现灯光的定时切换。
- 编写主循环程序,根据定时器的值切换LED灯的状态。
3. 程序调试:- 将程序烧录到单片机中。
- 使用示波器或逻辑分析仪观察LED灯的状态,确保程序运行正常。
4. 实验验证:- 将LED灯连接到实际交通灯的位置。
- 启动单片机,观察LED灯的状态是否符合交通灯的控制逻辑。
五、实验结果与分析1. 实验结果:- 红灯亮时,表示禁止通行。
- 绿灯亮时,表示允许通行。
- 黄灯亮时,表示准备切换到红灯。
2. 实验分析:- 通过本次实验,掌握了使用单片机进行交通灯控制系统的设计与实现。
- 了解了定时器在实现灯光切换中的作用。
- 提高了动手实践能力和问题解决能力。
六、实验总结1. 优点:- 实验操作简单,易于上手。
- 理论与实践相结合,提高了学生的动手能力。
2. 不足:- 实验内容较为简单,未能涉及到复杂交通灯控制系统的设计。
- 实验器材较为有限,限制了实验的拓展性。
七、实验拓展1. 研究复杂交通灯控制系统的设计,如多路口交通灯协同控制。
交通信号灯控制器实验报告交通信号灯控制器⼀、设计任务及要求 (2)⼆、总体⽅案设计以及系统原理框图 (2)2.1、设计思路 (2)2.2、各模块相应的功能 (2)2.3、系统原理图 (3)三、单元电路设计 (3)3.1、车辆检测电路 (3)3.2、主控电路 (4)3.3、灯控电路 (5)3.4、计时控制电路 (6)3.5、计时显⽰电路 (6)3.6、反馈控制电路 (7)3.7、置数电路 (7)3.8、时基电路 (7)四、⼯作原理 (8)五、电路的软件仿真及结果分析 (8)5.1、时基电路(555接成的多谐振荡器)的电路图以及波形的显⽰ (8)5.2、结果分析 (10)六、电路的组装调试 (10)6.1、使⽤的主要仪器和仪表 (10)6.2、调试电路的⽅法和技巧 (10)6.3、调试中出现的问题、原因和排除⽅法 (11)七、收获、存在的问题和进⼀步的改进意见 (11)7.1、存在的问题和进⼀步的改进意见 (11)7.2、收获以及⼼得体会 (12)附录⼀:电路所⽤元器件 (14)附录⼆:电路全图 (15)附录三:实际电路图 (16)⼀、设计任务及要求在⼀个主⼲道和⽀⼲道汇交叉的⼗字路⼝,为了确保车辆⾏车安全,迅速通⾏,设计⼀个交通信号灯控制电路,要求如下:1、⽤两组红、绿、黄发光⼆极管作信号灯,分别指⽰主道和⽀道的通⾏状态。
2、通⾏状态⾃动交替转换,主道每次通⾏30秒,⽀道每次通⾏20秒,通⾏交替间隔时为5秒。
3、通⾏状态转换依照“主道优先”的原则,即:当主道通⾏30秒后,若⽀道⽆车则继续通⾏;当⽀道通⾏20秒后,只有当⽀道有车且主道⽆车时才允许继续通⾏。
(⽤按键模拟路⼝是否有车)4、设计计时显⽰电路,计时⽅式尽量采⽤倒计时。
⼆、总体⽅案设计以及系统原理框图2.1、设计思路本次设计采⽤模块划分的⽅法,每个模块完成⼀项功能,最后将各个模块连接起来,设计完成后,⽤Multisim进⾏仿真,仿真成功后,再去实验室焊接调试。
交通灯实验报告一、实验分析:利用计数器74LS192做60秒、57秒和3秒的倒计时(在计数器74LS192的,当计数器上的十位上的计数器为九时置5做成一个六十秒的倒计时)做倒计时3秒和倒计时六十秒相与得到倒计时57秒和3秒。
做倒计时的57秒和3秒的分析过程可以根据以下图一可知:红灯南北(东西):绿灯东西(南北):黄灯东西(南北):图一做好倒计时后,放入JK触发器后做好各个方向的灯的信号,加入三极管增大负载后接入灯泡。
二、实验目的:1、熟悉计数器74LS192、触发器、三极管、和各种门电路的应用。
2、利用各种器材做出交通灯。
三、实验器材:计数器74LS192、7SEG-BCD、JK触发器、三极管2N1711、电阻、与门、与非门、红灯LED-RED、绿灯LED-BIRG、黄灯LED-BIBY。
四、实验步骤:1、倒计时的制作:用计数器74LS192做60秒的倒计时把脉冲接到计数器的DN端,在十位的那里用九置五,个位的满一周后接一个脉冲放在十位的DN上,个位和十位的计数器的UP和清零端(高电平有效)接低电平。
接的图如图二所示:图二做3秒的脉冲把个位的B3、B2与起来以后与B7、B6、B5、B1非后的数在与非得到B11。
做三秒脉冲时的分析:(当B3和B2为高电平的数有3、7、13、17、23、27、33、37、43、47、53、57所以当为三秒的时候就只能B3、B2的时候为高电平就得排除B7、B6、B5、B1)连接的图如下图三所示:图三做57秒的脉冲和3秒的脉冲之和就为60秒脉冲所以就可以把B11、B10与起来以后做黄灯和绿灯的脉冲,六十秒做红灯的脉冲。
分析图和实验图如图四和图五所示:红灯南北(东西):绿灯东西(南北):黄灯东西(南北):图四图五2、利用JK触发器对红绿灯的控制:把步骤1上做的控制红绿黄的倒计时脉冲接在JK触发器上的脉冲处。
根据JK触发器的特性方程Q*=JQ’+K’Q,特性表如下图六所示可以知道为了要达到控制红绿灯的要求Q*=Q’,所以J和K端都要接高电平。
单片机c语言程序设计---C51-交通灯实验报告课程名称:单片机c语言设计实验类型:设计型实验实验项目名称: C51-交通灯实验一、实验目的和要求1.熟悉单片机的硬件结构及其工作原理2.掌握单片机的C51编程二、实验内容和原理(1)硬件设计使用P1端口连接VD1、VD2、VD3,模拟路口东面的红、黄、绿灯;P0端口连接VD9、VD10、VD11,模拟路口西面的红、黄、绿灯;P3端口连接VD17、VD18、VD19,模拟路口南面的红、黄、绿灯;P2端口连接VD25、VD26、VD27,模拟路口北面的红、黄、绿灯。
路口红绿灯的显示规律为:①南面和北面显示红灯(即VD17和VD25为红灯)时,东面和西面显示绿灯(即VD3和VD11为绿灯)。
②南面和北面,东面和西面都变成黄灯。
③南面和北面显示绿灯,东面和西面显示红灯④南面和北面,东面和西面都变成黄灯,然后再从①进行循环(需注意:此处设置的黄灯显示时长应短于红灯或绿灯的显示时长)(2)protues仿真通过Keil编译后,利用protues软件进行仿真。
在protues ISIS 编译环境中绘制仿真电路图,将编译好的“xxx.hex”文件加入AT89C51。
启动仿真,观察仿真结果。
三、主要仪器设备四、操作方法与实验步骤1.按照硬件设计在protues上按照所给硬件设计绘制电路图。
2.在keil上进行编译后生成“xxx.hex”文件。
3.编译好的“xxx.hex”文件加入AT89C51。
启动仿真,观察仿真结果。
五、实验结果与分析void S_N(void){VD1=0;VD9=0;VD19=0;VD27=0;Delay(1000);VD1=1;VD9=1;VD19=1;VD27=1;}int main (void) {while(1){E_W();NOT();S_N();NOT();}}六、讨论和心得。
西安郵電學院硬件课程设计报告题目:微机原理与接口课程设计;^院系名称:计算机学院专业名称:软件工程班级:软件0802学生姓名:王晶晶学号(8位): 04085047指导教师:刘军设计起止时间:2011年05月23日~2011年05月27日[一、设计目的通过可编程并行接口芯片8255A和可编程定时器/计数器芯片8253/8254以及中断控制器 8259实现十字路口交通灯的模拟控制,进一步掌握并行接口和定时器/计数器及数码管控制的实际应用。
二、设计内容1.用试验台提供的发光二极管(红绿黄各两支,共六支)作为南北路口(红绿黄各一支)和东西路口(红绿黄各一支)的模拟交通灯。
2.用可编程并行接口芯片8255A控制模拟交通灯的亮与灭和数码管的倒计时显示。
3.用可编程定时器/计数器芯片8253实现模拟交通灯亮与灭的时间延迟控制。
4.用数码管作为模拟交通灯亮与灭的时间延迟控制的倒计时显示。
'5.用汇编语言编程使六个灯按交通灯变化规律“亮/灭”。
交通灯变化规律要求:① 南北路口的绿灯,东西路口的红灯同时亮30秒,且数码管30秒倒计时显示。
② 南北路口的黄灯闪烁3秒(三亮三灭),同时东西路口的红灯继续亮,且数码管3秒倒计时显示。
③ 南北路口的红灯,东西路口的绿灯同时亮20秒,且数码管20秒倒计时显示。
④ 南北路口的红灯继续亮,同时东西路口的黄灯闪烁3秒(三亮三灭),且数码管3秒倒计时显示。
⑤ 转①重复⑥按压“东西紧急键”,则东西方向绿灯,南北方向红灯;再次按压“东西紧急键”,解除东西紧急通行状态。
(“东西紧急键”可是键盘键,亦可是逻辑开关键)⑦按压“南北紧急键”,则南北方向绿灯,东西方向红灯;再次按压“南北紧急键”,解除南北紧急通行状态。
(“南北紧急键”可是键盘键,亦可是逻辑开关键)"⑧按 <ESC>键退出程序。
备注:1、按键用 8255A 芯片的 PC 口实现或用键盘模拟实现。
2、8253定时到可以通过8259,用中断的方式实现定时器。
交通灯控制系统设计-实验报告
实验目的:设计一个交通灯控制系统,实现对交通灯的自动控制。
实验材料:
1. Arduino UNO开发板
2. 红绿黄LED灯各1个
3. 杜邦线若干
实验原理:
交通灯系统的控制主要是通过控制LED灯的亮灭来实现。
红
色LED灯表示停止,绿色LED灯表示通行,黄色LED灯表
示警示。
通过控制不同LED灯的亮灭状态,可以模拟交通灯
的不同信号。
实验步骤:
1. 将红色LED灯连接到Arduino开发板的数字输出引脚13,
绿色LED灯连接到数字输出引脚12,黄色LED灯连接到数
字输出引脚11。
2. 在Arduino开发环境中编写控制交通灯的程序。
3. 将Arduino开发板与计算机连接,将程序上传到Arduino开
发板中。
4. 接通Arduino开发板的电源,观察交通灯的亮灭状态。
实验结果:
根据程序编写的逻辑,交通灯会按照规定的时间间隔进行变换,实现红绿灯的循环。
实验总结:
通过本次实验,我们设计并实现了一个简单的交通灯控制系统。
掌握了Arduino编程和控制LED灯的方法,加深了对控制系
统的理解。
通过实验,我们发现了交通灯控制系统的重要性和意义,为今后的交通控制提供了一种可行的解决方案。
交通灯信号灯自动控制系统交通灯原理图一、系统的基本功能要求(1)以秒为计时单位,两位数码管以十进制递减计数形式作定时显示,在递减计数回零瞬间完成换灯操作。
(2)通过键盘红黄绿三色信号灯所亮时间在0~99秒内任意设定。
(3)十字路口的通行起始状态可人工设定,运行中可通过人工干预使十字路口通行状态固定于任何一种工作模式。
硬件设计1.系统总体框图2.电路设计(1)显示模块倒计时与时钟说明:⑴共阴极两位数码管用于倒计时;段选端由锁存器控制,位选端用P3_0与P3_1控制⑵两个四位共阴极数码组成八位数码管用于时钟显示段位选分别由两个锁存器控制(2)红绿灯模块说明:⑴图为两方向的红绿黄灯,分别接在P0口上,由P0口控制⑵51系列单片机的P0口内部没有集成上拉电阻,加上拉就是提高驱动能力,必须要通过上拉电阻接VCC。
上拉电阻一般接1K的。
(3)键盘模块说明⑴P2键控制功能说明:P2^6 key0绿灯位选择P2^5 key1黄灯位选择P2^4 key2 加1操作P2^3 key3 减1操作P2^2 key4 信号灯状态固定P2^1 key5 信号灯状态切换P2^0 key6时钟时分秒设置键⑵键盘加上拉电阻为了提高驱动能力3.复位电路:4.时钟电路:说明:用12M晶振时电容要选择30p软件部分1、主程序流程图2、时钟初值控制子程序3、绿灯,黄灯初值设置子程序4、时钟控制与倒计时控制时钟,倒计时初值通过键盘输入。
倒计时使用52单片机内部定时器1实现计数,时钟控制部分是使用定时、计数器2实现计时,以秒为基本单位在数码管中显示。
时钟部分:当秒的个位计时到了10,则秒个位清0,同时十位进一,以此类推;倒计时部分显示是则递减显示。
此过程通过判断语句实现。
5、.灯状态控制灯的状态通过键盘扫描控制。
状态固定键按下时,关闭定时器1;再次按下此键时,打开定时器。
状态选择键按下时,程序跳至下一个状态的程序控制部分,从而实现状态改变。
基本功能:(1)A B干道分别有两组红黄绿灯,各自的亮灯时间与状态由键盘控制。
(2)两位数码管用于倒计时,记录各个灯的亮灯时间,定时时间由键盘设定。
(3)十字路口通行状态可由键盘切换。
发挥部分功能:(1) 由八位数码管显示,初试时间可由键盘设定,且在05:00~23:00黄灯闪烁显示。
(2) 绿灯倒计时最后三秒和黄灯显示时闪烁显示(频率1HZ)。
(3)人行道的红绿灯配合车辆的红绿灯同时工作。
(1) 共阴数码管10个:8个显示时间,2个显示倒计时时间(2) 红黄绿发光二极管个4个:模拟十字路口信号灯。
令各加1个人行道上的红灯和绿灯(3) 74HC573锁存器2个:段码和位选锁存各一个(4) STC单片机一块按键8个12M晶振一个排线排针电阻电容若干(1)问题:每次通电后都要在十八、十十九口触发一下才能正常工作。
分析:晶振电路与单片机距离过远,输入噪声很大解决:把晶振电路改在紧挨单片机位置就可排除干扰。
(2) 共阳数码管需要接三极管放大驱动电流,为节约成本选用共阴数码管。
(3) 键盘扫描程序中加了按键前沿消抖延时,但按键不够灵敏加了后延消抖后使得按键足够灵敏。
(4) 在段锁存器给各个数码管送段码时相互之间有影响,在显示函数中加消影程序解决相互之间的影响。
(5) 在第一次焊接时一次性焊接完,调试时无法检查错误,而在第二次焊接时采用边调试边焊接的方法,加快速度,提高了准确度。
(6) 杜邦线数码管、锁存器等接线比较多,用单根导线焊接容易相互连接且不易检查错误,用杜邦线便于检查和模块化调试。
本次设计,我们花了不少时间和精力,但收获很大:(1) 这次设计时间很长,期间,我们自学了单片机教程,keil 2、proteus、protel 99se等软件,自学能力达到很大的提高(2)本次设计过程中,我们充分体会到了团体合作的重要性。
通过我们三个人的合理分工,设计过程完成的比较成功(3)通过本次设计,我们学到了对复杂程序模块化的编程方法和对其进行检查与修改方法。
(4)本次设计过程中,我们的动手能力得到很大的提高,例如说焊接技术、对电路板的总体规划,等等。
<<单片机原理与应用及C51程序设计>>清华大学大学出版社附:软件C程序//********************实验板上完整程序#include"reg52.h"#define uint unsigned int#define uchar unsigned charuchar aa,bb,cc,dd,ee,ff,a1,a3,con32,con31; uchar temp,ye,shi1,ge1,shi2,ge2,shi,ge,flag; int b,c=0,d=0,m=1,t;uint n1,n2;sbit p0_3=P0^3; //A干道黄灯sbit p0_2=P0^2; //A干道红灯sbit p0_4=P0^4; //A干道绿灯sbit p0_6=P0^6; //B干道黄灯sbit p0_7=P0^7; //B干道红灯sbit p0_5=P0^5; //B干道绿灯sbit wela=P3^0;sbit dula=P3^1;sbit p3_2=P3^2;sbit p3_3=P3^3;uchar data timedate1[3]={0x00,0x00,0x00};//显示缓冲区两位数字uchar data timedate2[3]={0x00,0x00,0x00};//显示缓冲区两位数字uchar data timedate3[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};//显示缓冲区两位数字char code wei[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位扫描sbit key0=P2^6; //绿灯控制键sbit key1=P2^5; //黄灯控制键sbit key2=P2^4; //加一键sbit key3=P2^3; //减一键sbit key4=P2^2; //保存状态sbit key5=P2^1; //状态改变sbit key6=P2^0; //时钟控制键uchar data con3=0x00;uchar data con=0x00;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};void display(uchar shi,uchar ge);void display3(uchar aa,uchar bb,uchar cc,uchar dd,uchar ee,uchar ff);void delay(uint z);void init();keyscan1() ;keyscan2() ;keyscan3() ;void main(){init();//初始化子程序while(1){//*************************键盘扫描控制程序if(con==0&&ye==0)keyscan3();display3(aa,bb,cc,dd,ee,ff);if(con3==0&&ye==0) //调用键盘扫描程序{keyscan1();shi1=n1/10;ge1=n1%10;display(shi1,ge1);}if(con==0&&con3==0){keyscan2();shi2=n2/10;ge2=n2%10;display(shi2,ge2);}if((con>=3&&ye==0)||(ye>=3&&con==0)) display(0,0);P0=0xff;delay(1);// ***************************保存当前状态if(key4==0){delay(12);while(key4==0) ;delay(12);d++;if(d%2)TR0=0;//关闭计数器,下面else if语句不执行,直接到delay()显示语句else TR0=1;}//****************************状态改变,进入下一个状态if(key5==0){delay(12);while(key5==0) ;delay(12);m++;c++;if(c%2) temp=n2;else temp=n1;}//****************************状态选择if(t<5||t>=23){if(a1/10==0){p0_3=0;p0_6=0;}else {p0_3=1;p0_6=1;}delay(1);}else{if(m%4==1){p0_6=1;p0_2=1;if(temp>3)p0_4=0;else{if(a1/10==0)p0_4=0;else p0_4=1;} //A绿灯p0_7=0; //B红灯delay(1);}else if(m%4==2){p0_4=1;if(a1/10==0)p0_3=0; else p0_3=1;//A黄灯p0_7=0; //B红灯delay(1);}else if(m%4==3){p0_3=1;p0_7=1;p0_2=0; //A红灯if(temp>3)p0_5=0;else{if(a1/10==0)p0_5=0;else p0_5=1;} //B绿灯delay(1);}else if(m%4==0){p0_5=1;p0_2=0; //A红灯if(a1/10==0)p0_6=0; else p0_6=1; //B黄灯delay(1);}}//*****************************************倒计时if(con>=3&&ye>=3){TR0=1;if (b!=0) temp=n1; //只有当扫描到有输入时temp才等于n,否则为自减后的值shi=temp/10;ge=temp%10;if(a1==20){ a1=0;temp--;if(temp==-1){ c++; //进入下一个状态,赋倒计时起始值m++; //进入下一个状态,赋灯的状态if(c%2) temp=n2;else temp=n1;}}display(shi,ge);}b=0;}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display(uchar shi,uchar ge) { P1=0x00;wela=0;p3_2=1;dula=1;P1=table[shi];dula=0;p3_3=0;delay(1);p3_3=1;dula=1;P1=table[ge];dula=0;p3_2=0;delay(1);p3_2=1;}void display3(uchar aa,uchar bb,uchar cc,uchar dd,uchar ee,uchar ff){ p3_2=1;p3_3=1;P1=0xff;wela=1;P1=wei[7];wela=0;P1=0x00;dula=1;P1=table[aa];dula=0;delay(1);dula=1;P1=table[bb];dula=0;P1= 0xff;wela=1;P1=wei[6];wela=0;dula=1;P1=table[10]; dula=0;P1=0xff;wela=1;P1= wei[5]; wela=0;delay(1);dula=1;P1=table[cc]; dula=0;P1=0xff;wela=1;P1= wei[4]; wela=0;delay(1);P1=table[dd]; dula=0;P1= 0xff;wela=1;P1=wei[3]; wela=0;delay(1);dula=1;P1=table[10]; dula=0;P1=0xff;wela=1;P1= wei[2]; wela=0;delay(1);dula=1;P1=table[ee];P1=0xff;wela=1;P1= wei[1];wela=0;delay(1);dula=1;P1=table[ff];dula=0;P1= 0xff;wela=1;P1=wei[0];wela=0;delay(1);}void init(){wela=0;dula=0;TH1=(65536-50000)/256;TL1=(65536-50000)%256;TMOD=0x11; EA=1;ET1=1;TR1=0;TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;TR0=0;}//************************绿灯键盘扫描程序keyscan1(){if(key0==0){//b=0;delay(12);while(key0==0) ;delay(12);con++;//b++;}if(con!=0) //con=1||2时的加一运算if(key2==0){delay(12);while(key2==0) ;delay(12);timedate1[con]++;if(timedate1[con]>9)timedate1[con]=0;shi1=timedate1[1];ge1=timedate1[2];display(shi1,ge1);n1=10*shi1+ge1;}if(con!=0) //con=1||2时的减一运算if(key3==0){delay(12);while(key3==0) ;delay(12);timedate1[con]--;if(timedate1[con]==255)timedate1[con]=9;shi1=timedate1[1];ge1=timedate1[2];display(shi1,ge1);n1=10*shi1+ge1;}}//*********************黄灯控制键扫描keyscan2(){if(key1==0){b=0;delay(12);while(key1==0) ;delay(12);ye++;b++;}if(ye!=0) //con=1||2时的加一运算if(key2==0){delay(12);while(key2==0) ;delay(12);timedate2[ye]++;if(timedate2[ye]>9)timedate2[ye]=0;shi2=timedate2[1];ge2=timedate2[2];display(shi2,ge2) ;n2=10*shi2+ge2;}if(ye!=0) //con=1||2时的减一运算if(key3==0){delay(12);while(key3==0) ;delay(12);timedate2[ye]--;if(timedate2[ye]==255)timedate2[ye]=9;shi2=timedate2[1];ge2=timedate2[2];display(shi2,ge2);n2=10*shi2+ge2;}}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;a1++;}//******************时钟控制键扫描程序keyscan3(){if(key6==0){delay(12);while(key6==0) ;delay(12);con3++;TR1=0;if(con3==5){TR0=1;con3=0; }}if(con3!=0) //con=1||2时的加一运算if(key2==0){delay(12);while(key2==0) ;delay(12);timedate3[con3]++;if(con3==1)con31=2;else if(con3==2)con31=9;else if(con3==3)con31=5;else if(con3==4)con31=9;if(timedate3[con3]>con31)timedate3[con3]=0;if(timedate3[1]==2&&timedate3[2]==4){timedate3[2]=0;timedate3[1]=0;}}if(con3!=0)if(key3==0){delay(12);while(key3==0) ;delay(12);timedate3[con3]--;}if(con3==1) con32=2;else if(con3==2) con32=9;else if(con3==3) con32=5;else if(con3==4) con32=9;if(timedate3[con3]==255)timedate3[con3]=con32;if(timedate3[1]==2&&timedate3[2]==9)timedate3[2]=3;aa=timedate3[1]; //小时的十是位bb=timedate3[2];cc=timedate3[3];dd=timedate3[4];ee=timedate3[5];ff=timedate3[6];t=10*aa+bb;}void time_intt3(void) interrupt 3{TH0=(65536-50000)/256;TL0=(65536-50000)%256;a3++;if(a3==20){a3=0;timedate3[6]++;if(timedate3[6]==10){timedate3[6]=0;timedate3[5]++;} if(timedate3[5]==6){timedate3[5]=0;timedate3[4]++;} if(timedate3[4]==10){timedate3[4]=0;timedate3[3]++;} if(timedate3[3]==6){timedate3[3]=0;timedate3[2]++;} if(timedate3[2]==10){timedate3[2]=0;timedate3[1]++;} if(timedate3[1]==2&&timedate3[2]==4) {timedate3[1]=0;timedate3[2]=0;} aa=timedate3[1];bb=timedate3[2];cc=timedate3[3];dd=timedate3[4];ee=timedate3[5];ff=timedate3[6];t=10*aa+bb;}}。