单片机 交通灯控制电路的设计(急求硬件电路图和程序) 30

1设计一个十字路口的交通灯控制电路要求,甲车道和乙车道两条交叉道路上的车辆交替运行,每次同行时间都设为30秒2在绿灯转为红灯时,要求黄灯先亮8秒才能交换运行车道3黄灯亮时... 1 设计一个十字路口的交通灯控制电路要求,甲车道和乙车道两条交叉道路上的车辆交替运行,每次同行时间都设为30秒
2 在绿灯转为红灯时,要求黄灯先亮8秒才能交换运行车道
3 黄灯亮时,要求每秒闪亮一次
4 甲乙除了还有红黄绿等指示外每种灯亮的时间都用数码管进行显示(采用倒计时方法)
展开
 我来答
百度网友742b063
2011-01-07 · 超过15用户采纳过TA的回答
知道答主
回答量:65
采纳率:0%
帮助的人:38.5万
展开全部
ORG 0000H
LJMP A1
A1:NOP
A2:MOV P0,#0FFH ;将p1口作为输入
MOV 30H,#0AH ;显示A
MOV 31H,#11H ;显示—
MOV 32H,#03H ;将30秒的十位送给32H
MOV 33H,#00H ;将30秒的个位送给33H
MOV R3,#30 ;设置为30秒
MOV P1,#0DEH ;A路口显示红灯,B路口显示绿灯
A3:MOV 2AH,P1 ;保存P1状态
MOV 2BH,R3 ;保存R3状态
LCALL DEL ;调用显示程序
MOV R3,2BH
DEC R3 ;将时间自减一
LJMP A4 ;跳到A4
A5:MOV A,R3 ;将剩余时间送给A
MOV B,#0AH ;把B送入10
DIV AB ;将剩余时间除以10
MOV 32H,A ;高位送给32H
MOV 33H,B ;低位送给33H
LJMP A3
A4:CJNE R3,#00H,A5 ;判断倒计时是否为0
B1:MOV P1,#0FFH ;将p1口作为输入
MOV R3,#8 ;设置为8秒
MOV 30H,#0CH ;显示C
MOV 31H,#11H ;显示—
MOV 32H,#00H ;将8秒的十位送给32H
MOV 33H,#08H ;将8秒的个位送给33H
MOV P1,#0DDH ;A路口显示黄灯,B路口显示绿灯
B2:MOV 2AH,P1 ;保存P1状态
MOV 2BH,R3 ;保存R3状态
LCALL DEL ;调用显示程序
DEC R3 ;将时间自减一
LJMP B3
B4: MOV A,R3 ;将剩余时间送给A
MOV B,#0AH ;把B送入10
DIV AB ;将剩余时间除以10
MOV 32H,A ;高位送给32H
MOV 33H,B ;低位送给33H
LJMP B2
B3:CJNE R3,#00H,B4 ;判断倒计时是否为0
C1:MOV P0,#0FFH ;将p1口作为输入
MOV 30H,#0BH ;显示C
MOV 31H,#11H ;显示—
MOV 32H,#03H ;将30秒的十位送给32H
MOV 33H,#00H ;将30秒的个位送给33H
MOV R3,#30 ;设置为30秒
MOV P1,#0F3H ;A绿B红
C2:MOV 2AH,P1 ;保存P1状态
MOV 2BH,R3 ;保存R3状态
LCALL DEL ;调用显示程序
DEC R3 ;将剩余时间自减1
LJMP C3
C4:MOV A,R3 ;将剩余时间送给A
MOV B,#0AH ;把B送入10
DIV AB ;将剩余时间除以10
MOV 32H,A ;高位送给32H
MOV 33H,B ;低位送给33H
LJMP C2
C3:CJNE R3,#00H,C4 ;判断倒计时是否为0
D1:MOV P1,#0FFH ;将p1口作为输入
MOV R3,#8 ;设置为8秒
MOV 30H,#0CH ;显示C
MOV 31H,#11H ;显示—
MOV 32H,#00H ;将8秒的十位送给32H
MOV 33H,#08H ;将8秒的个位送给33H
MOV P1,#0EBH A绿B黄
D2:MOV 2AH,P1 ;保存P1状态
MOV 2BH,R3 ;保存R3状态
LCALL DEL ;调用显示程序
DEC R3 将剩余时间自减1
LJMP D3
D4: MOV A,R3 ;将剩余时间送给A
MOV B,#0AH ;把B送入10
DIV AB ;将剩余时间除以10
MOV 32H,A ;高位送给32H
MOV 33H,B ;低位送给33H
LJMP D2
D3:CJNE R3,#00H,D4 ;判断倒计时是否为0
LJMP A2 ;循环
DEL:MOV R6,#0FFH ;延时
DEL1:MOV R2,#0F7H ;选择数码显示管
MOV R0,#30H ;将30H中的内容送给R0
DEL2:MOV A,#00H ;对A清0
MOV P0,#00H ;对P0清0
MOV A,@R0 ;将30H的内容送给A
MOV DPTR,#SGTR ;指向七段码表首地址
MOVC A,@A+DPTR ;查表
MOV P0,A
MOV P2,R2
MOV R1,#0FFH ;延时程序
DEL3:DJNZ R1,DEL3
INC R0 ;指向数码管下一位地址
MOV A,R2
RR A ;右移
MOV R2,A
JB P2.7,DEL2 ;判断4位数码管是否扫描完
DJNZ R6,DEL1 ;判断1S到否
RET

SGTR:DB 3FH,06H,5BH,4FH,66H,6DH
DB 7DH,07H,7FH,6FH,77H,7CH
DB 39H,5EH,79H,71H,00H,40H,0F3H
这个程序的延时就是通过循环显示来完成的,显示程序循环两次大概的时间就为1S,你可以自己在加一个循环增加延时时间,这个程序黄灯没有闪你加一个求反就可以了
花店小龙2
2011-01-07
知道答主
回答量:1
采纳率:0%
帮助的人:0
展开全部
#include<iom16v.h>
void delay_ms(unsigned int time)
{
unsigned int k,l;
for(k=0;k<time;k++)
for(l=0;l<1141;l++);
}
void main()
{unsigned char i,j,n,m,h;
static unsigned char led[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//定义数组0 1。。9
unsigned char count[3]={0,0,0};
DDRA=0XFF;//A口为输出
PORTA=0X00;
DDRC=0XFF;//C口为输出
PORTC=0XFF;
DDRD=0X03;//D口的PD0和PD1为输出
PORTD=0XFF;
n=0x12;
m=0x06;
h=0x02;
while(1)
{
DDRB=0XFF;//B口为输出
PORTB=n;
count[0]=1;count[1]=5;count[2]=19;//给数组COUNT赋初值。count[0]为十位,count[1]为个位
}
while(1)
{
if(0==count[2]--)//从19减到0
{count[2]=19;
if(0==count[1]--)//从5减到0
{count[1]=9;
count[0]--;// count[1]为0时count[0]减1成为0
}
}
for(i=0;i<2;i++)
{
PORTD=h;
PORTC=~led[count[i]];//输出相应数字
delay_ms(10);
h=~h;
}
if(count[0]==0&&count[1]==3)
{
PORTB=(PORTB&=m);//B输出PORTB与m的位与
PORTA=(PORTB&=m);// A输出PORTB与m的位与
}
if(count[0]==0&&count[1]==0&&count[2]==0)//当全为0时
{
PORTA=0X00;
n=~n;
m=~m;
break;
}
}
}
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友d07b083b8
2011-01-06 · TA获得超过400个赞
知道小有建树答主
回答量:88
采纳率:0%
帮助的人:107万
展开全部
大工程一个
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式