【问题标题】:need help writing a program需要帮助编写程序
【发布时间】:2011-04-16 21:10:03
【问题描述】:

我正在上一门微处理课程,但在编写一个将在一个端口中保存一个值两秒钟然后再转到下一个端口的程序时遇到了一些麻烦。

谁能帮助这更有意义?
我曾考虑过使用 NOP,但意识到这有点不切实际,我尝试了 ACALL DELAY 但由于某种原因它作为未知命令拉起。

此时我很困惑,如果我能得到任何帮助,我将不胜感激。

我正在使用时钟为 11 MHz 的 DS89C450,我曾尝试询问教授,他告诉我这是小菜一碟,你应该没问题,但读写代码对我来说是全新的,只有已经做了两个星期了。当我看这本书时,它几乎就像是用中文写的,很难理解,我的同学和我一样被难住了,我想我最后的办法是在网上问一个可能有类似情况的人问题或有更多洞察力的人可能能够将我引向正确的方向。

我知道我需要为每个端口加载指定的值我的问题在于端口的切换给了它们 2 秒的延迟。

我的程序看起来像这个 MOV P0、#33H MOV P1、#7FH MOV P2、B7H MOV P3、EFH,所以这四个端口加载了这些值,我需要 P0 去 P1、P1-P2 等等当到达 P3 时,它的值需要转到 P0 并将其全部循环。我打算使用 SJMP 将其循环回开始,以便程序始终运行

虽然这样做有两秒的延迟,每个值只在每个端口停留两秒,这仍然是模糊的,其余的听起来对吗?

【问题讨论】:

  • 似乎必须提供一些方向。其他学生在做什么?你调查过你的教授吗?
  • 您至少需要指定您使用的微处理器。
  • 我使用的是 DS89C450 时钟频率为 11 MHz,我试过问教授,他告诉我小菜一碟,你应该没问题,但是读写代码很麻烦对我来说是新手,我只做了两个星期。当我看这本书时,它几乎就像是用中文写的,很难理解,我的同学和我一样被难住了,我想我最后的办法是在网上问一个可能有类似情况的人问题或有更多见解的人可能能够将我引向正确的方向。
  • 我知道我需要用指定的值加载每个端口我的问题在于端口的切换给他们 2 秒的延迟
  • 我的程序看起来像这个 MOV P0, #33H MOV P1, #7FH MOV P2, B7H MOV P3, EFH 所以用这四个端口加载这些值我需要 P0 去 P1, P1 -P2 等到 P3 时,它的值需要转到 P0 并循环它。我打算使用 SJMP 将其循环回开始,以便程序始终运行

标签: programming-languages assembly microprocessors


【解决方案1】:

我在 PIC 16f84 微控制器中做了类似的事情

要进行延迟,您有两种方法可以使用中断或循环

由于您知道 Instructions_per_second,因此您可以使用循环来生成所需数量的指令并花费所需时间

这个link 说明了如何确定循环索引(因为如果需要所需的指令数量,您可能需要嵌套循环......在 PIC 中,我必须制作 100 万条指令才能延迟 1 秒)

【讨论】:

    【解决方案2】:

    我从来没有用那个特定的芯片做过这个(而且我不知道它支持的汇编语法),但是伪代码方法是这样的:

    Load initial values into ports
    Initialize counter with (delay in seconds * clock ticks per second) / (clock ticks in loop)
    While counter != 0
        Decrement counter 
    Swap port values:
        P3 -> temp, P2 -> P3, P1 -> P2, P0 -> P1, temp -> P0
    Loop (4 times?)
    

    我认为这就是你真正需要的结构。根据我对 8051 组件的 10 分钟阅读,延迟循环如下所示:

              MOV A, b6h ; ~91 ticks/sec @ 11 ms/tick 
    DELAY:    DEC A
              JNZ DELAY ; NOP-type delay loop
    

    【讨论】:

    • 所以你说的通话延迟对吗?当我早些时候尝试这种方法时,它告诉我 ACALL dakay 是一个未知命令?
    • 我不知道“呼叫延迟”是什么意思。在 x86 汇编器中,我会用我的值加载 CX,将指向它的标签和循环指令放在同一行上,然后瞧 - 延迟循环。
    • 感谢您的帮助,我仍然感到困惑,但感谢您抽出宝贵时间,我不确定 CX 是什么或标签和循环指令,这对我来说都是全新的,我不确定我是否什至问过正确的问题?我试图从其他程序中读取图表并使它们与这个程序相关,并且所有程序中都有一个 ACALL 你使用汇编语言吗?
    • 是的 - 这是来自 x86 程序集的 MASM 语法 - 这是我唯一做过很多工作的语法。
    • 我们使用的是 8051 by intel sound familar?