|
请问专家:
我以前用的是12位AD转换器MAX187,现在用的是16位的MAX1162,不知怎么转换的数据不对,变小了好多?
以前的MAX187自带基准电压,这次我用的是外基准电压MAX6241,和以前的一样4.096v
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit Sclk = P0^1;
sbit CS = P0^0;
sbit Dout = P0^2;
sbit ControlA = P1^0;
sbit ControlB = P1^1;
#define TimeDelay 2000
//程序所用变量声明
uchar Time0Count;
uchar Time0Count;
uchar Uart0DataNum;
uchar Uart0Data[5];
uint ADout;
//程序所用函数声明
void McuInitial(void);
void InitialTime0(void);
void IntialSerialComm(void);
void SerialSend(uchar SendData);
void delay(uint n);
void Max1162(void);
void ADAverage(void);
void ADResult(void);
void OutControl(void);
bit FlagComm;
//主函数//
void main(void)
{
uint i;
McuInitial();
for(i=0;i<20;i++)
delay(0xff);
for(i=0;i<8;i++)
SerialSend('A');
while(1)
{
ADResult();
SerialSend(0xaa);
SerialSend(ADout/256);
SerialSend(ADout%256);
SerialSend(0xbb);
Time0Count = 0;
if(FlagComm==1)
{
FlagComm = 0;
OutControl();
FlagComm = 0;
}
}
}
//单片机初始化处理//
void McuInitial(void)
{
IntialSerialComm();//串行中断初始化,占用定时器1,如果用串行中断,定时器1不能用于定时
EA = 1;//打开中断
ControlA = 0;
ControlB = 0;
}
//定时器1初始化//
void InitialTime0 (void)
{
TMOD |= 0x01;//16位定时器
TH0 = 0x06;//8ms
TL0 = 0xed;
ET0 = 1;//使能中断
TR0 = 0;//打开定时器
}
//串行中断初始化//
void IntialSerialComm(void)
{
PCON = 0x00;//串口中断初始化,SMOD=0
TMOD = 0x20;
SCON=0x50;//允许接收
TH1=0xfd;//fd
TL1=0xfd;//fd
TR1=1;
ES=1;
}
//定时器0中断服务子程序//
void InterruptTime0(void) interrupt 1
{
TH0 = 0x06;//8ms
TL0 = 0xed;
Time0Count++;
}
//串行接收中断服务子程序//
void InterruptSerialComm(void) interrupt 4
{
if(RI)
{
RI = 0;
Uart0Data[Uart0DataNum] = SBUF;
Uart0DataNum++;
if(Uart0DataNum>4)
{
ES = 0;
FlagComm = 1;
Uart0DataNum = 0;
}
}
}
//串行发送程序//
void SerialSend(uchar SendData)
{
SBUF = SendData;
while(TI==0);
TI = 0;
}
//延时//
void delay(uint n)
{
while(n!=0)
{
n--;
}
}
void Max1162(void)
{
uchar i;
uchar TempUp,TempDown;
CS = 1;
TempUp = 0;
TempDown = 0;
CS = 0;
for(i=0;i<8;i++) 用MAX187的时候是i<4
{
TempUp = TempUp << 1;
Sclk = 1;
delay(1);
Sclk = 0;
if(Dout)
TempUp = TempUp + 1;
}
for(i=0;i<8;i++)
{
TempDown = TempDown << 1;
Sclk = 1;
delay(1);
Sclk = 0;
if(Dout)
TempDown = TempDown + 1;
}
CS = 1;
ADout = TempUp;
ADout = ADout << 8;
ADout += TempDown;
}
//数据处理:以MAX1162采样转换发送T转换周期=25μs计算,每隔一T转换周期采一次数据,
//连续采集5次,共用时(25+25)*5=250μs,即0.25ms,组成一个采集周期T采集,
//求这5次的数据的平均得平均值Y1(注意:在此过程中如有某一数据与其它数据相差较大,即删除不用。)
//每隔250个T采集的周期即62.5ms后,再采集一组数据得平均值Y2,在1000个T采集的周期内,共得四个数据Y1、Y2、Y3、Y4,
//取平均值Y,将此值Y 送上位机。完成了1秒送上位机4个数据的任务。此过程不断循环。
void ADAverage(void)
{
uchar i;
uint TempOut[5];
for(i=0;i<5;i++)
{
Max1162();
TempOut = ADout;
}
for(i=0;i<5;i++)
{
ADout = ADout + TempOut;
}
ADout = ADout / 5;
}
void ADResult(void)
{
uchar i;
uint TempOut[5];
for(i=0;i<5;i++)
{
ADAverage();
TempOut = ADout;
}
for(i=0;i<5;i++)
{
ADout = ADout + TempOut;
}
ADout = ADout / 5;
}
//P1口输出控制,受命于串口命令//
void OutControl(void)
{
uchar i;
if(Uart0Data[3] == 0x11)
ControlA = !ControlA;
if(Uart0Data[3] == 0x12)
ControlB = !ControlB;
if(Uart0Data[3] == 0x13)
McuInitial();
for(i=0;i<5;i++)
{
Uart0Data = 0;
}
ES = 1;
RI = 0;//此处一定要清0
}
|
|