我应该编写一个程序,将一些值发送到寄存器,然后等待一秒钟,然后更改值。问题是,我找不到将停止操作一秒钟的指令。
3 回答
设置定时器中断怎么样?
本Keil 8051 应用笔记中有一些有用的提示和代码片段。
没有这样的“指示”。然而,毫无疑问至少有一个硬件定时器外围设备(确切的外围设备集取决于您使用的确切部分)。拿出您正在使用的部件的数据表/用户手册,并弄清楚如何对定时器进行编程;然后您可以轮询它或使用中断。通常,您会将计时器配置为生成周期性中断,然后递增计数器变量。
关于定时器中断你必须知道的两件事:首先,如果你的计数器变量大于 8 位,访问它不会是原子的,所以在中断上下文之外你必须暂时禁用中断来读取它,或者读取它两次连续使用相同的值来验证它。其次,必须声明定时器计数器变量volatile
以防止编译器优化对它的访问;这适用于中断和线程之间共享的所有变量。
如果支持,另一种选择是使用低功耗“睡眠”模式;您设置一个计时器以在所需的时间后唤醒处理器,并发出必要的睡眠指令(这可能由您的编译器作为“内在”提供,或者您可能由外围寄存器控制。这是一般建议,不是8051 特定;我不知道您的部件是否支持睡眠模式。
无论哪种方式,您都需要仔细阅读特定于零件的文档。如果你能告诉我们确切的部分,你可能会得到帮助。
第三种解决方案是使用 8051 特定的 RTOS 内核,该内核将准确提供您正在寻找的周期性延迟功能,以及多线程和 IPC。
我会设置一个计时器,使其每 10 毫秒中断一次。在那个中断中,增加一个变量。
您还需要编写一个函数来禁用中断并读取该变量。
在您的主程序中,您将读取计时器变量,然后等到它比开始时多10 100。
不要忘记注意计时器变量的翻转。