📄 ad7705 sensor00.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数据输出的反相脉冲*/
sbit AdDin = P2^2; /*AD7705数据输入脉冲*/
sbit DRDY = P1^4;
sbit REST = P2^6;
sbit ALARM_X = P2^0;
sbit ALARM_Y = P2^1;
uchar code BAUD; /*存储波特率代码*/
uchar code BAUD_Data = 0xfa; /*存储波特率初值*/
uint code ID = 100;
float code ALARM_X_P=5,ALARM_Y_P=5,ALARM_X_N=-5,ALARM_Y_N=-5; /*存储报警值*/
float code ZeroPoint_X,ZeroPoint_Y;
uint idata ZeroPoint_X_temp,ZeroPoint_Y_temp,ZeroPoint_X_temp_temp,ZeroPoint_Y_temp_temp;
float idata LSB = 0.000457764;
uint idata ReceiveData_X[4]; /*存储从AD7705读到的转换结果*/
uint idata ReceiveData_Y[4];
float idata ALARM_X_P_temp,ALARM_Y_P_temp,ALARM_X_N_temp,ALARM_Y_N_temp;
uchar idata RIFlag,SendFlag,ArrangeFlag;
uchar idata BAUD_temp,BAUD_Data_temp,Update_temp = 1;
uchar idata CommandData[5]; /*存储从串口接收到的命令数据*/
uchar idata i = 4; /*命令数据字符串的小脚标*/
//---------------------------------------------------------------------------
//功能:看门狗初始化
//---------------------------------------------------------------------------
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;
}
//---------------------------------------------------------------------------
//功能:外部中断1中断处理子程序
//---------------------------------------------------------------------------
/*void int1() interrupt 2 using 0
{
ReceiveData_X[m] = GetDataAD7705(0x01);
ReceiveData_X[m] = ReceiveData_X[m] | GetDataAD7705(0x01);
ReceiveData_X[m]<<=8;
ReceiveData_X[m] = ReceiveData_X[m] | GetDataAD7705(0x01);
WatchdogFeed();
ReceiveData_Y[m] = ReceiveData_Y[m] | GetDataAD7705(0x02);
ReceiveData_Y[m]<<=8;
ReceiveData_Y[m] = ReceiveData_Y[m] | GetDataAD7705(0x02);
m--;
if(m == 0)
{
m = 10;
ArrangeFlag = 1;
}
EX1 = 0;
WatchdogFeed();
}*/
/* AD7705软件延时 */
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(0x06); /* 2.4576MHz时钟,50Hz数据更新速率 */
}
else
{
WriteByte7705(0x21); /* 写CH1 clock register */
WriteByte7705(0x06); /* 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(0x44);
}
//---------------------------------------------------------------------------
//功能:读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[4] == 'C'|CommandData[4] == 'c') /*终止数据更新命令*/
{
Update_temp = 0;
}
if(CommandData[4] == '$'&(CommandData[3] == 'R'|CommandData[3] == 'r')&CommandData[2] == 0x0d)/*复位命令*/
{
ZeroPoint_X_temp = 0;
ZeroPoint_Y_temp = 0;
ALARM_X_P_temp = 15.0;
ALARM_X_N_temp = -15.0;
ALARM_Y_P_temp = 15.0;
ALARM_Y_N_temp = -15.0;
EA = 0;
FLASH_WriteByte(&ALARM_X_P,15.0);
FLASH_WriteByte(&ALARM_X_N,-15.0);
FLASH_WriteByte(&ALARM_Y_P,15.0);
FLASH_WriteByte(&ALARM_Y_N,-15.0);
FLASH_WriteByte(&ZeroPoint_X,0);
FLASH_WriteByte(&ZeroPoint_Y,0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -