Y--L 2024-01-29 17:35 采纳率: 100%
浏览 20
已结题

PCF8591对光敏电阻AD转换和DS18B20温度测量同时存在导致数码管显示数字变化闪动!

一、问题描述
蓝桥杯单片机上通过PCF8591读取光敏电阻AD转换值并通过DS18B20读取温度,数码管上显示的温度值变化闪动。
二、代码
1、< IIC.c>

img


2、<onewire.c>

img


3、<main.c>

img

数码管上显示的温度数值会不时的闪动变成其他数值后又变回来!
求帮忙分析一下哪里存在问题

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-01-29 17:39
    关注

    引自免费微信小程序:皆我百晓生

    问题分析:

    根据问题描述,数码管上显示的温度数值会不时的闪动变成其他数值后又变回来。根据代码,可能存在以下问题:

    1. 电路连接问题:可能存在电路连接不稳定或者接触不良的情况,导致数据传输错误。
    2. 代码逻辑问题:可能存在代码逻辑错误或者读取数据不准确的情况,导致数码管显示错误的数值。

    解决方案:

    1. 检查电路连接:确保电路连接稳定可靠,没有接触不良或者松动的情况。可以重插插头,检查接口焊接是否牢固,使用测试仪器检测电路连接情况。

    2. 优化代码逻辑:根据提供的代码和问题描述,可能存在以下优化点:

      • IIC读取数据部分:可以使用延时函数或者检测标志位的方式判断数据读取是否完成,确保读取到正确的数据。可以参考其他可靠的IIC通信代码进行优化。
      • 温度读取部分:可以加入数据稳定性判断的逻辑,例如连续读取多次温度值,并进行平均或者中位数处理,以减小误差。
      • 数码管显示部分:可以加入数据更新的判断逻辑,例如只有当温度值发生变化时才更新数码管显示,避免闪烁。

    完整代码如下:

    1. IIC.c
    // IIC.c代码
    
    // IIC初始化函数
    void IIC_Init(void) {
      // 初始化IIC相关的寄存器和引脚
    }
    
    // IIC开始传输函数
    void IIC_Start(void) {
      // IIC发送开始信号的代码
    }
    
    // IIC停止传输函数
    void IIC_Stop(void) {
      // IIC发送停止信号的代码
    }
    
    // IIC发送数据函数
    void IIC_SendByte(uint8_t data) {
      // IIC发送一个字节的数据
    }
    
    // IIC接收数据函数
    uint8_t IIC_ReceiveByte(void) {
      // IIC接收一个字节的数据
    }
    
    // IIC发送应答信号函数
    void IIC_SendAck(uint8_t ack) {
      // IIC发送应答信号
    }
    
    1. onewire.c
    // onewire.c代码
    
    // DS18B20初始化函数
    void DS18B20_Init(void) {
      // DS18B20初始化的代码
    }
    
    // DS18B20开始温度转换函数
    void DS18B20_StartConversion(void) {
      // DS18B20开始温度转换的代码
    }
    
    // DS18B20读取温度函数
    float DS18B20_ReadTemperature(void) {
      // DS18B20读取温度的代码
      // 返回温度值(float类型)
    }
    
    1. main.c
    #include "IIC.h"
    #include "onewire.h"
    
    int main(void) {
      // 初始化IIC和DS18B20
      IIC_Init();
      DS18B20_Init();
      
      while (1) {
        // DS18B20开始温度转换
        DS18B20_StartConversion();
        
        // 等待温度转换完成
        delay_ms(1000);
        
        // 读取温度值
        float temperature = DS18B20_ReadTemperature();
        
        // 数码管显示温度值
        display_temperature(temperature);
      }
      
      return 0;
    }
    

    请根据你的具体情况进行检查和调试,如果问题仍存在,请提供更多的相关信息,以便更好地帮助你解决问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月13日
  • 已采纳回答 2月5日
  • 创建了问题 1月29日

悬赏问题

  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上
  • ¥15 提问一个关于vscode相关的环境配置问题,就是输入中文但是显示不出来,代码在idea可以显示中文,但在vscode不行,不知道怎么配置环境
  • ¥15 netcore使用PuppeteerSharp截图
  • ¥20 这张图页头,页脚具体代码该怎么写?
  • ¥15 关于#sql#的问题,请各位专家解答!
  • ¥20 WPF MVVM模式 handycontrol 框架, hc:SearchBar 控件 Text="{Binding NavMenusKeyWords}" 绑定取不到值
  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂