请给我翻译一下这个单片机51的程序(加注释)
发布网友
发布时间:2023-05-17 16:32
我来回答
共3个回答
热心网友
时间:2023-07-03 08:08
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
热心网友
时间:2023-07-03 08:09
如果每条语句都加上正确注释的话,我估计LZ也是不太看的懂的(不是讽刺的意思,我也如此)。
大致说一下整个流程吧,个人感觉此程序应该是跑马灯之类的。
首先在P1口上输出0x0f,接下来把0x0f 带进位依次左移动7次并每次在P1口上输出,,7次左移输出后,P1口在把7次左移后的输出,在连续6次带进位右移输出,,,,,如此循环。
热心网友
时间:2023-07-03 08:09
这么简单还要翻译,何必呢