⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad7705 sensor.c

📁 P89LPC931操作AD7705的程序。
💻 C
📖 第 1 页 / 共 2 页
字号:
#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数据输出的反相脉冲*/ 
sbit AdDin = P2^2;  /*AD7705数据输入脉冲*/ 
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读到的转换结果*/ 
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];    /*存储从串口接收到的命令数据*/ 
uchar idata i = 6;             /*命令数据字符串的小脚标*/ 
uchar f = 1,ChannelFlag = 2,zerotemp;
float idata LSB = 0.000457764;
//---------------------------------------------------------------------------
//功能:看门狗初始化
//---------------------------------------------------------------------------
void WatchdogInit(void)
{
  WDL = 0XFF; 				//看门狗复位时间
  EA =0;
  WDCON = 0XE6;    //选择看门狗振荡器为看门狗时钟源;//0XE5;选择PCLK为看门狗时钟源
  WFEED1 = 0XA5;
  WFEED2 = 0X5A;
  EA =1;
}
///---------------------------------------------------------------------------
//功能:关看门狗定时器时钟
//---------------------------------------------------------------------------
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通信端口复位
//---------------------------------------------------------------------------
void Reset7705(void) 
{
    uchar i; 
    for(i=0;i<35;i++)    //多于连续32个 DIN=1 使串口复位 
    { 
        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数据更新速率 */ 
	}
	else
	{
    WriteByte7705(0x21); /* 写CH1 clock register */ 
    WriteByte7705(0x05); /* 2.4576MHz时钟,50Hz数据更新速率 */ 
	}
    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转换数据 输入通道channel ----1=IN1,2=IN2;
//---------------------------------------------------------------------------
uint GetData7705(uchar channel) 
{
    if(channel==1) 
        WriteByte7705(0x38); 
    else 
        WriteByte7705(0x39); 
    return ( ReadWord7705() ); 
}
//---------------------------------------------------------------------------
//功能:处理串口收到的数据
//---------------------------------------------------------------------------
void ArrangeData(void)
{
 if(CommandData[6] == 'C'|CommandData[6] == 'c')  /*终止数据更新命令*/ 
     {
	  Update_temp = 0;
	 }
  if(CommandData[6] == '$'&(CommandData[5] == 'I'|CommandData[5] == 'i')&CommandData[4] == ','&CommandData[1] == 0x0d)  /*终止数据更新命令*/ 
     {
	  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)/*复位命令*/ 
     {
	  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;  /*继续输出数据*/ 
	 }
 if(CommandData[6] == '$'&(CommandData[5] == 'Z'|CommandData[5] == 'z')&CommandData[4] == 0x0d)/*将当前位置设为零点*/ 
     {
      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);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -