📄 20090309161950f65785[1].txt
字号:
}
//=================================
void SetP3()
{
switch(ComBuf[2])
{
case 0x00: P3_0=ComBuf[3]; break;
case 0x01: P3_1=ComBuf[3]; break;
case 0x02: P3_2=ComBuf[3]; break;
case 0x03: P3_3=ComBuf[3]; break;
case 0x04: P3_4=ComBuf[3]; break;
case 0x05: P3_5=ComBuf[3]; break;
case 0x06: P3_6=ComBuf[3]; break;
case 0x07: P3_7=ComBuf[3]; break;
default:
P3=ComBuf[3];//为8时...则设置整个port状态
}
}
/*=================================
WritePortData()
按上位机传来的格式进行端口的设置
=================================*/
void WritePortData()
{
switch (ComBuf[1])/*Port号*/
{
case 0x00: SetP0(); break;
case 0x01: SetP1(); break;
case 0x02: SetP2(); break;
case 0x03: SetP3(); break;
}
}
/*----------------------------------
* SetEA() *
* *
* 中断允许设定,(EA寄存器) *
* ComBuf[1]==>0x00为EA设定 *
* 0x01为读取EA值 *
------------------------------------*/
void SetEA()
{
if (ComBuf[1]==0x00)
EA=ComBuf[3];
else
{
ComBuf[3]=EA;
SendByteArray();//发送数据
}
}
/*---------------------------------------------------------------
* *
* float型转为2位char型,并发送至串行 *
* void Convert_AD_VOL_ValueToChar() *
* *
---------------------------------------------------------------*/
void Convert_AD_VOL_ValueToChar(uint vol)
{
float temp_float_vol;
unsigned int temp;
uchar AD_Hight,AD_Low;
temp_float_vol=vol*0.0048*AD_VOL_PER;
temp=temp_float_vol*100;
AD_Hight=temp /100;//取个位数
AD_Low=temp-AD_Hight*100;//取2位小数
ComBuf[2]=AD_Hight;
ComBuf[3]=AD_Low;
SendByteArray();//发送数据
}
/*--------------------------------
* *
* 预先采集一次AD数据 *
* *
*--------------------------------*/
void Befor_Once_AD()
{
uchar i;
ADCLK=ADOUT=0;
//----------
ADCS=0; //开启控制电路,使能DATA OUT和I/O CLOCK
for(i=1;i<=10;i++)
{
ADCLK=1;
ADCLK=0;
}
ADCS=1;
delay(25);//两次转换间隔大于21us
}
/*---------------------------------------------------------------
* GetAD() TLC1549数据采集 *
* sbit ADCLK=P2^0; *
* sbit ADOUT=P2^1; *
* sbit ADCS=P2^2; *
-----------------------------------------------------------------*/
void GetAD()
{
uchar i=1,w,PickCount;
uint vol;
Befor_Once_AD();//预先采集一次AD数据
//---------------
if (ComBuf[1]==0)ComBuf[1]=0x01;
PickCount=ComBuf[1];
for(w=1;w<=PickCount;w++)
{
ADCLK=ADOUT=0;
vol=0;
ADCS=0; //开启控制电路,使能DATA OUT和I/O CLOCK
for(i=1;i<=10;i++)
{
//给一个脉冲
ADCLK=1;
vol<<=1;
if(ADOUT)vol|=0x01;
ADCLK=0;
}
ADCS=1;
delay(21);//两次转换间隔大于21us
//---------------
ComBuf[1]=w;//发送第几次采集的序号
Convert_AD_VOL_ValueToChar(vol);//对float转为2位char型,并发送至串行口
P2=0xff;//p2口置初始状态
}
}
/*---------------------------------------------------------------
* *
* TLC1549数据软件滤波采集 *
* *
-----------------------------------------------------------------*/
void GetAD_With_VOL_Filter()
{
uchar i,w,j,k,PickCount,AD_Hight=0,AD_Low=0;
uint Vol=0,VolArray[10],temp;
float SumVol=0;
Befor_Once_AD();//预先采集一次AD数据
//---------------
//---------------
PickCount=11;
for(w=0;w<=PickCount;w++)
{
ADCLK=ADOUT=0;
Vol=0;
ADCS=0; //开启控制电路,使能DATA OUT和I/O CLOCK
for(i=1;i<=10;i++)
{
//给一个脉冲
ADCLK=1;
Vol<<=1;
if(ADOUT)Vol|=0x01;
ADCLK=0;
}
ADCS=1;
delay(21);//两次转换间隔大于21us
VolArray[w]=Vol;//保存采集来的数据
//---------------
P2=0xff;//p2口置初始状态
}
//-------按从小到大排序--------
//选择排序法..
for(i=0;i<=PickCount-1;i++)
{
k=i;
for(j=PickCount+1;j<i;j++)
{
if(VolArray[j]>VolArray[k])k=j;
if(k!=i)
{
temp=VolArray[k];
VolArray[k]=VolArray[i];
VolArray[i]=temp;
}
}
}
//----------累加计算平静均值------------
//乎略最小和最大值
for(i=1;i<=PickCount-1;i++)
{
SumVol=SumVol+VolArray[i];//累加结果
}
SumVol=SumVol/(PickCount-1)*0.0048;//电压值=平均值*介数
/*------------------------------
0时为正常采集,1为CD4051循环采集
因为CD4051通道存在电压消耗,
所以和正常的直接采集的校准值不一样
-------------------------------*/
/*电压校准比*/
if(CD4051_Vol_Conver_Flag)
SumVol*=AD_Loop_PickVol_PER;//采用CD4051时的电压校准值
else
SumVol*=AD_VOL_PER;//直接输入时的电压校准值
//----------------
temp=SumVol*100;//保留2位小位
AD_Hight=temp /100;//取个位数
AD_Low=temp-AD_Hight*100;//取2位小数
//ComBuf[1]=w;//发送第几次采集的序号
ComBuf[2]=AD_Hight;
ComBuf[3]=AD_Low;
SendByteArray();//发送数据
}
/*-------------------------------------------------------------------------*
* *
* CD4051_PickVol...8路选通TLC1549采集 *
* *
*-------------------------------------------------------------------------*/
void CD4051_PickVol()
{
CD4051_Vol_Conver_Flag=1;
P1=CD4051_NUM[ComBuf[1]];//CD4051通道选通
// delay(2300);//通道切换时间间隔,避免电路的残余电
GetAD_With_VOL_Filter();
CD4051_Vol_Conver_Flag=0;
}
/*-------------------------------------------------------------------------*
* *
* CD4051_LoopPickVol()...8路巡检TLC1549采集 *
* *
*-------------------------------------------------------------------------*/
void CD4051_LoopPickVol()
{
uchar i=0,w;
w=ComBuf[1]-1;//通导号等于。。。通道数-1
for(;i<=w;i++)
{
ComBuf[1]=i;//通道号
CD4051_PickVol();
}
P1=0xff;//关闭通道
}
/*-------------------------------------------------------------------------*
* *
* 电容放电计数测试 *
* TestCapCount() *
* *
*-------------------------------------------------------------------------*/
void TestCapCount()
{
uint Vol,TempVol=0xff,Count=0,temp1,temp2;
uchar i,CAPDELAYTIME;
float TEST_CAP_OUT_value="/0.05;"
P1=CD4051_NUM[1];//CD4051通道选通,1号通道
TEST_CAP_VOL_CRLT=0;//打开电源
if (ComBuf[1]==0x00)//为0x00时为电容测量方式,0x01为电压测量方式
{
for(i=0;i<=ComBuf[2];i++)delay(60000);//等待电容充电
TEST_CAP_VOL_CRLT=1;//断开电源
TEST_CAP_OUT_value="/0.01;//当为电容测量时。。下限电压"
}
CAPDELAYTIME=ComBuf[3];//延时常量
//--------------
P1_1=0;//打开LED状态指示
while(TempVol*0.0048*AD_VOL_PER>=TEST_CAP_OUT_VALUE)//当放电到0V时退出
{
ADCLK=ADOUT=0;
Vol=0;
ADCS=0; //开启控制电路,使能DATA OUT和I/O CLOCK
for(i=1;i<=10;i++)
{
//给一个脉冲
ADCLK=1;
Vol<<=1;
if(ADOUT)Vol|=0x01;
ADCLK=0;
}
ADCS=1;
delay(21);//两次转换间隔大于21us
//---------------
P2=0xff;//p2口置初始状态
Count++;//计数
ComBuf[0]=0x05;//利用软件滤波的处理过程显示
if(Count>2)TempVol=Vol;//第一次的取值有可能是1,,去掉不要
Convert_AD_VOL_ValueToChar(Vol);//转换并发送本次数据
Pluckdelay(CAPDELAYTIME);//采集间隔时间,为ComBuf[4]*1000的时间常数
}
//从高到低取
P1=0xff;//初始P1口
ComBuf[0]=0x0b;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -