|
ORG 0000H ;
AJMP START ;
ORG 000BH ;定时器0的中断向量地址
AJMP TIME0 ;跳转到真正的定时器程序处
ORG 0030H ;
START:MOV P1,#0FFH ;关所有的灯
MOV 30H,#00H ;软件计数器预清0
MOV TMOD,#01H ;定时/计数器0工作于方式1
MOV TH0,#3CH ;
MOV TL0,#0B0H ;立即数15536
SETB EA ;开总中断允许
SETB ET0 ;开定时/计数器0允许
SETB TR0 ;定时/计数器0开始运行
此处漏了LOOP:SJMP LOOP
TIME0:
PUSH ACC ;将ACC推入堆栈保护
PUSH PSW ;将PSW推入堆栈保护
INC 30H ;
INC 31H ;
inc 32h
MOV A,30H ;
CJNE A,#30,TNEXT ;30H单元中的值到了20了吗—此处按解释应为CJNE A,#20,TNEXT
CPL P1.0 ;到了取反P1.0
MOV 30H,#0 ;清软件计数器
TNEXT:MOV A,31H ;
CJNE A,#20,TRENT ;31H单元中的值到40了吗—此处按解释应为CJNE A,#40,TNEXT
CPL P1.1 ;
MOV 31H,#0 ;到了取反P1.1并清计数器返回
TRENT:MOV A,32H
CJNE A,#20,TRET
CPL P1.2
MOV 32H,#0
TRET:MOV TH0,#15H ;
MOV TL0,#9FH ;重置定时常数
POP PSW ;
POP ACC ;
RETI ;
END
以上修改仅从语意而言。从实现的角度来说,lz的程序的目的未明。要注意的是(并不是指错误):
1.定时器初始常数与工作常数不一致。
2.只有30h初始化为0,31h,32h可能是随机值(在干扰等因素下更可能发生)。
3.亮灯的三个端口中任意端翻转后继续运行下面的程序,根据检测存储单元值继续判断其他的端是否翻转。
4.未设置SP,应防止堆栈溢出,增强系统稳定性。
只是浏览一下,暂时先这点吧~ |
|