📄 text1.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 + -