//---------------------------------------------------------------------
//LR618A.C
//---------------------------------------------------------------------
//LR618A直流电压测量
//---------------------------------------------------------------------
//电流电压测量选择描述
#define USE_SWITCH 0 // 1为电压测量,0为电流测量
#define Address 0x02 // 通道地址
#define ADResult 24615 // A/D对应各档位的标准值
//---------------------------------------------------------------------
#include <c8051f350.h> // SFR 描述
#include <stdio.h> // 标准 I/O 库
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sfr16 ADC0DEC = 0x9a;
//---------------------------------------------------------------------
//参数设置区
//---------------------------------------------------------------------
#define MAX_LEN 50 //每次接收/发送字符串的长度
#define TURE 1
#define FALSE 0
#define MAX_BUF 64
#define NUM_RANGE 20
//---------------------------------------------------------------------
//ADS1240E常量定义
//---------------------------------------------------------------------
#define SETUP 0x00 //增益选择
#define MUX 0x01 //输入通道选择
#define ACR 0x02 //模拟电路控制
#define RDATA 0x01 //读数据
#define WERG 0x50 //写数据
#define RREG 0x10 //读寄存器
#define SELFOCAL 0xf1 //失调误差自校准
#define SELFGCAL 0xf2 //增益误差自校准
#define RES 0xfE //芯片复位
//---------------------------------------------------------------------
//电压挡位常量定义
//---------------------------------------------------------------------
#define CTRL_100mV 0
#define CTRL_1V 1
#define CTRL_10V 2
#define CTRL_100V 3
#define CTRL_1000V 4
//---------------------------------------------------------------------
//电流挡位常量定义
//---------------------------------------------------------------------
#define CTRL_1mA 0
#define CTRL_10mA 1
#define CTRL_100mA 2
#define CTRL_1A 3
#define CTRL_5A 4
#define CTRL_25A 5
//---------------------------------------------------------------------
//换挡位电流常量定义
//---------------------------------------------------------------------
#define P0_1mA_1mA30_pos MaxMin[0]
#define P0_1mA_1mA30_neg MaxMin[1]
#define P1_10mA_1mA20_pos MaxMin[2]
#define P1_10mA_1mA20_neg MaxMin[3]
#define P1_10mA_10mA30_pos MaxMin[4]
#define P1_10mA_10mA30_neg MaxMin[5]
#define P2_100mA_10mA20_pos MaxMin[6]
#define P2_100mA_10mA20_neg MaxMin[7]
#define P2_100mA_100mA30_pos MaxMin[8]
#define P2_100mA_100mA30_neg MaxMin[9]
#define P3_1A_100mA20_pos MaxMin[10]
#define P3_1A_100mA20_neg MaxMin[11]
#define P3_1A_1A30_pos MaxMin[12]
#define P3_1A_1A30_neg MaxMin[13]
#define P4_5A_1A20_pos MaxMin[14]
#define P4_5A_1A20_neg MaxMin[15]
#define P4_5A_5A30_pos MaxMin[16]
#define P4_5A_5A30_neg MaxMin[17]
#define P5_25A_5A20_pos MaxMin[18]
#define P5_25A_5A20_neg MaxMin[19]
//---------------------------------------------------------------------
//换挡位电压常量定义
//---------------------------------------------------------------------
#define P0_100mV_100mV30_pos MaxMin[0]
#define P0_100mV_100mV30_neg MaxMin[1]
#define P1_1V_100mV20_pos MaxMin[2]
#define P1_1V_100mV20_neg MaxMin[3]
#define P1_1V_1V30_pos MaxMin[4]
#define P1_1V_1V30_neg MaxMin[5]
#define P2_10V_1V20_pos MaxMin[6]
#define P2_10V_1V20_neg MaxMin[7]
#define P2_10V_10V30_pos MaxMin[8]
#define P2_10V_10V30_neg MaxMin[9]
#define P3_100V_10V20_pos MaxMin[10]
#define P3_100V_10V20_neg MaxMin[11]
#define P3_100V_100V30_pos MaxMin[12]
#define P3_100V_100V30_neg MaxMin[13]
#define P4_1000V_100V20_pos MaxMin[14]
#define P4_1000V_100V20_neg MaxMin[15]
//---------------------------------------------------------------------
//全局变量
//---------------------------------------------------------------------
#define SYSCLK 24500000 //24.5MHz
#define BAUDRATE 57600//115200 // UART0 波特率 (bps)
#define MDCLK 3000000 // 转换频率= 2MHZ
//#define MDCLK 2457600 // 转换频率= 2MHZ
#define OWR 10 // desired Output Word Rate in Hz
#define VREF 250L // External VREF (x 10^-2 V)
typedef struct strChange
{
uchar a;
uint Dat;
uchar b;
};
typedef union uniChange
{
ulong Dat;
uchar Chr[4];
struct strChange sDat;
};
sbit CTLCS = P0^1;
sbit SERIN = P0^2;
sbit SRCLK = P0^0;
sbit DIN = P1^4;
sbit SCLK = P1^2;
sbit LED1 = P0^3;
sbit DOUT = P1^3;
sbit ADCS = P1^5;
sbit RESET = P1^1;
sbit DRDY = P0^7;
bit readFlag = 0; //是返回A/D数据为 1
bit randFlag = 0; //是设置挡位为 1
uchar readCounts = 0; //已经读取的字符个数,与MAX_LEN比较
uchar writeCounts = 7;
uchar idata trdata[MAX_LEN]; //要接收/发送的字符串
uint xdata MaxMin[NUM_RANGE];
bit ADC0_DONE;
union uniChange ad[2]; //A/D采集缓冲区
uchar verify; //校验和
uchar addsum = 0, addbak = 0; //A/D采集缓冲区,交换变量
#if (USE_SWITCH == 1)
uchar ctrlbf = CTRL_1000V; //电压测量
#else
uchar ctrlbf; //电流测量
#endif
uchar ctrlbfbak = 0xff;
volatile ulong addat;
//---------------------------------------------------------------------
//子函数声明
//---------------------------------------------------------------------
void PARAM_Init(void);
void SYSCLK_Init (void);
void PORT_Init (void);
void ADC0_Init (void);
void IDA0_Init (void);
void UART0_Init (void);
void Send_Char (uchar ch);
void Send_String (uchar * str,uint len);
void UART0_ISR (void);
void Set_Range (uchar No);
void AD_Init (void);
void RX_CS1240 (uchar x);
void TX_ADS1240 (uchar Data, uchar x);
void delay_us (unsigned int time);
//---------------------------------------------------------------------
//主函数
//---------------------------------------------------------------------
long sample_array;
uchar as;
void main (void)
{
//volatile long ADC_OutputVal=0; // Concatenated ADC output value
// disable watchdog timer
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer enable)
PCA0CPL2 = 0xff; // 设定软件狗更新偏移值
//使能软件狗
PCA0MD |= 0x40;
delay_us(0xfff0);
delay_us(0xfff0);
delay_us(0xfff0);
delay_us(0xfff0);
delay_us(0xfff0);
SYSCLK_Init(); // 初始化系统时钟 24.5 MHz
ADC0MD = 0; // 不使用内部A/D
PORT_Init(); // Initialize crossbar and GPIO
PCA0CPH2 = 0xff; // 喂狗
RESET = 1;
ADCS = 1;
DIN = 0;
SCLK = 0;
UART0_Init(); // Initialize UART0
EA = 1; // enable global interrupts
EIE1 &= ~0x08; // Disable ADC0 interrupts
PCA0CPH2 = 0xff; // 喂狗
if((RSTSRC & 0x01) == 0x01)
{
PARAM_Init(); // 初始化测量档位换档最大最小值
}
#if (USE_SWITCH == 1) // 电压测量
ctrlbf = CTRL_1000V;
Set_Range(CTRL_1000V); // 设置最大量程
#else // 电流测量
ctrlbf = CTRL_25A;
Set_Range(CTRL_25A); // 设置最大量程
#endif
PCA0CPH2 = 0xff; // 喂狗
readCounts = 0;
readFlag = 0;
AD_Init();
while(1
评论0