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;
}