久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1106|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 99久久精品免费看国产四区 | 中文字幕国产精品视频 | 欧美日韩中文在线 | 中文字幕综合 | 在线看一区二区三区 | 一区二区三区视频在线观看 | 精品视频一区二区三区 | 久久国产区 | 日韩中文一区二区三区 | 日韩成人精品一区二区三区 | 日韩精品av一区二区三区 | 久久国产精品99久久久久久丝袜 | 综合九九 | 天天草天天射 | 黄色免费网站在线看 | 一区二区三区av夏目彩春 | 九九综合| 日韩精品在线免费观看视频 | 538在线精品 | 国产一二区在线 | 日韩欧美视频 | 一级在线观看 | 国产欧美日韩一区 | 一区欧美 | 亚洲欧洲视频 | 欧美一区二区在线免费观看 | 国产亚洲精品久久情网 | 亚洲欧美视频 | 亚洲社区在线 | 久久久久久久久精 | 国产偷录视频叫床高潮对白 | av片免费| 国产精品99久久久久久动医院 | 免费看黄色视屏 | 国产精品久久久久久影视 | 国产97在线视频 | 久久99精品视频 | 国产精品中文字幕一区二区三区 | 国产成人免费视频网站视频社区 | 久久av一区二区三区 |