历史上的今天
返回首页

历史上的今天

今天是:2024年12月10日(星期二)

正在发生

2019年12月10日 | STC89C51单片机和ADXL345三轴加速度模块实现简易计步器程序

2019-12-10 来源:51hei

单片机源程序如下:

#include "STC51PRJ.h"


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


/*****************起始信号***************/

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)***********/

void ADXL345_SendACK(bit ack)

{

        SDA = ack;                  //写应答信号

        SCL = 1;                    //拉高时钟线

        Delay5us();                 //延时

        SCL = 0;                    //拉低时钟线

        Delay5us();                 //延时

}


/**********接收应答信号************/

bit ADXL345_RecvACK()

{

        SCL = 1;                    //拉高时钟线

        Delay5us();                 //延时

        CY = SDA;                   //读应答信号

        SCL = 0;                    //拉低时钟线

        Delay5us();                 //延时

        return CY;

}


/********向IIC总线发送一个字节数据************/

void ADXL345_SendByte(BYTE dat)

{

        BYTE i;

        for(i=0;i<8;i++)         //8位计数器

        {

                dat <<= 1;              //移出数据的最高位

                SDA = CY;               //送数据口

                SCL = 1;                //拉高时钟线

                Delay5us();             //延时

                SCL = 0;                //拉低时钟线

                Delay5us();             //延时

        }

        ADXL345_RecvACK();

}


/*********从IIC总线接收一个字节数据**************/

BYTE ADXL345_RecvByte()

{

        BYTE i;

        BYTE dat = 0;

        SDA = 1;                    //使能内部上拉,准备读取数据,

        for (i=0; i<8; i++)         //8位计数器

        {

                dat <<= 1;

                SCL = 1;                //拉高时钟线

                Delay5us();             //延时

                dat |= SDA;             //读数据               

                SCL = 0;                //拉低时钟线

                Delay5us();             //延时

        }

        return dat;

}


/******单字节写入***********/

void Single_Write_ADXL345(uint8 REG_Address,uint8 REG_data)

{

        ADXL345_Start();                  //起始信号

        ADXL345_SendByte(SlaveAddress);   //发送设备地址+写信号

        ADXL345_SendByte(REG_Address);    //内部寄存器地址,请参考中文pdf22页 

        ADXL345_SendByte(REG_data);       //内部寄存器数据,请参考中文pdf22页 

        ADXL345_Stop();                   //发送停止信号

}


/********单个读取内部寄存器数据***********/

uint8 Single_Read_ADXL345(uint8 REG_Address)

        uint8 REG_data;

  ADXL345_Start();                          //起始信号

  ADXL345_SendByte(SlaveAddress);           //发送设备地址+写信号

  ADXL345_SendByte(REG_Address);                   //发送存储单元地址,从0开始        

  ADXL345_Start();                          //起始信号

  ADXL345_SendByte(SlaveAddress+1);         //发送设备地址+读信号

  REG_data=ADXL345_RecvByte();              //读出寄存器数据

        ADXL345_SendACK(1);   

        ADXL345_Stop();                           //停止信号

  return REG_data; 

}


/***连续读出ADXL345内部加速度数据,地址范围0x32~0x37****/

void Multiple_read_ADXL345(void)

{   

        uint8 i;

        ADXL345_Start();                          //起始信号

        ADXL345_SendByte(SlaveAddress);           //发送设备地址+写信号

        ADXL345_SendByte(0x32);                   //发送存储单元地址,从0x32开始        

        ADXL345_Start();                          //起始信号

        ADXL345_SendByte(SlaveAddress+1);         //发送设备地址+读信号

        for(i=0;i<6;i++)                      //连续读取6个地址数据,存储中BUF

        {

                BUF[i] = ADXL345_RecvByte();          //BUF[0]存储0x32地址中的数据

                if (i == 5)

                {

                        ADXL345_SendACK(1);                //最后一个数据需要回NOACK

                }

                else

                {

                        ADXL345_SendACK(0);                 //回应ACK

                }

  }

        ADXL345_Stop();                           //停止信号

        Delay5ms();

}


/****初始化ADXL345,根据需要请参考pdf进行修改**/

void Init_ADXL345()

{

        Single_Write_ADXL345(0x31,0x0B);   //测量范围,正负16g,13位模式

        Single_Write_ADXL345(0x2C,0x08);   //速率设定为12.5 参考pdf13页

        Single_Write_ADXL345(0x2D,0x08);   //选择电源模式   参考pdf24页

        Single_Write_ADXL345(0x2E,0x80);   //使能 DATA_READY 中断

        Single_Write_ADXL345(0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入pdf29页

        Single_Write_ADXL345(0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入pdf29页

        Single_Write_ADXL345(0x20,0x05);   //Z 偏移量 根据测试传感器的状态写入pdf29页

}



推荐阅读

史海拾趣

Excelsys公司的发展小趣事

Excelsys公司自创立之初,就致力于电源管理技术的研发。在电子行业中,电源管理一直是影响产品性能和可靠性的关键因素。公司团队通过不断的技术创新,推出了一系列高性能、高效率的电源管理产品,赢得了市场的广泛认可。特别是在智能设备日益普及的背景下,Excelsys的电源管理解决方案为各种智能设备提供了稳定可靠的电力支持,助力了行业的发展。

岑科(CENKER)公司的发展小趣事

为了实现更高效的生产和更优质的产品,岑科在2011年成立了自动化设备研发团队。通过自主研发生产设备,岑科实现了对生产技术的全面掌控,并加强了技术创新和改进。这一举措不仅提高了生产效率,还为岑科带来了更多的技术积累和知识产权。随着自动化设备的广泛应用,岑科的生产能力得到了大幅提升,同时也推动了整个产业的升级和可持续发展。

DBLECTRO公司的发展小趣事

1997年,迪贝电子在上海正式成立,标志着这家专注于环境感知技术和气体检测及分析领域的创新企业正式进入中国市场。当时,中国的环保法规日益严格,对气体排放的监控和管理要求也不断提高。迪贝电子凭借其在该领域的深厚积累和技术实力,迅速在市场上推出了一系列高质量的气体检测和分析仪器。这些产品以其准确性、稳定性和易用性受到了用户的广泛好评,为迪贝电子在中国市场的快速发展奠定了坚实的基础。

明微公司的发展小趣事

随着全球半导体行业向中国市场的转移,明微公司意识到拓展海外市场的重要性。为了加快海外市场拓展步伐,公司积极加强与国际知名企业的合作与交流,引进先进的技术和管理经验。同时,公司还积极参加国际展会和论坛等活动,提升品牌影响力。这些举措使明微公司在国际市场上逐渐树立起良好的口碑和形象。

Chipcera Technology Co Ltd公司的发展小趣事

在电子行业的激烈竞争中,Chipcera Technology Co Ltd始终坚持以技术为核心的发展策略。某年,公司研发团队成功研发出一款具有更高耐压、更低损耗的陶瓷电容器。这款产品不仅满足了市场对高性能电容器的迫切需求,还为公司赢得了大量订单。随着该产品的广泛应用,Chipcera在行业内的影响力逐渐提升,为后续的发展奠定了坚实基础。

Foxconn_Optical_Interconnect_Technologies__Inc.公司的发展小趣事

人才是企业发展的核心动力。为了保持技术领先地位和市场竞争力,Chipcera高度重视人才引进和团队建设。公司积极招聘具有丰富经验和专业技能的人才,并为员工提供良好的工作环境和发展空间。同时,公司还定期组织各种培训和学习活动,提升员工的专业素养和创新能力。这些措施使得Chipcera的团队更加团结、高效,为公司的持续发展提供了有力保障。

问答坊 | AI 解惑

【电子开源项目】项目报名帖

格式如下:拟加入模块,网名,信箱,QQ,现职业如:软件开发,小人物,wealding@gmail.com,250404000,研发…

查看全部问答>

求高手们帮我看看这个升级文件

这是其乐达956D的固件升级文件 ,加装了触摸屏,请各位大哥帮小弟看看这个文件是用什么软件开发的 QQ752352212  谢谢~~~! 这是其乐达956D的固件升级文件 ,加装了触摸屏,请各位大哥帮小弟看看这个文件是用什么软件开发的 QQ752352212 ...…

查看全部问答>

操作系统奉行拿来主义 产品大都类iPhone

有分析师认为,智能手机操作系统的市场正趋于开源化;此外,苹果和RIM的封闭系统也在不断壮大,微软正面临两面受困的局面。 在去年11月底以2亿美元收购联想移动后的短短1个多月,昨日,联想集团正式发布其移动互联网战略———“乐计划”,并推出 ...…

查看全部问答>

USB甲壳虫HUB

该产品四位活动式设计,更实用,更美观彩色甲壳虫USB HUB 1分4USB USB转换口1.本机带4个USB输出接口(OUT),和一条与电脑USB口接驳的数据线。2.USB接口可方便用于U盘和各种数码产品与电脑的接驳。3.USB接口均可与Windows95/98/ME/2000/XP或更新版本 ...…

查看全部问答>

关于在uClinux 下建立可读写文件 问题

您好。我是uClinux个新手。谢谢帮助哈~~。 贴子有点长,我把问题先写出来吧: 1.zlib库应该怎么安装呢?是用gcc安装 还是交叉编译?  装到哪里? 2.可不可以直接对mtd设备文件读写呢? 我在uClinux 下跑 boa server 。现在问题是这样 ...…

查看全部问答>

终于升星了,散分庆祝!!!

终于升星了,散分庆祝!!!…

查看全部问答>

网页控制的问题~~

大家好!我用的是LM3S6965 的板子,想做个网页控制led的东西,自己编了个网页,然后在原有的enet_lwip的程序里修改,但是改过之后通过浏览器打开的还是原来的网页。。。也不知道错在哪里。。。 哪位大神帮帮我啊。。。谢谢…

查看全部问答>

FPGA与单片机之间的通信

想通过9根线实现单片机与fpga之间的通信,一根是时钟线,8根数据线,来一个时钟,单片机把p0口的八位数据传给fpga,结果发现fpga接到的数据不稳定…

查看全部问答>

2600A系列数字源表的数据存储变化

在2600A系列数字源表中,对内存读取速率的最大测量值增加了两倍,必定需要更多的读数缓冲存储器。除了增加2600A系列数字源表[1]的内部数据缓冲存储器,还需要添加前部面板USB端口,以便于用户访问更多的内存。为了满足存储需求,用户现在可以从多 ...…

查看全部问答>