?? spi.#3
字號:
/*================================================================================================
AD7705 analogy serialport driver
==================================================================================================
AD7705------W77E58 AD7705------W77E58 AD7705------W77E58
AD_DOUT-------P0.7 AD_DIN----------P0.4 AD_SCLK-------P2.2
[note] CYGANAL at 6MHz, AD7705BN at 2.576MHz
================================================================================================*/
#include <C8051F020.H>
//#include <reg51.h>
//#include <math.h>
//#include <intrins.h>
/*--------------------global define-------------------------------------------------------------*/
#define uchar unsigned char
#define STORE_BUF_LEN 12 /*size of storing buffer */
uchar idata ucidStoreBuf[STORE_BUF_LEN]; /*storage for storing ADC results */
uchar idata *inlast=ucidStoreBuf; /*the positon of last ADC result */
long int transfer_ad;
extern unsigned int xdata canmodify_package[];
extern int cycle_times;
extern xdata int Parameter_transfer;
/*-------------------interface define-------------------------*/
sbit AD_SCLK = P0^6; /*analogize TX in serial mode 0 */
sbit AD_DIN = P0^4; /* */
sbit AD_DOUT = P0^7;
sbit CS = P1^7; /* */
sfr16 DAC0=0Xd2;
/*---------------function prototype define--------------------*/
extern void writeCmd (uchar); /*write command code to AD7705's register */
extern uchar readStatus (void); /*read the communication register's status */
extern void readData (void); /*read ADC result from AD7705 */
extern uchar readByte (void); /* read a byte from AD7705 */
extern void delayMS (uchar); /*delay certain time */
extern void delay(int a );
extern init3();
void ad1 (void)
{
//while(1)
// {
//delayMS (50);
//delay(100);
readData (); /*read ADC result */
// delayMS (50);
//}
}
/* -----------------------------------------------------------------------------------------------
Function: void writeCmd (uchar)
PURPOSE: write command code to AD7705's regester
PARAMETERS:
RETURN:
COMMENTS:
HISTORY:
Date: 2002-7-18 2002-7-23
Author: xiaolan xiaolan
Comment: Wrote it Revise it
------------------------------------------------------------------------------------------------*/
void writeCmd (uchar command)
{
xdata uchar i;
/* AD_CS = 0; */
for (i = 0; i < 8; i ++)
{
AD_SCLK = 0;
if (command & 0x80)
AD_DIN = 1;
else
AD_DIN = 0;
command <<= 1;
AD_SCLK = 1;
}
/* AD_CS = 1; */
AD_DIN = 1;
AD_SCLK = 1;
}
/* -----------------------------------------------------------------------------------------------
Function: uchar readStatus (void);
PURPOSE: read AD7705's regester status
PARAMETERS:
RETURN:
COMMENTS:
HISTORY:
Date: 2002-7-18 2002-7-23
Author: xiaolan xiaolan
Comment: Wrote it Revise it
------------------------------------------------------------------------------------------------*/
uchar readStatus (void)
{
xdata uchar ucStatus = 0x00;
if(canmodify_package[6]==3)
writeCmd (0x08); /*write to communications register setting up */
if(canmodify_package[6]==1)
writeCmd(0x09); /*next operation to be a read from the communic-*/
/*ations register */
ucStatus = readByte();
return (ucStatus);
}
/* -----------------------------------------------------------------------------------------------
Function: uchar readData (void);
PURPOSE: read AD7705's regester status
PARAMETERS:
RETURN:
COMMENTS:
HISTORY:
Date: 2002-7-18 2002-7-23
Author: xiaolan xiaolan
Comment: Wrote it Revise it
------------------------------------------------------------------------------------------------*/
void readData (void)
{
xdata uchar ucStatus = 0x00, ucDataHigh = 0x00, ucDataLow = 0x00;
static long xdata jiyi[4];
static unsigned dec=5;
static long total=0L;
long xdata transfer1;
long xdata transfer2;
long xdata transfer3;
long xdata transfer;
// {
// ucStatus = readStatus();
// }while (ucStatus & 0x80);
ucStatus = readStatus(); /*wait for ADC result */
if((ucStatus & 0x80)==0x00)
{
if(canmodify_package[6]==3)
writeCmd(0x38); /*write to communications register setting up */
if(canmodify_package[6]==1)
writeCmd(0x39); /*next operation to be a read from the communic-*/ /*ations register */
ucDataHigh = readByte(); /*first get the high 8 bits */
*inlast = ucDataHigh; /*store the ADC result */
inlast++; /*add 1 to the position of the last ADC result */
if (inlast == ucidStoreBuf + STORE_BUF_LEN)
inlast = ucidStoreBuf; /*reset the pointer of the last ADC result */
ucDataLow = readByte(); /*then get the low 8 bits */
*inlast = ucDataLow; /*store the ADC result */
inlast++; /*add 1 to the position of the last ADC result */
if (inlast == ucidStoreBuf + STORE_BUF_LEN)
inlast = ucidStoreBuf;
/*------------------------------------------------------------------------------------------------
AD dealing with the data
----------------------------------------------------------------------------------------------------*/
transfer=(ucDataHigh<<8)+ucDataLow;
total+=transfer;
dec--;
if(dec==0)
{
jiyi[0]=jiyi[1];
jiyi[1]=jiyi[2];
jiyi[2]=jiyi[3];
//jiyi[3]=jiyi[4];
//jiyi[4]=jiyi[5];
//jiyi[5]=jiyi[6];
//jiyi[6]=jiyi[7];
//jiyi[7]=jiyi[8];
//jiyi[8]=jiyi[9];
transfer1=((total/5));
if(transfer<0)transfer1=jiyi[2];
jiyi[3]=transfer1;
transfer2=(jiyi[0]+jiyi[1]+jiyi[2]+jiyi[3])/4;
Parameter_transfer=(int)transfer2;
//transfer2=(jiyi[0]+jiyi[1]+jiyi[2]+jiyi[3]+jiyi[4]+jiyi[5]+jiyi[6]+jiyi[7]+jiyi[8]+jiyi[9])/10;
if(canmodify_package[6]==1)
{
// transfer_ad=(transfer2-canmodify_package[0])*(canmodify_package[3]*1000)/65536;
// if(transfer2>=(canmodify_package[0])+12752)
/*----------------------------------------It is temporary-------------------------------------------------------*/
//if(transfer2>=(canmodify_package[0]*52368/(canmodify_package[3]*1000))+12752)
if(transfer2>=((long)canmodify_package[0]*(canmodify_package[17]-canmodify_package[15])/(canmodify_package[3]*1000))+canmodify_package[15])
/*------------------------------------------------------------------------------------------------------------------*/
{
cycle_times=1;
//transfer_ad=((transfer2-canmodify_package[0]-12752)*(canmodify_package[3]*1000))/52368;
/*----------------------------------------It is temporary-------------------------------------------------------*/
//transfer_ad=(((transfer2-12752)*(canmodify_package[3]*1000))/52368)-canmodify_package[0];
//transfer3=transfer_ad*4095/(canmodify_package[3]*1000);
transfer_ad=(((transfer2-canmodify_package[15])*(canmodify_package[3]*1000))/(canmodify_package[17]-canmodify_package[15]))-canmodify_package[0];
transfer3=transfer_ad*4095/(canmodify_package[3]*1000);
/*------------------------------------------------------------------------------------------------------------------*/
//transfer3=((transfer2-canmodify_package[0]-12752)*4095)/52368;
if (transfer3>=4095)
DAC0=4095;
else
{DAC0=transfer3;}
}
else
{
cycle_times=-8;
//transfer_ad=((canmodify_package[0]+12752-transfer1)*(canmodify_package[3]*1000))/52368;
/*----------------------------------------It is temporary-------------------------------------------------------*/
//transfer_ad=((canmodify_package[0]*52368/(canmodify_package[3]*1000)+12752)-transfer2)*(canmodify_package[3]*1000)/52368;
transfer_ad=(((long)canmodify_package[0]*(canmodify_package[17]-canmodify_package[15])/(canmodify_package[3]*1000)+canmodify_package[15])-transfer2)*(canmodify_package[3]*1000)/(canmodify_package[17]-canmodify_package[15]);
/*------------------------------------------------------------------------------------------------------------------*/
DAC0=0;
}
}
if(canmodify_package[6]==3)
{
// if(transfer2>=canmodify_package[0]+127)
/*----------------------------------------It is temporary-------------------------------------------------------*/
//if(transfer2>=canmodify_package[0]*65404/(canmodify_package[3]*1000)+127)
if(transfer2>=(long)canmodify_package[0]*(canmodify_package[18]-canmodify_package[16])/(canmodify_package[3]*1000)+canmodify_package[16])
/*------------------------------------------------------------------------------------------------------------------*/
{
cycle_times=1;
// transfer_ad=(transfer2-canmodify_package[0]-127)*(canmodify_package[3]*1000)/65404;
/*----------------------------------------It is temporary-------------------------------------------------------*/
// transfer_ad=(transfer2-127)*(canmodify_package[3]*1000)/65404-canmodify_package[0];
// DAC0=transfer_ad*4095/(canmodify_package[3]*1000);
transfer_ad=(transfer2-canmodify_package[16])*(canmodify_package[3]*1000)/(canmodify_package[18]-canmodify_package[16])-canmodify_package[0];
DAC0=transfer_ad*4095/(canmodify_package[3]*1000);
/*------------------------------------------------------------------------------------------------------------------*/
//DAC0=(transfer2-canmodify_package[0])*4095/65536;
if(transfer2>=65404)DAC0=4095;
}
else
{
cycle_times=-8;
//transfer_ad=(canmodify_package[0]+127-transfer2)*(canmodify_package[3]*1000)/65404;
/*----------------------------------------It is temporary-------------------------------------------------------*/
//transfer_ad=((canmodify_package[0])*65404/(canmodify_package[3]*1000)+127-transfer2)*(canmodify_package[3]*1000)/65404;
transfer_ad=((long)canmodify_package[0]*(canmodify_package[18]-canmodify_package[16])/(canmodify_package[3]*1000)+canmodify_package[16]-transfer2)*(canmodify_package[3]*1000)/(canmodify_package[18]-canmodify_package[16]);
/*------------------------------------------------------------------------------------------------------------------*/
DAC0=0;
}
}
//transfer_ad=transfer2;
dec=5;
total=0;
}
} /*reset the pointer of the last ADC result */
}
/* -----------------------------------------------------------------------------------------------
Function: uchar readByte (void)
PURPOSE:
PARAMETERS:
RETURN:
COMMENTS:
HISTORY:
Date: 2002-7-23
Author: xiaolan
Comment: Wrote it
------------------------------------------------------------------------------------------------*/
uchar readByte (void)
{
xdata uchar i, ucReturn = 0x00;
/* AD_CS = 0; */
AD_DOUT = 1;
AD_SCLK = 1;
for (i = 0; i < 8; i ++)
{
AD_SCLK = 0;
ucReturn <<= 1;
if (AD_DOUT)
ucReturn |= 0x01;
AD_SCLK = 1;
}
/* AD_CS = 1; */
AD_DOUT = 1;
AD_SCLK = 1;
return (ucReturn);
}
/* -----------------------------------------------------------------------------------------------
Function: void delayMS (uchar)
PURPOSE: delay certain time
PARAMETERS:
RETURN:
COMMENTS:
HISTORY:
Date: 2002-7-1
Author: xiaolan
Comment: Wrote it
------------------------------------------------------------------------------------------------*/
void delayMS (uchar MS)
{
xdata uchar us,usn;
while (MS!=0)
{WDTCN=0xa5;
usn = 4;
while (usn!=0)
{WDTCN=0xa5;
us = 0xf0;
while (us!=0)
{WDTCN=0xa5;
us--;
}
usn--;
}
MS--;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -