⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 powertestinganddetecting.c

📁 电压监测 实现多路数据采集,算法简单,可靠性高
💻 C
字号:
/*******************************************************************************************/
//使用stc89le516ad,12MHZ晶振,P0口输出段码,P2口做列扫描,共阳极LED数码管,P1口数据采集通道//
//开机显示"-dy-",扫描开机按钮是否按下,等待开机
//数据采集完毕后,默认显示"pass"或"fail",按功能键,可切换到数据显示方式
//按关机按钮,切断电源
/*******************************************************************************************/
#include "reg52.h"
#include "intrins.h" //包含内部函数
#include "math.h"
#define uchar unsigned char
#define uint unsigned int
sbit on_off=P3^4;     //开测试板电源
sbit fun=P3^5;        //功能健,调整显示方式
sbit ad_start=P3^6;         //关测试板电源
sbit on_offpower=P3^7;

//定义与A/D转换有关的特殊寄存器
sfr P1_en=0X97;            // 转换功能允许寄存器
sfr ad_con=0xc5;           // 转换控制寄存器
sfr ad_data=0xc6;          // 转换结果寄存器

uchar code dis_7[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
                     0x90,0x88,0xa1,0x8e,0xc7,0x8c,0x91,0xbf,0xff};
           /*  共阳极段码显示表 0,1,2,3,4,5,6,7,8,9,a,d,f,l,p,y,- ,不亮 */
int code scan_con[4]={0xfe,0xfd,0xfb,0xf7};    // 段码位控制字
uint data dis[5]={0x10,0x0b,0x0f,0x10,0x00};         // 显示数据初始化,显示"-dy-"
int data ad[5]={0x00,0x00,0x00,0x00,0x00};          // AD转换原始数据存放        
uchar data success[4]={0x0e,0x0a,0x05,0x05};     // 若合格,显示的字符,"pass"
uchar data fail[4]={0x0c,0x0a,0x01,0x0d};        // 若不合格,显示的字符,"fail"
bit dis_flag=0;    // 显示标志位
bit flag_t1=0; // T1中断标志 
bit dis_mode=0;//显示模式
uint h=0x00;     // T1中断计数,20次关闭,定时1s

void delay1ms(uint count);
void ledscan();
void ledscan0();
void ledscan1();
void keyscan();
void power_on_off();

/********************/
// 开关测试板电源   //
/********************/
void power_on_off()
  { 
    static bit bpressflag;
    if(!on_off)          // 等待开待检测板电源         
	  { 
	    if(bpressflag)
	    return;
	    delay1ms(5);      // 判断是否为干扰
		if(!on_off)
		 {
		  bpressflag=1;
 	    if(!on_offpower)
		   on_offpower=1;
		else
		   on_offpower=0;
     }  

   }
   else
	       bpressflag=0;
  }

/********************/
//   扫描方式判断   //
/********************/
void ledscan()
 {
  static bit bpressflag;
  if(!fun)  // 如果功能键按下,进入显示方式1
    { 
	  if(bpressflag)
	  return;
	  delay1ms(5);
	  if(!fun)
	 {
	  bpressflag=1;
	  if(!dis_mode)
        {
		  dis_mode=1; 
		  ledscan0();
    	}
	  else
	    {
		  dis_mode=0; 
		  ledscan1();
		}
		}
	}
	else
	  bpressflag=0;
 }
/*****************/
// 扫描方式1程序 //
/*****************/
void ledscan1()
 { 
   uchar i,k;
   long ad_sub;
   TMOD=0x10;      // T1使用定时模式方式1,50ms
   TH1=0x3c;
   TL1=0xb0;
   dis[0]=0x00;
   delay1ms(100);
   delay1ms(100);
   delay1ms(100);
   for(i=0;i<5;i++)    // 5条通道,显示5个数据
     { 
	   dis[0]++;
	   ad_sub=ad[i];
	   ad_sub=(ad_sub*330)/256;
	   dis[1]=ad_sub/100;
  	   dis[4]=ad_sub%100;
	   dis[2]=dis[4]/10;
	   dis[3]=dis[4]%10;
	   flag_t1=0;
	   TR1=1;          //开始计时,开中断
	   ET1=1;
	   EA=1;
	   while(1)
	   {
		if (flag_t1)
		     {
			    P2=0xff;
				break;
			 }
         for(k=0;k<4;k++)   // 4位LED扫描控制
	      {   
		    if (k==1)
              P0=(dis_7[dis[k]] & 0x7f);
			else
			  P0=dis_7[dis[k]];
		      P2=scan_con[k];
		      delay1ms(1);
		}
	   }
	 }
 }

/*****************/
// 扫描方式0程序 //
/*****************/
void ledscan0()
  {
    uchar k;
	TMOD=0x10;      // T1使用定时模式方式1,50ms
    TH1=0x3c;
    TL1=0xb0;
    if(!dis_flag)
	 {
	   for(k=0;k<4;k++)
		dis[k]=success[k];
	 }
	else
	  {
	   for(k=0;k<4;k++)
		 dis[k]=fail[k];
      }
   TR1=1;          //开始计时,开中断
   ET1=1;
   EA=1;
   while(1)
   {
   if(flag_t1)
		  {
			 P2=0xff;
			 break;
		  }
   for(k=0;k<4;k++)
     {
	   P0=dis_7[dis[k]];
	   P2=scan_con[k];
	   delay1ms(1);
   }
	 }
  }
/**************/
// 键扫描程序 //
/**************/
void keyscan()
{ 
    static bit bpressflag;
    static bit ad_finish;
    uchar i;
	int compare[5]={0x80,0x80,0x9e,0xcc,0x80};
	if (!ad_start)       
	  {
	    if(bpressflag)
	    return;

        delay1ms(5);      
		 if (!ad_start)    
 		     { 
               bpressflag=1;
               
			   P1=P1 | 0xf8;
               P1_en=0xf8;
			   for(i=0;i<5;) 
			     {
				   ad_data=0;
				   ad_con=i+3;
                   delay1ms(10);
				   ad_con|=0x08;
				   ad_finish=0;
				   while(!ad_finish)
				    { 
					  ad_finish=(ad_con & 0x10);
					}
				   ad_con &= 0xf7;
				   ad[i]=ad_data;
  				   i++;
				 }
			     
                 for(i=0;i<5;i++)
	              { 
				    if ( fabs(ad[i] - compare[i])>23 )
						{
						 dis_flag=1;
						 break;
						}
				}     
			 }
		  }

      else

	     bpressflag=0;      
}

/**************/
//  延时程序  //
/**************/
void delay1ms(uint count)
 {
    uint i,k,temp;
	uchar j;
	temp=(uint)((100*12)/12);
	for(i=0;i<count;i++)
	   for(j=0;j<1;j++)
	       for(k=0;k<temp;k++)
		   ;
 }
 /**************/
//   主程序   //
/**************/
void main()
 {
  char k;
  on_off=1;
  while(1)
   {
     for(k=0;k<4;k++)
     {
	   P0=dis_7[dis[k]];
	   P2=scan_con[k];
	   delay1ms(1);
	 }
	  power_on_off();
	  keyscan();
	  ledscan();
   }
  }
/**************/
//  定时中断  //
/**************/
 void t1_int() interrupt 3 using 2
  {  ET1=0;TR1=0;TH1=0X3C;TL1=0XB0;
     h++;
	 if(h==48)
	  {
	   flag_t1=1;
	   h=0;
	  }
	  else
	     {
		   flag_t1=0;
		   ET1=1;
		   TR1=1;
		 }	  
  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -