×
单片机 > 单片机程序设计 > 详情

ADXL345倾角传感器的51单片机源程序

发布时间:2021-04-26 发布时间:
|

这是自己做的一个小程序,用到了STC12C5160S2这块单片机芯片做控制,实现ADXL345倾角传感器模块测量角度


单片机源程序如下:

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

* 文件名  :GY-29 ADXL345 测角度,角度值显示

* 创建人  :飞翔的猫

* 描述    : 该文件实现了用GY-29 ADXL345角度的采集,并在数码管上显示出来。

                        使用单片机STC89C51 

*晶振          :11.0592M

*显示     :LCD1602

*编译环境 :Keil uVision4

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

#include          

#include      //Keil library  

#include     //Keil library        

#include 

#define   uchar unsigned char

#define   uint unsigned int        


//这个一定要根据自己接的引脚来改,否则不出数据

sbit          SCL=P2^0;      //IIC时钟引脚定义

sbit           SDA=P2^1;      //IIC数据引脚定义


#define   DataPort P0    //LCD1602数据端口

sbit      LCM_RS=P2^4;   //LCD1602命令端口                

sbit      LCM_RW=P2^5;   //LCD1602命令端口                

sbit      LCM_EN=P2^7;   //LCD1602命令端口 


#define        SlaveAddress   0xA6          //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改

                              //ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A

typedef unsigned char  BYTE;

typedef unsigned short WORD;


BYTE BUF[8];                         //接收数据缓存区              

uchar ge,shi,bai,qian,wan;           //显示变量

int  dis_data;                       //变量

int  data_xyz[3];




void delay(unsigned int k);

void InitLcd();                      //初始化lcd1602

void Init_ADXL345(void);             //初始化ADXL345


void WriteDataLCM(uchar dataW);

void WriteCommandLCM(uchar CMD,uchar Attribc);

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

void conversion(uint temp_data);


void  Single_Write_ADXL345(uchar REG_Address,uchar REG_data);   //单个写入数据

uchar Single_Read_ADXL345(uchar REG_Address);                   //单个读取内部寄存器数据

void Mutiple_Read_ADXL345(void);     

void clear(void);                               //连续的读取内部寄存器数据

//------------------------------------

void Delay5us();

void Delay5ms();

void ADXL345_Start();

void ADXL345_Stop();

void ADXL345_SendACK(bit ack);

bit  ADXL345_RecvACK();

void ADXL345_SendByte(BYTE dat);

BYTE ADXL345_RecvByte();

void ADXL345_ReadPage();

void ADXL345_WritePage();

//-----------------------------------


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

void conversion(uint temp_data)  

{  

    wan=temp_data/10000+0x30 ;

    temp_data=temp_data%10000;   //取余运算

        qian=temp_data/1000+0x30 ;

    temp_data=temp_data%1000;    //取余运算

    bai=temp_data/100+0x30   ;

    temp_data=temp_data%100;     //取余运算

    shi=temp_data/10+0x30    ;

    temp_data=temp_data%10;      //取余运算

    ge=temp_data+0x30;         

}


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

void delay(unsigned int k)        

{                                                

unsigned int i,j;                                

for(i=0;i

{                        

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

{;}}                                                

}

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

void WaitForEnable(void)        

{                                        

DataPort=0xff;                

LCM_RS=0;LCM_RW=1;_nop_();

LCM_EN=1;_nop_();_nop_();

while(DataPort&0x80);        

LCM_EN=0;                                

}                                        

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

void WriteCommandLCM(uchar CMD,uchar Attribc)

{                                        

if(Attribc)WaitForEnable();        

LCM_RS=0;LCM_RW=0;_nop_();

DataPort=CMD;_nop_();        

LCM_EN=1;_nop_();_nop_();LCM_EN=0;

}                                        

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

void WriteDataLCM(uchar dataW)

{                                        

WaitForEnable();                

LCM_RS=1;LCM_RW=0;_nop_();

DataPort=dataW;_nop_();        

LCM_EN=1;_nop_();_nop_();LCM_EN=0;

}                

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

void InitLcd()                        //液晶显示器的设置        

{                        

WriteCommandLCM(0x38,1);        

WriteCommandLCM(0x08,1);        

WriteCommandLCM(0x01,1);        

WriteCommandLCM(0x06,1);        

WriteCommandLCM(0x0c,1);

}                        

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

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

{                                                

Y&=1;                                                

X&=15;                                                

if(Y)X|=0x40;                                        

X|=0x80;                        

WriteCommandLCM(X,0);                

WriteDataLCM(DData);                

}                                                


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

延时5微秒(STC90C52RC@12M)

不同的工作环境,需要调整此函数,注意时钟过快时需要修改

当改用1T的MCU时,请调整此延时函数

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

void Delay5us()

{

    _nop_();_nop_();_nop_();_nop_();

    _nop_();_nop_();_nop_();_nop_();

        _nop_();_nop_();_nop_();_nop_();

}


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

延时5毫秒(STC90C52RC@12M)

不同的工作环境,需要调整此函数

当改用1T的MCU时,请调整此延时函数

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

void Delay5ms()

{

    WORD n = 560;


    while (n--);

}


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

起始信号

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

void ADXL345_Start()

{

    SDA = 1;                    //拉高数据线

    SCL = 1;                    //拉高时钟线

    Delay5us();                 //延时

    SDA = 0;                    //产生下降沿

Delay5us(); //延时


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机的抗干扰措施有哪些