首页 > 解决方案 > 当端口从 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;
}

标签: cpicmplab

解决方案


为什么不将 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


推荐阅读