La Red de Conocimientos Pedagógicos - Currículum vitae - 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

#include // Biblioteca Keil

#include

#include

#include<1602.h>

#include

#include

void main()

{

unsigned int i;

retardo(500);

init_com();

Init_ADXL345();

while(1) // Bucle

{

retraso(100);

Multiple_read_SHEBEI(0xA6,0x32);

display_x() //--- ------Mostrar eje X

display_y() //---------Mostrar eje Y

display_z() //- -- ------Mostrar eje Z

retardo(100);

}

}

//** ** *******************xianshi.H

//Mostrar eje x

void display_x()

{ float temp;

dis_data=(BUF[1]<<8)+BUF[0] //Datos sintéticos

X1=(float)dis_data; *3.9/ 10000;

if(dis_data<0){

dis_data=-dis_data;

DisplayOneChar(10,0,'-'); /Mostrar bit de signo negativo correcto

}

else DisplayOneChar(10,0,' '); //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); //Convierta los datos necesarios para la visualización

DisplayOneChar(8,0,' X') ; //Fila 0, columna 0 muestra X

DisplayOneChar(9,0,':');

DisplayOneChar(11,0,qian); >

DisplayOneChar(12,0,'.');

DisplayOneChar(13,0,bai

DisplayOneChar(14,0,shi); >

DisplayOneChar(15,0,'g');

}

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

************************************************** * *****

//Mostrar eje y

void display_y()

{ float temp;

dis_data= (BUF [3]<<8)+BUF[2]; //Datos sintéticos

Y1=(float)dis_data*3.9/10000

if(dis_data<0) {

dis_data=-dis_data;

DisplayOneChar(2,1,'-'); //Muestra los bits de signo positivo y negativo

}

else DisplayOneChar(2,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(0,1,'Y'); //Fila 1, columna 0 muestra y

DisplayOneChar(1,1,':');

DisplayOneChar(3,1,qian

DisplayOneChar(4,1,'.'); /p >

DisplayOneChar(5,1,bai);

DisplayOneChar(6,1,shi);

DisplayOneChar(7,1,'g'); /p >

}

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

//Mostrar eje z

void display_z()

{ float temp;

dis_data=(BUF[5]<<8)+BUF[4] //Datos sintéticos

Z1=(float)dis_data*3.9/10000

if(dis_data<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; //Para calcular los datos y mostrarlos, consulte la página 4 del Inicio rápido de ADXL345

conversion(temp);

DisplayOneChar(8,1,'Z'); //La línea 0, columna 10 muestra Z

DisplayOneChar(9,1,':'); p> DisplayOneChar (11,1,qian);

DisplayOneChar(12,1,'.');

DisplayOneChar(13,1,bai); p>DisplayOneChar(14,1,shi);

DisplayOneChar(1);

5,1,'g');

}

/*void display(int k,uchar i,uchar m)

{

if(k<0){

k=-k;

DisplayOneChar(i,m,'-'); //Mostrar bit de signo negativo

}

else DisplayOneChar(i,m,' '); //Mostrar espacios

conversion(k); //Convierte 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; //Generar flanco descendente

Delay5us(); //Retraso

SCL = 0; //Baje la línea del reloj

}

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

Señal de parada

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

void IIC_Stop()

{

SDA = 0; //Extraer la línea de datos baja

SCL = 1; //Extraer la línea del reloj

Delay5us(); //Retraso

SDA = 1; /Generar subida a lo largo

Delay5us(); //Retraso

}

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

Enviar señal de respuesta

Parámetros de entrada: ack (0: ACK 1:NAK)

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

void SHEBEI_SendACK(bit ack)

{

SDA = ack //Escribir señal de reconocimiento

SCL = 1; //Sube la línea del reloj

Delay5us(); //Retraso

SCL = 0;

//Baja la línea del reloj

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 byte de datos al bus IIC

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

void SHEBEI_SendByte(BYTE dat)

{

BYTE i;

for (i=0; i <8; i++) //Contador de 8 bits

{

dat <<= 1; //Desplaza el bit de datos más alto

SDA = CY; / /Enviar puerto de datos

SCL = 1; //Sube la línea del reloj

Delay5us() //Retraso

SCL = 0; // Tira de la línea del reloj hacia arriba Línea del reloj baja

Delay5us() //Retraso

}

SHEBEI_RecvACK(); ;

}

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

Desde IIC El bus recibe un byte de datos

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

BYTE SHEBEI_RecvByte()

{

BYTE i ;

BYTE dat = 0;

SDA = 1; //Habilitar pull-up interno, listo para leer datos,

for (i=0; i<8; i++) //Contador de 8 bits

{

dat <<= 1;

SCL = 1; line

Delay5us(); //Retraso

dat |= SDA;

SCL = 0; //Baja la línea del reloj

Delay5us(); //Retraso

}

return dat;

}

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

void Single_Write_SHEBEI(uchar SlaveAddress,uchar REG_Address,uchar REG_data)

{

IIC_Start(); //Señal de inicio

SHEBEI_SendByte(SlaveAddress); //Enviar dirección del dispositivo + señal de escritura

SHEBEI_SendByte(REG_Address); , Consulte el pdf en chino

SHEBEI_SendByte(REG_data); // Para obtener datos de registro interno, consulte el pdf en chino

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 dirección del dispositivo + señal de escritura

SHEBEI_SendByte( dirección); //Enviar dirección de unidad de almacenamiento, comenzando desde 0x32

IIC_Start(); //Iniciar señal

SHEBEI_SendByte(SlaveAddress+1);

for (i=0; i<6; i++) //Leer continuamente 6 datos de direcciones, almacenados en BUF

{

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

if (i == 5)

{

SHEBEI_SendACK(1); //El último dato debe devolverse con 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, más o menos 16 g, modo de 13 bits

Single_Write_SHEBEI(0xA6,0x2C,0x08); //La velocidad está establecida en 12,5. página 13

Single_Write_SHEBEI(0xA6,0x2D,0x08); //Seleccione el modo de energía, consulte la página 24 del pdf

Single_Write_SHEBEI(0xA6,0x2E,0x80);

Single_Write_SHEBEI (0xA6,0x1E,0x00); //El desplazamiento X se escribe en la página 29 del pdf según el estado del sensor de prueba

Single_Write_SHEBEI(0xA6,0x1F,0x00); //El desplazamiento Y se basa en el estado del sensor de prueba. Escribe la página pdf29

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 // Defina la dirección esclava del dispositivo en el bus IIC

//uchar SlaveAddress;

typedef unsigned char BYTE;

typedef unsigned short WORD;

BYTE BUF[8]; //Recibir datos Área de caché

uchar ge,shi,bai,qian,wan; //Mostrar variables

int dis_data

p>

flotante X1;

flotante Y1;

flotante Z1;

int x;

int y;

int z;

int Hx;

int Hy;

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

nulo retraso (int k sin firmar)

{

unsi

gned int i,j;

for(i=0;i

{

for(j=0;j<121; j++)

{;}}

}

void Delay5us()

{

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

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

}

void Delay5ms()

{

PALABRA n = 560;

mientras (n--);

}

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

Conversión nula(uint temp_data)

{

wan= temp_data/10000x30;

temp_data=temp_data%10000; //operación restante

qian=temp_data/1000x30;

temp_data=temp_data% 1000; //Operación restante

bai=temp_data/100x30;

temp_data=temp_data%100; //Operación restante

shi=temp_data /10x30;

temp_data=temp_data%10; //Operación restante

ge=temp_data+0x30

}

p>

//***************************1602.h

void write_commend(uchar com)

{P0=com;

RS=0;

E=1;

retraso(2);

E =0;

}

void write_data(uchar dat)

{P0=dat;

RS=1;

E=1;

retraso(2);

E=0;

}

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); /Indica segunda línea

}

while (*s)

{

write_data( *s); p > s ++;

}

}

void DisplayOneChar(uchar X,uchar Y,uchar DData)

{ < / p>

Y&=1;

X&=15

si(Y)X|=0x40; /p>

p>

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

.