第一篇:基于单片机控制的交通灯设计系统
基于单片机控制的交通灯设计系统
班级:
姓名:
学号:
第一章 概述 1.设计内容
本系统需要采用AT89C51单片机AT89C5中心器件来设计交通灯控制器,实现以下功能: 1.1初始东西绿灯亮,南北红灯亮,东西方向通车。1.2黄灯闪烁后,东西路口红灯亮同时南北路口绿灯亮,南北方向开始通车。1.3延时27s,南北方向绿灯灭,黄灯闪烁3次,然后又切换成东西方向通车,如此重复。
设计交通灯控制系统硬件电路与软件控制程序,对硬件电路与软件程序分别进行调试,并进行软硬件联调,要求获得调试成功的仿真图。2.设计目的
2.1 了解交通灯管理的基本工作原理。2.2 熟悉AT89C51工作原理和应用编程。
2.3 熟悉AT89C51行接口的各种工作方式和应用。
2.4 熟悉AT89C51数器/定时器的工作方式和应用编程外部中断的方法。2.5 掌握多位LED显示问题的解决。3.设计原理
AT89C51片机具有控制二连体共阴极数码管和发光二极管的输出显示以及检测按键输入的功能。利用AT89C51片机模仿制作室外十字路口多功能交通灯,实现室内控制与室外显示的功能。合理控制交通繁忙,交通特殊情况和恢复交通正常的三种情况。
本设计用4个共阳极LED数码管的分别表示东、西、南、北四个方向路口,以数码管的上、中、下3个横段分别代表红、黄、绿3盏灯,用P0、P1口分别输出控制模拟交通灯的状态显示的数码管和倒计时显示数码管的状态码,P3^
1、P3^
2、P3^4-P3^7控制数码管的位选,P2^0-P2^4接收中断信号并反馈给INT0接口进行中断处理。
第二章 硬件设计
1.设计框图 如图2-1所示 此处要有文字说明
图2-1设计框图
2.元器件选择及其功能介绍
AT89C51是一种带4K字节LASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。AT89C51片引脚图如下图2-2所示。
图2-2 AT89C51片引脚图
主要特性:
·与MCS-51 兼容
·4K字节可编程闪烁存储器 ·寿命:1000写/擦循环 ·数据保留时间:10年 ·全静态工作:0Hz-24MHz ·三级程序存储器锁定 ·128×8位内部RAM ·32可编程I/O线
·两个16位定时器/计数器,5个中断源 ·可编程串行通道
·低功耗的闲置和掉电模式 ·片内振荡器和时钟电路 3.设计原理图
硬件电路图通过Proteus 仿真之后如图2-3所示,其中: 按钮K0连接P2^0端口实现红灯全亮,处理交通意外 按钮K1连接P2^1端口实现南北方向亮灯时间+1s 按钮K2连接P2^2端口实现南北方向亮灯时间-1s 按钮K3连接P2^3端口实现东西方向亮灯时间+1s 按钮K4连接P2^4端口实现东西方向亮灯时间-1s
图2-3整体连接电路原理图
第三章 软件设计
1.各个程序段介绍 1.1数码管显示
void Display(uchar j)//j控制显示table中连续位的起始点 { char h,l;if(j<11)//根据状态判定时间
{
h=Time_EW/10;//EW通行时间十位
l=Time_EW%10;//EW通行时间个位
} else if(j<23){
h=Time_SN/10;//SN通行时间十位
l=Time_SN%10;//SN通行时间个位
} for(i=0;i<4;)//按位显示通行状况及时间
{
P0=table1[j];//通行状况显示
P3=tab[i];//位选显示
i++;
j++;
if(i%2)//两位计时显示
{
P1=table[l];
Delay(400);
}
else
{
P1=table[h];
Delay(400);
} } Delay(5);} 1.2 INT0外部中断服务程序
void EXINT0(void)interrupt 0//INT0外部中断 { EX0=0;//关中断
if(Busy_Button==0){
P0=0xFE;//意外按钮按下全显示红灯
for(;Busy_Button!=1;)//意外按钮弹起时恢复之前状态
Display(24);} /*四个时间控制按钮分别控制SN、EW方向初始通行时间加减,最长不超过s,最少不低于s*/ if(SN_Add==0)//SN+1 {
SN1+=1;
if(SN1>99)
SN1=99;} if(SN_Red==0)//SN-1 {
SN1-=1;
if(SN1<20)
SN1=20;} if(EW_Add==0)//EW+1 {
EW1+=1;
if(EW1>99)
EW1=99;} if(EW_Red==0)//EW-1 {
EW1-=1;
if(EW1<20)
EW1=20;} EX0=1;//开中断 } 1.3延时子程序
void Delay(uchar a)//循环a次 { uchar x;x=a;while(x--){;} } 2.程序
#define uchar unsigned char #include
uchar x;x=a;while(x--){;} } void Display(uchar j){ char h,l;if(j<11){
h=Time_EW/10;
l=Time_EW%10;} else if(j<23){
h=Time_SN/10;
l=Time_SN%10;} for(i=0;i<4;){
P0=table1[j];
P3=tab[i];
i++;
j++;
if(i%2)
{
P1=table[l];
Delay(400);
}
else
{
P1=table[h];
Delay(400);
} } Delay(5);} void EXINT0(void)interrupt 0 { EX0=0;if(Busy_Button==0){
P0=0xFE;
for(;Busy_Button!=1;)Display(24);} if(SN_Add==0){
SN1+=1;
if(SN1>99)
SN1=99;} if(SN_Red==0){
SN1-=1;
if(SN1<20)
SN1=20;} if(EW_Add==0){
EW1+=1;
if(EW1>99)
EW1=99;} if(EW_Red==0){
EW1-=1;
if(EW1<20)
EW1=20;} EX0=1;
} void timer0(void)interrupt 1 using 1 { TH0=0x3C;TL0=0xB0;count++;if(count==20){
Time_EW--;
Time_SN--;
count=0;} } 第四章 仿真结果及其总结
1.仿真结果图
1.1正常状态的仿真结果如图4-1所示
图4-1正常状态
1.2黄灯状态的仿真结果如图4-2所示
图4-2黄灯状态
1.3紧急状态的仿真结果如图4-3所示
图4-3 紧急状态
1.4延长通行时间的仿真结果如图4-4所示
图4-4延长通行时间
2.总结
通过这次交通灯的课程设计,使我得到了一次用专业知识、专业技能分析和解决现实问题的能力。使我在单片机的基本原理、单片机应用学习过程中,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步,为日后成为一名合格的应用型人才打下良好的基础。综合课程设计让我把以前学习到的知识得到巩固和进一步的提高认识,对已有知识有了更深层次的理解和认识。在此,由于自身能力有限,在课程设计中碰到了很多的问题,我通过查阅相关书籍、资料以及和周围同学交流得到解决。
通过这次交通灯的课程设计,使我了解了写毕业设计的流程和方法。为自己以后的毕业论文的设计做一次练习,具有积极的意义。还有交通灯是我们生活中非常常见的一种东西,对于我们学以致用的这种能力得到了很好锻炼,能够为我们以后的工作于学习打下基础。
由于本人的水平有限,设计中难免会有一些不合理的部分,系统的稳定性还有待提高,望批评更正。
第二篇:单片机控制交通灯的案例
单片机控制交通灯
AT89C51单片机及由Keil 软件编写单片机程序,并且通过Proteus仿真测试,设计一个交通灯系统,实现简单的交通灯的管理功能。在交通灯系统的管理中,用发光二极管模拟交通信号灯,用逻辑电平开关模拟控制开关。在交通繁忙时,交通信号灯控制系统应有手控开关,可人为地改变信号灯的状态,以缓解交通拥挤状况。
工作内容及最终成果:
十字路口的交通指挥信号灯控制要求如下:
(1)信号灯受一个起动开关控制,当起动开关接通时,信号系统开始工作,且先南北红灯亮,东西绿灯亮。当起动开关断开时,所有信号灯都熄灭。(2)南北绿灯和东西绿灯不能同时亮,如果同时亮时应关闭信号灯系统,并报警。
(3)南北红灯亮维持25S。在南北红灯亮的同时东西绿灯也亮,并维持20S。到20S时,东西绿灯闪烁,闪烁3S后熄灭。在东西绿灯熄灭时,东西黄灯亮,并维持2S。到2S时,东西黄灯熄,东西红灯亮。同时,南北红灯熄灭,南北绿灯亮。
(4)东西红灯亮维持30S。南北绿灯亮维持25S。然后闪烁3S,熄灭。同时南北黄灯亮,维持2S后熄灭,这时南北红灯亮,东西绿灯亮。(5)周而复始。
ORG
0000H
LJMP START
ORG
0040H START:
MOV
SP,#60H
LCALL STATUS0;初始状态(都是红灯)CIRCLE:
LCALL STATUS1;南北绿灯,东西红灯
LCALL STATUS2;南北绿灯闪转黄灯,东西红灯
LCALL STATUS3;南北红灯,东西绿灯
LCALL STATUS4;南北红灯,东西绿灯闪转黄灯
LJMP CIRCLE STATUS0:
;南北红灯,东西红灯
MOV DPTR,#8300H
MOV A,#0FH
MOVX @DPTR,A
MOV R2,#10
;延时1秒
LCALL DELAY
RET STATUS1:
;南北绿灯,东西红灯
MOV DPTR,#08300H
MOV A,#96H
;南北绿灯,东西红灯
MOVX @DPTR,A
MOV R2,#200
;延时20秒
LCALL DELAY
RET STATUS2:
;南北绿灯闪转黄灯,东西红灯
MOV DPTR,#8300H
MOV R3,#03H
;绿灯闪3次 FLASH:
MOV A,#9FH
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
MOV A,#96H
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
DJNZ R3,FLASH
MOV A,#06H
;南北黄灯,东西红灯
MOVX @DPTR,A
MOV R2,#10
;延时1秒
LCALL DELAY
RET STATUS3:
;南北红灯,东西绿灯
MOV DPTR,#8300H
MOV A,#69H
MOVX @DPTR,A
MOV R2,#200
;延时20秒
LCALL DELAY
RET STATUS4:
;南北红灯,东西绿灯闪转黄灯
MOV DPTR,#8300H
MOV R3,#03H
;绿灯闪3次 FLASH1:
MOV A,#6FH
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
MOV A,#69H
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
DJNZ R3,FLASH1
MOV A,#09H
;南北红灯,东西黄灯
MOVX @DPTR,A
MOV R2,#10
;延时1秒
LCALL DELAY
NOP
RET DELAY:
;延时子程序
PUSH 2
PUSH 1
PUSH 0 DELAY1:
MOV 1,#00H DELAY2:
MOV 0,#0B2H
DJNZ 0,$
DJNZ 1,DELAY2;延时 100 mS
DJNZ 2,DELAY1
POP 0
POP 1
POP 2
RET
END
第三篇:单片机控制的交通灯控制系统设计
摘要
本设计是单片机控制的交通灯控制系统设计。由单片机系统、LED显示、交通灯演示系统、键盘电路及其控制电路组成。该系统除基本交通灯功能外,还具有倒计时、紧急情况处理、调整通行时间以及根
据具体情况手动控制等功能。
十字路口的交通灯在工作时应具有如下特点:红灯表示该条道路禁止通性;黄灯表示该条道路上未过停车线的车辆禁止通行,已过停车线的车辆继续通性;绿灯亮表示该条道路允许通行。该系统使用12MHZ晶振与单片机AT89S52相连接,通过软件编程的方法实现十字路口的交通灯控制,输入装置是键盘开关,用于控制交通灯的运行模式以及设置通行时间,显示装置是两位的LED七段数码管。该系统是由AT89S52单片机控制的,可以实现以下功能:
1.南北方向(主干道)车道和东西方向(支干道)两条交叉道路上的车辆交替运行,主干道每次通行时间都设为30秒、支干道每次通行间为20秒,时间可设置修改。
2.在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道。
3.黄灯亮时,要求每秒闪亮一次。
4.东西方向、南北方向车道除了有红、黄、绿灯指示外,每一种灯亮的时间都用显示器进行显示(采
用计时的方法)。
5.一道有车而另一道无车(实验时用开关 K0 和 K1 控制),交通灯控制系统能立即让有车道放行。
6.有紧急车辆要求通过时,系统要能禁止普通车辆通行,A、B道均为红灯。
关键字:AT89S52单片机,交通灯,LED显示,键盘开关电路。
目 录
1概述…………………………………………………………………………-3-1.1设计背景 ……………………………………………………………-3-1.2设计目的 ……………………………………………………………-3-1.3设计要求 ……………………………………………………………-3-2 系统总体方案及硬件设计 ………………………………………………-4-2.1 设计原理……………………………………………………………-4-2.2 各功能模块设计……………………………………………………-4-2.2.1单片机AT89S52介绍 …………………………………………-4-2.2.2总体方案 ………………………………………………………-5-2.2.3时钟电路模块 …………………………………………………-6-2.2.4复位电路模块 …………………………………………………-6-2.2.5交通灯演示模块 ………………………………………………-7-2.2.6 LED显示模块 …………………………………………………-7-2.2.7键盘开关模块 …………………………………………………-8-3 软件设计 …………………………………………………………………-10-3.1程序流程图 …………………………………………………………-10-3.2系统软件设计………………………………………………………-11-3.2.1 LED的编程……………………………………………………-11-3.2.2交通灯模块的编程设计………………………………………-12-3.2.3定时器程序……………………………………………………-12-3.2.4键盘程序………………………………………………………-13-3.2.4.1通行时间设置程序………………………………………-13-3.2.4.2紧急情况处理程序………………………………………-14-3.2.4.3状态调整程序……………………………………………-14-4 Proreus仿真 ……………………………………………………………-15-4.1正常工作状态………………………………………………………-15-4.2时间调整……………………………………………………………-17-4.3紧急状况……………………………………………………………-19-4.4状态调整……………………………………………………………-20-5课程设计体会 ……………………………………………………………-22-参考文献……………………………………………………………………-23-附1:源程序代码 …………………………………………………………-24-附2:系统原理图 …………………………………………………………-32-概述 1.1 设计背景
人们越来越关注城市交通问题,而交通灯在安全行车过程中起十分重要的作用, 现在交通灯一般设在十字路口,在醒目位置用红、绿、黄三种颜色的指示灯, 加上一个倒计时的显示计时器来控制行车, 对于一般情况下的安全行车、车辆分流发挥着作用, 但根据实际行车过程中出现的情况, 主要有如下几个缺点:
1、车道让车轮流放行时间相同且固定, 在十字路口, 经常出现有些车道车辆较多, 放行时间应该长些;而有些车道车辆较少,放行时间应短些。
2、没有考虑紧急车通过时, 两车道应采取的措施, 譬如, 有消防车通过执行紧急任务时, 两车道的车都应停止, 让紧急车辆通过。根据行车过程中出现的实际情况, 如何合理高效地利用交通灯指示交通情况,这是一个迫切需要解决的问题。
1.2 设计目的
1.进一步熟悉和掌握单片机的结构及工作原理。
2.掌握单片机的接口技术及相关外围芯片的外特性,控制方法。3.通过课程设计,掌握以单片机核心的电路设计的基本方法和技术。4.通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。5.了解开发单片机应用系统的全过程,为今后从事相关事业打下基础。
1.3 设计要求
1.设计一个十字路口的交通灯控制电路,要求南北方向(主干道)车道和东西方向(支干道)车道两条交叉道路上的车辆交替运行,主干道每次通行时间都设为30秒、支干道每次通行时间为20秒,时间
可设置修改。
2.在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道;
3.黄灯亮时,要求每秒闪亮一次。
4.东西方向、南北方向车道除了有红、黄、绿灯指示外,每一种灯亮的时间都用显示器进行显示(采
用计时的方法)。
5.一道有车而另一道无车(实验时用开关 K0 和 K1 控制),交通灯控制系统能立即让有车道放行。
6.有紧急车辆要求通过时,系统要能禁止普通车辆通行,A、B道均为红灯。系统总体方案及硬件设计
2.1 设计原理
本设计使用的是单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大,而且可以随时更新系统,根据道路情况适时调整交通灯的状态,全面有效地利用交通灯指示交通情况。该设计是以单片机AT89S52为核心完成的,在硬件电路中采用P1口点亮交通指示灯,采用P0口和P2口作为2位LED数码管的驱动接口,可显示各个方向的交通灯的持续时间,单片机外围接有按键开关电路,可以响应外部中断及键盘程序,实现紧急情况处理、调整交通灯的点亮时间等功能。芯片选用AT89C51 单片机,电路由下列部分组成:时钟电路、复位电路、键盘电路、交通灯演示电
路、LED显示电路。
2.2 各功能模块设计 2.2.1 单片机AT89S52介绍
AT89S52是一个低电压,高性能CMOS型 8位单片机,片内含8KB的可反复擦写的Flash只读程序存储器(ROM)和256 B的随机存取数据存储器(RAM)。AT89S52是一个低功耗高性能单片机,40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,2个16位可编程定时计数器,2个全双工串行通信口,AT89S52可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
引脚使用说明:
I/O端口的编程实际上就是根据应用电路的具体功能和要求对I/O寄存器进行编程。具体步骤如下:
l.根据实际电路的要求,选择要使用哪些I/O端口。
2.初始化端口的数据输出寄存器,应避免端口作为输出时的开始阶段出现不确定状态,影响外围电
路正常工作。
3.根据外围电路功能,确定PO端口的方向,初始化端口的数据方向寄存器。对于用作输入的端口可以不考虑方向初始化,因为PO的复位缺省值为输入。
4.用作输入的PO管脚,需上拉电阻。
5.最后对I/O端口进行输出(写数据输出寄存器)和输入(读端口)编程,完成对外围电路的相应功能。
几个特殊管脚:
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
RST: 复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平。
2.2.2 总体方案 此交通灯系统位于一个十字路口,此路口为东南西北走向。南北方向为主干道,东西方向为支干道。各干道有一组红、绿、黄三色的指示灯,指挥车辆和行人安全通行。红灯亮禁止通行,绿灯亮允许通行,黄灯亮提示人们注意红、绿灯的状态即将切换。
此交通灯系统工作过程分为4个状态。状态0南北方向绿灯亮,东西方向红灯亮。过25秒后转为状态1,南北方向绿灯灭,黄灯每秒闪亮一次,东西方向还是红灯亮。历时5秒钟再转为状态2,南北方向红灯亮,东西方向绿灯亮。过15秒后转为状态3,南北方向还是红灯亮,东西方向绿灯灭,黄灯每秒闪亮
一次。历时5秒钟又循环至状态0。
交通灯的状态表如下:
状态(时间)主干道—SN 红—R 0 1 2 3 0 0 1 1
绿—G 1 0 0 0
黄—Y 0 1/0 0 0
表01 交通灯的状态表
注:
1:SN:南北方向。WE:东西方向。2:状态:0:熄。1:亮。1/0:闪。
2.2.3 时钟电路模块
时钟电路模块给单片机提供特定的时钟周期,以备单片机工作使用。单片机的机器周期有6MHz和12MHz的两种。这里采用的是12MHZ的晶振,以给单片机提供12MHz的机器周期。另外有两个30P的电容,两晶振引脚分别连到XTAL1和XTAL2振荡脉冲输入引脚。
其电路图如图02所示:
支干道—WE 红—R 1 1 0 0
绿—G 0 0 1 0
黄—Y 0 0 0 1/0
图02 时钟电路模块
2.2.4 复位电路模块
单片机系统的复位电路采用的是上电+按钮复位电路形式,其中电阻R采用10KΩ的阻值,电容采用
电容值为10μF的电解电容。其具体连接电路如图03所示:
图03 复位电路模块 2.2.5 交通灯演示模块
此交通灯演示模块由单片机的P1口作信号输出端来控制12个交通灯的亮灭,交通灯采用的是发光二极管。因为单片机的输出电流非常小,为了使发光二极管能够发光或者更亮,二极管采用共阳极接法。即阳极通过470Ω电阻接+5V直流电源,阴极接单片机P1口。同时南北方向同色灯连同上拉电阻一起并联,东西方向也是一样,以保证同一干道上的同色灯同时点亮或熄灭,并且流过二极管的电流不会因并联
而减半。
其具体连接电路如图04所示:
图04交通灯演示电路 2.2.6 LED显示模块 由于同一干道上的两个方向的红灯,绿灯,黄灯点亮时间相同,所以南北方向只需一个数码管显示
相应的时间即可,同理东西方向也只需一个。
本次交通灯设计采用两位一体的共阴极数码管来显示相应的时间。由单片机的P0口输出字型码,P2口的前四位P2.0~P2.3作位选端。位选端接LED的共阴极,故低电位有效。因为单片机I/O口的驱动电流很小,一般只有几个毫安。为了增加驱动能力,每个LED上都加上一个上拉电阻,接入+5V电源,本次设计采用的是排阻。当P0口输出低电平时,LED不导通,上拉电阻电流灌进单片机,而当P0口输出高电平时,LED导通。而且上拉电阻的电流也通过LED,这自然就增加了LED的发光亮度。
其具体连接电路如图05所示:
图05 LED显示电路 2.2.7 键盘开关模块
此系统通过5个开关实现所有的要求,开关一端接地,另一端接单片机的P3口。K0接P3^7,当主干道有车而支干道无车时,按一下K0键,可以实现主干道通行。K1接P3^6,当支干道有车而主干道无车时,按一下K1键,可以实现支干道通行。K2接P3^3,利用中断1的方式对紧急情况进行处理,即使东南西北四个方向都亮红灯停车。K4接P3^2,利用中断0的方式对各个干道的通行时间进行设置。在相应中断0期间,K0,K1起调整时间的作用。每按一下K0,主干道通行时间加一,每按一下K0,主干道通行时间加一。K3接P3^5,按一下K3,可以使系统退出中断,回到主程序。
其具体连接电路如06图示:
图06 键盘开关电路 软件设计 3.1 系统流程图
(注:判断框SN=0,WE=0处的Y,N位置标反了,读者自己改正。)
3.2 系统软件设计 本次单片机课程设计软件部分利用C语言编程,采用模块化程序设计。程序部分由主程序、定时器程序、T0/T1中断服务程序、键盘扫描程序、交通灯点亮程序、LED数码管扫描显示程序和延时程序构成。
3.2.1 LED的编程
本次交通灯设计采用两位一体的共阴极数码管来显示相应的时间。数码管为七段数码管,由8个发光二极管构成,通过不同的组合可用来显示数字0-9,字符A-F、H、L、P、R、U、Y、符号“-”及小数点“.”。
本设计只需要显示数字0-9,来表示相应的时间。
共阴极数码管的8个发光二极管的阴极连接在一起接位选端。两个两位一体的共阴极数码管共有4个位选端,分别接在 P2^O-P2^3,低电平有效。数码管各个阳极管脚接各段的驱动电路输出端,既P0口。P0^0接a,P0^1接b,……P0^6接g,P0^7接dp,高电平有效。
本设计采用逐位扫描的方式实现相应时间的动态显示。先将P2^1置低电平,P2^0、P2^
2、P2^3置高电平,来选中南北方向数码管的个位,此时P0口的数据接传送给它显示。经延时一段时间,将P2^1置低电位选中南北方向数码管的十位,此时P0口的数据接传送给它显示。再用同样的方法依次驱动东西方向数码管。通过不断改变P0口、P2口的输出,用循环扫描的方式,即可实现LED的动态显示。
LED动态显示的流程图如图08:
3.2.2交通灯模块的编写设计
本次设计的交通灯演示模块由单片机的P1口作信号输出端来控制12个交通灯的亮灭。P1^1-P1^6依次连接南北的红灯、绿灯、黄灯,东西的红灯、绿灯,黄灯。所以4种状态依次为0x6A,0x66,0x5C,0x3C。当交通灯的剩余时间为零时,改变P1口的输出,进而改变交通灯的点亮状态。交通灯依次循环上面的4个状态,就可以实现指挥交通的作用。
3.2.3 定时器程序
本次设计用定时计数器T1,TMOD是定时计算器的工作方式控制寄存器,通过对该寄存器的操作可以改变T1的工作方式。T1有4种工作方式,由TMOD寄存器中间的M1、M0这两位来决定。本次设计的定时计数器工作在工作方式1,M1、M0设定为01。定时计算器采用加1计数的方式,当接收到一个驱动事件时计数器加1。工作方式1的内部计数器宽度为16位,由TH1的8位和TL1的8位组成。当TL1溢出时将向TH1进位,当TH1溢出后会产生相应的溢出中断。
驱动事件之间的时间间隔即为定时计数器的定时宽度。在定时的工作方式下,定时宽度是单片机的机械周期,也是外部时钟频率的1/12。本次设计的外部时钟频率为12MHz。可知,接收106个驱动事件的时间为1s。
定是1s的流程图如图09所示:
3.2.4 键盘程序
为了实现设置通行时间、紧急情况处理、有车放行等功能,本次设计中有键盘电路。通行时间设置由外部中断0实现,紧急情况由外部中断1处理,有车放行是用普通的键盘程序实现的。按键实际是一种常用的按钮,按键未按下时,键的两个触点处于断开状态,按键按下时,两个触点闭合。按键是利用机械触点来实现键的闭合和释放,由于弹性作用的影响,机械触点在闭合及断开瞬间均
有抖动过程,从而使键输入也出现抖动。
抖动时间一般为5—10ms。本次设计采用软件的办法消抖。在第一次检测到有键按下时不动作,延时10ms,再次检测按键的状态,如果仍保持闭合状态,则确定真的有键按下。当按键释放后,转入按键的处理程序 延时程序如下: /*延时t毫秒*/ void delay(uchar t)
{
uchar i;/*定义无符号字符常量*/ for(t;t>0;t--)/*执行t次循环*/
{ for(i=2000;i>0;i--)/*由于时钟脉冲是12MHz,执行2000次循环的时间为1ms*/
{ } } }
3.2.4.1 通行时间设置程序
本次设计通过外部中断0设置各个干道的通行时间。
外部中断0的请求信号由P3^2引脚输入,采用低电平有效的方式响应中断,即IT0=1。响应中断0期间,CPU禁止响应其他中断,按键K0,K1起调整时间的作用。采用加1的方式,每按一下K0,主干道通行时间加1,每按一下K1,支干道通行时间加1。通行时间可以直接在数码管上显示出来。按一下K3,可以使系统退出中断,回到主程序断点处,从下一个状态开始执行新设置的通行时间。CPU再开放总中断。
由于本次设计使用两位一体的共阴极数码管显示时间,故设置各个干道的通行时间的范围为0—100s。考虑道路通车的实际情况,时间太短无法通过交通路口,所以本设计中通行时间下限为6s(绿灯1s,黄灯5s)。在6—99s之间可以任意设置通行时间,更合理高效的指挥交通。
3.2.4.2 紧急情况处理程序
本次设计通过外部中断1实现对紧急情况的处理。
与外部中断0相仿。外部中断1的请求信号有P3^3引脚输入,采用低电平有效的方式相应中断,即IT0=1。响应中断1期间,CPU禁止响应其他中断,东南西北四个方向均亮红灯,各个干道都禁止通行。由于不确定要持续多久,不采用倒计时的方式显示时间,数码管显示00。紧急情况结束时,按一下K3,可以使系统退出中断,回到主程序断点处,CPU再开放总中断。
3.2.4.3 状态调整程序
在实际交通系统中,很有可能会不时的出现一道有车而另一道无车的情况,为了更合理高效的指挥交通,本次设计的交通灯控制系统能立即让有车道放。由开关 K0 和 K1 控制。采用查询的方式不断扫描K0、K1,看有没有键按下。按一下K0键,可以实现主干道通行,按一下K1键,可以实现支干道通行。
此时交通状态的改变是因为另一路无车,所以不需要设置返回,直接按主程序循环指挥。也有可能较长时间出现一道有车另一道无车的情况,只需多次按K0或K1键即可。Proteus仿真 4.1 正常工作状态
本次设计的交通灯控制系统共有四个工作状态,分别是状态0、状态
1、状态2和状态3。开始时先执行状态0,南北方向绿灯亮,东西方向红灯亮。历时25秒。如图10所示:
图10 状态0 25秒后转为状态1,南北方向绿灯灭,黄灯每秒闪亮一次,东西方向还是红灯亮。历时5秒。如图
11所示:
图11 状态1 5秒后再转状态2,南北方向红灯亮,东西方向绿灯亮。历时15秒。如图12所示:
图12 状态2 15秒后转状态3,南北方向还是红灯亮,东西方向绿灯灭,黄灯每秒闪亮一次。历时5秒。如图1
3所示:
图13 状态3
此状态结束后再回到状态0,如此循环进行。
4.2 时间调整
按一下开关K4,系统响应外部中断0,进入通行时间调整程序。各个干道的通行时间有数码管显
示。如图14所示:
图14 时间调整
按键K0,K1起调整时间的作用,每按一下K0,主干道通行时间加1,每按一下K1,支干道通行时间加1。多次按键即可调整到合理的通行时间。如图15所示:
图15 通行时间+1 按一下K3,可以使系统退出中断,回到主程序断点处,从下一个状态开始执行新设置的通行时间。
如图16、17所示:
图16 主干道按新设置的时间执行
图17 支干道按新设置的时间执行
4.3 紧急情况
当出现紧急情况时,按一下开关K2,系统响应外部中断1,各个方向均亮红灯禁止通行,数码管均显示0。按一下K3,可以使系统退出中断,回到主程序断点处。如图18所示
图18 紧急情况 4.4 状态调整
为了更合理高效的指挥交通,当南北方向有车而东西方向无车时,按K0,系统会自动跳转到状态0,实现南北方向通行。如图19所示:
图19 南北方向有车而东西方向无车时,南北放行
当东西方向有车而南北方向无车时,按K1,系统会自动跳转到状态2,实现东西方向通行。如图20
所示:
图20 东西方向有车而南北方向无车时,东西放行 课程设计体会
很荣幸有这次课程设计的机会,我可以把理论的学习与实践有机的结合起来。
在设计过程中,首先要分析课题,根据所学知识绘制出系统总体设计框图。然后按照自己的设计思路,利用所给的元器件绘制出设计图。在绘制设计图连接各个元器件的时候,要尽量使布线合适,从而使所作设计图清晰易看。绘制完设计图后,接下来就是要根据设计所要求的功能和已完成的设计图编写程序,在编程时,首先应该绘制出主程序流程图,然后采用模块化程序设计的方式,编写实现各个功能的子程序,再将各个子程序与主程序连接起来。在设计程序时要不断对程序进行修改,同时在设计程序的过程中要养成注释程序的习惯,在对程序进行修改的时候,可以通过注释很容易的看出各句程序的功能,清晰明朗。当程序设计出来之后,就可以通过仿真软件对其进行编译,生成仿真所需要的HEX文件。将生成的文件加载到系统图的单片机上,就可以进行系统仿真。通过仿真,检测所作设计是否能实现预期功能。本次课程设计使我对单片机的工作原理有了更深刻的认识,掌握了许多在以前学习中混淆不清的知识点。在翻阅相关书籍和查询相关资料过程中学到了丰富的单片机知识,开阔了眼界,增广了知识面。在编辑程序中,对C语言又有了新的认识和理解。实物焊接中不仅锻炼了自己的动手能力,而且真正作到了
理论联系实际的重要性,收益匪浅。
本次课程设计我参考的三本书。一本是余发山教授的《单片机原理及其应用技术》,一本是在图书馆借的王为青老师编写的《单片机Keil Cx51应用开发技术》,还有一本就是贾宗璞老师的《C语言程序
设计》。在此向编者表示诚挚的谢意。
本次设计中,我曾多次在课堂上向谭兴国老师请教各个模块设计的细节问题,得到了谭老师的大力
帮助,在此深表感谢!
参考文献 [1] 余发山,王福忠.单片机原理及应用技术 徐州:中国矿业大学出版社,2008 [2] 贾宗璞,许合利.C语言程序设计 徐州:中国矿业大学出版社,2007 [3] 王为青,程国刚.单片机Keil Cx51应用开发技术 北京:人民邮电出版社,2007
附1 源程序代码
#include
有效*/ uchar code b[4]={0x0D,0x0E,0x07,0x0B};/****P2口,低有效*/ uchar code c[4]={0x6A,0x66,0x5C,0x3C};/****P1口.低有效*/ char SN=25,WE=30;/*SN表示南北方向——主干道,WE表示东西方向——支干道*/ char SN_G=25,WE_G=15,Y=5;/*SN_G表示南北方向的绿灯,WE_G表示东西方向的绿灯,Y表
示黄灯*/
uchar i,k=0,count=0;/*定义无符号字符串变量*/
void delay(uchar t);/*定义函数*/
void light();/*定义函数*/ void led();/*定义函数*/ void ledthrough();/*定义函数*/ void leddrive();/*定义函数*/ sbit K0=P3^7;/*开关K0接P3^7管脚*/ sbit K1=P3^6;/*开关K1接P3^6管脚*/ sbit K2=P3^3;/*开关K2接P3^3管脚*/ sbit K3=P3^5;/*开关K3接P3^5管脚*/ sbit K4=P3^2;/*开关K4接P3^2管脚*/
/*程序初始化*/ void init(void)
{ /*12MHz */ TMOD=0x01;/**计数器用模式1,为16位计数器*****/
TH1=(65536-50000)/256;/*0x3C*/ TL1=(65536-50000)%256;/*0xB0*//*计50000个数,用时50ms*/
IT0=1;/*外部中断为低电平触发方式*/
ET0=1;/*允许T0中断*/ TR0=1;/*启动计数器*/ EA=1;/*CPU开放总中断*/ EX0=1;/*允许外部中断0中断,即允许响应端口P3^2(K4)中断*/ EX1=1;/*允许外部中断1中断,即允许响应端口P3^3(K2)中断*/
}
/*中断0处理程序*/ void int0(void)interrupt 0
{
EA=0;/*CPU禁止响应一切中断*/ P1=0x6C;/*东西南北方向均红灯亮*/
TR0=!TR0;/*计数器停止工作*/
for(;;)/*无条件循环*/
{
ledthrough();/*调用通行时间显示函数*/
/*设置南北方向通行时间*/ if(K0==0)/*P3^7=0*/
{
delay(10);/*延时,把抖动的时间抛掉*/
if(K0==0)
{ while(!K0)/*当松开K0开关时,跳出循环,执行后面的程序*/
{
ledthrough();/*调用通行时间显示函数*/
}
SN_G++;/*南北方向绿灯时间+1*/ if((SN_G+Y)==100)/*南北方向通行时间(绿灯加黄灯时间)为100s*/ SN_G=1;/*由于使用的是两位数码管,当南北方向通行时间加到100后绿灯时间归1*/
}
}
/*设置东西方向通行时间*/ if(K1==0)/*P3^6=0*/
{
delay(10);/*延时,把抖动的时间抛掉*/
if(K1==0)
{ while(!K1)/*当松开K1开关时,跳出循环,执行后面的程序*/
{ ledthrough();/*调用通行时间显示函数*/
}
WE_G++;/*东西方向绿灯时间+1*/ if((WE_G+Y)==100)/*东西方向通行时间(绿灯加黄灯时间)为100s*/ WE_G=1;/*由于使用的是两位数码管,当东西方向通行时间加到100后绿灯时间归1*/
} } /*返回*/
if(K3==0)/*P3^5=0*/
{
delay(10);/*延时,把抖动的时间抛掉*/
if(K3==0)
{ while(!K3)/*当松开K3开关时,跳出循环,执行后面的程序*/
{
ledthrough();/*调用通行时间显示函数*/
}
TR0=!TR0;/*启动计数器*/ EA=1;/*CPU开放总中断*/
break;/*跳出*/
}
} } }
/*中断1处理程序*/ void int1(void)interrupt 2
{ P1=0x6C,P0=a[0];/*东西南北方向均红灯亮,P0口输出0*/
EA=0;/*CPU禁止响应一切中断*/ TR0=!TR0;/*计数器停止工作*/
for(;;)/*无条件循环*/
{
leddrive();/*数码管驱动程序*/
/*返回*/
if(K3==0)/*P3^5=0*/
{
delay(10);/*延时,把抖动的时间抛掉*/
if(K3==0)
{ while(!K3)/*当松开K3开关时,跳出循环,执行后面的程序*/
{
leddrive();/*数码管驱动程序*/
}
EA=1;/*CPU开放总中断*/ TR0=!TR0;/*启动计数器*/ break;/*跳出*/ }
} }
} /*键盘程序*/ void key()
{
/*南北有车而东西无车*/ if(K0==0)/*K0=0*/
{
delay(10);/*延时,把抖动的时间抛掉*/
if(K0==0)
{ while(!K0)/*当松开K0开关时,跳出循环,执行后面的程序*/
{
light();/*调用交通灯函数*/
led();/*调用数码管函数*/
} count=0;/*清零*/
k=0;/*南北方向通车,东西方向不通车*/ SN=SN_G,WE=SN_G+Y;/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为
南北方向绿灯通行时间加黄灯闪亮时间*/
} }
/*南北无车而东西有车*/ if(K1==0)/*K1=0*/
{
delay(10);/*延时,把抖动的时间抛掉*/
if(K1==0)
{ while(!K1)/*当松开K1开关时,跳出循环,执行后面的程序*/
{
light();/*调用交通灯函数*/
led();/*调用数码管函数*/
} count=0;/*清零*/
k=2;/*南北方向不通车,东西方向通车*/ SN=WE_G+Y,WE=WE_G;/*南北方向显示时间为东西方向绿灯通行时间加黄灯闪亮时间,东
西方向显示时间为东西方向绿灯通行时间*/
} } } /*定时函数*/
void time1(void)interrupt 1
{ TH0=0x3c;
TL0=0xb0;/*计50000个数,用时50ms*/
count++;/*自增运算*/
if(count>=20)/*当count大于或等于20时,历时1s,执行程序*/
{
SN--;/*自减运算*/ WE--;/*自减运算*/ count=0;/*清零*/ if(SN==0||WE==0)/*当SN=0或者WE=0时,执行程序*/
{
k++;/*自增运算*/ if(k>3)/*当k>3时,执行程序*/
k=0;/*清零*/ switch(k)/*switch 语句*/
{ case 0:SN=SN_G,WE=SN_G+Y;break;/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/ case 1:SN=Y,WE=Y;break;/*东西南北方向显示时间均为黄灯闪亮时间*/ case 2:SN=WE_G+Y,WE=WE_G;break;/*南北方向显示时间为东西方向绿灯通行时间加黄灯闪亮时间,东西方向显示时间为东西方向绿灯通行时间*/ case 3:SN=Y,WE=Y;break;/*东西南北方向显示时间均为黄灯闪亮时间*/
} } } } /*延时t毫秒*/ void delay(uchar t)
{
uchar i;/*定义无符号字符常量*/ for(t;t>0;t--)/*执行t次循环*/
{ for(i=2000;i>0;i--)/*由于时钟脉冲是12MHz,执行2000次循环的时间为1ms*/
{ } } } /*交通灯函数*/ void light()
{
P1=c[k];/*交通灯对应着k的值变化*/ if(P1==c[1]&&count==0)/*当南北方向亮黄灯且count=0时,执行程序*/
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;/*延时50ms*/ P1=0x6E;/*南北方向黄灯熄灭,东西方向亮红灯*/
} else if(P1==c[3]&&count==0)/*当东西方向亮黄灯且count=0时,执行程序*/
{
TH1=(65536-300000)/256;TL1=(65536-300000)%256;/*延时50ms*/ P1=0x7C;/*南北方向亮红灯,东西方向黄灯熄灭*/
} } /*数码管函数*/ void led()
{
P2=b[0],P0=a[SN%10];/*显示南北方向个位*/
delay(5);/*延时*/
P2=b[1],P0=a[SN/10];/*显示南北方向十位*/
delay(5);/*延时*/
P2=b[2],P0=a[WE%10];/*显示东西方向个位*/
delay(5);/*延时*/
P2=b[3],P0=a[WE/10];/*显示东西方向十位*/
delay(5);/*延时*/
}
/*通行时间显示函数*/ void ledthrough()
{ P2=b[0],P0=a[(SN_G+Y)%10];/*南北方向数码管显示可通行时间的个位*/
delay(5);/*延时*/
P2=b[1],P0=a[(SN_G+Y)/10];/*南北方向数码管显示可通行时间的十位*/
delay(5);/*延时*/
P2=b[2],P0=a[(WE_G+Y)%10];/*东西方向数码管显示可通行时间的个位*/
delay(5);/*延时*/
P2=b[3],P0=a[(WE_G+Y)/10];/*东西方向数码管显示可通行时间的十位*/
delay(5);/*延时*/
}
/*数码管驱动函数*/ void leddrive()
{
P2=b[0];/*显示南北方向个位*/
delay(5);/*延时*/
P2=b[1];/*显示南北方向十位*/
delay(5);/*延时*/ P2=b[2];/*显示东西方向个位*/
delay(5);/*延时*/ P2=b[3];/*显示东西方向十位*/
delay(5);/*延时*/
} /*主函数*/ void main(void)
{
init();/*调用程序初始化函数*/
for(;;)/*无条件循环*/
{
key();/*调用键盘程序*/ light();/*调用交通灯函数*/ led();/*调用数码管函数*/
} }
附2 系统原理图
第四篇:单片机:交通灯控制系统设计
交通灯控制系统设计
摘要:本系统由单片机系统、键盘、LED 显示、交通灯演示系统组成。系统包括人行道、左转、右转、以及基本的交通灯的功能。系统除基本交通灯功能外,还具有倒计时、时间设置、紧急情况处理、分时段调整信号灯的点亮时间以及根据具体情况手动控制等功能。关键词:AT89S51,交通规则
一、方案比较、设计与论证 1 电源提供方案
为使模块稳定工作,须有可靠电源。我们考虑了两种电源方案
方案一:采用独立的稳压电源。此方案的优点是稳定可靠,且有各种成熟电路可供选用;缺点是各模块都采用独立电源,会使系统复杂,且可能影响电路电平。方案二:采用单片机控制模块提供电源。改方案的优点是系统简明扼要,节约成本;缺点是输出功率不高。综上所述,我们选择第二种方案。2 显示界面方案
该系统要求完成倒计时、状态灯等功能。基于上述原因,我们考虑了三种方案: 方案一:完全采用数码管显示。这种方案只显示有限的符号和数码字苻,无法胜任题目要求。
方案二:完全采用点阵式LED 显示。这种方案实现复杂,且须完成大量的软件工作;但功能强大,可方便的显示各种英文字符,汉字,图形等。
方案三:采用数码管与点阵LED 相结合的方法因为设计既要求倒计时数字输出,又要求有状态灯输出等,为方便观看并考虑到现实情况,用数码管与LED灯分别显示时间与提示信息。这种方案既满足系统功能要求,又减少了系统实现的复杂度。权衡利弊,第三种方案可互补一二方案的优缺,我们决定采用方案三以实现系统的显示功能。3 输入方案:
题目要求系统能手动设灯亮时间、紧急情况处理,我们讨论了两种方案: 方案一:采用8155扩展I/O 口及键盘,显示等。该方案的优点是:
使用灵活可编程,并且有RAM,及计数器。若用该方案,可提供较多I/O 口,但操作起来稍显复杂。
方案二: 直接在IO口线上接上按键开关。因为设计时精简和优化了电路,所以剩余的口资源还比较多,我们使用四个按键,分别是K1、K2、K3、K4。由于该系统对于交通灯及数码管的控制,只用单片机本身的I/O 口就可实现,且本身的计数器及RAM已经够用,故选择方案二。
二、理论分析与计算
1.交通灯显示时序的理论分析与计算
对于一个交通路口来说,能在最短的时间内达到最大的车流量,就算是达到了最佳的性能,我们称在单位时间内多能达到的最大车流为车流量,用公式:车流量= 车流 / 时间 来表示。
先设定一些标号如图2-1 所示。
说明:此图为直方图,上边为北路口灯,右边为东路口灯,下边为南路口灯,左边为西 路口灯。
图2-2 所示为一种红绿灯规则的状态图,分别设定为S1、S2、S3、S4,交通灯以这四 的状态为一个周期,循环执行(见图2-3)。
请注意图2-1b和图2-1d,它们在一个时间段中四个方向都可以通车,这种状态能在
一定的时间内达到较大的车流量,效率特别高。
依据上述的车辆行驶的状态图,可以列出各个路口灯的逻辑表,由于相向的灯的状态图
是一样的,所以只需写出相邻路口的灯的逻辑表;根据图2-3 可以看出,相邻路口的灯它
们的状态在相位上相差180°。因此最终只需写出一组S1、S2、S3、S4的逻辑状态表。
如表2-1 所示。
表中的“×”代表是红灯亮(也代表逻辑上的0),“√”是代表绿灯亮(也代表逻辑上 的1),依上表,就可以向相应的端口送逻辑值。2.交通灯显示时间的理论分析与计算
东西和南北方向的放行时间的长短是依据路口的各个方向平时的车流量来设定,并且
S1、S2、S3、S4各个状态保持的时间之有严格的对应关系,其公式如下所示。T-S1+T-S2=T-S3 T-S2=T-S4 T-S1=T-S3 我们可以依据上述的标准来改变车辆的放行时间。按照一般的规则,一个十字路口可分
为主干道和次干道,主干道的放行时间大于次干道的放行时间,我们设定值时也应以此为参 考。
三、电路图及设计文件 1.灯控制电路设计
由于32个LED 来实现红绿灯状态,若直接接在单片机的口线,路口倒计时的显示就不
能实现,所以本次设计中采用一种新型的电路如图3-1 所示。
图中74LS04的作用是倒相和驱动,它输出的电流大约48mA,实际测试发现足以满足要
求,而且发光管也能达到足够的亮度。
观察图可以看出:两组发光管(一组红、一组绿)由于反相器的作用,其逻辑状态恰恰 相反。
图中和电阻串联的二极管的作用是为了分压,防止因上下两组发光管分压不同导致逻辑 的错误。
共四组和上述相同的电路分别代表东西南北四个方向的红绿灯,使用两片74LS04 作为 驱动。
2.倒计时显示电路设计
前面已经分析过相向的灯的状态和倒计时都是相同的,所以为了节省,采用两组四个数码管
作为倒计时的显示;同时为了节省口资源,采用串口显示的方式驱动数码管。见图3-2 所 示。
四、程序设计思路与流程图 1.主程序流程图
主程序中主要是一个死循环,不停的循环四个状态,如图4-1 所示。
2.按键子程序流程图
它包含倒计时调整和紧急状态两个状态。
主程序中放了一个按键的判断指令,当有按键按下的时候,程序就自动的跳转到按键子
程序处理。当检测到K2键按下的时候就自动返回到主程序。当出现紧急的情况的时候,按下K3或者K4 就切换到紧急状态,当紧急事件处理完毕 的时候,按下K2,就可以返回正常状态。
五、测试、数据及结果分析 1.状态灯显示测试
当电路连接完毕后,将写好的测试程序刷写到芯片内,K1 和K2分别给端口送高电平和
低电平,通电即可检测。2.数码管的测试
将串口的和电路板上的接口连接,将写好的测试程序刷写到芯片内,开电源即可测试。
3.整体电路测试
系统上电,刷写好程序即可开始测试,观测一个周期(共计S1~S4四个状态,默认140 秒)灯的显示状态是否正常,同时观察倒计的计数是否正常。
六、总结
由于使用的是单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大,而且可以随时的更新系统,进行不同状态的组合。
但是在我们设计和调试的过程中,也发现了一些问题,譬如红灯和绿灯的切换还不够迅
速,红绿灯规则不效率还不是很高等等,这需要在实践中进一步完善。附录 系统总体电路图
1.满足南北向红绿灯亮,东西向红灯亮,占25秒——南北向黄灯亮,东西向红灯亮,占5秒——南北向红灯亮,东西向绿灯亮,占25秒——南北向红灯亮,东西向黄灯亮,占5秒。如此循环,周而复始。2.十字路口要有数字显示,提示行人把握时间:当某方向绿灯亮时,置显示器为24,然后以每秒减1计数方式工作,直到减为0,绿灯灭,黄灯亮。黄灯灭,红灯亮时,再次置显示器为29,并开始减计数,直到为0,十字路口红绿灯交换,完成一次工作循环。
3.可手动调整和自动调整,夜间为黄灯闪耀。下面是一个单片机交通灯程序 /*
****************************************************************************************** * *
* Keil C 89S51 交通信号控制程序 * *(C)版权所有 Dai_Weis@hotmail.com * * *
****************************************************************************************** */
#include “reg51.h” #define UINT unsigned int #define ULONG unsigned long #define UCHAR unsigned char /*
信号灯变量
南北方向绿灯
sbit n_bike_g = P1^0;//自行车
sbit n_right_g = P1^1;//右转
sbit n_up_g = P1^2;//直行
sbit n_left_g = P1^3;//左转 调头
南北方向红灯
sbit n_bike_r = P1^4;//自行车
sbit n_right_r = P1^5;//右转
sbit n_up_r = P1^6;//直行
sbit n_left_r = P1^7;//左转 调头 南北方向黄灯
sbit n_bike_y = P3^0;//自行车
sbit n_right_y = P3^1;//右转
sbit n_up_y = P3^2;//直行
sbit n_left_y = P3^3;//左转 调头
东西方向绿灯
sbit e_bike_g = P2^0;//自行车
sbit e_right_g = P2^1;//右转
sbit e_up_g = P2^2;//直行
东西方向红灯
sbit e_bike_r = P2^4;//自行车
sbit e_right_r = P2^5;//右转
sbit e_up_r = P2^6;//直行
东西方向黄灯
sbit e_bike_y = P3^4;//自行车
sbit e_right_y = P3^5;//右转
sbit e_up_y = P3^6;//直行
*/ //延时
void delay(UINT t, UINT s){ while(t){ UINT i;
for(i = 0;i < s;i++){ } t--;} }
//信号灯状态
void time_x(UCHAR P_P1, UCHAR P_P2, UCHAR P_P3){
P1 = P_P1;P2 = P_P2;P3 = P_P3;delay(150, 65535);}
void time_s(UCHAR P_P1, UCHAR P_P2, UCHAR P_P3, UCHAR P_P11, UCHAR P_P22){ UINT i;
for(i = 0;i < 3;i ++){
P1 = P_P1;P2 = P_P2;delay(5, 65535);P1 = P_P11;P2 = P_P22;delay(5, 65535);}
P1 = P_P1;P2 = P_P2;P3 = P_P3;delay(10, 65535);} //主程序
void main(){
P1 = P2 = P3 = 0x0;while(1){
time_x(0xA5, 0x38, 0x0);
time_s(0xA4, 0x38, 0x1, 0xA5, 0x38);time_x(0x96, 0x52, 0x0);
time_s(0x92, 0x52, 0x4, 0x96, 0x52);time_x(0x5A, 0x52, 0x0);
time_s(0x50, 0x50, 0x2A, 0x5A, 0x52);time_x(0xF0, 0x25, 0x0);
time_s(0xF0, 0x24, 0x20, 0xF0, 0x25);time_x(0xD2, 0x16, 0x0);
time_s(0xD0, 0x10, 0x62, 0xD2, 0x16);} }
给你一个定时控制的信号系统,我只做的简单的测试,至于延时我用的软件,你自己想办法。^_^
Dai_Weis 于 2005-5-4 13:43:23 重新给你说明
/*
*********************************************************************************** * *
* Keil C AT89S51 交通信号控制程序 * *(C)版权所有 Dai_Weis@hotmail.com * * *
*********************************************************************************** 开发说明:
固定时间信号变换,南北设置调头、左传、直行、右转、自行车。
东西设置左传、直行、右转、自行车。
时序状态:
红 绿 红 绿
序号 左 前 右 自 左 前 右 自 前 右 自 前 右 自1 0 1 0 0 1 0 1 1 1 1 0 0 0 2 1 0 0 1 0 1 1 0 1 0 1 0 1 0 3 0 1 0 1 1 0 1 0 1 0 1 0 1 0 4 1 1 1 1 0 0 0 0 0 1 0 1 0 1 5 1 1 0 1 0 0 1 0 0 0 1 1 1 0 */
另外修正个错误
while(1){
time_x(0xA5, 0x70, 0x0);time_s(0xA4, 0x70, 0x1, 0xA5, 0x70);
材料: 1、89S51 11.0592M 晶振
1K电阻、10UF电容
12个灯,红、黄、绿各四个,12个1K电阻
,十字路口嘛。蜂鸣器一个。
按键一个,按键复位
采用AT89s51型号的单片机,由于交通十字路口的对称性,所以一个引脚可以同时控制两个灯,将发光二极管分别接到P1各个引脚,在其中加入一个时振荡当电路,来控制时间,在P3.0引脚接入蜂鸣器只黄灯亮的时候发出声响,这里我们让每次黄灯亮的时候发出六声响,通过C程序的控制就可以实现,每次循环是10秒。2、9cm*15cm万用板 1片 单片机及IC座 1套 12M晶振 1只 22P电容 2只 10uF电容 1只 10K电阻 1只 1K排阻 1只 两位一体数码管 2只 DC座 1只 自锁开关 1只
发光二极管红绿黄
各4只 按键 7只 USB电源线 1条 导线
若干
1、基于51系列单片机(型号:STC89C52、AT89C51/C52、AT89S51/S52,随机选择,如有特
殊要求请与店主讨论)设计实现。(以上几种单片机全部为51系列单片机,除了名字不一样外,功能及应用完全一样,互相
兼容)
2、两个两位一体数码管显示东西、南北方向时间。
3、四方向各有红绿黄三颗灯。
4、七个按键操作,分别是:禁止通行、东西通行、南北通行、时间加、时间减、切换方向、确认。
第五篇:基于单片机的交通灯设计
基于单片机的交通灯设计
设计程序:
#include
//共阳极
uchar
code table1[5]={0xf3,0xf5,0xde,0xee,0xf6};/*各种状态下红绿灯段选码, 状态1:A绿灯,B红灯;状态2:A黄灯亮,B红灯;状态3:A红灯,B绿灯;状态4:A红灯,B黄灯亮;状态5:A红灯,B红灯;*/ uchar
code tab[4]={0x1E,0x2D,0x4E,0x8D};//数码管显示位选码 sbit key1=P1^0;//放行A sbit key2=P1^1;//放行B sbit key3=P1^2;//禁止通行
uchar EW=40,SN=30,K1_T=15,K2_T=15,K3_T=20;//初始化交通灯时间 uchar count;//计时中断次数 uchar i,j;//循环控制变量 char Timer;//子程序说明语句 void Process();void Display(uchar j);void Delay(uchar a);/**************************主程序**************************/ main(){ IP=0X02;//设置定时器中断为高优先级//成为中断嵌套
TMOD=0x01;//定时器工作方式
TH0=0x3C;//定时器初始化
TL0=0xB0;IT0=1;//中断触发方式为下降沿触发
EA=1;//CPU开中断
ET0=1;//开定时中断
TR0=1;//启动定时
EX0=1;//启动外部中断0 while(1)
{
Process();
} } /*************************交通灯显示子程序*************************/ void Display(uchar j)//j控制显示table中连续位的起始点 {
char h,l;
h=Timer/10;//EW通行时间十位
l=Timer%10;//EW通行时间个位
for(i=0;i<4;)//按位显示通行状况及时间 {
P0=table1[j];//通行状况显示
P3=tab[i];//位选显示
i++;
//j++;
if(i%2)//两位计时显示
{
P2=table[l];
Delay(400);
}
else
{
P2=table[h];
Delay(400);
} } Delay(5);
//设置扫描时间
} /*********键控*******/ void Keyboard()interrupt 0 using 0 {
if(key1==0)
{ Timer=K1_T;
while(Timer>0)
{
j=0;
Display(0);
//显示一次
}
if(key2==0)
{
Timer=K2_T;
while(Timer>0)
{
j=2;
Display(j);
}
if(key3==0)
{
Timer=K3_T;
while(Timer>0)
{
j=4;
Display(j);
}
} } /**************************延时子程序**************************/ void Delay(uchar a)//循环a次 { uchar x;x=a;while(x--){;} }
/************************TO计时中断服务程序************************/ void timer0(void)interrupt 1 using 1//T0中断 { TH0=0x3C;TL0=0xB0;//定时计数初值
count++;//中断溢出一次count+1 if(count==20){
Timer--;
count=0;//中断次计数,count回,倒计时时间
} } /**************************亮灯控制**************************/ void Process(){ Timer=EW;//初始化方向通行时间
while(Timer>3)//状态:A绿灯,B红灯;{
j=0;
Display(j);//调用显示函数
} while(Timer>0)//状态:A黄灯亮,B红灯;{
j=1;
Display(j);
} Timer=SN;while(Timer>3)//状态:A红灯,B绿灯;{
j=2;
Display(j);} while(Timer>0)//状态:A红灯,B黄灯亮;{
j=3;
Display(j);
}
}
电路图如下: