关于51的定时器
时间:10-02
整理:3721RD
点击:
最近学习定时器,就想自己编一个利用定时器定时一秒输出方波,来点亮,熄灭小灯,但是结果不对。这个程序在哪里有问题呢?对于关于定时器的程序改按怎样的顺序来看,工作的顺序是怎样的?希望大神百忙之中,指点一二、谢谢!
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP LOOP1
ORG 1000H
MAIN:
MOV P0,#00H
ACALL DELAY
MOV A,P0
CPL A
MOV P0,A
LJMP MAIN
DELAY:
MOV B,#0AH
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB EA
SETB ET0
SETB TR0
RET
LOOP1:
MOV TH0,#3CH
MOV TL0,#0B0H
DJNZ B,LOOP2
MOV B,#0AH
LOOP2:
RETI
END
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP LOOP1
ORG 1000H
MAIN:
MOV P0,#00H
ACALL DELAY
MOV A,P0
CPL A
MOV P0,A
LJMP MAIN
DELAY:
MOV B,#0AH
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB EA
SETB ET0
SETB TR0
RET
LOOP1:
MOV TH0,#3CH
MOV TL0,#0B0H
DJNZ B,LOOP2
MOV B,#0AH
LOOP2:
RETI
END
你应该把P0电平的转换放在中断函数里面才行的,你现在P0电平变化和定时器中断无关,只和main函数的运行频率有光。我改了一下程序,你参考一下。程序还没有运行过。不知道有没有问题。有问题再上来问。
- ORG 0000H
- LJMP MAIN
- ORG 000BH
- LJMP LOOP1
- ORG 1000H
- MAIN:
- ACALL LOOP0
- AJMP $
- LOOP0:
- MOV TMOD,#01H
- MOV TH0,#3CH
- MOV TL0,#0B0H
- SETB EA
- SETB ET0
- SETB TR0
- RET
- LOOP1:
- MOV TH0,#3CH
- MOV TL0,#0B0H
- DJNZ B,LOOP2
- MOV B,#0AH
- MOV A,P0
- CPL A
- MOV P0,A
- LOOP2:
- RETI
- END
按我原本的想法
MAIN:
MOV P0,#00H
ACALL DELAY
MOV A,P0
CPL A
MOV P0,A
LJMP MAIN
如果将定时器看做延时函数的话,程序应该正确。您的意思是,定时器不能将它看做延迟函数?为什么呢?谢谢!
小编还是对定时器的工作原理有点搞不懂。建议小编还是看看书,看下定时器中断是怎样工作的。
另附我在另一个帖子的回复给你参考下,希望对你有帮助。
http://bbs.elecfans.com/forum.php?mod=viewthread&tid=431136&page=1#pid2891135
好的,谢谢您!真心感谢!
