第1个回答 2010-12-02
LED EQU P2
ORG 0000H
LJMP START
ORG 0030H
START: MOV SP,#60H
LCALL S0 ;初始状态(都是红灯)
LCALL S1 ;南北绿灯,东西红灯
LCALL S2 ;南北绿灯闪转黄灯,东西红灯
LCALL S3 ;南北红灯,东西绿灯
LCALL S4 ;南北红灯,东西绿灯闪转黄灯
LJMP START
S0: MOV A,#00100001B ;南北红灯,东西红灯
MOV LED,A
MOV R2,#10 ;延时1m秒
LCALL DELAY
RET
S1: MOV A,#10000001B ;南北绿灯,东西红灯
MOV LED,A
MOV R2,#50 ;延时5秒
LCALL DELAY
RET
S2: MOV R3,#03H ;南北绿灯闪3次
FLASH: MOV A,#00000001B ;南北绿灯灭,东西红灯亮
MOV LED,A
MOV R2,#03H
LCALL DELAY
MOV A,#10000001B ;南北黄灯,东西红灯
MOV LED,A
MOV R2,#03H
LCALL DELAY
DJNZ R3,FLASH
MOV A,#01000001B
MOV LED,A
MOV R2,#10 ;延时1秒
LCALL DELAY
RET
S3: MOV A,#00100100B ;南北红灯,东西绿灯
MOV LED,A
MOV R2,#50 ;延时5秒
LCALL DELAY
RET
S4: MOV R3,#03H ;东西绿灯闪3次
FLASH1: MOV A,#00100000B ;南北红灯亮,东西绿灯灭
MOV LED,A
MOV R2,#03H
LCALL DELAY
MOV A,#00100100B ;南北红灯亮,东西绿灯亮
MOV LED,A
MOV R2,#03H
LCALL DELAY
DJNZ R3,FLASH1
MOV A,#00100010B ;南北红灯,东西黄灯
MOV LED,A
MOV R2,#10 ;延时1秒
LCALL DELAY
RET
DELAY: PUSH 02H ;延时子程序
PUSH 01H
PUSH 00H
DELAY1: MOV R1,#00H
DELAY2: MOV R0,#0C2H
DJNZ R0,$
DJNZ R1,DELAY2 ;延时100ms
DJNZ R2,DELAY1
POP 00H
POP 01H
POP 02H
RET
END
C51参考程序:
/* 交通灯实验 */
//====================声明区========================
#include<reg51.h> // 定义8051暂存器之标头档
#define LED P2 //定义指示灯
void s1(void); //南北绿灯,东西红灯,延时5秒
void s2(void); //南北绿灯闪5次,南北绿灯灭,南北黄灯亮,延时1秒
void s3(void); //南北红灯,东西绿灯,延时5秒
void s4(void); //东西绿灯闪5次,东西绿灯灭,东西黄灯亮,延时1秒
void delay1ms(int x); //延迟函数声明
//======================主程序==============================
main() // 主程序开始
{
int i;
LED=0x21; //初始状态00100001b(都是红灯)
delay1ms(100); //延时
while(1)
{
for(i=1;i<5;i++)
{
switch(i)
{
case 1:s1();break; //南北绿灯,东西红灯,延时5秒
case 2:s2();break; //南北绿灯闪5次,南北绿灯灭,南北黄灯亮,延时1秒
case 3:s3();break; //南北红灯,东西绿灯,延时5秒
case 4:s4();break; //东西绿灯闪5次,东西绿灯灭,东西黄灯亮,延时1秒
}
}
}
} // 主程序结束
// ================ 南北绿灯,东西红灯,延时5秒函数==============
void s1(void) //南北绿灯,东西红灯,延时5秒
{
LED=0x81; // 南北绿灯,东西红灯(10000001b)
delay1ms(5000); //延时5秒
}
// =========== 南北绿灯闪5次,南北绿灯灭,南北黄灯亮,延时1秒函数 =========
void s2(void) //南北绿灯闪5次,南北绿灯灭,南北黄灯亮,延时1秒
{
int i;
for(i=0;i<5;i++)
{
LED=0x01; //南北绿灯灭,东西红灯亮(00000001b)
delay1ms(200); //延时20毫秒
LED=0x81; //南北绿灯亮,东西红灯亮(10000001b)
delay1ms(200); //延时20毫秒
}
LED=0x41; //南北黄灯,东西红灯(01000001b)
delay1ms(1000); //延时1秒
}
// ==============南北红灯,东西绿灯,延时5秒函数================
void s3(void) //南北红灯,东西绿灯,延时5秒
{
LED=0x24; //南北红灯,东西绿灯(00100100b)
delay1ms(5000); //延时5秒
}
// ========== 东西绿灯闪5次,东西绿灯灭,东西黄灯亮,延时1秒函数 =========
void s4(void) // 东西绿灯闪5次,东西绿灯灭,东西黄灯亮,延时1秒
{
int i;
for(i=0;i<5;i++)
{
LED=0x20; //南北红灯亮,东西绿灯灭(00100000b)
delay1ms(200); //延时20毫秒
LED=0x24; //南北红灯亮,东西绿灯亮(00100100b)
delay1ms(200); //延时20毫秒
}
LED=0x22; //南北红灯,东西黄灯(00100010b)
delay1ms(1000); //延时1秒
}
// ================= 延迟函数,延迟约x*1ms ======================
void delay1ms(int x)
{ int i,j; // 声明整数变数i
for(i=0;i<x;i++) // 计数x次,延迟约*1ms
for(j=0;j<120;j++); // 计数120次,延迟约1ms
}本回答被网友采纳