请给我翻译一下这个单片机51的程序(加注释)

org 0000h
LJMP MAIN
org 0003h
ljmp int0
org 000Bh
ljmp timer0
MAIN:
MOV SP,#60h
mov TCON,#00000001b
mov IE,#10000011b
START:
mov A,#0fh
clr c
MOV R2,#08H
LOOP: RLC A ;左移一位
MOV P1,A ;输出至P0
LCALL DELAY ;延时0.2秒
DJNZ R2,LOOP ;左移7次?
MOV R2,#07H
LOOP1:RRC A ;右移一位
MOV P1,A ;输出至P0
LCALL DELAY
DJNZ R2,LOOP1 ;右移7次?
JMP START
int0: push psw
push a
mov TMOD,#00000001b
mov TL0,#0f0h
mov TH0,#0D8h
mov r2,#3
mov a,#00010000b
clr c
setb tr0
mov p1,a
HERE: cjne r2,#0,HERE
pop a
pop psw
RETI
timer0:
push psw
clr tr0
dec r2
RLC a
mov p1,a
mov TL0,#0f0h
mov TH0,#0D8h
setb tr0
pop psw
RETI
DELAY:MOV R3,#20 ;延时0.2秒
D1: MOV R4,#40
D2: MOV R5,#248
DJNZ R5,$
DJNZ R4,D2
DJNZ R3,D1
RET
END

org 0000h ;指定程序存放的地址
LJMP MAIN ;转主程序MAIN
org 0003h ;指定程序存放的地址
ljmp int0 ;转中断入口INT0
org 000Bh ;指定程序存放的地址
ljmp timer0 ;转定时中断入口timer0
MAIN: ;主程序
MOV SP,#60h ;设栈底60H
mov TCON,#00000001b ;
mov IE,#10000011b ;开中断

START: ;开始

mov A,#0fh ;送0F到A
clr c ;清进位
MOV R2,#08H ;送08到R2
LOOP: RLC A ;A带进位左环移
MOV P1,A ;A输出至P0
LCALL DELAY ;延时0.2秒
DJNZ R2,LOOP ;环移R2次

MOV R2,#07H ;R2设为07
LOOP1:RRC A ;A带进位右环移
MOV P1,A ;A输出至P0
LCALL DELAY
DJNZ R2,LOOP1 ;右环移R2次

JMP START ;跳到开始重来

int0: push psw ;中断入口,PSW进栈,保护标志
push a ;A进栈,保护A
mov TMOD,#00000001b,设定时器0为方式1
mov TL0,#0f0h ;设定时器初值
mov TH0,#0D8h ;设定时器初值
mov r2,#3 ;设R2为3
mov a,#00010000b ;A=#00010000b
clr c ;清进位
setb tr0 ;开始定时
mov p1,a ;把A输出至P1
HERE: cjne r2,#0,HERE,;R2不等于0,继续自跳等待
pop a ;A出栈,恢复受保护的A
pop psw ;PSW出栈
RETI ;中断返回

timer0: ;定时中断
push psw ;PSW进栈
clr tr0 ;停止定时器
dec r2 ;R2减1
RLC a ;A带进位左环移
mov p1,a ;从P1输出A
mov TL0,#0f0h ;重设定时器初值
mov TH0,#0D8h
setb tr0 ;开始计时
pop psw ;PSW出栈
RETI ;中断返回

DELAY:MOV R3,#20 ;延时0.2秒
D1: MOV R4,#40 ;送40到R4
D2: MOV R5,#248 送248到R5
DJNZ R5,$ ;R5减1,不为0再减,直至为0
DJNZ R4,D2 ;R4减1,不为0,转D2
DJNZ R3,D1 ;R3减1,不为0,转D1
RET ;返回
END
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-04-22
如果每条语句都加上正确注释的话,我估计LZ也是不太看的懂的(不是讽刺的意思,我也如此)。
大致说一下整个流程吧,个人感觉此程序应该是跑马灯之类的。
首先在P1口上输出0x0f,接下来把0x0f 带进位依次左移动7次并每次在P1口上输出,,7次左移输出后,P1口在把7次左移后的输出,在连续6次带进位右移输出,,,,,如此循环。
第2个回答  2009-04-23
这么简单还要翻译,何必呢
相似回答