单片机课程设计交通灯.docx
《单片机课程设计交通灯.docx》由会员分享,可在线阅读,更多相关《单片机课程设计交通灯.docx(18页珍藏版)》请在冰点文库上搜索。
单片机课程设计交通灯
智能交通灯控制器
一、选题背景
交通信号灯的出现,使交通得以有效管制,对于疏导交通流量,提高道路通行能力,减少交通事故有明显效果。
如何采用合适的控制方法,最大限度利用好耗费巨资修建的城市高速道路,缓解主干道与匝道、城区同周边地区的交通拥堵状况,越来越成为交通运输管理和城市规划部门亟待解决的主要问题。
随着电子技术的发展,利用计算机技术对交通灯进行智能化管理,已成为目前广泛采用的方法。
1.设计一个十字口的交通灯控制电路,要求主车道和干道两条交叉道路上的车辆交替运行,每次通行时间都设为主干道25s,次道路20s;
2.要求黄灯先亮5s,才能变换运行车道;
3.黄灯亮时,要求每秒钟闪亮一次;
4.倒数秒数显示;
5.当有特殊情况需要紧急通行时,可对红绿灯进行人为控制。
以上是目前常用路口交通信号灯的控制功能,为了演示效果,这里采用三种颜色的发光二极管来模拟交通信号灯。
二、设计与分析
从设计所要完成的任务与要求来看,显示通行时间必须用二位数码管,从节省硬件资源的角度考虑,可采用扫描的方式来处理,对于7段数码管,占用7个单片机的I/O口,另外设置两个电子开关对2位显示进行配合,占用2个I/O端口,十字路口共需4组红绿灯,加上转换黄灯,一共是12只灯,须用12个端口进行控制,加上两个方向上的紧急通行按键,占2个I/O端口,因此实际占用的单片机I/O端口为24个,为此,我们可以选用51系列单片机中的AT89c51来作为中央处理器。
这款单片机的I/O端口作为输出时,具有较大的电流吸收能力,因此我们可以选用共阳极数码管,这样由单片机的I/O口
就可以直接驱动,能简化硬件电路的设计。
经以上分析,我们设计出这款智能交通控制器的电路原理图
三、电路原理图:
电源部分电路图
四、原理框图如下:
否
是
否
主程序流程图
五、程序如下:
;以下程序完成各脚的预定义
QREQUP1.3;前红灯
QYEQUP1.1;前黄灯
QGEQUP1.2;前绿灯
HREQUP2.2;后红灯
HYEQUP2.0;后黄灯
HGEQUP2.1;后绿灯
ZREQUP1.4;左红灯
ZYEQUP1.5;左黄灯
ZGEQUP1.6;左绿灯
YREQUP2.5;右红灯
YYEQUP2.4;右黄灯
YGEQUP2.3;右绿灯
SWITCH1EQUP2.7;
SWITCH2EQUP2.6;
DATEQU60H;显存
ORG0000H
LJMPSTART
ORG0003H
LJMPD_X;外部中断0,东西向紧急按键
ORG000BH
RETI;
ORG0013H
LJMPN_B;外部中断1,南北向紧急按键
ORG001BH
RETI
ORG0023H
RETI
ORG0040H;定位
START:
MOVTCON,#5H;外部中断为下降沿触发
SETBEX0;
SETBEX1;开外部中断
SETBEA;开总中断
;IO口初始化
MOVP0,#0FFH
MOVP1,#0FFH;
MOVP2,#0FFH;
MOVP3,#0FFH;
MOVDAT,#25H;
AUTCLK:
MOVP1,#0FFH;
MOVP2,#0FFH;
MOVDAT,#25H;写入每一通路的通行时间
CLRQG;南北向绿灯亮
CLRHG;
CLRZR;东西向红灯亮
CLRYR;
MOVA,DAT;
MOVR2,#20;写入时间值
A1:
MOVR1,#220;
A2:
ACALLBCD;BCD调整
ACALLDISPCLK;显示
ACALLDEL1MS;延时
ACALLDEL1MS;
ACALLDEL1MS;
DJNZR1,A2;
MOVA,DAT;完成数字的减1操作
ADDA,#99H;
DAA;
MOVDAT,A;调整好的数字送显存
DJNZR2,A1;
;最后5秒黄灯闪
MOVP1,#0FFH;
MOVP2,#0FFH;关所有灯
CLRZY;黄灯亮
CLRYY;
CLRQY;
CLRHY;
MOVR2,#5;
A3:
MOVR1,#220;
A4:
ACALLBCD;
ACALLDISPCLK;
ACALLDEL1MS;
ACALLDEL1MS;
ACALLDEL1MS;
DJNZR1,A4;
CPLQY;南北向绿灯亮
CPLHY;
CPLZY;东西向红灯亮
CPLYY;
MOVA,DAT;
ADDA,#99H;
DAA;
MOVDAT,A;
DJNZR2,A3;
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
MOVP1,#0FFH;
MOVP2,#0FFH;
MOVDAT,#20H;
CLRZG;东西向绿灯亮
CLRYG;
CLRQR;南北向红灯亮
CLRHR;
MOVA,DAT;
MOVR2,#15;执行15秒
A5:
MOVR1,#220;
A6:
ACALLBCD;BCD调整
ACALLDISPCLK;显示
ACALLDEL1MS;
ACALLDEL1MS;
ACALLDEL1MS;
DJNZR1,A6;
MOVA,DAT;
ADDA,#99H;减1操作
DAA;
MOVDAT,A;
DJNZR2,A5;
;最后5秒黄灯闪
MOVP1,#0FFH;
MOVP2,#0FFH;关所有灯
CLRZY;黄灯亮
CLRYY;
CLRQY;
CLRHY;
MOVR2,#5;
A7:
MOVR1,#220;
A8:
ACALLBCD;
ACALLDISPCLK;
ACALLDEL1MS;
ACALLDEL1MS;
ACALLDEL1MS;
DJNZR1,A8;
CPLQY;南北向绿灯亮
CPLHY;
CPLZY;东西向红灯亮
CPLYY;
MOVA,DAT;
ADDA,#99H;
DAA;
MOVDAT,A;
DJNZR2,A7;
AJMPAUTCLK;
NOP;
NOP;
NOP;
LJMPSTART
;;*********************************
;;显示子程序
;;**********************************
DISPCLK:
MOVDPTR,#TAB;定入表头
;显示个位
MOVA,50H;
MOVCA,@A+DPTR;
MOVP0,A;
CLRSWITCH2;
LCALLDEL1MS;
SETBSWITCH2;
;显示十位
MOVA,51H;
MOVCA,@A+DPTR;
MOVP0,A;
CLRSWITCH1;
LCALLDEL1MS;
SETBSWITCH1;
RET;
NOP;
NOP;
NOP;
LJMPSTART
;************************************************************
;横向道路紧急中断程序
;************************************************************
D_X:
CLREA;关总中断
JNBP3.2,$;
MOVA,DAT;保存显示数据
MOV20H,A;
MOVDAT,#50H;
MOV21H,P1;
MOV22H,P2;
MOVP1,#0FFH;
MOVP2,#0FFH;
CLRZG;东西向绿灯亮
CLRYG;
CLRQR;南北向红灯亮
CLRHR;
MOVR4,#50;
D1:
MOVR3,#220;
D2:
ACALLBCD;
ACALLDISPCLK;
ACALLDEL1MS;
ACALLDEL1MS;
ACALLDEL1MS;
DJNZR3,D2;
MOVA,DAT;
ADDA,#99H;
DAA;
MOVDAT,A;
DJNZR4,D1;
MOVA,20H;恢复显示数据
MOVDAT,A;
MOVP2,22H;
MOVP1,21H;
SETBEA;开总中断
RETI;中断返回
NOP;
NOP;
NOP;
AJMPSTART;
;************************************************************
;纵向道路紧急中断程序
;************************************************************
N_B:
CLREA;关总中断
JNBP3.3,$;
MOVA,DAT;保存显示数据
MOV20H,A;
MOVDAT,#50H;
MOV21H,P1;
MOV22H,P2;
MOVP1,#0FFH;
MOVP2,#0FFH;
CLRQG;南北向绿灯亮
CLRHG;
CLRZR;东西向红灯亮
CLRYR;
MOVR4,#50;
N1:
MOVR3,#220;
N2:
ACALLBCD;
ACALLDISPCLK;
ACALLDEL1MS;
ACALLDEL1MS;
ACALLDEL1MS;
DJNZR3,N2;
MOVA,DAT;
ADDA,#99H;
DAA;
MOVDAT,A;
DJNZR4,N1;
MOVA,20H;恢复显示数据
MOVDAT,A;
MOVP2,22H;
MOVP1,21H;
SETBEA;开总中断
RETI;中断返回
NOP;
NOP;
NOP;
AJMPSTART;
;********************************************************
BCD:
;将显存中的数字分分两个BCD码存于50H和51H单元中,用于显示十位和个位
MOVA,DAT;
MOVB,#10H
DIVAB
MOV51H,A;写入分十位
MOVA,B
MOV50H,A;写入分个位
RET
NOP
NOP
NOP
LJMPSTART
;数码表
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
RET
NOP
NOP
NOP
LJMPSTART
;*****************************
;延时子程序
;12M晶振
;*****************************
DEL1MS:
MOVR6,#28
DEL1MS1:
MOVR7,#19
DEL1MS2:
DJNZR7,DEL1MS2
DJNZR6,DEL1MS1
RET
NOP
NOP
NOP
LJMPSTART
END
六、仿真结果:
1.仿真开始时南北向绿灯亮,东西向红灯亮,同时数码管显示从25s开始进行倒计时,过20s后,剩余5s红绿灯都不亮,转为四个方向的黄灯,每隔一秒亮一次,5s完成后,即主干道通行25s。
开始转向为南北向红灯亮东西向绿灯亮,同时数码管显示从20s开始计时,过15s后,剩余5s红绿灯都不亮,转为四个方向的黄灯,每隔一秒亮一次,5s完成后,即次干道通行20s。
2.当有紧急情况发生时,可人为控制某一路的通断,如南北向有紧急情况,可人为按下SB2按钮,此时南北向绿灯亮,东西向红灯亮,数码管显示从50s开始倒计时,即给主干道通行时间增加到了50s,以缓解交通压力。
如东西向(次干道)有紧急情况,可人为按下SB1按钮,下面情况与上面主干道情况类似。
3.关于数码管的显示问题,此例是用两个PNP型三极管来当作开关管来用,用以控制哪个数码的亮与灭。
数码管选用共阳型。
七、心得体会: