单片机 交通灯控制电路的设计(急求硬件电路图和程序)
发布网友
发布时间:2022-05-14 10:19
我来回答
共3个回答
热心网友
时间:2023-10-13 22:31
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,你可以自己在加一个循环增加延时时间,这个程序黄灯没有闪你加一个求反就可以了
热心网友
时间:2023-10-13 22:31
#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;
}
}
}
}
热心网友
时间:2023-10-13 22:32
大工程一个