用单片机控制交通灯传统的交通灯控制电路一般由数字电路构成,电路复杂、体积大、成本高。
采用单片机控制交通灯不但可以解决上述问题,而且还具有时间显示功能,非常方便。
下面介绍一种用单片机控制交通灯的方法。
一、硬件硬件电路如附图。
AT89C2051的P1.7~P1.5和P1.3~P1.1直接驱动红、黄、绿灯,利用单片机的串口和二片74LS164串/并转换移位寄存器实现时间显示,七段数码管为共阴管,硬件电路极为简单。
二、软件交通灯有红、黄、绿三种。
红灯亮,停止通行;绿灯亮,允许通行;黄灯亮,作过渡。
红灯亮60秒,绿灯亮55秒,黄灯亮5秒。
每组灯的亮暗状态以2分钟为周期循环,故程序采用主、子程序方式,循环结构。
另外,为了简化电路,红、黄、绿灯采用低电平点亮。
源程序清单如下:ORG0000HSTART:MOVDRTR,#TABMOVSCON,#00HMOVP1,#6CH;点亮红、绿灯MOVR0,#0;R0清零LEFT:INCR0CJNER0,#55,LP0;R0<55,转LP0MOVP1,#6AH;R0=55,点亮红、黄灯LJMPLP1LP0:CJNER0,#60,LP1;R0<60,转LP1MOVP1,#0C6H;R0=60,点亮绿、红灯LJMPRIGHTLP1:LCALLDBDBLCALLDISPLJMPLEFT;20H为1,转LEFTRIGHT:DECR0CJNER0,#5,LP2;R0>0,转LP2MOVP1,#0A6H;R0=5,点亮黄、红灯LJMPLP3LP2:CJNER0,#0,LP3MOVP1,#6CH;R0=0,点亮红、绿灯LJMPLEFTLP3:LCALLDBDBLCALLDISPLJMPRIGHTDBDB:MOVA,R0MOVB,#10DIVABMOVR1,AMOVR2,BRETDISP:MOVA,R2MOVCA,@A+DPTRMOVSBUF,AJNBTI,$;查TI位CLRTIMOVA,R1MOVCA,@A+DPTRMOVSBUF,AJNBT1,$CLRTILCALLDEALYRETDELAY:MOVR3,#09HK1:MOVR4,#100K2:MOVR5,#250K3:DJNZR5,K3DJNZR4,K2KJNZR3,K1RETTAB:DB3FH,06H,5BHDB4FH,66HDB6DH,7DH,07HDB7FH,6FH三.实验电路及连线四.实验说明1.因为本实验是交通灯控制实验,所以要先了解实际交通灯的变化规律。
假设一个十字路口为东西南北走向。
初始状态0为东西红灯,南北红灯。
然后转状态1南北绿灯通车,东西红灯。
过一段时间转状态2,南北绿灯闪几次转亮黄灯,延时几秒,东西仍然红灯。
再转状态3,东西绿灯通车,南北红灯。
过一段时间转状态4,东西绿灯闪几次转亮黄灯,延时几秒,南北仍然红灯。
最后循环至状态1。
2.双色LED是由一个红色LED管芯和一个绿色LED管芯封装在一起,公用负端。
当红色正端加高电平,绿色正端加低电平时,红灯亮;红色正端加低电平,绿色正端加高电平时,绿灯亮;两端都加高电平时,黄灯亮。
五.实验程序框图程序框图:源代码:ORG 0000HLJMP STARTORG 0040HSTART:MOV SP,#60HLCALL STATUS0 ;初始状态(都是红灯) CIRCLE: LCALL STATUS1 ;南北绿灯,东西红灯LCALL STATUS2 ;南北绿灯闪转黄灯,东西红灯LCALL STATUS3 ;南北红灯,东西绿灯LCALL STATUS4 ;南北红灯,东西绿灯闪转黄灯LJMP CIRCLESTATUS0: ;南北红灯,东西红灯MOV DPTR,#8300HMOV A,#0FHMOVX @DPTR,AMOV R2,#10 ;延时1秒LCALL DELAYRETSTATUS1: ;南北绿灯,东西红灯MOV DPTR,#08300HMOV A,#5AH ;南北绿灯,东西红灯MOVX @DPTR,AMOV R2,#50 ;延时5秒LCALL DELAYRETSTATUS2: ;南北绿灯闪转黄灯,东西红灯MOV DPTR,#8300HMOV R3,#03H ;绿灯闪3次FLASH: MOV A,#5FHMOVX @DPTR,AMOV R2,#03HLCALL DELAYMOV A,#5AHMOVX @DPTR,AMOV R2,#03HLCALL DELAYDJNZ R3,FLASHMOV A,#0AH ;南北黄灯,东西红灯MOVX @DPTR,AMOV R2,#10 ;延时1秒LCALL DELAYRETSTATUS3: ;南北红灯,东西绿灯MOV DPTR,#8300HMOV A,#0A5HMOVX @DPTR,AMOV R2,#50 ;延时5秒LCALL DELAYRETSTATUS4: ;南北红灯,东西绿灯闪转黄灯MOV DPTR,#8300HMOV R3,#03H ;绿灯闪3次FLASH1: MOV A,#0AFHMOVX @DPTR,AMOV R2,#03HLCALL DELAYMOV A,#0A5HMOVX @DPTR,AMOV R2,#03HLCALL DELAYDJNZ R3,FLASH1MOV A,#05H ;南北红灯,东西黄灯MOVX @DPTR,AMOV R2,#10 ;延时1秒LCALL DELAYNOPRETDELAY: ;延时子程序 PUSH 2PUSH 1PUSH 0DELAY1: MOV 1,#00HDELAY2: MOV 0,#0B2HDJNZ 0,$DJNZ 1,DELAY2 ;延时 100 mSDJNZ 2,DELAY1POP 0POP 1POP 2RETEND交通灯的程序及流程图电路说明: 由六个LED(两组红、绿、黄)控制东西向和南北向车流,两位数码管显示本状态剩余时间(秒),具体灯亮的的方式如下:流程图程序如下:ORG 0000HAJMP MAINMAIN: MOV P2,#00HSETB P3.0CLR P2.7MOV P0,#0EEH ;LED显示红红LCALL DELCLR P3.0MOV 7EH,#04H ;把41S 3S送入显示缓冲区MOV 7DH,#01HMOV 7AH,#00HMOV 79H,#03HLCALL DISPMOV R6,#03HMOV R4,#29HAA1: MOV R5,#50HAA2: LCALL DISPMOV R0,#7AHLCALL DAAD1 ;南北数码显示各减1MOV R0,#7EHLCALL DAAD1DJNZ R6,AA1 ;3S时间是否到LCALL DELMOV P2,#00HSETB P3.0CLR P2.7MOV P0,#0BEH ;LED显示红绿CLR P3.0MOV 7EH,#03H ;把38S 30S 分别送入显示缓冲区MOV 7DH,#08HMOV 7AH,#03HMOV 79H,#00HLCALL DISPMOV R6,#1EHMOV R4,#26HBB1: MOV R5,#50HBB2: LCALL DISPDJNZ R5,BB2MOV R0,#7AH ;显示减1LCALL DAAD1MOV R0,#7EHLCALL DAAD1DJNZ R6,BB1 ;30S是否到MOV P2,#00HSETB P3.0CLR P2.7MOV P0,#0DEH ;LED显示红黄LCALL DELCLR P3.0MOV 7EH,#00H ;把8S 5S分别送入显示缓冲区MOV 7DH,#08HMOV 7AH,#00HMOV 79H,#05HLCALL DISPMOV R6,#05HMOV R4,#08HCC1: MOV R5,#50HCC2: LCALL DISPDJNZ R5,CC2MOV R0,#7AHMOV R0,#7EHLCALL DAAD1DJNZ R6,CC1 ;5S是否到MOV P2,#00HSETB P3.0CLR P2.7MOV P0,#0EEH ;LED显示红红LCALL DELCLR P3.0MOV 7EH,#00HMOV 7DH,#03HMOV 7AH,#04HMOV 79H,#01HLCALL DISPMOV R6,#29HMOV R4,#03HDD1: MOV R5,#50HDD2: LCALL DISPDJNZ R5,DD2MOV R0,#7AHLCALL DAAD1MOV R0,#7EHLCALL DAAD1DJNZ R4,DD1 ;3S是否到MOV P2,#00HSETB P3.0CLR P2.7MOV P0,#0EBH ;LED显示绿红LCALL DELCLR P3.0MOV 7EH,#03HMOV 7DH,#00HMOV 7AH,#03HMOV 79H,#08HLCALL DISPMOV R6,#26HMOV R4,#1EHEE1: MOV R5,#50HEE2: LCALL DISPDJNZ R5,EE2MOV R0,#7AHLCALL DAAD1MOV R0,#7EHDJNZ R4,EE1 ;30S是否到MOV P2,#00HSETB P3.0CLR P2.7MOV P0,#0EDH ;LED显示黄红LCALL DELCLR P3.0MOV 7EH,#00HMOV 7DH,#05HMOV 7AH,#00HMOV 79H,#08HLCALL DISPMOV R6,#08HMOV R4,#05HFF1: MOV R5,#50HFF2: LCALL DISPDJNZ R5,FF2MOV R0,#7AHLCALL DAAD1MOV R0,#7EHLCALL DAAD1DJNZ R4,FF1 ;5S是否到LJMP MAIN ;返回主程序显示红红;*************************************************;显示子程序显示缓冲区地址:79H,7AH,7BH,7CH,7DH,7EH;*************************************************DISP: PUSH DPHPUSH DPLPUSH ACCPUSH PSWSETB RS1 ;改变当前寄存器组为组2CLR RS0MOV R1, #79H ;显示缓冲存储单元首地址MOV R2, #01H ;从右至左显示DISP1: MOV A, @R1MOV DPTR, #TABMOVC A, @A+DPTRMOV P0, A ;送段控MOV P2, R2 ;送位控ACALL DL ;延时2毫秒MOV A, R2JB ACC.5, DISP2RL AINC R1MOV R2, AAJMP DISP1DISP2: POP PSW ;恢复当前寄存器组的组号POP ACCPOP DPLPOP DPHRET;**********************************;减1子程序;***********************************DAAD1: MOV A,@R0DEC R0SW AP AORL A,@R0ADD A,#99HDA AMOV R2,AANL A,#0FHMOV @R0, AMOV A,R2INC R0ANL A,#0F0HSW AP AMOV @R0,ARET;**************************************;延时1MS子程序(晶振为6MHZ);**************************************DEL: MOV R2,#01HTIME0: MOV R3,#0FFHTIME1: DJNZ R3,TIME1DJNZ R2,TIME0RET;延时2毫秒子程序DL: PUSH PSWSETB RS1SETB RS0MOV R7, #02HDL1: MOV R6, #0FFHDL2: DJNZ R6, DL2DJNZ R7, DL1POP PSWRET;***************************************************;显示字符段选码表(共阳极代码);*****************************************************TAB: DB 03H,9FH,25H,0DH,99H,49H,41H,1FH,01H ;0-8DB 09H,0FH,83H,0C6H,0A1H,86H,8EH,0FFH,030H ;9-F ,灭,p.。