用STM8单片机的定时器实现一个检测几路LED中出现故障程序

最近公司在给一家地铁公司做一个地铁转向灯控制器项目,其中要用STM8单片机实现一个功能,先上原理图一会再描述功能。


功能描述:

1. 当A1(PD4)为高电平时,B1(PC5)B11(PC7)输出闪烁信号,驱动转向灯或继电器

2. 当A2(PD5)为高电平时,B2(PC6)B22(PD2)输出闪烁信号,驱动转向灯或继电器

3. 当HF(PD6)为高电平时,B1B2B11B22输出闪烁信号,驱动转向灯或继电器

4. 闪烁频率11.5Hz

控制器将对输出端口进行检测;当输出的电流小于一个灯的电流时,闪烁频率会加倍;以此来通知驾驶室,有指示灯损坏。

这个主要是检测控制端口PC4脚的电平变化,当小于一个灯的电路的时候,说明负载功率变小,LED闪烁频率变快,从而断定有故障发生。

这里以PC6脚单路输出作为测试。

程序流程图如下:

时间1指的时间计数器1,时间2指的时间计数器2.

程序如下:

#include "IOSTM8S103F3.h"
#define  u8   unsigned char
#define  u16  unsigned int
#define  JC  (PC_IDR&0x10)>>4 //读取PC4脚的信号
void Delay_ms(u16 ms)
{
 u16 i,j;
 for(i=ms;i>0;i--)
  for(j=0;j<1600;j++);
}
u8 i=0;
u8 t=0;
u8 num=100;
u8 temp=0;
u8 temp1=0;
void Init_Timer4(void)
{   TIM4_CR1=0x01;   //使能计数器
    TIM4_IER=0x01;   //更新中断使能
    TIM4_EGR=0x01;   //允许产生更新事件
    TIM4_CNTR=255;   //计数器初值装载
    TIM4_ARR=255;   //自动重装载的值
    TIM4_PSCR=0x07; //预分频,计数器时钟频率F_ck_cnt=F_ck_psc/2^(psc(0:2))
}
void Init_GPIO(void)
{
    PC_DDR|=0x40; //PC6输出模式
    PC_CR1|=0x40; //PC6推挽输出
    PC_DDR&=0xef; //PC4输入模式
    PC_CR1&=0xef; //PC4浮空输入
    PC_CR2|=0x00;
    PC_CR2&=0xef;
}
#pragma vector=TIM4_OVR_UIF_vector
__interrupt void TIM4_OVR_UIF_IRQHandler(void)
{     i++;
      TIM4_SR=0x00; //清除中断
      if(i==num)
      {
          PC_ODR^=0x40;
          i=0;
      }
       t++;
      if(JC==0x01)
        temp=1;
      if(t==20)
      {
        t=0;
        if(temp!=1)
        { 
            num=100;
            temp1=0;
        }
        temp=0;
      }
      //return;
}
int main( void )
{
  Init_GPIO();
  Init_Timer4();
  asm("rim");
  while(1)
  {
    if(temp1!=1)
    {
      if(JC==0x01)
      {
        temp1=1;
        num=10;
        i=0;
      }
    }
  }
}

用到定时/计数器的中断。

你可能感兴趣的:(测试,C语言,单片机,故障)