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
#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() p>
{ 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
} p>
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 p>
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;
} p>
/*************************************** *
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)
{ p>
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; p>
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 p>
#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; p>
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) p> {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