本代码段基于AD7705/TM7705 中文参考手册编写,采用软件SPI方式读写,其中引脚连接为:
AD7705->单片机
GND------->GND
VCC------->VCC
RST不接
CS------->P1^4
SCK----->P1^0
DN------->P1^1
DOUT--->P1^2
DRDY--->P1^3
主函数代码:
#include <REGX52.H>
#include "my_spi.h"
#include "my_7705.h"
//#include "my_iic.h"
#include "my_uart.h"
#include "stdio.h"
#define uint16_t unsigned short int
#define uint8_t unsigned char
void Delay_ms(int time)
{
int i=0;
for (;time>0;time--)
{
for (;i<11000;i++);
}
}
void main()
{
uint8_t Data[10]={0x01,0x02,0x03,0x04,0x05};
float ad7705_data=0;
My_UART_Init();
printf("Serial Init Complete\n");
ad7705_init();
printf("AD7705 Init Complete\n");
while (1)
{
ad7705_data=get_7705_data()*5.0/0xffff;
printf("%f\n",ad7705_data);
}
}
串口部分代码:(my_uart.h),包含重定向printf();
#include "regx52.h"
#define uint8_t unsigned char
void My_UART_Init(void);
void Serial_Send_1Byte(unsigned char Str);
void Serial_Print(unsigned char *Data);
void Serial_Print_Float(float Num);
串口部分代码:接收部分还未测试,仅供参考(my_uart.c)
#include "my_uart.h"
#include "string.h"
#include "stdio.h"
uint8_t RxBuf[10]={0};
uint8_t Rx_Cnt=0;
uint8_t TEST_Num=66;
void My_UART_Init(void)
{
SCON=0X50; //设置为工作方式1 ,既然是方式一,自然要确定波特率,设置定时器1
TMOD=0X20; //8位重装载
PCON=0X00;
TH1=0xfd; //波特率9600
TL1=0Xfd;
ES=1; //打开通信中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
void Serial_Send_1Byte(unsigned char str)
{
ES=0;
SBUF=str;
while(!TI);//TI等于1,表示数据发送完成
TI=0;
ES=1;
}
void Serial_Print(unsigned char *Data)
{
while (*Data!='\0')
{
Serial_Send_1Byte(*Data++);
}
}
char putchar (unsigned char Data)
{
Serial_Send_1Byte(Data);
return Data;
}
void Serial_Print_Float(float Num)
{
char String_temp[21]={0};
sprintf(String_temp,"%f",Num);
printf("%s",String_temp);
}
void Serial_INT(void) interrupt 4
{
if (TI)
{
TI=0;
}
else if (RI)
{
*RxBuf=SBUF;
printf("Rx is %s\t",RxBuf);
printf("Rx_Cnt is %c\n",TEST_Num);
if (Rx_Cnt==10)
{
Rx_Cnt=0;
memset(RxBuf,0,10);
}
RI=0;
}
}
软件SPI驱动:(my_spi.h)
#include <REGX52.H>
#define uint16_t unsigned short int
#define uint8_t unsigned char
sbit SCLK=P1^0;
sbit MOSI=P1^1;
sbit MISO=P1^2;
#define DATA_0 (MOSI=0)
#define DATA_1 (MOSI=1)
#define SCLK_0 (SCLK=0)
#define SCLK_1 (SCLK=1)
//#define uint8_t unsigned char
void SPI_Write_Byte(uint8_t Data);
void SPI_Write(uint8_t *Data,uint8_t length);
uint8_t SPI_ReadWrite_Byte(uint8_t Data);
软件SPI驱动:(my_spi.c)
#include <REGX52.H>
#include "my_spi.h"
void SPI_Delay(void)
{
int i,j;
for (i=0;i<1;i++)
{
for (j=0;j<24;j++);
}
}
static SPI_Send(uint8_t Data)
{
int i=0;
#ifdef SPI_DEBUG
MISO=0;
#endif
for (i=8;i>0;i--)
{
SCLK_0;
if (Data&0x80)
DATA_1;
else
DATA_0;
SCLK_1;
Data=Data<<1;
}
DATA_1;
}
/*软件SPI*/
void SPI_Write_Byte(uint8_t Data)
{
SPI_Send(Data);
}
void SPI_Write(uint8_t *Data,uint8_t length)
{
while (length--)
{
SPI_Send(*Data++);
}
}
uint8_t SPI_ReadWrite_Byte(uint8_t Data)
{
uint8_t i=0;
uint8_t Data_Temp=0;
for (i=0;i<8;i++)
{
SCLK_0;
if (Data&0x80)
DATA_1;
else
DATA_0;
if (MISO==1)
Data_Temp|=1;
SCLK_1;
Data_Temp=Data_Temp<<1;
Data=Data<<1;
}
DATA_1;
return Data_Temp;
}
AD7705驱动:(my_7705.h)
#include "REGX52.h"
sbit DRDY=P1^3;
sbit AD_CS=P1^4;
#define AD_ON (AD_CS=0)
#define AD_OFF (AD_CS=1)
#define uint16_t unsigned short int
#define uint8_t unsigned char
void ad7705_init(void);
uint16_t get_7705_data(void);
AD7705驱动:(my_7705.c)
#include "my_7705.h"
#include "my_spi.h"
#include "REGx52.h"
void ad7705_init(void)
{
AD_ON;
SPI_Write_Byte(0x20);
SPI_Write_Byte(0x0c);
SPI_Write_Byte(0x10);
SPI_Write_Byte(0x40);
AD_OFF;
}
uint16_t get_7705_data(void)
{
uint8_t Data_L=0,Data_H=0;
uint16_t Sum=0;
AD_ON;
while (DRDY==1);
SPI_Write_Byte(0x38);
Data_H=SPI_ReadWrite_Byte(0xff);
Data_L=SPI_ReadWrite_Byte(0xff);
Sum=Data_H<<8|Data_L;
AD_OFF;
return Sum;
}
测试部分:
通道1 0V电压 测试:
通道1 5V电压测试:
转换公式:(16BitAD 满量程输出为0xFFFF(2^16))
VCC为5V
串口输出:
Arduino 串口绘图输出: