一.实验要求
以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
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)