3 axis atmel code
/*
* Project name:
3 axis accelerometer sensor
* Copyright
(c) Researchdesignlab.com
* Description:
* Test configuration:
MCU: AT89S52
Dev.Board: 8051
Oscillator: 11.0592 MHz
Software: Keil uVision3
*/
#include<reg51.h>
#include<string.h>
sbit SCL = P1^7;
sbit SDA = P1^6;
#define LCD_PORT P2 // LCD D0-D7 PINS connected P2
sbit rs=P3^5; // LCD RS PIN connected P3.5
sbit en=P3^7; // LCD EN PIN connected P3.7
sbit D7=P2^7;
sbit rw=P3^6;
void busy();
void CMD_WRT(unsigned char);
void LCD_WRT(unsigned char *);
void DATA_WRT(unsigned char);
void delay(unsigned int time);
void CONVERT_DISPLAY(unsigned int );
void i2c_delay(void);
void i2c_start(void);
void i2c_stop(void);
void i2c_wbyte(char i2c_wb);
unsigned char i2c_rbyte(void);
char i2c_ack(void);
void i2c_nack(void);
void i2c_read(unsigned char id,unsigned char add,unsigned char d[]);
void DELAY();
void main()
{
unsigned char ADC0,ADC1,ADC2;
unsigned char d[4];
unsigned char CMD[]={0x38,0x01,0x0f,0x06,0x80},TEMP,i;
for(i=0;i<5;i++)
{
TEMP=CMD[i];
CMD_WRT(TEMP);
}
for(i=0;i<10;i++)
DELAY();
while(1)
{
i2c_read(0x9E,0x41,&d[0]);
ADC0 = d[0];
DELAY();
i2c_read(0x9E,0x42,&d[1]);
ADC1 = d[1];
DELAY();
i2c_read(0x9E,0x43,&d[2]);
ADC2 = d[2];
DELAY();
CMD_WRT(0X01);
CMD_WRT(0X80);
LCD_WRT("X=");
CMD_WRT(0X83);
CONVERT_DISPLAY(ADC0);
CMD_WRT(0X87);
LCD_WRT("Y=");
CMD_WRT(0X8D);
CONVERT_DISPLAY(ADC1);
CMD_WRT(0XC0);
LCD_WRT("Z=");
CMD_WRT(0XC3);
CONVERT_DISPLAY(ADC2);
DELAY();
}
}
void DELAY()
{
unsigned int X=8000,Y=100;
while(X--);
while(Y--);
}
void CONVERT_DISPLAY(unsigned int d)
{
unsigned char dig1,dig2,dig3,dig[3];
unsigned char x;
unsigned char temp;
temp=d;
temp=temp/10;
dig1=d%10;
dig2=temp%10;
dig3=temp/10;
dig[0]=dig3;
dig[1]=dig2;
dig[2]=dig1;
for(x=0;x<3;x++)
{
temp=dig[x]|0x30;
DATA_WRT(temp);
}
}
void i2c_delay(void)
{
char a;
for(a=0;a<20;a++);
}
//------------------------------------------ I2C START --------------------------------------------//
void i2c_start(void)
{
SCL = 1;
i2c_delay();
SDA = 1;
i2c_delay();
SDA = 0;
i2c_delay();
SCL = 0;
i2c_delay();
}
//------------------------------------------- I2C STOP --------------------------------------------//
void i2c_stop(void)
{
SDA = 0;
i2c_delay();
SCL = 1;
i2c_delay();
SDA = 1;
i2c_delay();//
SCL = 0; //
}
//---------------------------------------- I2C WRITE BYTE -----------------------------------------//
void i2c_wbyte(unsigned char i2c_wb)
{
char a;
for(a=0;a<8;a++) // Send 8 bits
{
SCL = 0;
i2c_delay();
if(i2c_wb & (0x80 >> a))
{
SDA = 1;
}
else
{
SDA = 0;
}
i2c_delay();
SCL = 1;
i2c_delay();
}
}
//----------------------------------------- I2C READ BYTE -----------------------------------------//
unsigned char i2c_rbyte(void)
{
char a;
unsigned char b;
b=0;
for(a=0;a<8;a++)
{
SCL = 1;
i2c_delay();
if(SDA)
{
b |= (0x80 >> a);
}
i2c_delay();
SCL = 0;
i2c_delay();
}
return(b);
}
//-------------------------------------------- I2C ACK --------------------------------------------//
char i2c_ack(void)
{
char a;
i2c_delay();
SCL = 0;
i2c_delay();
SDA = 1;
i2c_delay();
SCL = 1;
i2c_delay();
i2c_delay();
a = SDA;
i2c_delay();
SCL = 0;
i2c_delay();
return(a);
}
//------------------------------------------- I2C NACK --------------------------------------------//
void i2c_nack(void)
{
SDA = 1;
i2c_delay();
SCL = 1;
i2c_delay();
SCL = 0;
i2c_delay();
}
//-------------------------------------------- I2C Read -------------------------------------------//
void i2c_read(unsigned char id,unsigned char add,unsigned char d[])
{
i2c_start();
i2c_wbyte(id);
i2c_ack();
i2c_wbyte(add);
i2c_ack();
i2c_start();
i2c_wbyte(0x9f);
i2c_ack();
*d = i2c_rbyte();
//i2c_ack();
i2c_nack();
i2c_stop();
}
void busy()
{
D7=1;
rs=0;
rw=1;
while(D7!=0)
{
en=0;
en=1;
}
}
void CMD_WRT(unsigned char val)
{
busy(); ;
LCD_PORT=val;
rs=0;
rw=0;
en=1;
en=0;
}
void LCD_WRT(unsigned char *string)
{
while(*string)
DATA_WRT(*string++);
}
void DATA_WRT(unsigned char ch)
{
busy();
LCD_PORT = ch;
rs=1;
rw=0;
en=1;
en=0;
}