永发信息网

单片机汇编程序

答案:4  悬赏:60  手机版
解决时间 2021-01-02 17:00
  • 提问者网友:玫瑰园
  • 2021-01-02 00:06
要求利用单片机内部的定时器/计数器,达到一分钟延时。
下列程序使 定时器 /计数器0工作于方式1的定时器方式,达到1ms延时;定时器/计数器1工作于方式1的计数器方式,设定为技数60000次,而每次定时器/计数器0时间到、溢出时将发给它一个计数脉冲。这样两个定时器/计数器串接使用的结果:1ms*60000=1min
ORG 0000H
0000 02 00 30 LJMP 0030H
ORG 001BH;中断服务程序
001B D2 D5 SETB F0; 建立标志位F0
001D 32 RETI
ORG 0030H;主程序
0030 START: .
.
.
0048 75 89 51 MOV TMOD #01010001B
004B 75 8D 15 REPEAT: MOV TH1, #15H
004E 75 8B A0 MOV TL1, #A0H
0051 75 8C FC MOV TH0, #FCH
0054 75 8A 18 MOV TL0,#18H
0057 C2 B5 CLR P3.5
0059 75 A8 88 MOV IE #88H
005C D2 8E SETB TR1
005E D2 8C SETB TR0
0060 LOOP:
.
.
.
0090 30 8D FD JNB TF0,$
0093 C2 8D CLR TF0
0095 10 D5 0C JBC F0,ELSE
0098 D2 B5 SETB P3.5
009A 75 8C 3C MOV TH0,#FCH
009D 75 8A B0 MOV TL0,#18H
00A0 C2 B5 CLR P3.5
00A2 80 BC SJMP LOOP
00A4 ELSE: .
.
.
0112 01 4B AJMP 04BH
其中JNB TF0,$ 一句是什么意思?符号$是什么意思?MOV IE , #88H是什么意思?为什么把88H赋予IE?标志位F0是干什么用的?
问题补充:
从START开始是主程序。为什么要等定时器/计数器0溢出时要转去建立标志位呢,SETB F0?书上后边的解释中说达到1min延时后,响应定时器/计数器1中断,进入中断服务程序,标志位F0
建起,使程序转移到ELSE,执行相应程序后,又转移到REPEAT 重复执行。
请问一开始F0不是为0的么?执行到JNB TF0,$时定时器/计数器0定时到、溢出了,再把TF0清零。再执行到JBC F0 ,ELSE 的时候 ,因为F0=0,顺序执行,再转到loop,没法进入中断服务程序啊,怎么转移到REPEAT执行啊,请高手把程序怎么运行的尽量讲清楚。就是按什么顺序执行的,到哪转移到中断程序的。又怎么实现重复运行的。谢谢。
最佳答案
  • 五星知识达人网友:渊鱼
  • 2021-01-02 01:33
JNB TF0,$;符号$是本条指令的地址,TF0为0就重复执行本指令,否则TF0为1便执行下一条指令。
MOV IE , #88H;IE中断允许控制寄存器,88H赋予IE就是EA置1开中断,和ET1置1允许T1溢出中断。
标志位F0是用户自定义的标志位,你的程序不全,从中看不出是定义来做什么的,估计是执行某一部分程序的标志,即F0为1时运行某程序段,为0时运行另一程序段。
T0溢出时要转去建立标志位,T1定时1min延时后产生溢出中断,进入中断服务程序,建立标志位F0。目的是为了选择后续程序运行方向。如你所说:转移到ELSE,执行相应程序后,又转移到REPEAT 重复执行。
初始化时PSW为00H,所以F0也为0,但程序运行后其状态就不一定了,因此必须明确定义标志程序才能正确执行。
JBC F0,ELSE;是当F0为1时,先置零F0再转移,否则F0为0时就继续下一次T0定时,同时由P3.5经出一个脉冲令T1计一个数。 当程序运行到满足条件F0为1时(经过6000次T0定时溢出,也就是达到1分钟T1溢出产生中断时,至于F0怎么置1程序中看不出,估计T1溢出的同时,由溢出信号将其置1或溢出时硬件置1),就会转移到ELSE处,执行后续程序。
全部回答
  • 1楼网友:长青诗
  • 2021-01-02 04:37
晕! 1分钟定时,真的要那么麻繁吗? 这是练手程序吧?!
  • 2楼网友:独钓一江月
  • 2021-01-02 03:18
JNB TF0,$ 中$代表本行地址,编译器规定的,编译代码时就用本行地址代替$ MOV IE , #88H中 IE是允许中断寄存器,你应该查查书的,本行就是允许定时器1中断 标志位F0是工作状态寄存器PSW中的D5位,这里是用户自定义标志位,用来指示1min时间是否到,没到为1,到了应该置0。你错了,一开始F0=1
  • 3楼网友:猎心人
  • 2021-01-02 02:41
JNB TF0,$,其中的$是指本行, 也就是:当TF0为0时,一直重复执行本行,直到TF0变为1,才继续执行下一行! 相当于这样的指令: A000:JNB TF0,A000
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯