找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2759|回复: 5
打印 上一主题 下一主题
收起左侧

MPL3115A2测出数据不准确问题

[复制链接]
跳转到指定楼层
楼主
这是又买一个MPL3115A2传感器模块测量。结果都是这样,海拔测出120米,我这实际海拔73米左右,后边78 是16进制显示
温度还是很准确的,手摸反应灵敏
气压测出高的离谱,
不是说这模块测出数据是补偿过的吗?

1副本.jpg (3.1 MB, 下载次数: 78)

1副本.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:401564 发表于 2020-11-19 08:35 | 只看该作者
这个是IIC通讯协议的,只要有一个数据能读写,那么IIC的读写就是对的
现在的问题就是你数据处理的问题了,你整了好几天,都是靠猜,难道不是应该把代码上传上来看一下吗?
不要去怀疑去元件本身的精度,就算是会有元件本身的问题,但这确实少之又少,更何况你手头上已经有两个了,换一下就知道结果了
其实就是数据处理的问题而已
回复

使用道具 举报

板凳
ID:72088 发表于 2020-11-19 19:23 | 只看该作者
Y_G_G 发表于 2020-11-19 08:35
这个是IIC通讯协议的,只要有一个数据能读写,那么IIC的读写就是对的
现在的问题就是你数据处理的问题了,你 ...

汇编程序,大家没耐心看到最好的
回复

使用道具 举报

地板
ID:72088 发表于 2020-11-19 19:31 | 只看该作者
        sda  BIT        p1.0   ;SDA数据信号
        scl  BIT        p1.1   ;SCL时钟信号
           address        equ        31h    ;地址数

        CTRL_REG1 EQU 27H        ;压力传感器控制寄存器(测高测压和复位)
        DIZHI_X        EQU        5AH        ;列地址
        DIZHI_Y        EQU        5BH        ;页地址(B0-B7)
        SSDDADA EQU 5CH        ;一字节暂存地址

        ORG  00H
        ORG  60H

MAIN:
           CLR A
        MOV P0M1,A       ;00--->准双向口,  01--->推挽输出
        MOV P0M0,A          ;10--->高阻输入,  11--->开漏输出
        MOV P1M1,A    ;
        MOV P1M0,A
        MOV P2M1,A    ;设置准双向口
        MOV P2M0,A
        MOV P3M1,A    ;设置准双向口
        MOV P3M0,A          ;
        MOV P5M1,A    ;设置准双向口
        MOV P5M0,A         
        MOV SP, #70H;修改堆栈指针
        MOV A,#0
        MOV 20H,A
        MOV 21H,A
        MOV 22H,A
        MOV R7,#0

        MOV IE,#10000000B        ;不允许总中断,不允许定时器0
        MOV TMOD,#00000001B        ;定时器0=模式1,定时模式
        MOV AUXR,#00000010B        ;定时器0/2都工作12分频模式

        MOV        SP,#60H
        LCALL RESET                ;初始化OLED0.91
        LCALL QPCX                ;清屏程序
;===================主程序===============================================
ST:
           LCALL reset_M3PR        ;复位M3PR程序
        mov 20h,#10111001b        ;海拔检测
        LCALL shezhi_M3PR
        LCALL DELAY1S               
        lcall read_M3PR                 ;读温度和海拔程序
        LCALL ZHUAN                  ;数据转换
        lcall DISP_A                ;第一排显示程序

           LCALL reset_M3PR        ;复位M3PR程序

        mov 20h,#00111001b        ;气压检测
        LCALL shezhi_M3PR
        LCALL DELAY1S
        lcall read_M3PR                 ;读温度和气压程序
        LCALL ZHUAN_0                  ;数据转换
        lcall DISP_B                ;第二排显示程序
        JMP ST


;=====================复位M3PR程序===================================
reset_M3PR:
        lcall start
        mov        a,#11000000B        ;M3PR识别ID
        lcall send
        lcall ack
        jc         write
       
        mov        a,#26h        ;复位地址
        lcall send
        lcall ack
        mov        a,#04H        ;04H写入26H就完成复位
        lcall send
        lcall ack
        lcall stop
        ret

;=================设置BMPM3PR功能=================================
shezhi_M3PR:

        mov        r6,        #11000000b        ;id        =C0H
        mov r0,#20h                ;r0作为间接寻址
        mov address,#26h        ;开始地址
        mov        r5,        #1
        lcall write
        ret

write:
        lcall start
        mov        a,        r6
        lcall send
        lcall ack
        jc         write
       
        mov        a,        address
        lcall send
        lcall ack
        mov        a,        @r0                ;
        lcall send
        lcall ack
        lcall stop
        inc r0
        inc address
        djnz        r5,        write ;减1后不为0转移,存储6位
        ret
       
;=================身份识别BMPM3PR================================
shibie:
        mov r0,#1Ah                        ;r0作为间接寻址
        mov address,#0Ch        ;指向身份寄存器
        mov 1Ah,#0        ;清零
        mov r5,        #1        ;读出1字节数据          
        mov r2,        #11000000b;写BMPM3PR识别地址C0H,最后一位是读写位       
        mov r4,        #11000001b;读BMPM3PR识别地址C1H
        Lcall read                ;调用读I2C程序
        ret
;=================BMPM3PR读程序==============================
read_M3PR:

        mov r0,#21h                        ;欲读数据存放地址指针
        mov address,#01H        ;指向数据地址
        mov r5,        #5          
ss:        mov r2,        #11000000b;写BMPM3PR识别地址       
        mov r4,        #11000001b;读BMPM3PR
        Lcall read                ;调用读程序
        inc address
        inc        r0
        djnz r5,ss
        ret
;----------------------------------
read:
        lcall start                ;启动总线
        mov         a,        r2        ;发送芯片识别码
        lcall send
        lcall ack                ; 芯片应答
        jc         read                ;
               
        mov         a,        address
        lcall send
        lcall ack
read_a:
        lcall start
        mov         a,r4
        lcall send
        lcall ack
        jc         read_a
rece:
        lcall receive
        mov         @r0,a        ;读到数据存储到@R0指定地址
        lcall ack
        lcall stop
        ret

回复

使用道具 举报

5#
ID:401564 发表于 2020-11-20 14:26 | 只看该作者
新乡家电维修 发表于 2020-11-19 19:31
sda  BIT        p1.0   ;SDA数据信号
        scl  BIT        p1.1   ;SCL时钟信号
           address        equ        31h    ;地址数

没有完整的代码,看不明白,最主要的数据转换部分没有
以下是我改了你的代码,你参照一下
;=================BMPM3PR读程序==============================
read_M3PR:
        mov         r0,#21h         ;
        mov         address,#01H    ;
        mov         r5,#5         
ss:     mov         r2,#11000000b        ;      
        mov         r4,#11000001b        ;
        Lcall         read            ;
        inc         address
        inc     r0
        djnz         r5,ss
ret
/*                读取数据这一块,最好是直接用 OUT_P_MSB  DATA                030H
                                                                        OUT_P_CSB  DATA                031H
                                                                        OUT_P_LSB  DATA                032H
                专门用来存放海拔三个数据,用R0指向容易混乱*/
;==========================================================
read:        lcall         start        ;
        mov     a,r2        ;
        lcall         send
        lcall         ack         ;
        jc      read        ;没有完整代码,看不明白这什么意思?               
        mov     a,address
        lcall         send
        lcall         ack
read_a:        lcall         start
        mov     a,r4
        lcall         send
        lcall         ack
        jc      read_a
rece:        lcall         receive
        mov     @r0,a        
        lcall         ack                 ;读取一个地址的数据之后,这里应该是要发送一个不应答信号,而不是应答,这条指令不要了
/*                CLR                SCL
                延时
                SETB        SDA
                延时
                SETB        SCL
                延时
                CLR                SCSL
                延时
                CLR                SDA
这要发送一个不应答信号*/
        lcall         stop
ret
;===========================================================
回复

使用道具 举报

6#
ID:72088 发表于 2020-11-21 16:39 | 只看该作者
Y_G_G 发表于 2020-11-20 14:26
没有完整的代码,看不明白,最主要的数据转换部分没有
以下是我改了你的代码,你参照一下
;============== ...

我试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表