找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 361|回复: 4
收起左侧

为什么我的51单片机采集不到XGZP6869D压力传感器数据?

[复制链接]
ID:1128777 发表于 2024-7-11 16:52 | 显示全部楼层 |阅读模式
使用STC89C52单片机,传感器为XGZP6869D,传感器可以直接进行IIC采集信息,现在我使用了串口把数据发送至串口助手,但是串口助手不显示任何数据,传感器数据采集部分使用了传感器数据手册中的示例程序。麻烦有大佬帮我看看我的问题出现在哪里了?是不是我直接接了传感器芯片,没有接上拉电阻的原因?还是我的程序有问题?或者其他的什么问题?
接线:1脚SDA-->P1.7 7脚SCL-->P1.6 3脚VDD-->5V 5脚GND-->GND (传感器-->51单片机)


代码:
#include <reg52.h>
#include <math.h>
#include<stdio.h>
#define DELAY_TIME 600
#define TRUE 1
#define FALSE 0
#define uchar unsigned char
#define uint unsigned int
   
    //----define IIC SCL, SDA port----
    sbit SCL = P1 ^ 7;
    sbit SDA = P1 ^ 6;
   
    //----delay time_us----
    void DELAY(uint t) {
        while (t != 0)
            t--;
    }
   
    //----IIC START CONDITION----
    void I2C_Start(void) {
        SDA = 1; //SDA output high
        DELAY(DELAY_TIME);
        SCL = 1;
        DELAY(DELAY_TIME); //SCL output high
        SDA = 0;
        DELAY(DELAY_TIME);
        SCL = 0;
        DELAY(DELAY_TIME);
    }
   
    //----IIC STOP CONDITION----
    void I2C_Stop(void) {
        SDA = 0; //SDA OUTPUT LOW
        DELAY(DELAY_TIME);
        SCL = 1;
        DELAY(DELAY_TIME);
        SDA = 1;
        DELAY(DELAY_TIME);
        SCL = 0; //SCL OUTPUT LOW
        DELAY(DELAY_TIME);
    }
   
    //----IIC SEND DATA "0"----
    void SEND_0(void) {
        SDA = 0;
        DELAY(DELAY_TIME);
        SCL = 1;
        DELAY(DELAY_TIME);
        SCL = 0;
        DELAY(DELAY_TIME);
    }
   
    //----IIC SEND DATA "1"----
    void SEND_1(void) {
        SDA = 1;
        DELAY(DELAY_TIME);
        SCL = 1;
        DELAY(DELAY_TIME);
        SCL = 0;
        DELAY(DELAY_TIME);
    }
   
    //----Check SLAVE's Acknowledge----
    bit Check_Acknowledge(void) {
        SDA = 1;
        DELAY(DELAY_TIME);
        SCL = 1;
        DELAY(DELAY_TIME / 2);
        F0 = SDA;
        DELAY(DELAY_TIME / 2);
        SCL = 0;
        DELAY(DELAY_TIME);
        if (F0 == 1)
            return FALSE;
        return TRUE;
    }
   
    //----Write One Byte of Data----
    void WriteI2CByte(uchar b) reentrant {
        char i;
        for (i = 0; i < 8; i++)
            if ((b << i) & 0x80)
                SEND_1();
            else
                SEND_0();
    }
   
    //----Read One Byte of Data----
    uchar ReadI2CByte(void) reentrant {
        char b = 0, i;
        for (i = 0; i < 8; i++) {
            SDA = 1;
            DELAY(DELAY_TIME);
            SCL = 1;
            DELAY(DELAY_TIME);
            F0 = SDA;
            DELAY(DELAY_TIME);
            SCL = 0;
            if (F0 == 1) {
                b = b << 1;
                b = b | 0x01;
            } else
                b = b << 1;
        }
        return b;
    }
   
    //----write One Byte of Data,Data from MASTER to the SLAVER----
    void Write_One_Byte(uchar addr, uchar thedata) { //Write "thedata" to the SLAVER's address of "addr"
        bit acktemp = 1;
        I2C_Start(); //IIC START
        WriteI2CByte(0x6D << 1 + 0); //IIC WRITE operation, SLAVER address bit: 0x6D
        acktemp = Check_Acknowledge(); //check the SLAVER
        WriteI2CByte(addr); //address
        acktemp = Check_Acknowledge();
        WriteI2CByte(thedata); //thedata
        acktemp = Check_Acknowledge();
        I2C_Stop(); //IIC STOP
    }
   
    //----Read One Byte of Data,Data from SLAVER to the MASTER----
    uchar Read_One_Byte(uchar addr) {
        bit acktemp = 1;
        uchar mydata;
        I2C_Start();
        WriteI2CByte(0x6D << 1 + 0); //IIC WRITE operation, SLAVER address bit: 0x6D
        acktemp = Check_Acknowledge();
        WriteI2CByte(addr);
        acktemp = Check_Acknowledge();
        I2C_Start();
        WriteI2CByte(0x6D << 1 + 1); //IIC READ operation, SLAVER address bit: 0x6D
        acktemp = Check_Acknowledge();
        mydata = ReadI2CByte();
        I2C_Stop();
        return mydata;
    }
   
    //----Delay_ms----
    void Delay_xms(uint x) {
        uint i, j;
        for (i = 0; i < x; i++)
            for (j = 0; j < 112; j++);
    }
   
    //----UART Initialization----
    void UART_Init() {
        TMOD = 0x20; // Timer1 mode 2, 8-bit auto-reload
        TH1 = 0xFD;  // 9600 baud rate
        SCON = 0x50; // 8-bit data, 1 stop bit, REN enabled
        TR1 = 1;     // Start Timer1
    }
   
    //----UART Send Byte----
    void UART_SendByte(uchar dat) {
        SBUF = dat; // Load data into SBUF
        while (!TI); // Wait for transmission to complete
        TI = 0;     // Clear TI flag
    }
   
    //----UART Send String----
    void UART_SendString(uchar *str) {
        while (*str) {
            UART_SendByte(*str++);
        }
    }
   
    //----The main function----
    void main(void) {
        uchar pressure_H, pressure_M, pressure_L, temperature_H, temperature_L;
        long int pressure_adc, temperature_adc;
        float pressure, temperature;
        uchar pressure_str[20], temperature_str[20];
   
        UART_Init(); // Initialize UART
        Delay_xms(1000); // delay 1000ms
   
        while (1) {
            Write_One_Byte(0x30, 0x0A);
            while ((Read_One_Byte(0x30) & 0x08) > 0);         //如果注释掉这行,串口助手会显示收到数据,但是都是0000
            Delay_xms(20); // delay 20ms
   
            pressure_H = Read_One_Byte(0x06);
            pressure_M = Read_One_Byte(0x07);
            pressure_L = Read_One_Byte(0x08);
            pressure_adc = pressure_H * 65536 + pressure_M * 256 + pressure_L;
            if (pressure_adc > 8388608)
                pressure = (pressure_adc - 16777216) / 64; // unit: Pa
            else
                pressure = pressure_adc / 64; // unit: Pa
   
            temperature_H = Read_One_Byte(0x09);
            temperature_L = Read_One_Byte(0x0A);
            temperature_adc = temperature_H * 256 + temperature_L;
            if (temperature_adc > 32768)
                temperature = (temperature_adc - 65536) / 256; // unit: Celsius
            else
                temperature = temperature_adc / 256; // unit: Celsius
   
            sprintf(pressure_str, "Pressure: %.2fPa\r\n", pressure);
            sprintf(temperature_str, "Temperature: %.2fC\r\n", temperature);
   
            UART_SendString(pressure_str);
            UART_SendString(temperature_str);
   
            Delay_xms(100); // delay 100ms
        }
    }
51hei图片_20240711163258.jpg
51hei图片_20240711163308.jpg

XGZP6869D-Pressure-Sensor-V2.6.pdf

1.08 MB, 下载次数: 0

回复

使用道具 举报

ID:342197 发表于 2024-7-12 10:29 | 显示全部楼层
F0未定义;建议分模块单独调试。
回复

使用道具 举报

ID:961114 发表于 2024-7-12 11:01 | 显示全部楼层
可以用8051U   管脚兼容天王级别的: STC89C52RC, STC12C5A60S2,兼容 8位8051
回复

使用道具 举报

ID:1128777 发表于 2024-7-12 14:01 | 显示全部楼层
远征之路 发表于 2024-7-12 10:29
F0未定义;建议分模块单独调试。

大佬您好,这个F0我查了下,是51中PSW寄存器中的一个标志位(D5位),可以用作标志位,不需要定义,分模块调试正在尝试中,麻烦您帮我看一下哪里还可能有问题。万分感谢!
回复

使用道具 举报

ID:1128777 发表于 2024-8-19 11:31 | 显示全部楼层
问题已解决
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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