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

📄 20090309161950f65785[1].txt

📁 /8051单片机TLC1549数据采集程序源代码 //单片机:At89S52 //连接类型:232 |485 接口
💻 TXT
📖 第 1 页 / 共 5 页
字号:
                  } 
                  //================================= 
                  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 + -