汇编语言/C语言实现流水灯控制系统仿真实验
话不多说,上干货!
proteus仿真原理图
汇编语言代码(Keil uVision5)
ORG 0000H //程序的开始地址0000H(LJMP)
LJMP MAIN //无条件转移指令,跳转到MAIN函数位置
ORG 0030H //以下程序(MAIN)从0030H开始保存(未用中断,可从0003H开始)
MAIN:MOV A,#0FEH // A=1111 1110B(0FEH)
LIGHT0:MOV P2,A //P2=1111 1110
RL A // A=1111 1101(左移指令)
LCALL DELAY0 //调用子程序DELAY0
CJNE A,#0FEH,LIGHT0 //A=?1111 1110,判断不相等跳转指令
MOV A,#0BFH // A=1011 1111
LIGHT1:MOV P2,A //P2=1011 1111
RR A // A=1011 1111(右移指令)
LCALL DELAY0 //调用子程序DELAY0
CJNE A,#7FH,LIGHT1 //A=?0111 1111,判断不相等跳转指令
MOV A,#0FDH // A=1111 1101
SJMP LIGHT0 //跳转到LIGHT0
DELAY0:MOV R7,#240 //R7=240(设置外循环次数)
DELAY1:MOV R6,#240 //R6=240(设置内循环次数)
DJNZ R6,$ //R6=R6-1≠0,原地跳,延时240*2us=480us
DJNZ R7,DELAY1 //R7-1≠0,跳DELAY1,延时2+240*(1+480+2)=115.922ms
RET //子程序返回
END //程序结束
C语言代码(Keil uVision5)
#include<reg51.h>
sbit LED=P2^0;
void delay(unsigned int t)
{
unsigned int i=0,j=0;
for(i=0;i<t;i++)
{
for(j=0;j<200;j++);
}
}
void led()
{
int m=0,n=0;
for(m=0;m<8;m++)
{
P2=~(0x01<<m);//0000 0001_>0000 0010
delay(50);
}
for(n=0;n<8;n++)
{ P2=~(0x80>>n);//1000 0000_>0100 0000
delay(50);
}
}
void main()
{
while(1)
{
led();
}
}
又菜又爱玩,话不多说,赞