关于单片机定时器问题TR0。已经对单片机定时器进行初始化,CPU开放中断,T0处于工作方式1,时间是0.05s。

SETB TR0
MAIN: MOV A,3DH
MOV B,#64H
MUL AB
MOV R7,A
CLR C
MOV A,31H
SUBB A,R7
MOV A,30H
SUBB A,B
JNC AAAAA
JNB 20H.0,MAIN
AAAAA: CLR A
MOV 3CH,A
LCALL BBBBB
CLR TR0
BBBBB: RET

我想问下,这怎么定时啊,是不是定时开始后,到了时间20H.0会有变化那?
我想知道时间到后,怎么找到要执行的程序那?这段程序是书上的。
初始化已经设定好了:MOV TMOD,#21H
SETB EA
SETB ES
MOV TH0,#3CH
MOV TL0,#0AH

1、这段程序本身除了第一句SETB TR0和倒数第二句CLR TR0外,整体上没有任何与定时器0相关的内容。
2、感觉你的程序似乎只有一部分,而且最后部份有问题:
LCALL BBBBB
CLR TR0
BBBBB: RET
调用BBBBB后,执行RET,然后返回继续执行下一行:CLR TR0,然后又去执行RET,等于是并未调用BBBBB子程序却执行了,这样程序可能会跑飞的。至少应在CLR TR0之后加一句JMP $原地循环。
3、关于怎么找到要执行的程序,后面详细说明。
4、分析程序及你的提问,以及我在2、中的描述,实在看不出想实现的流程,也许20H.0确实是在中断服务子程序中修改的,但我不敢确定
5、关于定时器初始化,按你给出代码整理一下,如果原来程序中不全可能无法实现中断:
MOV TMOD,#21H ;定时器0定时方式1,16位模式
SETB EA ;总中断允许
SETB ES ;允许串口中断,这是针对串口的,如不用串口此句可以不要
MOV TH0,#3CH ;定时初值
MOV TL0,#0AH ;定时初值
SETB ET0 ;允许定时器0中断,没有这句定时器0中断不会被响应
SETB TR0 ;启动定时器0
至此定时器0的初始化才算完整。然后可以编制中断服务程序,比如:
TIMER0_P:
MOV TH0,#3CH ;重新装填初值,以便下次中断
MOV TL0,#0AH ;同上
CLR 20H.0 ;实现功能举例
..........................................
RETI ;退出中断,注意不是RET
最后在源程序代码开始处写如下语句:
ORG 0000H
LJMP START ;跳转到主程序
ORG 000BH
LJMP TIMER0_P ;定时中断0服务子程序入口,直接跳转到TIMER0_P程序实体
ORG 0100H
START: ;主程序开始
..................
MAIN: ;主循环体
LJMP MAIN

至此,就是一个完整的定时中断功能软件的框架。

关于如何找到要执行的中断程序:
单片机有5个中断源,每个中断产生后单片机会从相对应的中断的入口地址开始去执行程序,这个地址是固定的:
0003H:外部中断0
000BH:定时中断0
0013H:外部中断1
001BH:定时中断1
0023H:串口中断
比如定时器0的定时时间到了,产生了中断,单片机马上就会从000BH开始执行程序代码,执行完中断程序后通过RETI指令返回到中断相应前的位置继续执行原来的程序。这一切都是单片机设计时规划好的,比如入口地址,是不能变的。由于每一个中断入口地址到下一个入口地址只有8个字节的空间,写不了几条语句,所以一般都是在入口处写LJMP语句直接跳转到服务程序的实体。

最后,提供一个相对标准的51单片机汇编源程序框架,希望有所帮助,有问题可再提。

ORG 0000H ;程序总入口
LJMP START ;跳转到主程序区
ORG 0003H ;这是外部中断0的入口地址,是固定的,一般不放其它语句
LJMP INT0_P ;中断产生后单片机响应中断,将从这里开始执行,LJMP直接跳转到中断服务程序INT0_P去执行实际代码
ORG 000BH ;这是定时器0中断的入口地址,固定的
LJMP TIMER0_P ;定时中断0产生后单片机响应中断,将从这里开始执行,LJMP直接跳转到中断服务程序TIMER0_P去执行实际代码
ORG 0013H ;外部中断1入口
...................
ORG 001BH ;定时器中断1中断入口
...................
ORG 0023H ;串行中断入口
...................
ORG 0100H ;这是真正的主程序起始
START:
MOV SP, #60H ;设置堆栈起始地址
MOV PSW, #00H ;初始话工作寄存器区等
...........
MAIN: ;循环体开始
...........
LJMP MAIN ;主程序体执行完成,返回循环体首部
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-02
定时中断打开后 单片机自动计时 定时时间到后 执行你所要的程序 就是这样 还有一点 你是初学单片机的吧 以后标号最好别这样写 时间久了你自己也会看不懂什么意思 最好是能够用一目了然的单词 或缩写来做标号
第2个回答  2011-08-02
用中断还是查询呀,怎么看不到Tf0?
相似回答