_HOUT:
ROND:NOP
MOV 70H,#00H
DJNZ R7,ROND
RETI
END
上面这段汇编程序很简单,没有任何意义,只是用来进行延时的。
那么上面这段程序的延时时间是6μs+1us,(上面的程序加上RETI)
合计7US。
包含本身C语言做的传递值的语句,一共延时时间为 6+6*n
(n为C语言往R7中传递的基数,6*n指的是一次循环体执行时间是6US再乘以次数,前面的6指的是C语言本身传递值用的机器周期时间。这个时间是不变的。)
这是高电平的延时时间。。加上低电平的延时时间一共是 12+12*n
单片机用C语言调用这段延时程序,其值传递利用R7传递。
那么我请问,R7值如果是1的时候,延时时间符合逻辑,是24US。.
那么,R7值是2的时候,延时时间是多少?为什么不是 2*12+12=36US?
而是34US?
我要声明,我电路中没有什么特别的东西,直接从单片机口线输出频率
只是用C语言调用这段汇编,并且传递值在R7位,但是我输出的频率是逐步衰 减的!我用的是12M晶振
比如我送值为2,就衰减2
送值为3,输出频率就衰减4
送值为4,输出频率就衰减6US
很有规律,以此类推。
这是什么原因?附带我的 C语言调用程序
do
{
P1_1=1;
hout(hzoutnum);
P1_1=0;
hout(hzoutnum);
}
有高人来给我解释一下。。我下午调程序无意中调出来的。为什么会衰减?
回复2楼的,这是中断子程序。在KEIL里用C调用汇编,如果用RET就报错。
R7的值通过变量 HZOUTNUM进行传递,我仿真了一下,传递过程是正常的,最大取值范围是FF,也就是255
确实是正常的
你知道R7如果变成0下面 就会是多少么?FF!这误差就一个天上一个地下了。。不是这样的,因为用示波器检查
了,输出周期只是平均每执行一遍循环体,周期就衰减2US
"那段循环程序无论R7值为多少,只循环一遍的话,输出正常,如果第二遍就不正常了"
楼下给我的解释有点牵强。我需要更加合理的说法。我要知道原因
仿照楼主的问题,进行了程序调试,C调用汇编的时间,可以看插图。
实验证明了三个问题。
1. 使用 RETI 是不必要的,使用 RET 并不报错。
2. C调用这个汇编函数的时间,是 (5 + 5 * n)us。(假设机器周期T=1us)。
3. 从仿真调试过程中,没有看到楼主所说“衰减”的现象。
分析说明如下:
主函数传值到R7:1us;
主函数调用汇编:2us;
汇编返回值(无):0us;
汇编返回(RET):2us;
以上就是公式中的“5us”。
汇编函数体各指令的耗时:
ROND:NOP ;1us
MOV 70H,#00H ;2us
DJNZ R7,ROND ;2us
执行一遍共5us,以R7的值,控制循环次数,故有“5*n(us)”。
条件所限,没有使用示波器进行测试,等以后找个机会吧。