QMC5883L-IIC测试程序(精编版)_第1页
QMC5883L-IIC测试程序(精编版)_第2页
QMC5883L-IIC测试程序(精编版)_第3页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/*/qmc5883l iic测试程序/使用单片机stc15w408as/qmc5883 是一款国产三轴磁阻传感器/其内部寄存器设置与霍尼韦尔公司生产的hmc5883/不尽相同,不能直接套用hmc5883 的测试程序,否/则无法获得角度数据。/下面给出的测试程序可以通过串口助手/在 pc 机上直接读出qmc5883 输出的角度数据。/宜昌三峡电院电子科技创新协会/* #include "stc15f2k60s2.h"#include "intrins.h" #include "math.h" #include "stdio.

2、h"#defineslave_address0x1a/hmc5883为 0x3ctypedef unsigned int u16; typedef unsigned char u8; u8 buf8=0;sbit scl=p12;/iic 时钟线sbit sda=p13;/iic 数据线void delay_5us(); void delay(u16 t); void inituart();void qmc5883_start(); void qmc5883_stop();void qmc5883_sendack(bit ack); bitqmc5883_recvack();/voi

3、d qmc5883_sendbyte(u8 dat); / u8 qmc5883_recvbyte();/void single_write_qmc5883(u8 reg_address,u8 reg_data);/u8 single_read_qmc5883(u8 reg_address); void multiple_read_qmc5883(void);void init_qmc5883();/stc15w408as 无定时器1,只能用定时器2 作串口波特率发生器void inituart()scon = 0x50; auxr |= 0x01; auxr &= 0xfb; t2l

4、 = 0xe8; t2h = 0xff; auxr |= 0x10; es = 1;ea = 1;ti=1;void delay(u16 t)u16 i,j; for(i=t;i>0;i-)for(j=121;j>0;j-);void delay_5us()u8 x; x = 20;while (-x);/*起始信号*/ void qmc5883_start()sda = 1;/拉高数据线scl = 1;/ 拉高时钟线delay_5us();/延时sda = 0;/产生下降沿delay_5us();/延时scl = 0;/ 拉低时钟线/*停止信号*/ void qmc5883_st

5、op()sda = 0;/拉低数据线scl = 1;/ 拉高时钟线delay_5us();/延时sda = 1;/产生上升沿delay_5us();/延时/*发送应答信号入口参数 :ack (0:ack 1:nak)*/ void qmc5883_sendack(bit ack)sda = ack;/写应答信号scl = 1;/ 拉高时钟线delay_5us();/延时scl = 0;/ 拉低时钟线delay_5us();/延时/*接收应答信号*/ bit qmc5883_recvack()scl = 1;/ 拉高时钟线delay_5us();/ 延时cy = sda;/ 进位标志读应答信号s

6、cl = 0;/ 拉低时钟线delay_5us();/ 延时return cy;/*向 iic 总线发送一个字节数据*/ void qmc5883_sendbyte(u8 dat)u8 i;for (i=0; i<8; i+)/8 位计数器dat <<= 1;/ 移出数据的最高位sda = cy;/ 送数据口scl = 1;/ 拉高时钟线delay_5us();/延时scl = 0;/ 拉低时钟线delay_5us();/延时qmc5883_recvack();/*从 iic 总线接收一个字节数据*/ u8 qmc5883_recvbyte()u8 i;u8 dat = 0;

7、sda = 1;/使能内部上拉 ,准备读取数据, for (i=0; i<8; i+)/8 位计数器dat <<= 1;scl = 1;/ 拉高时钟线delay_5us();/延时dat |= sda;/ 读数据scl = 0;/ 拉低时钟线delay_5us();/延时return dat;/*写入单字节数据*void single_write_qmc5883(u8 reg_address,u8 reg_data)qmc5883_start();/ 起始信号qmc5883_sendbyte(slave_address);/ 发送设备地址 +写信号qmc5883_sendby

8、te(reg_address);/内部寄存器地址,请参考中文pdfqmc5883_sendbyte(reg_data);/内部寄存器数据,请参考中文pdfqmc5883_stop();/ 发送停止信号/*读取单字节数据*/u8 single_read_qmc5883(u8 reg_address)/u8 reg_data;/qmc5883_start();/ 起始信号/qmc5883_sendbyte(slave_address);/ 发送设备地址 +写信号/qmc5883_sendbyte(reg_address);/ 发送存储单元地址,从0 开始/qmc5883_start();/ 起始信

9、号/qmc5883_sendbyte(slave_address+1);/ 发送设备地址 +读信号/reg_data=qmc5883_recvbyte();/ 读出寄存器数据/qmc5883_sendack(1);/qmc5883_stop();/ 停止信号/return reg_data;/*/连续读出qmc5883 内部角度数据,地址范围0x000x05/* void multiple_read_qmc5883(void)u8 i;qmc5883_start();/ 起始信号qmc5883_sendbyte(slave_address);/ 发送设备地址 +写信号qmc5883_sendb

10、yte(0x00);/ 发送存储单元地址,从0x00 开始;hmc5883从 0x03 开始qmc5883_start();/ 起始信号qmc5883_sendbyte(slave_address+1);/发送设备地址 +读信号for (i=0; i<6; i+)/ 连续读取6 个地址数据,存储中bufbufi = qmc5883_recvbyte();/buf0 存储数据if (i = 5)qmc5883_sendack(1);/ 最后一个数据需要回非应答noackelseqmc5883_sendack(0);/ 应答 ackqmc5883_stop();/ 停止信号delay(5);

11、/初始化 qmc5883 ,注意与hmc5883 的区别void init_qmc5883()single_write_qmc5883(0x09,0x0d);/控制寄存器配置single_write_qmc5883(0x0b,0x01);/设置清除时间寄存器single_write_qmc5883(0x20,0x40);/single_write_qmc5883(0x21,0x01);/void main()/u16 i;int x=0,y=0,z=0;double angle_xy=0,angle_xz=0,angle_yz=0; inituart();delay(200);/init_lc

12、d();init_qmc5883();delay(300); while(1)multiple_read_qmc5883();/连续读取三轴角度数据,存储在buf 中x=buf1 << 8 | buf0; /combine msb and lsb of x data output register最高有效位y=buf3 << 8 | buf2; /combine msb and lsb of y data output register z=buf5 << 8 | buf4; /combine msb and lsb of z data output reg

13、isterif(x>0x7fff) x-=0xffff; if(y>0x7fff) y-=0xffff; if(z>0x7fff) z-=0xffff;/printf("x=%ivn",x);/ 输出 int 型数据/delay(2000);/printf("y=%ivn",y);/ 输出 int 型数据/delay(2000);/ printf("z=%ivn",z);/ 输出 int 型数据/ delay(2000);angle_xy= atan2(double)y,(double)x) * (180 / 3.14159265) + 180; /计算 xy 平面角度/angle_xy*=10;printf("xy=%fdn",angle_xy);/输出 float 型数据delay(1000);angle_xz= atan2(double)z,(double)x) * (180 / 3.14159265) + 180; /计算 xz 平面角度/angle_xz*=1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论