已知8051单片机系统时钟为6MHz 利用计时器T0 使 P1.2每隔350us就数出一个50us脉宽的正脉冲 。

如何选择计时方式 以及 如何计算初值? 并用查询方法编写程序。 谢谢各位大虾

第1个回答  2011-05-24
ORG 0000H
LJMP START
ORG 000BH
LJMP Timer0Interrupt

START:
MOV SP,#60H
InitTimer0:
MOV TMOD,#01H
MOV TH0,#0FFH
MOV TL0,#51H
SETB EA
SETB ET0
SETB TR0

Timer0Interrupt:
PUSH DPH
PUSH DPL
PUSH ACC
MOV TH0,#0FFH
MOV TL0,#51H
;========================
cpl p1.2
lcall delay50us
cpl p1.2
;========================
POP ACC
POP DPL
POP DPH
RETI

DELAY50US: ;误差 0us
MOV R5,#0BH
DJNZ R5,$
RET

END追问

您好 你用的是中断方式吧? 想请问 您是否可以用查询方式 再写一次? 非常感谢

追答

ORG 0000H
LJMP START
ORG 000BH
LJMP Timer0Interrupt

START:
MOV SP,#60H
InitTimer0:
MOV TMOD,#01H
MOV TH0,#0FFH
MOV TL0,#51H
SETB EA
SETB ET0
SETB TR0

Timer0Interrupt:
PUSH DPH
PUSH DPL
PUSH ACC
;====================
WAIT:
JNB TF0,WAIT
CLR TF0
;=======================
MOV TH0,#0FFH
MOV TL0,#51H
;========================
cpl p1.2
lcall delay50us
cpl p1.2
;========================
POP ACC
POP DPL
POP DPH
RETI

DELAY50US: ;误差 0us
MOV R5,#0BH
DJNZ R5,$
RET

本回答被提问者采纳
第2个回答  2011-05-24
ORG 0000H;
SJMP START;
ORG 000BH;
LJMP Timer0Interrupt;

ORG 0030H;
START: MOV SP, #50H;
MOV TMOD, #01H;
MOV TH0, #0FFH;
MOV TL0, #0E7H;
SETB EA;
SETB ET0;
SETB TR0;
MOV R0, #0H;
MOV P1, #0H;
LOOP: CJNE R0, #07H, L1;
MOV P1, #04H;
MOV R0, #0H;
L1: MOV P1, #0H;
LJMP LOOP;

Timer0Interrupt:
PUSH DPH;
PUSH DPL;
PUSH ACC;
MOV TH0, #0FFH;
MOV TL0, #0E7H;
INC R0;
POP ACC;
POP DPL;
POP DPH;
RETI;

END;
相似回答