打印

最近做的一个小项目(继电器老化测试)

[复制链接]
2491|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
allen2006|  楼主 | 2008-11-22 10:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原理:对继电器驱动I/O口每隔一秒进行置高,如果继电器吸合则计数器加1,并更新驱动数码管显示,如果没有吸合,用另一个寄存器计数加1,蜂鸣器发出滴滴报警声,按S2键可以查到继电器未吸合的次数,数码管只有五位,继电器最多吸合十万次。

//**************************************************/
#include "reg51.h"
#define uchar unsigned char
#define uint  unsigned int 

#define Hidden 0x10;    //消隐字符在字形码表中的位置
uchar code BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7};
uchar code DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};
uchar DispBuf[5];    //5字节的显示缓冲区
uchar DispBuf1[5];
bit    Sec=0;            //1s到的标记
bit     key_flag0=0,key_flag1=0;
bit    flag=0;
bit StartRun=0;
uchar key_count;    

uchar code TH0Val=63266/256;
uchar code TL0Val=63266%256;//当晶振为11.0592时,定时2.5ms的定时器初值
//经过精确调整,在值为63266时,定时时间为1.00043362s
//*******************************************************************
void Timer0() interrupt 1
{    uchar tmp;
     static uchar dCount;//计数器显示程序通过它得知现正显示哪个数码管
     static uint Count;        //秒计数器
     TH0=TH0Val;
     TL0=TL0Val;    
     tmp=BitTab[dCount];        //根据当前的计数值取位值
     P2=P2|0xf8;            //P2与11111000B相或,将高5位置1
     P2=P2&tmp;            //P2与取出的位值相与,将某一位清零
     if(flag)
     {
      tmp=DispBuf1[dCount];    //根据当前的计数值取显示缓冲待显示值    
      tmp=DispTab[tmp];        //取字形码
      P0=tmp;                    //送出字形码
     }
     else
     {
       tmp=DispBuf[dCount];    //根据当前的计数值取显示缓冲待显示值    
       tmp=DispTab[tmp];        //取字形码
       P0=tmp;                    //送出字形码
     }
      dCount++;                //计数值加1
      if(dCount==5)dCount=0;    //如果计数值等于5,则让其回0
      Count++;                //计数器加1
      if(Count>=400)        //到达预计数值
      {    
        Count=0;            //清零 
        if(StartRun)        //要求运行
        {    
      Sec=1;
         }
    else P1_2=0;
    }
    if(!P1_0)
    {
        if(!key_flag1)
        {    
          StartRun=~StartRun;
          key_flag1=1;
          
        }
    }
    else
    {
      key_flag1=0;
         }
    if(P1_4==0)
    {
      if(!key_flag0)
      {
        flag=~flag;
        key_flag0=1;
           }
    }
    else
    {
      key_flag0=0;
    }
}
//*******************************************************************
/*延时程序
  由Delay参数确定延迟时间
*/
void mDelay(unsigned int Delay)    //ms
{    unsigned int i;
    for(;Delay>0;Delay--)
    {    for(i=0;i<124;i++)
        {;}
    }
}
//---------------------        
void usDelay(unsigned int Delay)      //150us
{    unsigned int i;
    for(;Delay>0;Delay--)
    {    for(i=0;i<15;i++)
        {;}
    }
}
//*******************************************************************
void buzz_on()
{
   uint i,j;
   for(j=0;j<6;j++)
   {
     for(i=0;i<1000;i++)
      { 
        P1_3=0;
        usDelay(1);
        P1_3=1;
        usDelay(1);
      }
      mDelay(500);
   }
}
//*******************************************************************
void Init()
{    
    P1=0XFB;
    TMOD=0x01;
    TH0=TH0Val;
    TL0=TL0Val;    
    ET0=1;                //开T0中断
    EA=1;                //开总中断
    TR0=1;                //T0开始运行
}
//*******************************************************************
void disconnect_Disp()
{
     P1_2=0;
     DispBuf1[4]++;
     if(DispBuf1[4]>=10)
     {
       DispBuf1[4]=0;
       DispBuf1[3]++;
       if(DispBuf1[3]>=10)
       {
         DispBuf1[3]=0;
         DispBuf1[2]++;
         if(DispBuf1[2]>=10)
          {
            DispBuf1[2]=0;
            DispBuf1[1]++;
            if(DispBuf1[1]>=10)
             {
                DispBuf1[1]=0;
                  DispBuf1[0]++;
                  if(DispBuf1[0]>=10)
                   {
                      DispBuf1[0]=0;
                      DispBuf1[1]=0;
                      DispBuf1[2]=0;
                      DispBuf1[3]=0;
                      DispBuf1[4]=0;
                    }
              }
           }
        }    
      } 
}
//--------------------------------
void connect_Disp()
{
     P1_2=0;
     DispBuf[4]++;
     if(DispBuf[4]>=10)
     {
       DispBuf[4]=0;
       DispBuf[3]++;
       if(DispBuf[3]>=10)
       {
         DispBuf[3]=0;
         DispBuf[2]++;
         if(DispBuf[2]>=10)
          {
            DispBuf[2]=0;
            DispBuf[1]++;
            if(DispBuf[1]>=10)
             {
                DispBuf[1]=0;
                  DispBuf[0]++;
                  if(DispBuf[0]>=10)
                   {
                      DispBuf[0]=0;
                      DispBuf[1]=0;
                      DispBuf[2]=0;
                      DispBuf[3]=0;
                      DispBuf[4]=0;
                    }
              }
           }
        }    
      } 
}
//*******************************************************************
void main()
{    
      Init();                    //初始化
      while(1)
      {    
        if(Sec)
        {
     Sec=0;
          P1_2=1;
          mDelay(700);
          if(P1_1==0)
          {
             connect_Disp();
          }
          else 
          {
         disconnect_Disp();
        buzz_on();
          }        
        } 
    }
}

相关帖子

沙发
allen2006|  楼主 | 2008-11-22 10:53 | 只看该作者

原理图

使用特权

评论回复
板凳
Wxy8030| | 2008-11-22 13:54 | 只看该作者

测试结果如何?

可否公布一下?

使用特权

评论回复
地板
allen2006|  楼主 | 2008-11-22 15:27 | 只看该作者

回楼上,测试没问题!可以试下

使用特权

评论回复
5
耕在此行| | 2008-11-22 16:19 | 只看该作者

楼主用的是什么MCU

抗干扰能力蛮强啊

使用特权

评论回复
6
allen2006|  楼主 | 2008-11-22 16:34 | 只看该作者

8051呀

使用特权

评论回复
7
dhh278| | 2008-11-22 16:39 | 只看该作者

这样测试有触点行吗

使用特权

评论回复
8
allen2006|  楼主 | 2008-11-22 16:45 | 只看该作者

自己可以动手测试下,验证行不行

我也不知道行不行,工厂还没正式使用呢

使用特权

评论回复
9
lyjian| | 2008-11-22 21:21 | 只看该作者

没带负载,没什么太大的意义

使用特权

评论回复
10
taoest| | 2008-11-22 23:34 | 只看该作者

负载

如楼上所说。如果只是这么小得负载电流,反应不了实际应用情况。
大电流的时候,触点老化严重很多的。
还有感性负载会引起拉弧,容性负载会有瞬间接触大电流。影响都很大。

使用特权

评论回复
11
forthlab| | 2008-11-23 14:57 | 只看该作者

上次听说继电器有2次吸合问题,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

411

帖子

1

粉丝