?? ad7705 sensor.c
字號:
#include <reg931.h>
#include <stdio.h>
#include <flashiap.h>
#define uchar unsigned char
#define uint unsigned int
#define CH1 1 /*AD7705輸入通道IN1*/
#define CH2 2 /*AD7705輸入通道IN2*/
#define BIPOLAR 0 /*AD7705雙極性輸入*/
#define UNIPOLAR 1 /*AD7705單極性輸入*/
#define AD_CLK_WIDTH 1 /*AD7705串口時鐘脈沖寬度*/
sbit AdClk = P2^5; /*AD7705時鐘脈沖*/
sbit AdDout = P2^3; /*AD7705數(shù)據(jù)輸出的反相脈沖*/
sbit AdDin = P2^2; /*AD7705數(shù)據(jù)輸入脈沖*/
sbit DRDY = P2^7;
sbit REST = P2^6;
sbit ALARM_X = P2^0;
sbit ALARM_Y = P2^1;
uchar code BAUD_Data = 0xfa; /*存儲波特率初值*/ //19200
uchar code ID1 = 0x30,ID0 = 0x31,Update = 1;
uchar code ALARM[8]={0x01,0x00,0xff,0xff,0x01,0x00,0xff,0xff};
uchar code ZERO[4]; //////////////////////
uint idata ZeroPoint_X,ZeroPoint_Y;
uint idata ReceiveData_X[4]; /*存儲從AD7705讀到的轉(zhuǎn)換結(jié)果*/
uint idata ReceiveData_Y[4];
uint idata ALARM_X_P,ALARM_Y_P,ALARM_X_N,ALARM_Y_N;
uchar idata RIFlag,SendFlag,ArrangeFlag,InitFlag;
uchar idata BAUD_temp,BAUD_Data_temp,Update_temp = 1,ID0_temp,ID1_temp,ZeroPoint_X_temp,ZeroPoint_Y_temp;
uchar idata CommandData[7]; /*存儲從串口接收到的命令數(shù)據(jù)*/
uchar idata i = 6; /*命令數(shù)據(jù)字符串的小腳標*/
uchar f = 1,ChannelFlag = 2,zerotemp;
float idata LSB = 0.000457764;
//---------------------------------------------------------------------------
//功能:看門狗初始化
//---------------------------------------------------------------------------
void WatchdogInit(void)
{
WDL = 0XFF; //看門狗復(fù)位時間
EA =0;
WDCON = 0XE6; //選擇看門狗振蕩器為看門狗時鐘源;//0XE5;選擇PCLK為看門狗時鐘源
WFEED1 = 0XA5;
WFEED2 = 0X5A;
EA =1;
}
///---------------------------------------------------------------------------
//功能:關(guān)看門狗定時器時鐘
//---------------------------------------------------------------------------
void WatchdogStop(void)
{
EA =0;
WDCON =0XE1;
WFEED1 =0XA5;
WFEED2 =0X5A;
EA =1;
}
//---------------------------------------------------------------------------
//功能:喂狗程序
//---------------------------------------------------------------------------
void WatchdogFeed(void)
{
EA =0;
WFEED1 = 0XA5;
WFEED2 = 0X5A;
EA =1;
}
//---------------------------------------------------------------------------
//功能:初始化單片機接口
//---------------------------------------------------------------------------
/*void UART_Init()
{
P1M1 = 0x00;
P1M2 = 0x00;
SCON = 0x52;
SSTAT = 0x60;
BRGR1 = 0x02;
BRGR0 = 0xf0;
BRGCON = 0x03;
}
*/
//---------------------------------------------------------------------------
//功能:串口中斷處理
//---------------------------------------------------------------------------
void serial() interrupt 4 using 1
{
if(RI)
{
CommandData[i] = SBUF;
if(CommandData[i] == 0x0d)
{
RIFlag = 1;
}
i--;
}
RI = 0;
}
//---------------------------------------------------------------------------
//功能:AD7705軟件延時d
//---------------------------------------------------------------------------
void Wait7705(unsigned int t)
{
for( ;t>0 ;t-- );
}
//---------------------------------------------------------------------------
//功能:向AD7705寫入一個字
//---------------------------------------------------------------------------
void WriteByte7705(uchar x)
{
uchar i;
AdClk = 1;
for (i=0; i<8; i++)
{
AdClk=0;
Wait7705(AD_CLK_WIDTH);
AdDin =(bit) (x & 0x80);
Wait7705(AD_CLK_WIDTH);
AdClk=1;
Wait7705(AD_CLK_WIDTH);
x <<=1;
}
}
//---------------------------------------------------------------------------
//功能:從AD7705讀一個字
//---------------------------------------------------------------------------
uint ReadWord7705(void)
{
uchar i;
uint x ;
AdClk = 1 ;
for (i = 0,x=0 ; i < 16 ; i++)
{
AdClk=0;
Wait7705(AD_CLK_WIDTH);
x<<=1;
if (AdDout) /* 光電耦合器反相 */
x |= 0x01;
AdClk=1;
Wait7705(AD_CLK_WIDTH);
}
return x;
}
//---------------------------------------------------------------------------
//功能:AD7705通信端口復(fù)位
//---------------------------------------------------------------------------
void Reset7705(void)
{
uchar i;
for(i=0;i<35;i++) //多于連續(xù)32個 DIN=1 使串口復(fù)位
{
AdClk=0;
Wait7705(AD_CLK_WIDTH);
AdDin =1;
Wait7705(AD_CLK_WIDTH);
AdClk=1;
Wait7705(AD_CLK_WIDTH);
}
}
//---------------------------------------------------------------------------
//功能:AD7705初始化 通道channel 1=IN1,2=IN2; 輸入極性polarity -0=雙極性,1=單極性; PGA 增益gai 非緩沖模式
//---------------------------------------------------------------------------
void Init7705(uchar channel, bit polarity , uchar gain)
{
uchar x;
Reset7705(); /* 防止串口失步 */
if(channel == 1)
{
WriteByte7705(0x20); /* 寫ch0 clock register */
WriteByte7705(0x05); /* 2.4576MHz時鐘,50Hz數(shù)據(jù)更新速率 */
}
else
{
WriteByte7705(0x21); /* 寫CH1 clock register */
WriteByte7705(0x05); /* 2.4576MHz時鐘,50Hz數(shù)據(jù)更新速率 */
}
if(channel==1) /* com register ,選擇下步操作 setup register */
WriteByte7705(0x10);
else
WriteByte7705(0x11);
if(polarity) /* setup register */
x=0x04;
else
x=0x00;
switch(gain)
{
case 1 : x|=0x40;break;
case 2 : x|=0x48;break;
case 4 : x|=0x50;break;
case 8 : x|=0x58;break;
case 16 : x|=0x60;break;
case 32 : x|=0x68;break;
case 64 : x|=0x70;break;
case 128 : x|=0x78;break;
default : x|=0x40;break;
}
WriteByte7705(x);
}
//---------------------------------------------------------------------------
//功能:讀AD7705轉(zhuǎn)換數(shù)據(jù) 輸入通道channel ----1=IN1,2=IN2;
//---------------------------------------------------------------------------
uint GetData7705(uchar channel)
{
if(channel==1)
WriteByte7705(0x38);
else
WriteByte7705(0x39);
return ( ReadWord7705() );
}
//---------------------------------------------------------------------------
//功能:處理串口收到的數(shù)據(jù)
//---------------------------------------------------------------------------
void ArrangeData(void)
{
if(CommandData[6] == 'C'|CommandData[6] == 'c') /*終止數(shù)據(jù)更新命令*/
{
Update_temp = 0;
}
if(CommandData[6] == '$'&(CommandData[5] == 'I'|CommandData[5] == 'i')&CommandData[4] == ','&CommandData[1] == 0x0d) /*終止數(shù)據(jù)更新命令*/
{
ID1_temp = CommandData[3];
ID0_temp = CommandData[2];
EA = 0;
FLASH_WriteByte(&ID1,ID1_temp);
FLASH_WriteByte(&ID0,ID0_temp);
EA = 1;
if(ID0==ID0_temp&ID1==ID1_temp)
printf("ID SET OK.\n");
else
printf("ID SET FAILURE.\n");
printf("Currently ID=%c%c\n",ID1,ID0);
}
if((CommandData[6] == 'T'|CommandData[6] == 't')&CommandData[5] == 0x0d)
{
printf("\nID=%c%c\n",ID1_temp,ID0_temp);
printf("ZeroPoint_X=%2.3f\n",ZeroPoint_X*LSB);
printf("ZeroPoint_Y=%2.3f\n",ZeroPoint_Y*LSB);
printf("ALARM_X+:%2.3f,ALARM_X-:-%2.3f\n",(ALARM_X_P*LSB-15),(15-ALARM_X_N*LSB));
printf("ALARM_Y+:%2.3f,ALARM_Y-:-%2.3f\n",(ALARM_Y_P*LSB-15),(15-ALARM_Y_N*LSB));
}
if(CommandData[6] == '$'&(CommandData[5] == 'R'|CommandData[5] == 'r')&CommandData[4] == 0x0d)/*復(fù)位命令*/
{
EA = 0;
FLASH_WriteByte(&ALARM[7],0xff);
FLASH_WriteByte(&ALARM[6],0xff);
FLASH_WriteByte(&ALARM[5],0x00);
FLASH_WriteByte(&ALARM[4],0x00);
FLASH_WriteByte(&ALARM[3],0xff);
FLASH_WriteByte(&ALARM[2],0xff);
FLASH_WriteByte(&ALARM[1],0x00);
FLASH_WriteByte(&ALARM[0],0x00);
FLASH_WriteByte(&ZERO[3],0x00);
FLASH_WriteByte(&ZERO[2],0x00);
FLASH_WriteByte(&ZERO[1],0x00);
FLASH_WriteByte(&ZERO[0],0x00);
EA = 1;
ALARM_X_P = ALARM[7];
ALARM_X_P<<=8;
ALARM_X_P |=ALARM[6];
ALARM_X_N = ALARM[5];
ALARM_X_N<<=8;
ALARM_X_N |=ALARM[4];
ALARM_Y_P = ALARM[3];
ALARM_Y_P<<=8;
ALARM_Y_P |=ALARM[2];
ALARM_Y_N = ALARM[1];
ALARM_Y_N<<=8;
ALARM_Y_N |=ALARM[0];
ZeroPoint_X = 0;
ZeroPoint_Y = 0;
}
if((CommandData[6] == 'G'|CommandData[6] == 'g')&(CommandData[5] == 'O'|CommandData[5] == 'o')&CommandData[4] == 0x0d)
{
Update_temp = 1;//Update; /*繼續(xù)輸出數(shù)據(jù)*/
}
if(CommandData[6] == '$'&(CommandData[5] == 'Z'|CommandData[5] == 'z')&CommandData[4] == 0x0d)/*將當前位置設(shè)為零點*/
{
ZeroPoint_X = ReceiveData_X[0]-0x7fff;
ZeroPoint_Y = ReceiveData_Y[0]-0x7fff;
EA = 0;
zerotemp = ZeroPoint_X;
FLASH_WriteByte(&ZERO[2],zerotemp);
ZeroPoint_X>>=8;
zerotemp = ZeroPoint_X;
FLASH_WriteByte(&ZERO[3],zerotemp);
zerotemp = ZeroPoint_Y;
FLASH_WriteByte(&ZERO[0],zerotemp);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -