Red de conocimiento de abogados - Derecho de sociedades - 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.

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()

{ 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 paradap>

******************************************/

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;

}

/* *************************************

Enviar un mensaje al bus IIC Datos de sección

********************************* *********/

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

IIC_Stop(); //Enviar señal de parada

}

//

//******* *** **********************************************

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

{

BUF[i] = SHEBEI_RecvByte(); //BUF[0] almacena los datos en la dirección 0x32

if (i == 5)

{

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

}

//****************** ****************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;

// ******************************************* ******** ******************************************* ********* *

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

}

//************************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.