ORG 00H ;起始地址
STRAT ;程序已开始初始一些所需要的变量,如进位c清零等
MOV A,#0FFH ;累加器的八位全置一(0ffh),发光二极管全熄灭
CLR C ;进位c被清零,c=0
MOV R1,#8 ;R1等于八,循环八次(右移八次),用R1做计数器
RIGHT
RRC A ;把进位c在累加器A中从左到右轮换一次
MOV P2,A ;输出到P2口
CALL DELAY ;调用延时子程序,延时一秒
DJNZ R1,RIGHT ;R1减一如果不为零,跳回RIGHT循环执行
MOV R2,#7 ; R2=7为向左流动设置次数
LEFT
RLC A ;把进位C在累加器中从左向右轮换一位
MOV P2,A ; 输出至P2口
CALL DELAY ;调用延时子程序延时1秒
DJNZ R2,LEFT;是否左移了七次,如果不是则跳回LEFT继续执行
JMP START ;跳回一开始重复执行该流水灯程序
DELAY
MOV R3,#20
D1:
MOV R4,#100
D2:
MOV R5,#248
DJNZ R5,$ ;R5减一如果不为零就执行本行。时间计算【1+(248×2)】×100×20
DJNZ R4,D2 ;上一个语句是执行一次耗费两个周期,要执行248次
DJNZ R3,D1 ;所以时间就是248×2,MOV R5,#248这个语句是一个周期
;所以为248×2+1,DJNZ R4,D2这个是R4减一次就执行D2
RET ; DJNZ R3,D1同理 所以是(1+248×2)×100×20个机器周期
END ;如果是按12兆的晶振(一个机器周期1微妙)来算那 时间等于(1+248×2)×100×20个机器周期×1微妙=1000000微妙=1秒,如果是11.0592兆的晶振那 时间等于(1+248×2)×100×20×12/11.0592微妙,也就是说一个机器周期的时间等于12/(晶振的频率)。
这个是P2口 8个灯的循环亮程序;顺便帮你写个c语言的程序,高手勿喷啊
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delay();
void main()
{
uchar a;
P2=0x01;
while(1)
{
for(a=0;a<7;a++)
{
P2=_crol_(P1,1);
delay();
}
for(a=0;a<7;a++)
{
P2=_cror_(P1,1);
delay();
}
}
}
void delay()
{
uchar s,i;
for(s=10;s>0;s--)
for(i=100;i>0;i--);
}
c语言就不多说啦,仅供参考。不过我觉得还是用c语言单片机编程简单。 电路连接见仿真图
追问我就想知道例如MOV R4#100 对应的是c语言哪一句,写一个汇编语言,旁边写一个相同作用的c语言,就是用c语言在旁边翻译出来,用文字解释太抽象了,不好理解,能用c语言对应的是汇编的哪一句就最好了,因为分开写,还是看不懂汇编说的是什么意思啊
追答用C语言直接操作寄存器不是很方便,得先绑定寄存器的地址;
*(volatile unsigned int *)(R4)=0x00000003;//数字为R4寄存器的地址,
R4=100;
这个你可以看单片机的datesheet上查找R4的具体地址;
翻译过来就是这句;
R3 R4寄存器是用来存放数据的,
在C语言中你定义了一个变量会被存放到寄存器中去,但是具体存放到哪个寄存器是编译器决定的,就像这样 int a; a=100; 用来存放一个数据的