c - 当端口从 0 变为 1 时,如何添加 90 分钟的延迟?
问题描述
我有一个 PIC12F1822,其中有一个 LED 和继电器作为输出,触发器作为输入。
当触发器等于 1 时,我希望 LED 和继电器保持打开 90 分钟。
问题是我不能使用延迟,因为 __delayms 有限制。
如何才能做到这一点?
#include <xc.h>
#define _XTAL_FREQ 4000000
#define LED PORTAbits.RA5
#define RELAY PORTAbits.RA4
#define TRIGGER PORTAbits.RA2
int main()
{
// OSCCON = 0b01101000 ;
OSCCONbits.IRCF = 0b1101 ;
TRISAbits.TRISA5 = 0; //LED Output PIN
TRISAbits.TRISA4 = 0; //Output for Relay
TRISAbits.TRISA2 = 1; //INPUT trigger from comparator
while(1)
{
if (TRIGGER == 1)
{
LED = 1; // LED ON
__delay_ms(1000); // 1 Second Delay
LED = 0; // LED OFF
__delay_ms(1000); // 1 Second Delay
}
else
{
LED = 0; // LED OFF
}
}
return 0;
}
解决方案
为什么不将 1s 延迟包装在提供 adelay_s(uint32_t seconds)
的函数和提供 a 的函数中delay_m(uint32_t minutes)
void delay_s(uint32_t seconds)
{
while(seconds){
__delay_ms(1000);
seconds--;
}
}
void delay_m(uint32_t minutes)
{
while(minutes){
delay_s(60);
minutes--;
}
}
但是:
您应该知道这完全阻止了您的 µC 程序。它不会对任何按键做出反应。这可能没问题,但如果在延迟期间按下键,您可能希望将延迟重置为 90 分钟。
我建议用中断和定时器来实现整个事情。设置一个每秒触发一次的计时器,并volatile
在主循环设置的 isr 中倒计时一个全局变量(!)。如果计数器达到 0,您的 isr 可能会禁用您的输出。
这样,您的 µC 就可以在主循环中处理其他事情,并且不会被 -function 阻塞__delay
。
推荐阅读
- postgresql - Odoo 13,如何在 GITHUB 上上传我的 Postgres 数据库的内容
- reactjs - 为什么我的 React 函数没有等待 SweetAlert 确认?
- javascript - Jquery fadeToggle 麻烦
- javascript - 无法在地图函数内渲染
- amazon-web-services - S3:即使附加了 AmazonS3FullAccess,访问也被拒绝
- javascript - 使用 AWS Cognito 反应受 Redux 保护的路由
- oracle-cloud-infrastructure - 下载预授权对象存储中的文件名,而不是预授权请求中的存储 id (guid)
- umts - 哪个 3GPP 规范确定了 UE 可以激活的 PDP 上下文的最大数量?
- python - jinja2 TemplateResponse.template.render() 不会将上下文注入模板
- mongodb - 在 MongoDB 4.4 中创建一个新的数据库而不是一个新的集合是否提供任何性能优势?