交通信号灯控制程序设计

交通信号灯控制程序设计,第1张

简单I/O实验(交通灯控制)

一.实验要求

以74LS273作为输出口,控制4个双色LED灯(可发红,绿,黄光),模拟交通灯管理。

二.实验目的

1.学习在单片机系统中扩展简单I/O接口的方法。

2.学习数据输出程序的设计方法。

3.学习模拟交通灯控制的方法。

4.学习双色灯的使用。

三.实验电路及连线

四.实验说明

1.因为本实验是交通灯控制实验,所以要先了解实际交通灯的变化规律。假设一个十字路口为东西南北走向。初始状态0为东西红灯,南北红灯。然后转状态1南北绿灯通车,东西红灯。过一段时间转状态2,南北绿灯闪几次转亮黄灯,延时几秒,东西仍然红灯。再转状态3,东西绿灯通车,南北红灯。过一段时间转状态4,东西绿灯闪几次转亮黄灯,延时几秒,南北仍然红灯。最后循环至状态1。

2.双色LED是由一个红色LED管芯和一个绿色LED管芯封装在一起,公用负端。当红色正端加高电平,绿色正端加低电平时,红灯亮;红色正端加低电平,绿色正端加高电平时,绿灯亮;两端都加高电平时,黄灯亮。

五.实验程序框图

程序框图:

源代码:

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,#5AH 南北绿灯,东西红灯

MOVX @DPTR,A

MOV R2,#50 延时5秒

LCALL DELAY

RET

STATUS2: 南北绿灯闪转黄灯,东西红灯

MOV DPTR,#8300H

MOV R3,#03H 绿灯闪3次

FLASH: MOV A,#5FH

MOVX @DPTR,A

MOV R2,#03H

LCALL DELAY

MOV A,#5AH

MOVX @DPTR,A

MOV R2,#03H

LCALL DELAY

DJNZ R3,FLASH

MOV A,#0AH 南北黄灯,东西红灯

MOVX @DPTR,A

MOV R2,#10 延时1秒

LCALL DELAY

RET

STATUS3: 南北红灯,东西绿灯

MOV DPTR,#8300H

MOV A,#0A5H

MOVX @DPTR,A

MOV R2,#50 延时5秒

LCALL DELAY

RET

STATUS4: 南北红灯,东西绿灯闪转黄灯

MOV DPTR,#8300H

MOV R3,#03H 绿灯闪3次

FLASH1: MOV A,#0AFH

MOVX @DPTR,A

MOV R2,#03H

LCALL DELAY

MOV A,#0A5H

MOVX @DPTR,A

MOV R2,#03H

LCALL DELAY

DJNZ R3,FLASH1

MOV A,#05H 南北红灯,东西黄灯

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

晚上随手写,也未调试,权当看看

程序有不严谨地方还得调试修改

#include <REGX51.H>

#define STATUS_1S 1

#define STATUS_2S 2

#define STATUS_3S 3

#define STATUS_4S 4

#define STATUS_5S 5

#define STATUS_15S 15

#define STATUS_28S 28

#define STATUS_29S 29

#define STATUS_30S 30

unsigned char flag,status,status_temp=1,status_temp_

sbit K1 = P0^0

sbit K2  = P0^1

sbit RLED = P0^2

sbit YLED = P0^3

sbit GLED = P0^4

void Init(void)

{

ET0=1

TR0=1

RLED=0  //亮

YLED=0

GLED=0

while(status_temp)

{

switch (status)

{

case STATUS_1S: //1S

{

RLED=1 //灭,闪一次

YLED=1

GLED=1

} break

case STATUS_2S: //1S

{

RLED=0 //亮,闪一次

YLED=0

GLED=0

} break

case STATUS_3S: //1S

{

RLED=1    //灭

YLED=1

GLED=1

status_temp=0

} break

}

}

status_temp=1

ET0=0

TR0=0

}

void Init_Timer0(void)

{

TMOD=0x01

// ET0=1

// TR0=1

EA=1

TH0=0X3C

TL0=0XB0    // 未计算,偷楼上的

}

void M_Start(void)

{

TH0=0X3C

TL0=0XB0

ET0=1

TR0=1

RLED=0  //红亮

while(status_temp)

{

switch (status)

{

case STATUS_1S:

{

if(status_temp_==1)

{

YLED=0

}

} break

case STATUS_2S:

{

if(status_temp_==1)

{

YLED=1

}

} break

case STATUS_3S:

{

if(status_temp_==1)

{

YLED=0

status_temp_=0

}

} break

case STATUS_15S: //15S灭,绿亮

{

RLED=1

GLED=0

} break

case STATUS_28S:

{

GLED=1

} break

case STATUS_29S:

{

GLED=0

} break

case STATUS_30S:

{

GLED=1

status=0

status_temp_=1

} break

}

}

ET0=0

TR0=0

status=0

status_temp=1

YLED=1

}

void M_End(void)

{

TH0=0X3C

TL0=0XB0

ET0=1

TR0=1

RLED=0  //亮 1次

YLED=0

GLED=0

while(status_temp)

{

switch (status)

{

case STATUS_1S: //1S

{

RLED=1 //灭一次

YLED=1

GLED=1

} break

case STATUS_2S: //1S

{

RLED=0 //亮二次

YLED=0

GLED=0

} break

case STATUS_3S: //1S

{

RLED=1    ////灭二次

YLED=1

GLED=1

} break

case STATUS_4S: //1S

{

RLED=0    ////亮三次

YLED=0

GLED=0

} break

case STATUS_5S: //1S

{

RLED=1    ////灭三次

YLED=1

GLED=1

status_temp=0

} break

}

}

status_temp=1

ET0=0

TR0=0

}

main()

{

Init()//单片机初始化

Init_Timer0()//定时器初始化

while(1)

{

if(K1==0)

M_Start()//模拟开始

if(K2==0)

M_End()//模拟结束

}

}

void interrupt_time0() interrupt 1   //核对头文件,一致就好

{

TH0=0X3C

TL0=0XB0

flag++

if(flag==20)

{

status++

flag=0

}

}

你找那个kile c的代码搜一下算了,

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

uchar b=5,c

unsigned char code a[]=

sbit sg=P1^0

sbit sy=P1^1

sbit sr=P1^2

sbit hg=P1^3

sbit hy=P1^4

sbit hr=P1^5

sbit ge=P1^6

sbit shi=P1^7

uint num1,num2,num3

void delay(unsigned int z1)

{

unsigned int a1,b1

for(a1=z1a1>0a1--)

for(b1=12500b1>0b1--)

}

void main()

{

P2=0

P1=0

shi=1

P2=a[8]

shi=0

ge=1

P2=a[4]

ge=0

TMOD=0X11

TH0=(65536-50000)/256

TL0=(65536-50000)%256

TH1=(65536-50000)/256

TL1=(65536-50000)%256

EA=1

ET0=1

ET1=1

TR0=1

TR1=1

while(1)

{

switch(num2) //红绿灯

{

case(0): //10s内s绿灯亮

sr=0

hg=0

sg=1

hr=1

break

case(1): //5S:竖黄横红

sg=0

sy=1

delay(5)

sy=0

delay(5)

break

case(2): //10s:竖红横绿

sg=0

sr=1

sy=0

hg=1

hr=0

break

case(3): //5S:竖红横黄

hg=0

hy=1

delay(5)

hy=0

delay(5)

break

}

}

}

void timer0() interrupt 1 //定时器0

{

TH0=(65536-50000)/256

TL0=(65536-50000)%256

num1++

if(num1==200)

num2=1

if(num1==300)

num2=2

if(num1==500)

num2=3

if(num1==600)

{

num1=0

num2=0

}

}

void timer1() interrupt 3 //定时器1

{

TH1=(65536-50000)/256

TL1=(65536-50000)%256

num3++

if(num3>=20) //数码管显示

{

num3=0

c++

ge=1

P2=a[b++]

ge=0

if(b>=10)

b=0

if(b==1)

{

P2=a[9]

shi=1

shi=0

}

if(c>=15)

{

c=0

shi=1

P2=a[8]

shi=0

ge=1

P2=a[4]

ge=0

b=5

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7840382.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存