Y_G_G 发表于 2020-11-20 14:26 我试试 |
新乡家电维修 发表于 2020-11-19 19:31 没有完整的代码,看不明白,最主要的数据转换部分没有 以下是我改了你的代码,你参照一下 ;=================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 ;=========================================================== |
|
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 |
Y_G_G 发表于 2020-11-19 08:35 汇编程序,大家没耐心看到最好的 |
|
这个是IIC通讯协议的,只要有一个数据能读写,那么IIC的读写就是对的 现在的问题就是你数据处理的问题了,你整了好几天,都是靠猜,难道不是应该把代码上传上来看一下吗? 不要去怀疑去元件本身的精度,就算是会有元件本身的问题,但这确实少之又少,更何况你手头上已经有两个了,换一下就知道结果了 其实就是数据处理的问题而已 |