基于单片机的交通信号灯模拟控制系统设计

近期关于基于单片机的交通信号灯模拟控制系统设计的讨论热度持续攀升,我们通过多方渠道收集整理了相关资讯 ,并进行了系统化的梳理 。若这些内容恰好能为您提供参考,将是我们最大的荣幸。

;2位LED数码管显示程序:P0口接数码管段,P2口接数码管位。 P3口接键盘,P1口接发光二极管

ORG 0000H

LJMP MAIN

ORG 0003H

LJMP INT0P

ORG 000BH

LJMP T0INT

ORG 0013H

LJMP INT1P

ORG 001BH

LJMP CTC1

ORG 0100H

MAIN: LCALL CSHIH ;初始化

LOOP: LCALL TONGX ;通行路口

LCALL H_BCD2 ;计算(1位HEX转换为2位BCD码)

LCALL YIMA ;译码

LCALL LED4W ;显示

CLR 00H

JNB 00H,$

DJNZ R6,LOOP

MOV R6,#100

JNB 10H,LOOP1 ;启动特殊功能K0

JB 10H,$

LOOP1: JNB 11H,LOOP2 ;启动特殊功能K1

JB 11H,$

NOP

LOOP2: JNB 12H,LOOP3 ;启动特殊功能K2

JB 12H,$

NOP

LOOP3: DJNZ TIME,LOOP

SETB 02H

SJMP LOOP

TONGX: JB 01H,DONGX

JB 02H,HUANG1

MOV P1,#21H

SJMP TX_OUT

HUANG1: MOV P1,#22H

MOV TIME,#1

DJNZ R5,TX_OUT

MOV R5,200

CLR 02H

CPL 01H

MOV TIME,#15

SJMP TX_OUT

DONGX: JB 02H,HUANG2

MOV P1,#0CH

SJMP TX_OUT

HUANG2: MOV P1,#14H

MOV TIME,#1

DJNZ R5,TX_OUT

MOV R5,200

CLR 02H

CPL 01H

MOV TIME,#15

TX_OUT: RET

LED4W: MOV A,XWEI

MOV B,#3

MUL AB

MOV DPTR,#LED4T

JMP @A+DPTR

LED4T: LJMP LD4W1

LJMP LD4W2

LJMP LD4W3

LJMP LD4W4

LD4W1: MOV LEDD,MLED1

MOV LEDW,#1

INC XWEI

SJMP LED4WE

LD4W2: MOV LEDD,MLED2

MOV LEDW,#2

INC XWEI

SJMP LED4WE

LD4W3: MOV LEDD,MLED3

MOV LEDW,#4

INC XWEI

SJMP LED4WE

LD4W4: MOV LEDD,MLED4

MOV LEDW,#8

MOV XWEI,#0

LED4WE: RET

YIMA: MOV R0,#BLED1 ;四位LED

MOV R1,#MLED1

MOV R7,#2

MOV DPTR,#YIMTAB

YIMA1: MOV A,@R0

MOVC A,@A+DPTR

MOV @R1,A

INC R0

INC R1

DJNZ R7,YIMA1

RET

YIMTAB: DB 3FH,06H,5BH,4FH,66H ;0,1,2,3,4

DB 6DH,7DH,07H,7FH,6FH ;5,6,7,8,9

CSHIH: MOV TIME,#15

MOV XWEI,#0

MOV LEDD,#0

MOV LEDW,#0

MOV R6,#100 ;1秒延时

MOV R5,#200 ;2秒延时

MOV P1,#21H

MOV 20H,#0

MOV 22H,#0

MOV TMOD,#61H ;T0方式1

MOV TTH0,#0D8H ;10ms

MOV TTL0,#0F0H

MOV TL0,TTL0

MOV TH0,TTH0

MOV TL1,#0FFH

MOV TH1,#0FFH

MOV IE,#8FH

SETB TR0

SETB TR1

MOV BLED1,#0

MOV BLED2,#0

MOV MLED3,#0

MOV MLED4,#0

RET

H_BCD2: MOV A,TIME

MOV B,#10

DIV AB

MOV BLED2,A

MOV BLED1,B

MOV MLED3,#0

MOV MLED4,#0

RET

T0INT: MOV TL0,TTL0

MOV TH0,TTH0

SETB 00H

RETI

INT0P: CPL 10H

SETB P1.2

CLR P1.1

CLR P1.0

SETB P1.5

CLR P1.4

CLR P1.3

RETI

INT1P: CPL 11H

CLR P1.2

CLR P1.1

SETB P1.0

SETB P1.5

CLR P1.4

CLR P1.3

RETI

CTC1: CPL 12H

MOV P1,#0CH

RETI

BIAOZ DATA 20H ;标志:.0定时到 。

XWEI DATA 60H ;显示位,4位:0~3

TTL0 DATA 61H

TTH0 DATA 62H

TIME DATA 66H ;倒计时时间

BLED1 DATA 74H ;显示数据BCD

BLED2 DATA 75H

BLED3 DATA 76H

BLED4 DATA 77H

MLED1 DATA 78H ;显示数据译码

MLED2 DATA 79H

MLED3 DATA 7AH

MLED4 DATA 7BH

LEDD EQU P0 ;数码管段

LEDW EQU P2 ;数码管位

END

基于51单片机的交通灯控制设计

ORG 0000H ;主程序的入口地址

LJMP MAIN ;跳转到主程序的开始处

ORG 0003H ;外部中断0的中断程序入口地址

ORG 000BH ;定时器0的中断程序入口地址

LJMP T0_INT ;跳转到中断服务程序处

ORG 0013H ;外部中断1的中断程序入口地址

MAIN : MOV SP,#50H

MOV IE,#8EH ;CPU开中断 ,允许T0中断,T1中断和外部中断1中断

MOV TMOD,#51H ;设置T1为计数方式,T0为定时方式,且都工作于模式1

MOV TH1,#00H ;T1计数器清零

MOV TL1,#00H

SETB TR1 ;启动T1计时器

SETB EX1 ;允许INT1中断

SETB IT1 ;选择边沿触发方式

MOV DPTR ,#0003H

MOV A, #80H ;给8255赋初值 ,8255工作于方式0

MOVX @DPTR, A

AGAIN: JB P3.1,N0 ;判断是否要设定东西方向红绿灯时间的初值 ,若P3.1为1 则跳转

MOV A,P1

JB P1.7,RED ;判断P1.7是否为1,若为1则设定红灯时间,否则设定绿灯时间

MOV R0,#00H ;R0清零

MOV R0,A ;存入东西方向绿灯初始时间

MOV R3,A

LCALL DISP1

LCALL DELAY

AJMP AGAIN

RED: MOV A,P1

ANL A,#7FH ;P1.7置0

MOV R7,#00H ;R7清零

MOV R7,A ;存入东西方向红灯初始时间

MOV R3,A

LCALL DISP1

LCALL DELAY

AJMP AGAIN

;-------------------------------------------

N0: SETB TR0 ;启动T0计时器

MOV 76H,R7 ;红灯时间存入76H

N00: MOV A,76H ;东西方向禁止 ,南北方向通行

MOV R3,A

MOV DPTR,#0000H ;置8255A口,东西方向红灯亮,南北方向绿灯亮

MOV A,#0DDH

MOVX @DPTR, A

N01: JB P2.0,B0

N02: SETB P3.0

CJNE R3,#00H,N01 ;比较R3中的值是否为0 ,不为0转到当前指令处执行

;------黄灯闪烁5秒程序------

N1: SETB P3.0

MOV R3,#05H

MOV DPTR,#0000H ;置8255A口,东西,南北方向黄灯亮

MOV A,#0D4H

MOVX @DPTR,A

N11: MOV R4,#00H

N12: CJNE R4,#7DH,$ ;黄灯持续亮0.5秒

N13: MOV DPTR,#0000H ; 置8255A口 ,南北方向黄灯灭

MOV A,#0DDH

MOVX @DPTR,A

N14: MOV R4,#00H

CJNE R4,#7DH,$ ;黄灯持续灭0.5秒

CJNE R3,#00H,N1 ;闪烁时间达5秒则退出

;------------------------------------------------------------

N2: MOV R7,#00H

MOV A,R0 ;东西通行,南北禁止

MOV R3,A

MOV DPTR,#0000H ; 置8255A口,东西方向绿灯亮 ,南北方向红灯亮

MOV A,#0EBH

MOVX @DPTR,A

N21: JB P2.0,T03

N22: CJNE R3,#00H,N21

;------黄灯闪烁5秒程序------

N3: MOV R3,#05H

MOV DPTR,#0000H ;置8255A口,东西,南北方向黄灯亮

MOV A,#0E2H

MOVX @DPTR,A

N31: MOV R4,#00H

CJNE R4,#7DH,$ ;黄灯持续亮0.5秒

N32: MOV DPTR,#0000H ; 置8255A口 ,南北方向黄灯灭

MOV A,#0EBH

MOVX @DPTR,A

N33: MOV R4,#00H

CJNE R4,#7DH,$ ;黄灯持续灭0.5秒

CJNE R3,#00H,N3 ;闪烁时间达5秒则退出

SJMP N00

;------闯红灯报警程序------

B0: MOV R2,#03H ;报警持续时间3秒

B01: MOV A,R3

JZ N1 ;若倒计时完毕 ,不再报警

CLR P3.0 ;报警

CJNE R2,#00H,B01 ;判断3秒是否结束

SJMP N02

;------1秒延时子程序-------

N7: RETI

T0_INT:MOV TL0,#9AH ;给定时器T0送定时10ms的初值

MOV TH0,#0F1H

INC R4

INC R5

CJNE R5,#0FAH,T01 ;判断延时是否够一秒,不够则调用显示子程序

MOV R5,#00H ;R5清零

DEC R3 ;倒计时初值减一

DEC R2 ;报警初值减一

T01: ACALL DISP ;调用显示子程序

RETI ;中断返回

;------显示子程序------

DISP: JNB P2.4,T02

DISP1: MOV B,#0AH

MOV A,R3 ;R3中值二转十显示转换

DIV AB

MOV 79H,A

MOV 7AH,B

DIS: MOV A,79H ;显示十位

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOV DPTR,#0002H

MOVX @DPTR,A

MOV DPTR,#0001H

MOV A,#0F7H

MOVX @DPTR,A

LCALL DELAY

DS2: MOV A,7AH ;显示个位

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOV DPTR,#0002H

MOVX @DPTR,A

MOV DPTR,#0001H

MOV A,#0FBH

MOVX @DPTR,A

RET

;------东西方向车流量检测程序------

T03: MOV A,R3

SUBB A,#00H ;若绿灯倒计时完毕,不再检测车流量

JZ N3

JB P2.0,T03

INC R7

CJNE R7,#64H,E1

MOV R7,#00H ;中断到100次则清零

E1: SJMP N22

;------东西方向车流量显示程序------

T02: MOV B,#0AH

MOV A,R7 ;R7中值二转十显示转换

DIV AB

MOV 79H,A

MOV 7AH,B

DIS3: MOV A,79H ;显示十位

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOV DPTR,#0002H

MOVX @DPTR,A

MOV DPTR,#0001H

MOV A,#0F7H

MOVX @DPTR,A

LCALL DELAY

DS4: MOV A,7AH ;显示个位

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOV DPTR,#0002H

MOVX @DPTR,A

MOV DPTR,#0001H

MOV A,#0FBH

MOVX @DPTR,A

LJMP N7

;------延时4MS子程序----------

DELAY: MOV R1,#0AH

LOOP: MOV R6,#64H

NOP

LOOP1: DJNZ R6,LOOP1

DJNZ R1,LOOP

RET

;------字符表------

TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

END

用单片机模拟控制控制交通信号灯。 题目如下; 只要做出来 ,分不是问题!

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit RED_A=P0^0; //东西向灯

sbit YELLOW_A=P0^1;

sbit GREEN_A=P0^2;

sbit RED_B=P0^3; //南北向灯

sbit YELLOW_B=P0^4;

sbit GREEN_B=P0^5;

uchar Flash_Count=0,Operation_Type=1; //闪烁次数,操作类型变量

《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例

5

上海师范大学信息与机电工程学院—倪继锋

//延时

void DelayMS(uint x)

{

uchar i;

while(x--) for(i=0;i<120;i++);

}

//交通灯切换

void Traffic_Light()

{

switch(Operation_Type)

{

case 1: //东西向绿灯与南北向红灯亮

RED_A=1;YELLOW_A=1;GREEN_A=0;

RED_B=0;YELLOW_B=1;GREEN_B=1;

DelayMS(2000);

Operation_Type=2;

break;

case 2: //东西向黄灯闪烁,绿灯关闭

DelayMS(300);

YELLOW_A=~YELLOW_A;GREEN_A=1;

if(++Flash_Count!=10) return; //闪烁5 次

Flash_Count=0;

Operation_Type=3;

break;

case 3: //东西向红灯 ,南北向绿灯亮

RED_A=0;YELLOW_A=1;GREEN_A=1;

RED_B=1;YELLOW_B=1;GREEN_B=0;

DelayMS(2000);

Operation_Type=4;

break;

case 4: //南北向黄灯闪烁5 次

DelayMS(300);

YELLOW_B=~YELLOW_B;GREEN_B=1;

if(++Flash_Count!=10) return;

Flash_Count=0;

Operation_Type=1;

}

}

//主程序

void main()

{

while(1) Traffic_Light();

}

参考《51单片机C语言创新教程》温子祺等著。

源码转自:《51单片机C语言创新教程》 。

/*实验名称:交通灯实验

*描述:交通灯实验要求红灯亮15秒,绿灯亮10秒,黄灯亮5秒 ,

当红灯切换为绿灯或者绿灯切换为红灯,

要实现灯闪烁 。红灯 、绿灯、黄灯的点亮持续时间可以通过串口来修改,

并在下一个循环中更新数值。

*作者:温子祺

*修改日期:2010/5/4

*说明:代码注释与讲解详见《51单片机C语言创新教程》温子祺等著 ,北京航空航天大学出版社

*/

#include?"stc.h"

typedef?unsigned?charUINT8;

typedef?unsigned?int UINT16;

typedef?unsigned?longUINT32;?

typedef?charINT8;

typedef?int?INT16;

typedef?longINT32;

#define?TIMER0_INITIAL_VALUE?5000

#define?HIGH1

#define?LOW0

#define?ON?1

#define?OFF0

#define?SEG_PORTP0

#define?LS164_DATA(x)?{if((x))P0_4=1;else?P0_4=0;}?

#define?LS164_CLK(x){if((x))P0_5=1;else?P0_5=0;}?

#define?NORTH_R_LIGHT(x){if((x))P2_0=0;else?P2_0=1;}

#define?NORTH_Y_LIGHT(x){if((x))P2_1=0;else?P2_1=1;}

#define?NORTH_G_LIGHT(x){if((x))P2_2=0;else?P2_2=1;}

#define?SOUTH_R_LIGHT(x){if((x))P2_3=0;else?P2_3=1;}

#define?SOUTH_Y_LIGHT(x){if((x))P2_4=0;else?P2_4=1;}

#define?SOUTH_G_LIGHT(x){if((x))P2_5=0;else?P2_5=1;}

#define?TRAFFIC_STATUS_10

#define?TRAFFIC_STATUS_21

#define?TRAFFIC_STATUS_32

#define?UART_MARKER0xEE

UINT8?Timer0IRQEvent=0;

UINT8?Time1SecEvent=0;

UINT8?Time500MsEvent=0;

UINT8?TimeCount=0;

UINT8?SegCurPosition=0;

UINT8?LightOrgCount[4]={15,5,15,5};

UINT8?LightCurCount[4]={15,5,15,5};

UINT8?TrafficLightStatus=0;

code?UINT8?SegCode[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

UINT8?SegBuf[4]?={0};

code?UINT8?SegPosition[4]={0x07,0x0b,0x0d,0x0e};

typedef?struct?_LIGHT_VAL

{

UINT8?Head;

UINT8?val[4];?

}LIGHT_VAL;

typedef?union?_LIGHT_VAL_EX

{

LIGHT_VAL?lv;

UINT8p[5];?

}LIGHT_VAL_EX;

void?LS164Send(UINT8?byte)

{

UINT8?j;

for(j=0;j<=7;j++)

{

if(byte&(1<<(7-j)))

{

LS164_DATA(HIGH);

?}

?else

?{

LS164_DATA(LOW);

?}

LS164_CLK(LOW);?

LS164_CLK(HIGH);

}

}

void?RefreshDisplayBuf(UINT8?s1) ?//刷新显示缓存

{

SegBuf[0]?=?s1%10;

SegBuf[1]?=?s1/10;

SegBuf[2]?=?s1%10;

SegBuf[3]?=?s1/10;

}

void?SegDisplay(void)

{

UINT8?t;

t?=?SegCode[SegBuf[SegCurPosition]];?

SEG_PORT?|=?0x0f;

LS164Send(t);?

SEG_PORT?=?(SEG_PORT|0x0f)?&?SegPosition[SegCurPosition];

if(++SegCurPosition>=4)?

{

SegCurPosition=0;

}

?

}

void?TimerInit(void)

{

TH1?=?0;

TL1?=?0;?

TH0?=?(65536-TIMER0_INITIAL_VALUE)/256;

TL0?=?(65536-TIMER0_INITIAL_VALUE)%256;?//定时1MS

TMOD?=?0x51; /*01010001?T1计数,T0定时*/

}

void?Timer0Start(void)

{

TR0?=?1; //启动计时器1?

?ET0?=?1;

}

void?Timer0Stop(void)

{

TR0?=?0; //启动计时器1?

ET0?=?0;?

}

void?PortInit(void)

{

?P0=P1=P2=P3=0xFF;

}

void?UartInit(void)

{

SCON=0x40;

T2CON=0x34;

RCAP2L=0xD9;

RCAP2H=0xFF;

REN=1;

ES=1;

}

void?UartSendByte(UINT8?byte)

{

SBUF=byte;

while(TI==0);

TI=0;

}

void?UartPrintfString(INT8?*str)

{

while(str?&&?*str)

{

UartSendByte(*str++);

}

}

void?main(void)

{

UINT8?i=0;

PortInit();

TimerInit();

Timer0Start();

UartInit();

RefreshDisplayBuf(LightCurCount[0]);

EA=1;

NORTH_R_LIGHT(ON);

SOUTH_G_LIGHT(ON);

while(1)

{

if(Timer0IRQEvent)

{?

Timer0IRQEvent=0;

TimeCount++;

if(TimeCount>=200)

{

TimeCount=0;

if(LightCurCount[0])

{

TrafficLightStatus=0;

}

else?if(LightCurCount[1])

{

TrafficLightStatus=1;

}

else?if(LightCurCount[2])

{

TrafficLightStatus=2;

}

else?if(LightCurCount[3])

{

TrafficLightStatus=3;

}

else?

{

for(i=0;i<4;i++)

{

LightCurCount[i]=LightOrgCount[i];

}

TrafficLightStatus=0;

}

switch(TrafficLightStatus)

{

case?0:

{

NORTH_R_LIGHT(ON);

SOUTH_R_LIGHT(OFF);

NORTH_G_LIGHT(OFF);

SOUTH_G_LIGHT(ON);

NORTH_Y_LIGHT(OFF);

SOUTH_Y_LIGHT(OFF);

}

break;

case?1:

{

if(LightCurCount[1]%2)

{

NORTH_R_LIGHT(ON);

SOUTH_G_LIGHT(ON);

}

else

{

NORTH_R_LIGHT(OFF);

SOUTH_G_LIGHT(OFF);

}

NORTH_Y_LIGHT(ON);

SOUTH_Y_LIGHT(ON);

}

break;

case?2:

{

NORTH_R_LIGHT(OFF);

SOUTH_R_LIGHT(ON);

NORTH_G_LIGHT(ON);

SOUTH_G_LIGHT(OFF);

NORTH_Y_LIGHT(OFF);

SOUTH_Y_LIGHT(OFF);

}

break;

case?3:

{

if(LightCurCount[3]%2)

{

NORTH_G_LIGHT(ON);

SOUTH_R_LIGHT(ON);

}

else

{

NORTH_G_LIGHT(OFF);

SOUTH_R_LIGHT(OFF);

}

NORTH_Y_LIGHT(ON);

SOUTH_Y_LIGHT(ON);

}

break;?

default:break;?

}

RefreshDisplayBuf(LightCurCount[TrafficLightStatus]);

LightCurCount[TrafficLightStatus]--;

}

SegDisplay();

}

}

}

void?UartIRQ(void)interrupt?4?

{

static?UINT8?cnt=0;

static?LIGHT_VAL_EX?LightValEx;

if(RI)

{

RI=0;

?LightValEx.p[cnt++]=SBUF;

if(LightValEx.lv.Head?==?UART_MARKER)

{?

if(cnt>=5)

{

for(cnt=1;cnt<5;cnt++)

{

LightOrgCount[cnt-1]=LightValEx.lv.val[cnt];?

LightCurCount[cnt-1]=LightValEx.lv.val[cnt];

}

cnt=0;

UartPrintfString("设置交通灯完成\r\n");

}

}

else

{

cnt=0;

}

}

}

void?Timer0IRQ(void)?interrupt?1?

{

ET0 =?0;

TH0?=?(65536-TIMER0_INITIAL_VALUE)/256;

TL0?=?(65536-TIMER0_INITIAL_VALUE)%256;?//定时1MS

Timer0IRQEvent=1;

ET0 =?1;

}

=====================================================================

坐等拿分!

关于基于单片机的交通信号灯模拟控制系统设计的探讨就到这里,您是否还有其他想了解的内容?欢迎在评论区留言告诉我们,同时别忘了点击关注哦!

(7)

猜你喜欢

发表回复

本站作者才能评论

评论列表(3条)

  • admin的头像
    admin 2026年07月21日

    我是宝凯利的签约作者“admin”

  • admin
    admin 2026年07月21日

    本文概览:近期关于基于单片机的交通信号灯模拟控制系统设计的讨论热度持续攀升,我们通过多方渠道收集整理了相关资讯,并进行了系统化的梳理。若这些内容恰好能为您提供参考,将是我们最大的荣幸。;...

  • admin
    用户072112 2026年07月21日

    文章不错《基于单片机的交通信号灯模拟控制系统设计》内容很有帮助

联系我们:

邮件:宝凯利@gmail.com

工作时间:周一至周五,9:30-17:30,节假日休息

关注微信