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

来源:互联网 发布:身份证号码找人软件 编辑:程序博客网 时间:2024/05/23 01:58

最近公司在给一家地铁公司做一个地铁转向灯控制器项目,其中要用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;      }    }  }}

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

0 0
原创粉丝点击