导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→Windows CE5  的单[ZhouYongliang]

 *第34379篇: Windows CE5  的单片机采样程序[原创]

  
楼 主:ZhouYongliang 2011年6月29日09:40
 Windows CE5  的单片机采样程序[原创]
发到 Windows CE5  适用于 C8051F350
// 变量声明

unsigned char xdata Vx_Char[8];       // 取模数组
unsigned char code Show_Char[10] = {'0','1','2','3','4','5','6','7','8','9'};
unsigned long xdata X_Scale , Y_Scale , Z_Scale;
unsigned char Chnnl;
/*************************************************/
/******* 用于 ADC 转换的结构变量 *****************/
/*************************************************/
typedef union LONGDATA
   { 
   unsigned long result;
   unsigned char Byte[4];
   } xdata LONGDATA;
   static LONGDATA rawvalue;
/*************************************************/


/************  发到 Windows CE5 的检测数据函数 ************* 
* 名称: 
* 说明: 单通道启动
* 功能: 检测数据读取
* 调用: X_Read();Y_Read();Z_Read();
* 输入: 无
* 返回值: (其它反回值) X_Scale , Y_Scale , Z_Scale ;
***********************************************/


void Superior_Data (void)
{
Variable_Char(X_Read());      
         UARTS_Char('$');
         UARTS_Char('A');

         UARTS_Char(Show_Char[Vx_Char[0]]);
         UARTS_Char(Show_Char[Vx_Char[1]]);
         UARTS_Char(Show_Char[Vx_Char[2]]);
         UARTS_Char(Show_Char[Vx_Char[3]]);
         UARTS_Char(Show_Char[Vx_Char[4]]);
         UARTS_Char(Show_Char[Vx_Char[5]]);
         UARTS_Char(Show_Char[Vx_Char[6]]);
         UARTS_Char(Show_Char[Vx_Char[7]]);

         UARTS_Char('\n');
         UARTS_Char('\r');
Variable_Char(Y_Read());      
         UARTS_Char('$');
         UARTS_Char('B');

         UARTS_Char(Show_Char[Vx_Char[0]]);
         UARTS_Char(Show_Char[Vx_Char[1]]);
         UARTS_Char(Show_Char[Vx_Char[2]]);
         UARTS_Char(Show_Char[Vx_Char[3]]);
         UARTS_Char(Show_Char[Vx_Char[4]]);
         UARTS_Char(Show_Char[Vx_Char[5]]);
         UARTS_Char(Show_Char[Vx_Char[6]]);
         UARTS_Char(Show_Char[Vx_Char[7]]);

         UARTS_Char('\n');
         UARTS_Char('\r');
Variable_Char(Z_Read());      
         UARTS_Char('$');
         UARTS_Char('C');

         UARTS_Char(Show_Char[Vx_Char[0]]);
         UARTS_Char(Show_Char[Vx_Char[1]]);
         UARTS_Char(Show_Char[Vx_Char[2]]);
         UARTS_Char(Show_Char[Vx_Char[3]]);
         UARTS_Char(Show_Char[Vx_Char[4]]);
         UARTS_Char(Show_Char[Vx_Char[5]]);
         UARTS_Char(Show_Char[Vx_Char[6]]);
         UARTS_Char(Show_Char[Vx_Char[7]]);

         UARTS_Char('\n');
         UARTS_Char('\r');
}

/************  单通道启动检测函数 ************* 
* 名称: X_Read();Y_Read();Z_Read();
* 说明: 单通道启动
* 功能: 检测数据读取
* 调用: 中断 ADC0_ISR
* 输入: 无
* 返回值: X_Scale , Y_Scale , Z_Scale ;
***********************************************/

/*********************X*************************/
long X_Read(void) // V
{
 ADC0CN  = 0x00;  // 增益设置 ==  1
 ADC0MUX = 0x01;  // 0x08; 电压通道差动配置
// Chnnl = 1;
 if (ADC0MD == 0x80){ADC0MD = 0x82;};
 EIE1 = 0x08;      // 开启 ADC_ISR 
 while(AD0BUSY) PCA0CPH2 = 0x0E; // 喂狗
return(rawvalue.result);
}
/*********************Y*************************/
long Y_Read(void) // I
{
 ADC0CN  = 0x05;  // 增益设置 ==  32
 ADC0MUX = 0x23;  // 0x18; 电流通道差动配置
// Chnnl = 2;
 if (ADC0MD == 0x80){ADC0MD = 0x82;};
 EIE1 = 0x08;      // 开启 ADC_ISR
 while(AD0BUSY) PCA0CPH2 = 0x0E; // 喂狗
return(rawvalue.result);
}
/*********************Z*************************/
long Z_Read(void) // Power V
{
 ADC0CN  = 0x00;  // 增益设置 ==  1
 ADC0MUX = 0x45;  // 0x28; 本机电源检测通道差动配置 
// Chnnl = 3;
 if (ADC0MD == 0x80){ADC0MD = 0x82;};
 EIE1 = 0x08;      // 开启 ADC_ISR
 while(AD0BUSY) PCA0CPH2 = 0x0E; // 喂狗
return(rawvalue.result);
}
/********************END************************/

/******************** ADC 通道切换函数 ****************** 
* 名称: Switch_Gate
* 说明: 交叉数据采样
* 功能: 通道切换交叉启动 ADC
* 调用: 无
* 输入: 无
* 返回值: X_Scale , Y_Scale , Z_Scale ;
*********************************************************/
void Switch_Gate(void) 
{
   Frequency = 0;
   X_Scale   = 0; 
   Y_Scale   = 0;
   Z_Scale   = 0;
   Chnnl     = 0;
  for (;Frequency   <= 2;)
      {
    Chnnl++; 
            switch (Chnnl)
               {
         case 1:
       ADC0CN  = 0x00;  // 增益设置 ==  1
          ADC0MUX = 0x01;  // 0x08; 电压通道差动配置
       if (ADC0MD == 0x80){ADC0MD = 0x82;};
       EIE1 = 0x08;      // 开启 ADC_ISR 
       while(AD0BUSY) PCA0CPH2 = 0x0E; // 喂狗
      break;
  
         case 2:
       ADC0CN  = 0x05;  // 增益设置 ==  32
          ADC0MUX = 0x23;  // 0x18; 电流通道差动配置
       if (ADC0MD == 0x80){ADC0MD = 0x82;};
       EIE1 = 0x08;      // 开启 ADC_ISR
       while(AD0BUSY) PCA0CPH2 = 0x0E; // 喂狗
      break;

         case 3:
       ADC0CN  = 0x00;  // 增益设置 ==  1
          ADC0MUX = 0x45;  // 0x28; 本机电源检测通道差动配置 
       if (ADC0MD == 0x80){ADC0MD = 0x82;};
       EIE1 = 0x08;      // 开启 ADC_ISR
       while(AD0BUSY) PCA0CPH2 = 0x0E; // 喂狗
      break;
      }
            } 
PCA0CPH2 = 0x0E; // 喂狗
return;


/********************** 发送数据 ************************* 
* 名称: UARTS_Char(New_char i)
* 说明: 向串口发送一个字节
* 功能: 
* 返回值: 无
*********************************************************/
void UARTS_Char(New_char i)
{
   ES0 = 0;
   TI0 = 0;
   SBUF0 = i;     // 发送数据到  UART
   while (!TI0);  // 等待发送1个字节数据完成
   TI0 = 0 ;     // 清除中断标志 
   ES0 = 1;
return;
}

/********************* 取模函数 ****************
* 名称: Variable_Char(My_value Temp1)
* 说明: 按位取模存入数组
* 功能: 按位取模   
* 调用: 无
* 输入: Temp 被取模变量
* 返回值: Vx_Char[8] 数组
************************************************/
void Variable_Char(My_value Temp1)
{
  Vx_Char[0] = (Temp1 / 10000000) % 10;  // 千万位数
     Vx_Char[1] = (Temp1 / 1000000) % 10;   // 百万位数
     Vx_Char[2] = (Temp1 / 100000) % 10;    // 十万位数
  Vx_Char[3] = (Temp1 / 10000) % 10;   // 万位数
     Vx_Char[4] = (Temp1 / 1000) % 10;    // 千位数
     Vx_Char[5] = (Temp1 / 100) % 10;     // 百位数
     Vx_Char[6] = (Temp1 / 10) % 10;      // 十位数
     Vx_Char[7] = (Temp1 / 1) % 10;       // 个位数
return;
}


/*----------------------------------------------------------------------/
ADC0_Init C051F350 初始化
-----------------------------------------------------------------------*/
void ADC0_Init (void)
{
   REF0CN = 0x03;       // 电压基准
   ADC0CF = 0x00;       // 单次转换,外部电压基准配置 

 ADC0CN  = 0x00;     // 放大倍数 Gain = 1 
 ADC0BUF = 0x44;     // 正负通道缓冲控制寄存器 0x88; 0x44; 
 ADC0MUX = 0x08;     // 模拟多路控制器

 // SYSCLK = 24.5 MHz or 49.00  MHz
 // MDCLK  = 2.4576 MHz 
 // OWR    = 100 秒   

 ADC0CLK = (SYSCLK / MDCLK) - 1;     // Generate MDCLK for modulator.
                                        // Ideally  MDCLK = 2.4576MHz
    // Program decimation rate for desired OWR
 // ADC0DECL      = 0x9A;  ADC0 DECIMATION LOW 
 // ADC0DECH      = 0x9B;  ADC0 DECIMATION HIGH 
 // sfr16 ADC0DEC = 0x9A;  抽取比率寄存器设置

 ADC0DEC = ((unsigned long) MDCLK / (unsigned long) OWR / (unsigned long) 128) - 1;

return;
}

//-----------------------------------------------------------------------------
// ADC0 中断 ADC0_ISR
//-----------------------------------------------------------------------------
void ADC0_ISR (void) interrupt 10
{
        EIE1 = 0x00;    
  while(AD0INT != 1)PCA0CPH2 = 0x0E; // 等待转换结束
  AD0INT  = 0;  // ADC0MD = 0x80 自动进入空闲方式

  rawvalue.Byte[0] = 0x00;   
  rawvalue.Byte[1] = (unsigned char) ADC0H; // ADC0FH
  rawvalue.Byte[2] = (unsigned char) ADC0M; // ADC0FM
  rawvalue.Byte[3] = (unsigned char) ADC0L; // ADC0FL

         switch (Chnnl)
    {
       case 1: X_Scale = rawvalue.result ; break; 
       case 2: Y_Scale = rawvalue.result ; break; 
       case 3: Z_Scale = rawvalue.result ; break;  
    }
return;
}



>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:2011西部电子论坛推出VIP观众服务计划

[下一篇主题]:[原创]IP-Camera应用层外包