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

📄 voltage.c

📁 用于对8组电压的采集和送到LED上显示出来. C语言编程.
💻 C
字号:
#include "at89x52.h"
#include "absacc.h"
#include "ledcode.c"

#define sck5      p26   //74hc595 
#define data5     p27
#define oe5       p24
#define lock5     p25

#define sck6      p17  //24c256
#define data6     p16

#define sck2      p21  //定义2543接口.
#define datain2   p22
#define dataout2  p23
#define eoc2      p20
#define cs2       p13

#define relay1     p11
#define relay2	   p12


unsigned char data sbufs[16], vol[4];
unsigned char isbufs=0, sbuf;   //sbufs 计算
unsigned int  vol12,total;
unsigned long voltemp;
bit keysign=0,failsign=0;

//************子函数开始************************************

void mdelay(unsigned int delay)
{    unsigned int delay1;
     for (;delay>0;delay--)
     for (delay1=0;delay1<125;delay1++);
}

/*void send232(void)
{	EA=0;
    TI = 0;
	SBUF = sbuf;
  	while(!TI);		 	// 是0等发送完毕
	TI=0;
   EA=1;
	//SBUF=((unsigned char *)&v)[0];
}
void receive232(void) interrupt 4 
{    
     RI=0;
     EA=0;	  	 
	 if (isbufs>=12) isbufs=0;
     sbufs[isbufs]=SBUF; 
   	 isbufs++;

     EA=1;    

}	 */

void read2543(unsigned char j)
{     unsigned char i=12,k=2;  
      while(k--)
	  {i=12;
	   j<<=4;   //j=0x10; high 4bits choice the channel
       vol12=0;
       cs2=1;
       dataout2=1;
       sck2=0;
       cs2=0;
       while(i--)
       { vol12<<=1;
	     if (dataout2) vol12 |=0x01;
	     datain2=(bit)(j&0x80);
	     sck2=1;
	     j<<=1;
	     sck2=0;
       }
         cs2=1;  
         while(!eoc2);
	   }
}		

int send595(j) unsigned char j;
{	  unsigned char i=8;
	  lock5=1;
	  oe5=0;
	  sck5=1;
while (i--)
     { sck5=0;
	   data5=(j & 0x80); 
	   j<<=1;
	   sck5=1;
	 }	 
}
void send595_4vol(void)
{    unsigned char i;
     i=voltemp/1000;  voltemp%=1000;
     send595(ledcode[i] | 0x80);
	 i=voltemp/100;  voltemp%=100;
     send595(ledcode[i]);
	 i=voltemp/10;  voltemp%=10;
     send595(ledcode[i]);
	 i=voltemp;
     send595(ledcode[i]);

	 lock5=0;  //Latch上升沿有效
	 lock5=1;
//	 oe5=0;	  // 595 /G有效, 输出.
}


void keypress(void)
{	 while (!p10)
     { mdelay(100);
	   while(!p10)
	   { while(!p10);
	     keysign=1;
	   }
	 }
}

void readvol(void)	  //依次读电压.判断范围,显示
{    unsigned char i,k,j=8,t=0;
     failsign=0;
     for (k=0;k<j;k++)
	 { do
	   { read2543(k);
	     if (k==0) vol12<<=1;
	     voltemp=((unsigned long)vol12*5000)/0xfff;
	     if (voltemp<Lspc[t] || voltemp>Hspc[t]) 
	          {p14=0;p15=1;}
		 else {p14=1;p15=0;}
         send595_4vol();
		 for (i=0;i<10;i++)
		 { 	mdelay(30);
		    if(!p10)
		     { while(!p10); 
		       goto exit; 
		     }
		 } 	  	
	    }
	     while (keysign);

  exit:	 if (p14==0) failsign=1;
         t++;
	     if (t==6) {relay1=0;relay2=1;}
	     if (t==7) {relay1=1;relay2=1;k--;};
	     if (t==8) {relay1=0;relay2=1;k--;};
	     if (t==9){relay1=1;relay2=0;};
	     mdelay(30);
	 }
	     relay2=1;relay1=1;	
}
void showresult(void)
{    unsigned char i,j,k;
     if (failsign) {i=4;p14=0;p15=1;}	  //Show FALL
	     else      
		 {i=0;	    //Show PASS
		  total++;	//pass总数
		  p14=1;
		  p15=0;
		 } 
	 while(1)	 	  
     {for (j=0;j<4;j++)
	 send595(ledcodechar[i+j]);  
	 lock5=0; lock5=1;
	   for (k=0;k<15;k++)
	   { mdelay(50);
	     if (p10==0)  
	        { while(!p10);  goto exits; }
	   }
	   voltemp=total;
	   send595_4vol();
	   for (k=0;k<15;k++)
	   { mdelay(50);
	     if (p10==0)
	        { while(!p10); goto exits; }			
	   }
	 }
exits:	   ;	 
}

void main(void)
{   unsigned int a=2, b=6,c=7;
    c=(a>b)? a:b;

 	TMOD = 0x20; 	// 记数器0 计数器1 都以 16 位 记数
  	SCON = 0x50;
  	PCON = 0x00;  // 1001 0001 EA=1中断允许, 外部中断使能, 串口中断使能
  	TL1 = 0xfd;	 // 中断优先权寄存器
    TH1 = 0xfd;
    TR1=1;
    ES=1;
	EA=1;
	keypress();

while(1){    readvol();			  //依次读取9个电压数据并判断范围
		     showresult();
			 mdelay(200);
	 //     sbuf=(unsigned char)vol12;
     //     send232();

		 } 

}


⌨️ 快捷键说明

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