抱闸控制器抱闸时间检测仪的设计_希望腾飞_百度空间

这是为本公司生产抱闸控制器质量检测所设计的检测仪,用以检测抱闸控制器抱闸时间。

电路图如下:

以下为C51源程序:

/*********************************************************
** 文件名:   MAIN.C
** 功能描述: 这是为本公司生产的抱闸控制器质量检测所设计的检测仪,用以检测抱闸控制器抱闸时间。
** 主要器件:STC89C52 ,12M晶振,四合一数码管,三极管,二极管,光耦,蜂鸣器,LED灯,电阻若干。
** 作    者: xiwangcumt 希望腾飞
** 日    期: 2010-05-28
**********************************************************/


#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
#define outdat P0
#define warn_time 600 //正常时间范围0.6s,超出报警
#define settime_ss 1 //设定报警时间下限常数,秒位 ,此时设定报警时间下限为1.0s
#define settime_100mss 0 //设定报警时间下限常数,10分秒位,
sbit warn=P3^4;
sbit set=P3^3;


uchar datcode[]={0xeb,0x28,0x73,0x7a,0xb8,0xda,0xdb,0x68,0xfb,0xfa}; //数字0-9字型码,看电路具体接线方法而不同
uchar datled[]={0xeb,0xeb,0xeB,0xeb}; //数码管当前显示的数据的字型码,初始状态为关闭显示(数码管共阴)
uchar nt50ms=0; //16位定时器计数单位,每次溢出计数50ms
uint nt10ms=0; //10ms计数单位
uchar nt2ms=0; //2ms计数单位
uchar settime_s=settime_ss;settime_100ms=settime_100mss;//设定时间
uchar freqs=0;//外部脉冲计数
uchar led0=0,led1=0,led2=0,led3=0; //数码管当前显示的数据,初始状态为0
bit warn_en=0;//报警使能位,初始状态禁止


/*********************************************************
** 函 数 名:delay()
** 功能描述:
** 输入参数:t
** 输出参数:
** 返 回 值:无
** 作    者:xiwangcumt 希望腾飞
** 日    期:
**********************************************************/

void delay(uint t)
{
uchar i;
while(t--)
{
   for(i=0;i<125;i++) ;
}
}

/*********************************************************
** 函 数 名:keycan_set()
** 功能描述:键盘扫描,设定数据,设定报警下限,报警上限为:报警下限+时间范围warn_time
** 输入参数:
** 输出参数:
** 返 回 值:无
** 作    者:xiwangcumt 希望腾飞
** 日    期:
**********************************************************/
void keycan_set()
{
while(!set)
{
   delay(15);
   //while(!set)
   {
    while(!set);
    //
    settime_100ms=led2; settime_s=led1;datled[3]=datcode[0];
    settime_100ms++;
    if(settime_100ms>=10)
    {
     settime_100ms=led2=0;
     settime_s++;
     if(settime_s>=4){settime_s=led1=0;}
     led1=settime_s;datled[1]=datcode[led1]|0x04;
    }
    led2=settime_100ms; datled[2]=datcode[led2];
   }
}
}

/*********************************************************
** 函 数 名:main()
** 功能描述:主函数,从抱闸控制器输出端检测输入脉冲。抱闸控制器上电后,输出交流全波,经过一定的时间后输出半波。此段时间即为本系统需要检测的时间。要求:抱闸控制器上电后,开始重新计时,超出时间范围报警。抱闸控制器断电后,保持时间显示在设备上,并停止报警。抱闸器再上电,重新计时检测
** 输入参数:无
** 输出参数:
** 返 回 值:无
** 作    者:xiwangcumt 希望腾飞
** 日    期:
**********************************************************/

void main()
{
uchar j;
uchar settime;
uchar warn_time_10ms;
warn_time_10ms=warn_time/10;
// IP=0X01;//中断优先级设置,定时器0为高优先级。
EA=1;
ET0=1;ET1=1;
EX0=1;IT0=1;//外部中断0设置为下降沿触发
EX1=1;IT1=1;
TMOD=0X11;//定时器0模式1:16位定时器                        
TH0=(0XFFFF-20000)/256; //定时时间10ms,24M晶振
TL0=(0XFFFF-20000)%256;
TH1=(0XFFFF-4000)/256; //定时器定时时间2ms,大于全波周期(10ms),小于半波周期(20ms)
TL1=(0XFFFF-4000)%256; //

    led1=settime_s; led2=settime_100ms; led3=0;
datled[1]=datcode[led1]|0x04;datled[2] =datcode[led2]; datled[3] =datcode[led3];
//初始化完

while(1)
{
      if(P3^3)EX1=1;
   settime=settime_s*100+settime_100ms*10;
    if((nt10ms<settime|nt10ms>settime+warn_time_10ms)&warn_en)
    //nt10ms*10=settime_s*1000+settime_100ms*100 |nt10ms*10>settime_s*1000+settime_100ms*100+800
    //报警时间范围:800ms
    {
     warn=0;datled[0]=0xd3;//报警显示E
    }  
    else
    {
     warn=1;datled[0]=0;
    }

   for(j=0;j<3;j++) //循环显示四位数据
   {
  
    P2=(0X10>>j);//动态显示,右移一位显示
    outdat=datled[j];
    delay(2);
    //keycan_set();     
   
   }
}
}


/*外部中断启动键盘扫描
void keyset() interrupt 2
{
EX0=0;
keycan_set();//扫描键
EX0=1;
} */

/*********************************************************
** 函 数 名:leddatchange()
** 功能描述:显示数据更新。即在LED上实时xx显示计时时间。由定时器中断实现。时间由三位LED显示,xx到0.01秒
** 输入参数:
** 输出参数:
** 返 回 值:无
** 作    者:xiwangcumt 希望腾飞
** 日    期:
**********************************************************/

void leddatchange() interrupt 1
{
TH0=(0XFFFF-20000)/256;//10ms
TL0=(0XFFFF-20000)%256;
nt10ms++;
// if(nt50ms==5)
//   {
//    nt50ms=0;
    led3++;
    if(led3>=10)
    {
     led3=0;led2++;
     if(led2>=10)
     {
      led2=0;led1++;
     
      if(led1>=10)
      {
       led1=0;//led0++;
       /*if(led0>=10){led0=0;}
       datled[0]=datcode[led0];*/
      }
     
      datled[1]=datcode[led1]|0x04;
     
     }
     datled[2]=datcode[led2];
    }
    datled[3]=datcode[led3];
//   }

}


/*********************************************************
** 函 数 名:Vin()
** 功能描述:从抱闸控制器输出端检测输入脉冲,在全波输入的过程中持续计时。判断是否全波或半波,判断是否超出时间范围报警,判断是否抱闸器刚上电。
** 输入参数:
** 输出参数:
** 返 回 值:无
** 作    者:xiwangcumt 希望腾飞
** 日    期:
**********************************************************/

void Vin() interrupt 0 //交流 电源输入,上升产生中断
{
   EX0=0; //EX1=0; //禁止外部中断,禁止设置
   TR1=1;
   freqs++;//脉冲计数
     //有电压输入时允许报警
   if(nt2ms==0)freqs=1; //判断输入起始    
   if(nt2ms<9)TR0=1; //如果此次脉冲来的时间小于18ms,判断输入为全,打开定时器1,开始(继续)计时,计算下次脉冲来的时间
   if(nt2ms>=9){TR0=0;warn_en=1;}    //如果此次脉冲来的时间大于18ms,判断输入为半波,关闭定时器1,停止计时。
     nt2ms=0;
  
   if(freqs==1)//在vin{dy}个脉冲开始计时
   {
    led0=led1=led2=led3=0;nt10ms=0;
    //datled[0]=0xeb;
    datled[1]=0xeb|0X04;datled[2]=0xeb; datled[3]=0xeb;
    TR0=1;
   }
  
   if(freqs>=127){freqs=100;}//防止uchar型freqs溢出
   EX0=1;// EX1=1;
  
}

/*********************************************************
** 函 数 名:freq()
** 功能描述:超过一个交流电的周期无外部输入即判断抱闸控制器断电。关报警和定时器。
** 输入参数:
** 输出参数:
** 返 回 值:无
** 作    者:xiwangcumt 希望腾飞
** 日    期:
**********************************************************/

void freq() interrupt 3
{
TH1=(0XFFFF-4000)/256;//2ms
TL1=(0XFFFF-4000)%256;
nt2ms++;//每次定时器1中断,计数5ms
if(nt2ms>=11){nt2ms=0;TR1=0;warn_en=0;TR0=0;}//22ms外部无电压输入,关定时器0;关报警;
}



郑重声明:资讯 【抱闸控制器抱闸时间检测仪的设计_希望腾飞_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——