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

📄 text1.c

📁 数字电压表,电压表能实现档位自动切换,让使用者方便,不必手动切换档位.
💻 C
字号:
#include "reg51.h"
#define uint unsigned int
#define uchar unsigned char
uchar disbuf[6];
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
                       0xf8,0x80,0x90,0x88,0x83,0xc6,0xa2,0x86,0x8e};
float 	   VolTureValudeA;
#define V_hig 0x80
#define V_mid 0x40
#define V_low 0x20
sbit e=P2^3;
sbit cs=P2^5;
sbit din=P2^6;
sbit clk=P2^4; 
sbit out=P2^7;
bdata bit busy=0;
uchar disp_move=0;
long float Vol_actual;
uchar Level=2; //0,1,2三个电压等级标志

void delay3(int a)
{
    while(a--);
}

uint read1543(uchar port) //从TLC1543读取采样值,形参port是采样的通道号
{
uint data ad;uint data i;
uchar data al=0,ah=0;

busy=1;
clk=0;
cs=0;
port<<=4;
for (i=0;i<4;i++) //把通道号打入1543
{
din=(bit)(port&0x80);clk=1;clk=0;
port<<=1;
}

for (i=0;i<6;i++) //填充6个CLOCK
{
clk=1;clk=0;
}

cs=1;
delay3(20);
cs=0; //等待AD转换
 while(e==0);
delay3(5);

for (i=0;i<2;i++) //取D9,D8
{
out=1;
clk=1;
ah<<=1;
if (out) ah|=0x01;
clk=0;
} 

for (i=0;i<8;i++) //取D7--D0
{
out=1;
clk=1;
al<<=1;
if (out) al|=0x01;
clk=0;
} 

cs=1;
ad=(uint)ah;ad<<=8;ad|=(uint)al; //得到AD值
busy=0;
return (ad);
}

/*float GetData_MedianFilter()
{
		unsigned int xdata m=0,i,k;
    	float xdata d_p,mad,d[11],z,b[11],v_sum=0,data_p;
       float VolTureValude;
       for(i=0;i<10;i++)//取出窗口中的n个收据
       {
       	b[i]=read1543(0x0a);
       }  
       
		delay3(100);
   			  
               for(i=0;i<10;i++)
			   v_sum=v_sum+b[i];
			   delay3(100);
			   VolTureValude=v_sum/10;
		return(VolTureValude);				 }	   		*/	



float filter(uchar v)
{  float sum=0;
float value_buf[11],temp;
char count,i,j;
for (count=0;count<11;count++)
{
value_buf[count]=read1543(v);    //获取采样值
delay3(300);
}
for (j=0;j<10;j++)  //采样值由小到大排列,排序采用冒泡法
{
for (i=0;i<11-j;i++)
{
if(value_buf[i]>value_buf[i+1])
{
temp=value_buf[i];
value_buf[i]=value_buf[i+1];
value_buf[i+1]=temp;
}
}
}
  for(count=1;count<10;count++)    //去掉第一个和末一个数
{
sum+=value_buf[count];
delay3(100);
}
return (float)(sum/9);
}
	

							  
timer0() interrupt 1 using 1  //显示处理部分
{
	if(busy==0)
	{
		if(Level!=3)
		{
	 		disbuf[0]=Vol_actual/10;
			disbuf[1]=(uchar)Vol_actual%10; 
			disbuf[2]=(uint)(Vol_actual*10)%10;
			disbuf[3]=(uint)(Vol_actual*100)%10;
			disbuf[4]=(unsigned long)(Vol_actual*1000)%10;													
  			disbuf[5]=(unsigned long)(Vol_actual*10000)%10;

			P0=0x00;
			if(disp_move==1)
			{
				  P1=table[disbuf[disp_move]]&0x7f;
			}
			else
			P1=table[disbuf[disp_move]];
			P0=0x01<<disp_move;
			disp_move=(disp_move+1)%6;
		}
		else
		{
			P0=0xff;
			P1=table[15];
		}
	}
	TH0=(65536-2000)/256; //定时器1定时50ms
	TL0=(65536-2000)%256;
} 
main()
{  
	long float Vol_test;
	TMOD=0x01; //定时器0在工作方式1
	TH0=(65536-2000)/256; //定时器1定时50ms
	TL0=(65536-2000)%256;
	ET0=1; 
	EA=1; 
	TR0=1;
    while(1)
  	{	
		if(  filter(0x0a)>=0x3ff)	  //超出总量程
		{
			P3=0x00;
			Level=3;
		}
		else 
		{
			Vol_test= filter(0x0a)/1024*5;
			if(Vol_test<=2.4658)
			{
					if(Vol_test<=0.2490)
					{
			  			P3=V_low;
						Level=0;
					}
					else
					{
						P3=V_mid;
						Level=1;
					}


			} 
			else
			{
				P3=V_hig;
				Level=2;
			} 	  
		}			 
		delay3(1000);									  
		switch(Level)
		{
			case 0:
			{
				   	Vol_actual=(float)filter(0x09)/1024*5+0.0005;
				   	break;
			}
			case 1:
			{
				   Vol_actual=(float)filter(0x08)/1024*5*10+0.0005;
				   break;
			}
			case 2:
			{
				Vol_actual=(float)filter(0x07)/1024*5*20+0.0005;
				break;
			}
			default: break;
		}
	}	 
}

⌨️ 快捷键说明

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