/******************************************************************
ADXL313测试 程序
******************************************************************/
#include <C8051F040.h>
#include <stdio.h>
#include <Intrins.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
#define slave_address 0xa6 //ADXL313地址
sbit SDA = P0^2;
sbit SCL = P0^3;
sfr16 RCAP2 = 0xca;
sfr16 TMR2 = 0xcc;
sbit LED = P0^7;
int buf[5];
unsigned char code cucBit[] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
void Delay_4ms(void);
void delay_5us(void); //延时函数
void SYSCLK_Init(void);
void PORT_Init(void);
void UART0_Init(void);
void senddata(unsigned char cjdata);
void Delay_40ms(void);
void I2C_Start(void);
void I2C_Stop(void);
void I2C_SenAck(void);
void I2C_SenNotAck(void);
unsigned char I2C_RecvAck(void);
void I2C_Write(unsigned char oneData);
unsigned char I2C_Read(void);
void ADXL313_single_write(unsigned char reg_address,unsigned char reg_data);
unsigned char ADXL313_single_read(unsigned char reg_address);
void ADXL313_lianxu_read(void);
void ADXL313_Init(void);
void main()
{
int out_X,out_Y,out_Z;
unsigned char out_ID=0;
WDTCN=0xde;
WDTCN=0xad; //关闭看门狗
SYSCLK_Init();
PORT_Init();
UART0_Init();
ADXL313_Init();
while(1)
{
out_ID = ADXL313_single_read(0x00); //读取ID,默认值为0xAD
// delay_5us();
ADXL313_lianxu_read();
_nop_();
out_X = ( buf[1]<<8 ) + buf[0] ;
out_Y = ( buf[3]<<8 ) + buf[2] ;
out_Z = ( buf[5]<<8 ) + buf[4] ;
// senddata(out_ID);
senddata(0xa5);
senddata(buf[1]);
senddata(buf[0]);
senddata(buf[3]);
senddata(buf[2]);
senddata(buf[5]);
senddata(buf[4]);
senddata(0xaa);
//senddata(0xf);
}
}
//延时函数
void delay_5us(void) //12M
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
void SYSCLK_Init(void)
{
int j = 0;
char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
OSCXCN = 0x67; //选择晶体振荡方式,12MHz晶振(0110 0111)
for (j = 0; j <13000; j++); // 延时1ms,// at 24 MHz, 1 ms = 24000 SYSCLKs,DJNZ = 2 SYSCLKs
while (!(OSCXCN & 0x80)); //晶体振荡器有效标志是否为1
CLKSEL = 0x01; //选择外部振荡器作为系统时钟,不分频
SFRPAGE = SFRPAGE_SAVE;
}
void PORT_Init(void)
{
char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
XBR0 = 0x04; //P0.0,P0.1连接到UART0,(0000 0100)
XBR1 = 0x00;
XBR2 = 0x40; //使能交叉开关和弱上拉
P0MDOUT = 0xf0; // SDA,SCL,RX0漏极开路,TX0推挽输出,(0000 1101)
SFRPAGE = SFRPAGE_SAVE;
}
//---------------------------------------串口初始化、数据传输----------------------------------------
void UART0_Init(void)
{
char SFRPAGE_SAVE;
SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = TMR2_PAGE;
TMR2CN = 0x00; // 定时器2,16位自动重载方式
TMR2CF = 0x08; // 系统时钟,不分频
RCAP2 = -((long)12000000/57600/16); //设置波特率57600
TMR2 = RCAP2;
TR2= 1; // 使能定时器2
SFRPAGE = UART0_PAGE;
SCON0 = 0x50; //方式1,使能RX
SSTA0 = 0x15; // 禁止分频,RX,TX选择T2波特率
// ES0 = 1;
// IP |= 0x10; //优先中断
SFRPAGE = SFRPAGE_SAVE;
}
void senddata(unsigned char cjdata)
{
char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = UART0_PAGE;
SBUF0=cjdata;
while(TI0==0);
TI0=0;
SFRPAGE = SFRPAGE_SAVE;
}
//******************************************************************************
void I2C_Start(void)
{
char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
SDA = 1;
_nop_();
SCL = 1;
delay_5us();
SDA = 0;
delay_5us();
SCL = 0;
_nop_();_nop_();
SFRPAGE = SFRPAGE_SAVE;
}
void I2C_Stop(void)
{
char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
SDA = 0;
_nop_();
SCL = 1;
delay_5us();
SDA = 1;
delay_5us();
SFRPAGE = SFRPAGE_SAVE;
}
void I2C_SenAck(void)
{
char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
SDA = 0;
SCL = 0;
delay_5us();
SCL = 1;
delay_5us();
SCL = 0;
SFRPAGE = SFRPAGE_SAVE;
}
void I2C_SenNotAck(void)
{
char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
SDA = 1;
SCL = 0;
delay_5us();
SCL = 1;
delay_5us();
SCL = 0;
SFRPAGE = SFRPAGE_SAVE;
}
unsigned char I2C_RecvAck(void)
{
unsigned char ucErrTime = 255; //故障接收方无ACK,超时值
char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
SCL = 0;
SDA = 1;
delay_5us();
SCL = 1;
delay_5us();
while(SDA)
{
ucErrTime--;
if(ucErrTime == 0)
{
I2C_Stop();
return 0;
}
}
SCL = 0;
return 1;
}
void I2C_Write(unsigned char oneData) //写一字节数据
{
unsigned char i,temp;
char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
temp = oneData;
for(i=0;i<8;i++)
{
SCL = 0;
delay_5us();
if ((temp&cucBit[i])!=0)
SDA = 1;
else
SDA = 0;
delay_5us();
SCL = 1;
delay_5us();
}
SCL = 0;
_nop_();_nop_();
SDA = 1;
_nop_();_nop_();
SFRPAGE = SFRPAGE_SAVE;
}
unsigned char I2C_Read(void)
{
unsigned char temp = 0;
unsigned char i;
char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
SCL = 0;
delay_5us();
SDA = 1;
delay_5us();
for(i=0;i<8;i++)
{
SCL = 1;
delay_5us();
temp = (temp<<1)|SDA;
SCL = 0;
delay_5us();
}
return temp;
}
void ADXL313_single_write(unsigned char reg_address,unsigned char reg_data)
{
I2C_Start();
I2C_Write(slave_address);
I2C_RecvAck();
I2C_Write(reg_address);
I2C_RecvAck();
I2C_Write(reg_data);
I2C_RecvAck();
I2C_Stop();
}
unsigned char ADXL313_single_read(unsigned char reg_address)
{
unsigned char reg_data;
I2C_Start();
I2C_Write(slave_address);
I2C_RecvAck();
I2C_Write(reg_address);
I2C_RecvAck();
I2C_Start();
I2C_Write(slave_address + 1);
I2C_RecvAck();
reg_data = I2C_Read();
I2C_SenNotAck();
I2C_Stop();
return reg_data;
}
void ADXL313_lianxu_read(void)
{
unsigned char i;
I2C_Start();
I2C_Write(slave_address);
I2C_RecvAck();
I2C_Write(0x32);
I2C_RecvAck();
I2C_Start();
I2C_Write(slave_address + 1);
I2C_RecvAck();
for(i=0;i<6;i++)
{
buf[i] = I2C_Read();
if (i==5)
I2C_SenNotAck();
else
I2C_SenAck();
}
I2C_Stop();
}
/*
void ADXL313_lianxu_read(void)
{
buf[0]=ADXL313_single_read(0x32);
buf[1]=ADXL313_single_read(0x33);
buf[2]=ADXL313_single_read(0x34);
buf[3]=ADXL313_single_read(0x35);
buf[4]=ADXL313_single_read(0x36);
buf[5]=ADXL313_single_read(0x37);
}
*/
void ADXL313_Init(void)
{
ADXL313_single_write( 0x31,0x01 ); //全分辨率,数据右对齐,测量范围+-4G
ADXL313_single_write( 0x2c,0x08 ); //100Hz数据传输率
ADXL313_single_write( 0x2d,0x08 ); //开启测量模式,关闭Sleep
ADXL313_single_write( 0x2e,0x00 ); //关闭所有中断
ADXL313_single_write( 0x1e,0x00 ); //x轴偏移量
ADXL313_single_write( 0x1f,0x00 ); //y轴偏移量
ADXL313_single_write( 0x20,0x00 ); //z轴偏移量
}
void Delay_40ms(void)
{
long i,j;
for (i=0;i<4000;i++)
for (j=0;i<1000;i++);
}