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

发布者:ww313618最新更新时间:2020-01-08 来源: 51hei关键字:ADXL345  倾角传感器  51单片机 手机看文章 扫描二维码
随时随地手机看文章

这是自己做的一个小程序,用到了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();                 //延时

    SCL = 0;                    //拉低时钟线

}


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

停止信号

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

void ADXL345_Stop()

{

    SDA = 0;                    //拉低数据线

    SCL = 1;                    //拉高时钟线

    Delay5us();                 //延时

    SDA = 1;                    //产生上升沿

    Delay5us();                 //延时

}


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

发送应答信号

入口参数:ack (0:ACK 1:NAK)

[1] [2] [3]
关键字:ADXL345  倾角传感器  51单片机 引用地址:ADXL345倾角传感器的51单片机源程序

上一篇:keil软件错误总结
下一篇:DHT11驱动程序

推荐阅读最新更新时间:2024-11-10 17:15

C51单片机学习笔记之密码锁
简介 根据之前学的LCD1602显示器和矩阵键盘实现一个简单的密码锁。 原理图 请翻之前的文章 LCD1602:C51单片机学习笔记之LCD1602 矩阵键盘:C51单片机学习笔记之矩阵键盘 代码部分 LCD1602.c #include reg52.h #include intrins.h sbit RS = P2^0; sbit RW = P2^1; sbit EN = P2^2; #define RS_CLR RS = 0 #define RS_SET RS = 1 #define RW_CLR RW = 0 #define RW_SET RW = 1 #define EN_CLR
[单片机]
MCS-51单片机的串行口应用的程序设计举例
1.实验设计 定时中断程序,串行口P3.0、P3.1输出,用74LS164移位寄存器驱动发光二极管 ; 定时器0于方式1,16位,10ms中断一次 ; 40H 10ms定时计数单元 ; 41H 初值为01101101B ; 位地址 00H=1 ; 定时方式1为10MS:THX=0ECH,TLX=78H ; 串行口以方式0工作,不需初始化 2.参考程序 LPOUT EQU 41H ;输出缓冲区 DISP EQU 0DE00H ;显示子程序入口 ; ORG 0000H START: AJMP MAIN ; ORG 000BH ;定时器0中断服 AJMP TINT0 ;务
[单片机]
51单片机实验5:动态数码管
开发板数码管模块电路图如下: 由于74ls138译码器的特点,即只能是一个数码管的阴极电平为0,显然不能使多个数码管同时工作,若想要得到多个数码管同时工作的效果,只能采用动态扫描显示的方式。所谓动态扫描显示,就是利用发光管的余辉和人眼视觉暂留作用,使人感觉好像多个数码管在同时工作。 程序中digdisplay函数利用for循环和switch语句,不断扫描8个数码管,完成位选工作,并对P0口赋值实现段选功能。从而在8个数码管依次输出1~8,并利用延时函数控制输出间隔时间,实现动态输出的功能。 细节: (1)在每位数码管显示之后设置一定时间的延时。 (2)P0口置0(P0=0x00),完成“消影”目的。 #incl
[单片机]
<font color='red'>51单片机</font>实验5:动态数码管
8051单片机模块化编程技巧
  程序设计就是用计算机所能接受的语言把解决问题的步骤描述出来,也就是把计算机指令或语句组成一个有序的集合。一个好的应用程序不仅是执行效率高,而且还要结构清晰、便于调试。所以人们都采用结构化程序设计方法来编制应用程序。对于每一个初学者来说更应该养成习惯,从简单的程序编制开始就采用这种模块化结构。   目前在8051 单片机应用开发中主要有两种编程语言:汇编语言和C51 语言。C51 语言是一种结构化的编程语言,采用C51 编写的应用程序结构清晰、模块化程度高、可读性强、并容易移植。但C51 语言也有缺点,就是编译后生成的目标代码空间要比汇编的大。   而且目前单片机的教材还是侧重于汇编语言。因此学习用单片机汇编语言程序进行结构化
[单片机]
80<font color='red'>51单片机</font>模块化编程技巧
51-基于51单片机射频RFID卡考勤上课上班统计设计
具体实现功能 系统由STC89C52单片机电路+RFID模块电路+1602液晶显示电路+电源电路组成。 具体功能: (1)系统有3张卡,分别代表依次是张三、李四、王二; (2)任何一个人刷卡成功能,1602液晶响应显示,未刷卡显示“N”,刷卡成功后显示“Y”; (3)液晶第二行显示刷卡人数,即出勤总人数。 设计背景 随着信息化建设的不断发展,磁卡得到普遍的推广,大部分采用RFID射频技术,通过射频信号自动识别目标对象获取数据,识别工作不受环境的影响,操作方便快捷,具有防污、防水、加密存储等优点,较传统的接触式IC卡,具有明显的优势,被广泛应用在身份识别、消费等各项服务上,为企业或单位的管理以及人们的生活提供极大
[单片机]
51-基于<font color='red'>51单片机</font>射频RFID卡考勤上课上班统计设计
一文详解80C51单片机的中断系统
中断系统是计算机或者单片机的主要功能部件。 有了中断系统,便可以使微处理器具备对外部的异步事件进行处理的能力。 当微处理器的CPU正在执行程序的过程中,如果外部硬件或者内部组件有紧急的请求(如通信,断点,发生重大故障等),中断系统就可以将当前的程序暂停,优先处理这些中断请求。 这种处理方式,对整个系统的稳定性,健壮性至关重要,同时也能大大提高处理器的效率,使得系统的应用更加灵活多变。 中断的概念 中断是指单片机在执行程序的过程中,当出现异常情况或特殊请求时,单片机停止当前程序的运行,转向对这些异常情况或特殊请求进行处理,当处理结束后再返回原程序的间断处,继续执行原程序,这一现象称为中断。 中断是单片机实时处理内部或外部事件的一
[单片机]
一文详解80C<font color='red'>51单片机</font>的中断系统
51单片机最简LED驱动
得到8盏LED交替亮灭的实验效果 #include reg51.h void Delay10ms(unsigned int c); // 延时10ms void main() { while(1) { P0 = 0x00; // 设置 P0 为低电平 Delay10ms(50); // 延时 P0 = 0xff; // 设置 P0 为高电平 Delay10ms(50); // 延时 } } void Delay10ms(unsigned int c) { unsigned char a, b; for (; c 0; c--) { for (b = 38;
[单片机]
51单片机 + ds12c887时钟芯片 开发的电子时钟
原文地址: 51单片机 + ds12c887时钟芯片 开发的电子时钟 作者: 紫暮秋 风 主要代码如下 void delay(int z) { int x,y; for(x=z;x 0;x--) for(y=110;y 0;y--); } void write_com(char com) //写指令操作 { rs=0; lcden=0; //这一步万万不可少,否则不出结果 P0=com; delay(5); lcden=1; delay(5); lcden=0; } void didi() { beep=0
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved