Quiero el método de conexión del modo I2C específico entre el microcontrolador ADXL345 y 51. Lo mejor es proporcionar un programa. Gracias a todos.
//********ADXL345.C
#include lt;REG51.Hgt;
#include lt;math.hgt; //Biblioteca Keil
#include lt;INTRINS.Hgt;
#includelt;dingyi.hgt;
#includelt;1602.hgt;
#includelt;Reluctance.hgt;
#includelt;xianshi.hgt;
void main()
{
int sin signo i;
retraso(500);
init_com();
Init_ADXL345(); // Bucle
{
delay(100);
Multiple_read_SHEBEI(0xA6, 0x32);
display_x(); ---------Mostrar eje X
display_y(); //---------Mostrar eje Y
display_z(); // ---------Mostrar eje Z
delay(100);
}
}
/ /* *************************xianshi.H
//Mostrar eje x
void display_x() p>
{ float temp;
dis_data=(BUF[1]lt;lt;8) BUF[0] //Datos sintéticos
X1=(float) dis_data*3.9/10000;
if(dis_datalt; 0){
dis_data=-dis_data
DisplayOneChar(10, 0, '-'); //Mostrar los bits de signo positivo y negativo
}
else DisplayOneChar(10, 0, ' '); //Mostrar espacios
temp=(float)dis_data *3.9; //Calcule los datos y visualícelos, consulte la página 4 del inicio rápido de ADXL345
conversion(temp) //Convierta los datos necesarios para la visualización
DisplayOneChar(8, 0, 'X'); //Línea 0, columna 0 muestra X
DisplayOneChar(9, 0, ':'); 0, qian);
DisplayOneChar(12, 0, '.');
DisplayOneChar(13, 0, bai
DisplayOne);
Char(14, 0, shi);
DisplayOneChar(15, 0, 'g');
}
//****** ************************************************** * ***************
//Mostrar eje y
void display_y()
{ float temp ;
dis_data=(BUF[3]lt;lt;8) BUF[2]; //Datos sintéticos
Y1=(float)dis_data*3.9/10000; p>
if(dis_datalt; 0){
dis_data=-dis_data;
DisplayOneChar(2, 1, '-'); //Muestra el signo positivo y negativo bits
}
else DisplayOneChar(2, 1, ' '); //Mostrar espacios
temp=(float)dis_data*3.9; datos y visualización, consulte la página 4 del inicio rápido de ADXL345
conversion(temp); //Convierta los datos necesarios para la visualización
DisplayOneChar(0, 1, 'Y'); // Línea 1, columna 0 muestra y
DisplayOneChar(1, 1, ':'
DisplayOneChar(3, 1, qian); DisplayOneChar(4, 1, '.');
DisplayOneChar(5, 1, bai
DisplayOneChar(6, 1, shi
); DisplayOneChar(7, 1, 'g');
}
//********************** ****** ********************************************** ****
//Mostrar eje z
void display_z()
{ float temp;
dis_data=(BUF [5]lt;lt;8) BUF[4]; //Datos sintéticos
Z1=(float)dis_data*3.9/10000
if(dis_datalt;0){
dis_data= -dis_data;
DisplayOneChar(10, 1, '-'); //Mostrar bit de signo negativo
}
else DisplayOneChar(10, 1,''); //Mostrar espacios
temp=(float)dis_data*3.9; //Calcular datos y mostrar, consulte la página 4 del Inicio rápido de ADXL345
conversion(temp); //Convierte los datos necesarios para la visualización
DisplayOneChar(8, 1, 'Z'); //La línea 0, columna 10 muestra Z
Mostrar un carácter (9, 1
,':');
DisplayOneChar(11, 1, qian);
DisplayOneChar(12, 1, '.'); , 1, bai);
DisplayOneChar(14, 1, shi
DisplayOneChar(15, 1, 'g'); p>
/*void display(int k, uchar i, uchar m)
{
if(klt; 0){
k= -k;
DisplayOneChar(i, m, '-'); //Mostrar bit de signo negativo
}
else DisplayOneChar(i, m,' '); //Mostrar espacios
conversion(k); //Convertir los datos necesarios para la visualización
DisplayOneChar(i 1, m, qian); > DisplayOneChar(i 2, m, '.');
DisplayOneChar(i 3, m, bai
DisplayOneChar(i 4, m, shi); >
} */
//************************************ ***********Renuencia.h*****
void IIC_Start()
{
SDA = 1; /Sube la línea de datos
SCL = 1; //Sube la línea de reloj
Delay5us(); //Retraso
SDA = 0; / Genera un flanco descendente
Delay5us(); //Retraso
SCL = 0 //Baja la línea del reloj
}
/************************************
Señal de parada p>p>
******************************************/
void IIC_Stop()
{
SDA = 0; // Baja la línea de datos
SCL = 1; Tirar la línea del reloj hacia arriba
Delay5us(); //Retraso
SDA = 1; //Generar flanco ascendente
Delay5us() //Retraso
}
/************************************ *******
Enviar señal de respuesta
p>
Parámetros de entrada: ack (0: ACK 1: NAK)
*************************** ** ***********/
void SHEBEI_SendACK(bit ack)
{
SDA = ack //Escribir; señal de respuesta
SCL = 1; // Tira la línea del reloj hacia arriba
Delay5us(); // Retraso
SCL = 0; línea baja
Delay5us(); //Retraso
}
/****************** ** *******************
Recibir señal de respuesta
*************** ***** *************************/
bit SHEBEI_RecvACK()
{
SCL = 1; // Levante la línea del reloj
Delay5us(); //Retraso
CY = SDA //Leer señal de respuesta
p>SCL = 0; //Baja la línea del reloj
Delay5us(); //Retraso
return CY;
} p>
/* *************************************
Enviar un mensaje al bus IIC Datos de sección
********************************* *********/ p>
void SHEBEI_SendByte(BYTE dat)
{
BYTE i
para ( i=0; ilt; 8; i) // Contador de 8 bits
{
dat lt; = 1; p>
SDA = CY; //Enviar puerto de datos
SCL = 1; //Sube la línea del reloj
Delay5us(); //Retraso
SCL = 0; //Baja la línea del reloj
p>
Delay5us(); //Retraso
}
SHEBEI_RecvACK(
}
/** ******************************); ******
Recibir un byte de datos del bus IIC
************************ ********
************/
BYTE SHEBEI_RecvByte()
{
BYTE i;
BYTE dat = 0;
SDA = 1; //Habilita el pull-up interno y prepárate para leer datos,
for (i=0; ilt; 8; i) // Contador de 8 bits
{
dat lt; = 1;
SCL = 1; // Ponga la línea del reloj en alto
Delay5us(); //Retraso
dat |= SDA; //Leer datos
SCL = 0; //Bajar la línea del reloj
Delay5us( ); //Retraso
}
return dat;
}
//******* ******************************************
nulo Single_Write_SHEBEI(uchar SlaveAddress, uchar REG_Address, uchar REG_data)
{
IIC_Start(); //Señal de inicio
SHEBEI_SendByte(SlaveAddress); señal de escritura de dirección
SHEBEI_SendByte(REG_Address); // Dirección de registro interno, consulte el pdf chino
SHEBEI_SendByte(REG_data); // Datos de registro interno, consulte el chino pdf p>
IIC_Stop(); //Enviar señal de parada
}
//
//******* *** ********************************************** p>
void Multiple_read_SHEBEI(uchar SlaveAddress, uchar dirección)
{ uchar i;
IIC_Start(); //Señal de inicio
SHEBEI_SendByte(SlaveAddress) ); //Enviar señal de escritura de dirección del dispositivo
SHEBEI_SendByte(address); //Enviar dirección de unidad de almacenamiento, comenzando desde 0x32
IIC_Start() //Iniciar señal
SHEBEI_SendByte(Dirección de esclavo 1)
; //Enviar señal de lectura de dirección del dispositivo
for (i=0; ilt; 6; i) //Leer continuamente 6 datos de dirección, almacenados en BUF
{ p>
BUF[i] = SHEBEI_RecvByte(); //BUF[0] almacena los datos en la dirección 0x32
if (i == 5)
{ p>
SHEBEI_SendACK(1); //Los últimos datos deben devolver NOACK
}
else
{
SHEBEI_SendACK ( 0); //Respuesta a ACK
}
}
IIC_Stop(); //Señal de parada
Delay5ms();
}
void Init_ADXL345()
{
Single_Write_SHEBEI(0xA6, 0x31, 0x0B); //Rango de medición, positivo y negativo 16g, modo de 13 bits
Single_Write_SHEBEI(0xA6, 0x2C, 0x08); //La velocidad se establece en 12,5, consulte la página 13 del pdf
Single_Write_SHEBEI(0xA6, 0x2D, 0x08); //Seleccione el pdf de referencia del modo de energía, página 24
Single_Write_SHEBEI(0xA6, 0x2E, 0x80); //Habilite la interrupción DATA_READY
Single_Write_SHEBEI(0xA6, 0x1E, 0x00) ; //El desplazamiento X se basa en El estado del sensor de prueba se escribe en la página 29 del pdf
Single_Write_SHEBEI(0xA6, 0x1F, 0x00); //El desplazamiento Y se escribe en la página 29 del pdf; sobre el estado del sensor de prueba
Single_Write_SHEBEI(0xA6, 0x20, 0x05); //El desplazamiento Z se escribe en la página pdf29 según el estado del sensor de prueba
} p>
//****************** ****************dingyi.h
#define uchar unsigned char
#define uint unsigned int
#define DataPort P0 //puerto de datos LCD1602
sbit SCL=P1^0; Definición del pin del reloj IIC
sbit SDA=P1^1; //Definición del pin de datos IIC
sbit RS=P2^0; //Puerto de comando LCD1602
sbit RW=P2^1; //puerto de comando LCD1602
sbit E=P2 ^2; //puerto de comando LCD1602
//#define SlaveAddress 0x3C //Definir la dirección esclava del dispositivo en el bus IIC
//uchar SlaveAddress;
typedef unsigned char BYTE;
p>
typedef unsigned short WORD;
BYTE BUF[8]; //Recibir área de búfer de datos
uchar ge, shi, bai, qian, wan; //Mostrar variables
int dis_data;
flotar X1
flotar Y1
flotar Z1; p>
int x ;
int y;
int z;
int Hx;
int Hy; p>
// ******************************************* ******** ******************************************* ********* *
retraso nulo (unsigned int k)
{
unsigned int i, j
<; p>for(i=0; ilt ;k;i){
for(j=0;jlt;121;j)
{; }}
}
void Delay5us()
{
_nop_(); _nop_();
_nop_(); _nop_(); _nop_(); p>
_nop_(); _nop_(); _nop_();
_nop_(); > _nop_(); _nop_(); _nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_() ;_nop_();_nop_(); _nop_();
_nop_(); _nop_(); ; _nop_(); _nop_();
_nop_(); _nop_(); ; _nop_();
_nop_(); _nop_();
_nop_ ();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_ ();_nop_();
_nop_();
_nop_(); _nop_(); _nop_();
}
retraso nulo5ms()
{
PALABRA n = 560;
mientras (n--); *********************************** ************* ** *****************************************
anular la conversión (uint temp_data)
{
wan=temp_data/10000 0x30;
temp_data=temp_data10000 //operación restante
qian= temp_data/1000 0x30;
temp_data=temp_data1000; //operación restante
bai=temp_data/100 0x30;
temp_data=temp_data100; /p>
shi=temp_data/10 0x30;
temp_data=temp_data10; //Operación restante
ge=temp_data 0x30
} p>
//************************1602.h
void write_commend(uchar com)
{P0=com;
RS=0;
E=1;
retraso(2);
p>
E=0;
}
void write_data(uchar dat)
{P0=dat;
RS =1;
E=1;
retraso(2);
E=0; p> void write_string(uchar x, uchar y, uchar *s)
{
if (y == 0)
{
write_commend(0x80 x); //Indica la primera línea
}
else
{
write_commend(0xC0 x) ; //Representa la segunda línea
}
while (*s)
{
write_data( *s); p>
p>
s;
}
}
void DisplayOneChar(uchar X, uchar Y, uchar DData)
{
Yamp;=1
Xamp;=15
if(Y)X|=0x40;
X|=0x80;
write_commend(X
write_data(DData)
}
void init_com()
{RW =0;
retraso(10);
write_commend(0x02);
retraso( 10);
write_commend(0x38);
retraso(10);
write_commend(0x38);
retraso(10) ;
write_commend(0x38);
write_commend(0x0c);
write_commend(0x06);
write_commend(0x01);
write_commend(0x01);
}
Lo he jugado antes, pero no tengo el módulo a mano para probarlo. Ayudarte a eliminar los que no necesitas. IIC se ha escrito como un módulo. Puede llamar directamente a Multiple_read_SHEBEI() para configurar la dirección del dispositivo y la dirección de la unidad de almacenamiento.