单片机知识,哪位给解答一下

在8051单片机中,已知晶振频率为12MHZ,试编程使P1.0和P1.1引脚分别输出周期为5s和500ms的方波.(要求:用定时器T0工作方式1.因为500ms已超过最大定时时间,所以我的思路是将第二个的定时时间也设为1ms,和那个保持一致,这样可以使程序更简洁。用循环实现延时,延时250)谁帮帮我把代码写一下 谢谢了

;P1.0和P1.1引脚分别输出周期为5s和500ms的方波,用定时中断
;P1.0是2.5S取反一次,P1.1是0.25S取反一次,
;用定时器0做0.05S的定时,再做两个软件计数器,让0.05S跑50次和5次就到
;2.5S取反一次和0.25S取反一次
;**************************************************
TM1 EQU 5
TM2 EQU 50
ORG 0000H
AJMP START
ORG 000BH
AJMP TIME0
ORG 30H
START:
MOV P1,#0FFH
MOV R6,#00H ;软件计数器预清0
MOV R7,#00H
MOV TMOD,#00000001B ;定时/计数器0工作于方式1
MOV TH0,#3CH
MOV TL0,#0B0H ;即数15536,定时0.05ms
SETB EA
SETB ET0
SETB TR0 ;定时0开始运行
LOOP:
AJMP LOOP

TIME0: ;定时器0的中断处理程序
INC R6
INC R7 ;两个计数器都加1
MOV A,R6
CJNE A,#TM1,T_NEXT ;30H单元中的值到了5了吗?
T_L1:
CPL P1.1 ;到了,取反P11
MOV R6,#0 ;清软件计数器
T_NEXT:
MOV A,R7
CJNE A,#TM2,T_RET;31h单元中的值到50了吗?
T_L2:
CPL P1.0
MOV R7,#0 ;到了,取反P10,清计数器,返回
T_RET:
MOV TH0,#3CH
MOV TL0,#0B0H ;重置定时常数
RETI
END
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-11-28
你那个想法可以的,但有些麻烦,你可能会把自己搞糊涂了。实际上还可以用另外方法实现:
就用一个定时器,在中断程序内增加两个计数变量,每次中断,它们的值增加1,到一定的数值(就是达到定时时间间隔),就把它清零,同时把指定脚的状态翻转就可以了。
这里定时器的定时值可以选为250ms,就不会超出定时器的最大值了。同时5s也是250ms的整数倍。
第2个回答  2008-11-28
你这个是作业题,建议不要的在百里面的提你们的作业了。自己学习一点东西,远远的好多向别人索取来的东西。
第3个回答  2008-11-28
其实方式1最大定时时间是65.536ms,如果选择1ms,两个方波要500,5000都超出了51单片机八位的表示范围,不如改用50ms,并用RO,R1存放10,100两个计数值就能满足要求了
ORG 0000H
SJMP START
ORG 000BH
AJMP INTT0
ORG 0040H
START:MOV SP,#60H
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
SETB ET0
SETB EA
MOV R0,#5
MOV R1,#50
LOOPA:CJNE R0,#00H,LOOPB
CPL P1.0
MOV R0,#10
LOOPB:CJNE R1,#00H,LOOPA
CPL P1.1
MOV R1,#100
AJMP LOOPA
INTT0:MOV TH0,#3CH
MOV TL0,#0B0H
DEC R0
DEC R1
RET
希望我的程序能够符合你的要求
相似回答