- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要编写一个延迟子例程。它应该延迟大约 1 秒。它必须适用于 8051 环境、DS89C430 微 Controller (11.0592 MHz XTAL)。我该如何编写这个子程序?
Delay1sec: ...
....
...
....
...
最佳答案
要获得在中断期间也有效的精确 1 秒延迟,您需要使用硬件定时器,而不是软件定时器。我建议您使用可用的板载计时器 as suggested by Jerry Coffin 之一。
这是一种涉及内置计时器和计数计时器溢出的方法。由于运行定时器默认每 12 个时钟周期更新一次以保持与 8051 的兼容性,因此每秒将更新 921,600 次。一点乘法告诉我们,从 0 计数到 46080 需要 50 ms,这也告诉我们,我们可以在 19456 处启动一个 16 位定时器,等待它溢出 20 次来延迟 1 秒* .
代码可能如下所示:
CLR T0M ; set timer 0 to use a divide-by-12 of
; the crystal frequency (default)
MOV R0,TMOD ; set timer 0 to 16-bit mode without
ORL R0,#01h ; affecting the setup of timer 1
MOV TMOD,R0
LCALL Delay1sec ; call the delay subroutine
Delay1sec:
MOV R0,#20d ; set loop count to 20
loop: CLR TR0 ; start each loop with the timer stopped
CLR TF0 ; and the overflow flag clear. setup
MOV TH0,#4Ch ; timer 0 to overflow in 50 ms, start the
MOV TL0,#00h ; timer, wait for overflow, then repeat
SETB TR0 ; until the loop count is exhausted
JNB TF0,$
DJNZ R0,loop
RET
注意:示例中不包括指令执行时间的开销。
* 数学如何分解:
11059200/12 = 921600
0.05 * 921600 = 46080
65536 - 46080 = 19456 = 0x4C00
软件延迟循环浪费处理器时间并受到中断的干扰。话虽这么说,您可以通过硬编码的方式来完成。
一种方法涉及了解每个机器周期的时钟周期数以及执行各种指令所需的机器周期数。根据data sheet,DS89C430通常每个指令字节使用一个机器周期,并且需要一个周期来执行。 Ultra-High-Speed Flash Microcontroller User's Guide 中提供了每条指令的周期数。
由于您的晶体频率为 11.0592 MHz,因此您的例程将需要延迟 11,059,200 个时钟周期。这通常是通过已知长度的嵌套循环来完成的,然后包括任何额外的循环设置以及可能的子例程调用和返回指令*。
该函数可能如下所示:
Delay1sec: ; <------------------------------+
; LCALL Delay1sec ; 3 cycles |
MOV R2,#42d ; 2 cycles |
MOV R1,#00d ; 2 cycles |
MOV R0,#00d ; 2 cycles |
loop: DJNZ R0,loop ; 4 cycles <-- l1 <- l2 <- l3 Delay1sec
DJNZ R1,loop ; 4 cycles <---------+ | |
DJNZ R2,loop ; 4 cycles <---------------+ |
RET ; 3 cycles <---------------------+
让我们看看数学是如何分解的**:
l1
= 4 * 256 = 1024 个周期l2
= (1024 + 4) * 256 = 263168 周期l3
= (263168 + 4) * 42 = 11053224 周期延迟1秒
= 11072668 + 3 + 2 + 2 + 2 + 3 = 11053236 个周期
11053236 周期 * 1/11059200 秒/周期 = 999.461 毫秒
* 子程序调用和返回指令可以根据需要省略。
** 我使用 Microsoft Excel 来协助进行与确定循环计数器相关的计算。
关于assembly - 写一个延迟子程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5134836/
我有一个包含很多工作表和几个宏的工作簿。当我进入 VBA 并尝试将新的 Sub 写入 ThisWorkbook 模块时,我看到: "This will reset your project, proc
1、函数定义 子程序即一段分离的代码,它可以使减少重复代码且程序易读.perl中,子程序可以出现在程序的任何地方.但一般放在程序的开始或结尾. 复制代码 代码如下:
1、定义 子程序即执行一个特殊任务的一段分离的代码,它可以使减少重复代码且使程序易读。PERL中,子程序可以出现在程序的任何地方。定义方法为: &n
如何将 deck(52) 数组从 Newgame 函数传递到 deckshuffle 函数 FUNCTION newgame 'New game RANDOMIZE TIMER CA
有没有办法在后台运行 perl 子程序?我环顾四周,看到了一些关于线程的提及,但看到一个例子会有所帮助,或者为我指明正确的方向。谢谢。 想跑run_sleep在后台。 #!/usr/bin/perl
情况 我正在创建一个简单的模板文件,该文件将有助于创建 future 的脚本,以便在 *nix 系统上通过命令行执行各种任务。作为其中的一部分,我可能会要求用户输入需要根据源代码中提供的正则表达式进行
我想将以下变量传递给子程序 mySubroutine,$name, $age然后是这个多维数组: $name = "jennifer"; $age = 100; $list[0][0] = "TEST
据我所知,VB6不支持继承,但它支持接口(interface)。我正在尝试创建一个重载子例程,将其信息传递给基类的同名子例程。 Sub Main() Dim Student1 as New S
这个问题已经有答案了: Dynamic Function Calls in Excel VBA (1 个回答) 已关闭 8 年前。 这是我的测试代码 Sub dotask() Dim qusu
我正在编写一个本质上是静态的函数。我想将它插入到模板工具包中,它会传递类名。本质上,它正在做 ClassName->function( $args.. ) 但我希望它做类似的事情 ClassName:
我创建了一个小示例程序来检查子例程系统调用。 package main func print() { } func main() { go print() } go 子程序的 straces
我是该网站的新手,这看起来可能是获得一些提示和帮助(如果有的话)的地方。 我正在学习“C 调用 Fortran 子程序”,我对 C 有一定的了解,但对 Fortran 了解不多。 优点:我看过一些例子
是否有一种方法/功能可以为所有可用的 Mojolicious 路由编写自动启动子程序/方法? 也许是一个自动助手,但我还不知道如何去做。 我认为这对于为几乎所有可用路由初始化数据库连接 $self->
我试图在不实例化对象的情况下从类中调用原型(prototype)函数。我的类(class) MyClass 的一个例子: package MyClass; use strict; use warnin
我正在尝试从 C 调用 FORTRAN 函数 我的问题是: 如果 fortRoutine 是我的 fortran 子例程的名称,那么我从 C 调用它作为 fortRoutine_。如果 fortRou
我可以调用编译这个 fortran 代码 'test.f90' subroutine test(g,o) double precision, intent(in):: g double precisi
我制作了一个 Perl 模块 MyModule.pm 它有一些我想在 shell 脚本中调用的子例程 getText。我尝试了以下方式,但它给出了错误; SEC_DIR=`perl -MMyModul
我用 CommaIde 打开了这个简单的脚本: #!/usr/bin/env perl6 my $str = 'foobar'; say $str; IDE 突出显示了带有错误的“说”一词: Subr
我基本上有一个存储有数字 1-6(例如垄断)的立方体 vector > cube; 看起来像这样: 0300 5126 0400 我有将它倒转的代码: short tmp=cube[0][1]; cu
我必须在两个文件中创建一个 surbroutine,我在构建项目时遇到问题,出现错误: undefined reference to c 我不知道发生了什么,我正在尝试发送 C[0] 内存方向,这就是
我是一名优秀的程序员,十分优秀!